Текущее время: Вс, июл 27 2025, 20:53

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot]


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

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