Текущее время: Пн, июл 28 2025, 00:18

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 07:21 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Прикрутил к elementary SH exit, чтобы одно из полей списка совпадений вычислялось в зависимости от значений других полей.

Вопрос собственно, как правильно добавлять в SH это самое дополнительное поле? SH строится на основе ракурса БД (join между несколькими таблицами БД), но в самих таблицах такого поля - нет. Расширять структуру одной из таблиц, чтобы оттуда в ракурс и дальше в SH тянуть - както криво (хранить в БД вычисяемое значение не нужно).
Динамически в существующий SH както можно поле вставить?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 08:02 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
pberezin написал:
Прикрутил к elementary SH exit, чтобы одно из полей списка совпадений вычислялось в зависимости от значений других полей.

Вопрос собственно, как правильно добавлять в SH это самое дополнительное поле? SH строится на основе ракурса БД (join между несколькими таблицами БД), но в самих таблицах такого поля - нет. Расширять структуру одной из таблиц, чтобы оттуда в ракурс и дальше в SH тянуть - както криво (хранить в БД вычисяемое значение не нужно).
Динамически в существующий SH както можно поле вставить?


А как Вы "прикрутили" заполнение вычисляемого поле? Через ПользовСредстПоиск (то есть через ФМ)? Через него можно делать практически все что угодно с СП на разных шагах (при выборки или отрисовке например).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 09:55 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
взял стандартный SH (метод выбора = ракурс БД = LFA inner join LFB), прикрутил к нему ФМ (SH-exit), и в событии DISP внутри ФМ получаю список отобранных средством поиска значений (RECORD_TAB[]), вычисляю для каждой записи значение моего поля и заталкиваю его обратно в RECORD_TAB[]. Получается стандартный SH но с динамически-вычисляемым полем.

Проблема, как наименее кривым способом определить это самое поле в описании SH. Я расширил LFA1 полем ZZDUMMY, подтягиваю его в ракурс и SH (чтобы было куда вычисляемые значения складывать). Но не нравится, что поле приходится хранить в таблице БД - оно всёравно там никаких значений не сохраняет...фактически "балласт", только ради того, чтобы можно было подтянуть это поле в SH.

Както иначе можно сделать? Т.е. чтобы таблицы БД не трогать, но в SH можно было-бы полностью динамически (например в событии SELECT sh-exit'a) добавлять нужные мне произвольные поля (которых нет в таблицах ракурса)?

Или в ракурс БД, на котором строится этот SH, добавить пустое фиктивное поле, которого не существует в таблицах БД?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 11:22 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
pberezin написал:
взял стандартный SH (метод выбора = ракурс БД = LFA inner join LFB), прикрутил к нему ФМ (SH-exit), и в событии DISP внутри ФМ получаю список отобранных средством поиска значений (RECORD_TAB[]), вычисляю для каждой записи значение моего поля и заталкиваю его обратно в RECORD_TAB[]. Получается стандартный SH но с динамически-вычисляемым полем.

Проблема, как наименее кривым способом определить это самое поле в описании SH. Я расширил LFA1 полем ZZDUMMY, подтягиваю его в ракурс и SH (чтобы было куда вычисляемые значения складывать). Но не нравится, что поле приходится хранить в таблице БД - оно всёравно там никаких значений не сохраняет...фактически "балласт", только ради того, чтобы можно было подтянуть это поле в SH.

Както иначе можно сделать? Т.е. чтобы таблицы БД не трогать, но в SH можно было-бы полностью динамически (например в событии SELECT sh-exit'a) добавлять нужные мне произвольные поля (которых нет в таблицах ракурса)?

Или в ракурс БД, на котором строится этот SH, добавить пустое фиктивное поле, которого не существует в таблицах БД?

Правильно мыслите, таблицы БД трогать незачем, ZZDUMMY лишнее, хранить ничего там не надо. Фиктивное поле в ракурс Вы не добавите. Можете сделать через ФМ(SH-exit), поправив параметр SHLP. Можете просто добавить в само СП фиктивное поле, должно сработать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 11:39 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Вам нужно сделать средство поиска
не через "Метод выбора"-->>указание ракурса,
а через "ПользовСредстПоиск"-->> указание функционального модуля SH-exit (пример которого приведен ниже: FUNCTION zos_search_blls1)

В данном примере, в средство поиска выведется таблица lt_outtab. Прямо в этом Ф.М. вы определяете её структуру, наименование полей, а также, наполняете требуемыми данными.

Code:
FUNCTION zos_search_blls1.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------

  CASE callcontrol-step.
*=======================================================================
    WHEN 'PRESEL1'.
*=======================================================================
*     переименование полей
      FIELD-SYMBOLS: <fielddescr> TYPE dfies.
      READ TABLE shlp-fielddescr ASSIGNING <fielddescr>  WITH KEY fieldname = 'BKTXT_PP'.
      IF sy-subrc EQ 0.
        <fielddescr>-fieldtext = <fielddescr>-reptext =
        <fielddescr>-scrtext_s = <fielddescr>-scrtext_m =
        <fielddescr>-scrtext_l = 'ПП'.
      ENDIF.
      READ TABLE shlp-fielddescr ASSIGNING <fielddescr>  WITH KEY fieldname = 'DMBTR_DZ'.
      IF sy-subrc EQ 0.
        <fielddescr>-fieldtext = <fielddescr>-reptext =
        <fielddescr>-scrtext_s = <fielddescr>-scrtext_m =
        <fielddescr>-scrtext_l = 'Сумма ДЗ'.
      ENDIF.
      READ TABLE shlp-fielddescr ASSIGNING <fielddescr>  WITH KEY fieldname = 'DMBTR_VV'.
      IF sy-subrc EQ 0.
        <fielddescr>-fieldtext = <fielddescr>-reptext =
        <fielddescr>-scrtext_s = <fielddescr>-scrtext_m =
        <fielddescr>-scrtext_l = 'Сумма ВВ'.
      ENDIF.

*=======================================================================
    WHEN 'SELECT'.
*=======================================================================

*---------------------------
* РАЗБОР ПАРАМЕТРОВ
*---------------------------
      DATA:
        ls_selopt       TYPE ddshselopt.
      RANGES:
        lr_bukrs        FOR  bkpf-bukrs,
        lr_gjahr        FOR  bkpf-gjahr,
        lr_belnr        FOR  bkpf-belnr,
        lr_bktxt        FOR  bkpf-bktxt,
        lr_blart        FOR  bkpf-blart.
      FIELD-SYMBOLS:
        <lr_blart>      LIKE LINE OF lr_blart.

      LOOP AT shlp-selopt INTO ls_selopt.
        CASE ls_selopt-shlpfield.
          WHEN 'BUKRS'.
            CLEAR lr_bukrs.
            MOVE-CORRESPONDING ls_selopt TO lr_bukrs.
            COLLECT lr_bukrs.
          WHEN 'GJAHR'.
            CLEAR lr_gjahr.
            MOVE-CORRESPONDING ls_selopt TO lr_gjahr.
            COLLECT lr_gjahr.
          WHEN 'BELNR'.
            CLEAR lr_belnr.
            MOVE-CORRESPONDING ls_selopt TO lr_belnr.
            COLLECT lr_belnr.
          WHEN 'BKTXT'.
            CLEAR lr_bktxt.
            MOVE-CORRESPONDING ls_selopt TO lr_bktxt.
            COLLECT lr_bktxt.
        ENDCASE.
      ENDLOOP.

*     вид документа берем из настройки
      SELECT sign opti AS option low high
        INTO CORRESPONDING FIELDS OF TABLE lr_blart
        FROM tvarv
       WHERE name EQ 'ZOS_BLART_SCHET'.

      LOOP AT lr_blart ASSIGNING <lr_blart> .
        IF <lr_blart>-sign IS INITIAL.
          <lr_blart>-sign = 'I'.
        ENDIF.
        CHECK <lr_blart>-option IS INITIAL.
        IF <lr_blart>-high IS INITIAL.
          <lr_blart>-option = 'EQ'.
        ELSE.
          <lr_blart>-option = 'BT'.
        ENDIF.
      ENDLOOP.

*---------------------------
* ФОРМИРОВАНИЕ НАБОРА ДАННЫХ
*---------------------------
      TYPES:
        BEGIN OF stype_outtab,
          belnr         TYPE belnr_d,
          bukrs         TYPE bukrs,
          gjahr         TYPE gjahr,
          bktxt         TYPE bktxt,
          bktxt_pp      TYPE bktxt,
          dmbtr_vv      TYPE dmbtr,
          dmbtr_dz      TYPE dmbtr,
        END   OF stype_outtab,
        ttype_outtab    TYPE STANDARD TABLE OF stype_outtab.
      DATA:
        ls_outtab       TYPE stype_outtab,
        lt_outtab       TYPE ttype_outtab.
      DATA:
        ls_bills_bkpf   TYPE bkpf,
        lt_bills_bkpf   TYPE STANDARD TABLE OF bkpf,
        ls_bills_bsak   TYPE bsak,
        lt_bills_bsak   TYPE STANDARD TABLE OF bsak,
        ls_payord       TYPE zfi_unific_bill_2_payord1,
        lt_payord       TYPE STANDARD TABLE OF zfi_unific_bill_2_payord1,
        ls_tab          TYPE zfi_unific_debzadol_4_payord1,
        lt_tab          TYPE STANDARD TABLE OF zfi_unific_debzadol_4_payord1.

*     Выбор релевантных счетов на оплату
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_bills_bkpf
        FROM bkpf
          UP TO callcontrol-maxrecords ROWS
       WHERE bukrs IN lr_bukrs
         AND belnr IN lr_belnr
         AND gjahr IN lr_gjahr
         AND blart IN lr_blart
         AND bktxt IN lr_bktxt
         AND stblg EQ space
         AND EXISTS ( SELECT *
                        FROM bsak
                       WHERE bukrs EQ bkpf~bukrs
                         AND belnr EQ bkpf~belnr
                         AND gjahr EQ bkpf~gjahr ).
      CHECK sy-subrc EQ 0.

      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE lt_bills_bsak
        FROM bsak
         FOR ALL ENTRIES IN lt_bills_bkpf
       WHERE bukrs EQ lt_bills_bkpf-bukrs
         AND belnr EQ lt_bills_bkpf-belnr
         AND gjahr EQ lt_bills_bkpf-gjahr.

*     По найденным Счетам, поиск Платежных поручений
      CALL FUNCTION 'ZFI_UNIFIC_BILL_2_PAYORD'
        EXPORTING
          i_search_payord_in_bsik = space " -->> интересуют только выровненные Платежные поручения
        TABLES
          it_bills                = lt_bills_bkpf
          et_payord               = lt_payord
        EXCEPTIONS
          OTHERS                  = 2.
      CHECK sy-subrc EQ 0.

*     Находим дебиторскую задолженность
      LOOP AT lt_payord INTO ls_payord.
        CLEAR ls_tab.
        MOVE:
          ls_payord-bukrs     TO ls_tab-bukrs,
          ls_payord-belnr     TO ls_tab-belnr,
          ls_payord-gjahr     TO ls_tab-gjahr.
        APPEND ls_tab TO lt_tab.
      ENDLOOP.

      CALL FUNCTION 'ZFI_UNIFIC_DEBZADOL_4_PAYORD'
        TABLES
          ct_tab = lt_tab
        EXCEPTIONS
          OTHERS = 2.

*     Формируем таблицу для вывода в SH
      LOOP AT lt_bills_bkpf INTO ls_bills_bkpf.
        CLEAR ls_outtab.

*       поля из счета на оплату
        MOVE:
          ls_bills_bkpf-bukrs   TO ls_outtab-bukrs,
          ls_bills_bkpf-gjahr   TO ls_outtab-gjahr,
          ls_bills_bkpf-belnr   TO ls_outtab-belnr,
          ls_bills_bkpf-bktxt   TO ls_outtab-bktxt.

*       текст из платежного поручения
        READ TABLE lt_payord INTO ls_payord
                  WITH KEY bl_bukrs = ls_bills_bkpf-bukrs
                           bl_belnr = ls_bills_bkpf-belnr
                           bl_gjahr = ls_bills_bkpf-gjahr.
        IF sy-subrc EQ 0.
          ls_outtab-bktxt_pp = ls_payord-bktxt.

*         дебиторская задолженность
          READ TABLE lt_tab INTO ls_tab
                  WITH KEY bukrs = ls_payord-bukrs
                           belnr = ls_payord-belnr
                           gjahr = ls_payord-gjahr.
          IF sy-subrc EQ 0.
            ls_outtab-dmbtr_dz = ls_tab-dmbtr_dz.
          ENDIF.

        ENDIF.

        LOOP AT lt_bills_bsak INTO ls_bills_bsak
                             WHERE bukrs EQ ls_bills_bkpf-bukrs
                               AND belnr EQ ls_bills_bkpf-belnr
                               AND gjahr EQ ls_bills_bkpf-gjahr.
          ADD ls_bills_bsak-dmbtr TO ls_outtab-dmbtr_vv.
        ENDLOOP.

        CHECK NOT ls_outtab-dmbtr_dz IS INITIAL.
        APPEND ls_outtab TO lt_outtab.
      ENDLOOP.

*---------------------------
* МАПИНГ
*---------------------------
      CALL FUNCTION 'F4UT_RESULTS_MAP'
        EXPORTING
          apply_restrictions = 'X'
        TABLES
          shlp_tab           = shlp_tab
          record_tab         = record_tab
          source_tab         = lt_outtab
        CHANGING
          shlp               = shlp
          callcontrol        = callcontrol
        EXCEPTIONS
          illegal_structure  = 1
          OTHERS             = 2.

      IF record_tab[] IS INITIAL.
        callcontrol-step = 'PRESEL'.
      ELSE.
        callcontrol-step = 'DISP'.
      ENDIF.

*=======================================================================
    WHEN OTHERS.
*=======================================================================
  ENDCASE.


ENDFUNCTION.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 13:01 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Цитата:
таблицы БД трогать незачем, ZZDUMMY лишнее, хранить ничего там не надо. Фиктивное поле в ракурс Вы не добавите. Можете сделать через ФМ(SH-exit), поправив параметр SHLP


У меня чтото не получилось. Добавляю, но на экране попрежнему рисуется без него. И там определённые сложности с вычислением смещений (offset) полей. Вобщем, отказался пока от этого метода.

Я уже впринципе готов в T000 все DUMMY-поля толкать - она ведь неявно join-нится с любой мандантнозависимой таблицей, и м.б. добавлна в любой ракурс практически :) Единственный минус видится - при любой модификации нарвёмся на полную перекомпиляцию практически всего манданта. Т.е. переносить придётся "в часы отчаяния" :D

Цитата:
WHEN 'PRESEL1'.
*=======================================================================
* переименование полей
FIELD-SYMBOLS: <fielddescr> TYPE dfies.
READ TABLE shlp-fielddescr ASSIGNING <fielddescr> WITH KEY fieldname = 'BKTXT_PP'.
IF sy-subrc EQ 0.
<fielddescr>-fieldtext = <fielddescr>-reptext =
<fielddescr>-scrtext_s = <fielddescr>-scrtext_m =
<fielddescr>-scrtext_l = 'ПП'.
ENDIF.


Я вот тут чтото не пойму - как тогда описание самого SH выглядит? Т.е. там всёравно какието поля отбалды надо подобавлять, чтобы это событие их переименовало, и потом в них отмаппило?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 13:36 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
pberezin, почему Вы просто не добавите в СП фиктивное поле? Оно у Вас внутри ФМ-а будет видно, заполните его значением и все.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: search-help с вычисляемым полем, как правильно?
СообщениеДобавлено: Чт, мар 18 2010, 13:54 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, мар 29 2007, 11:51
Сообщения: 330
Откуда: Yugorsk.RU
Пол: Мужской
Спасибо - получилось.
Самый простой способ оказался самым неочевидным :D


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB