Текущее время: Чт, авг 07 2025, 20:59

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Сб, окт 10 2015, 18:33 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Имхо лучше использовать cl_salv_table - всего 2 строчки, чтобы вывести любую таблицу, никаких экранов и паи/пбо логики.
Code:
cl_salv_table=>factory( importing r_salv_table = data(salv) changing t_table = lt_mard ).
salv->display( ).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Вс, окт 11 2015, 17:38 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Parazit написал:
Объедините оба запроса в один через JOIN и кладите результат в одну внутреннюю таблицу.

Не надо в один join объединять таблицы остатков и оборотов.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Вс, окт 11 2015, 22:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Удав написал(а):
Parazit написал:
Объедините оба запроса в один через JOIN и кладите результат в одну внутреннюю таблицу.

Не надо в один join объединять таблицы остатков и оборотов.

Удав, ты прав! Объединять то можно, но остатки с оборотами сложить не получится, а больше тут и объединять незачем.
boreich, прошу прощения, я как увидел "join" между внутренними таблицами, сразу решил перенести его на уровень выборки, а что внутри сумма позиции wa_mseg-menge с остатком wa_mard-labst складывается - упустил. :)

Однако и в этом случае есть чего доработать. Основной принцип - всё лишнее нужно отсечь ещё на этапе выборки.
Агрегирование также позволяет сократить объём выбранных данных на несколько порядков.
Code:
REPORT zlab_1.

TABLES: mara, makt, mard, mkpf, mseg.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

TYPES: BEGIN OF st_mard,
         matnr TYPE mard-matnr,
         werks TYPE mard-werks,
         lgort TYPE mard-lgort,
         labst TYPE mard-labst,
       END OF st_mard.

TYPES: BEGIN OF st_mseg,
         matnr      TYPE mseg-matnr,
         werks      TYPE mseg-werks,
         lgort      TYPE mseg-lgort,
*vvn         budat_mkpf TYPE mseg-budat_mkpf,
         shkzg      TYPE mseg-shkzg,
         menge      TYPE mseg-menge,
       END OF st_mseg.

DATA: p_material    LIKE mara-matnr,
      p_warehouse   LIKE mard-lgort,
      lt_mseg       TYPE STANDARD TABLE OF st_mseg,
      lt_mard       TYPE STANDARD TABLE OF st_mard,
      wa_mseg       TYPE st_mseg,
      wa_mard       TYPE st_mard,
      container_ref TYPE REF TO cl_gui_custom_container,
      grid_ref      TYPE REF TO cl_gui_alv_grid.

PARAMETERS: p_data  LIKE sy-datum DEFAULT sy-datum OBLIGATORY,
            p_plant LIKE mard-werks.

SELECT-OPTIONS: s_mat FOR p_material OBLIGATORY,
                s_wh  FOR p_warehouse.

SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.

  SELECT *
    FROM mard
    INTO CORRESPONDING FIELDS OF TABLE lt_mard
    WHERE matnr IN s_mat
    AND lgort IN s_wh
    AND werks EQ p_plant.

  Select
*vvn(
    MSEG~MATNR
    MSEG~WERKS
    MSEG~LGORT
    MSEG~SHKZG
    Sum( MSEG~MENGE ) as menge
*)vvn
    from MSEG
*vvn(
    join MKPF
      on MKPF~MBLNR = MSEG~MBLNR and
         MKPF~MJAHR = MSEG~MJAHR
*)vvn
    into corresponding fields of table lt_mseg
    where MATNR in s_mat
      and LGORT in s_wh
      and WERKS = p_plant
*vvn(
      and MKPF~BUDAT >= p_data
    group by
      MSEG~MATNR
      MSEG~WERKS
      MSEG~LGORT
      MSEG~SHKZG.
*)vvn

  LOOP AT lt_mard INTO wa_mard.
    LOOP AT lt_mseg INTO wa_mseg.
*vvn      IF wa_mseg-budat_mkpf GE p_data.
        IF  wa_mard-matnr EQ wa_mseg-matnr
        AND wa_mard-werks EQ wa_mseg-werks
        AND wa_mard-lgort EQ wa_mseg-lgort.
          IF wa_mseg-shkzg EQ 'H'.
            ADD wa_mseg-menge TO wa_mard-labst.
          ELSEIF wa_mseg-shkzg EQ 'S'.
            SUBTRACT wa_mseg-menge FROM wa_mard-labst.
          ENDIF.
        ENDIF.
*vvn      ENDIF.
    ENDLOOP.
    WRITE: /  wa_mard-matnr,
                   wa_mard-lgort,
                   wa_mard-labst.
  ENDLOOP.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Пн, окт 12 2015, 14:54 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Решил вмешаться в этот учебный пример.
1. Уже несколько лет как поле mkpf-budat дублируется в mseg-mkpf_budat, лучше накладывать ограничения на поля из одной таблицы, а не разных, это позволит эффективно использовать индексы.
2. Зачем два вложенных loop?
Данные из mard селектить сразу в hashed table с ключем товар-завод-склад и полем для количества (в селекте сразу отбирать только строки mard с ненулевым количеством)
Вмеcто двух loop оставить один (по mseg) и внутри него collect в эту самую hashed table (сначала, конечно, знак учесть из индикатора Д/К)

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Пн, окт 12 2015, 16:10 
Специалист
Специалист

Зарегистрирован:
Ср, окт 07 2015, 12:36
Сообщения: 124
Благодарю всех за помощь. Стало значительно лучше по сравнению с тем, что было. Хотел только уточнить, что означает комментарий vvn - просто, чтобы было видно изменения?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Пн, окт 12 2015, 16:10 
Специалист
Специалист

Зарегистрирован:
Ср, окт 07 2015, 12:36
Сообщения: 124
Благодарю всех за помощь. Стало значительно лучше по сравнению с тем, что было. Хотел только уточнить, что означает комментарий vvn - просто, чтобы было видно изменения?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Пн, окт 12 2015, 17:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
LKU написал:
Решил вмешаться в этот учебный пример.
1. Уже несколько лет как поле mkpf-budat дублируется в mseg-mkpf_budat, лучше накладывать ограничения на поля из одной таблицы, а не разных, это позволит эффективно использовать индексы.
Про mseg-mkpf_budat не знал, в моей системе его нет, а неотлаженный код выкладывать не хотел. Да и с точки зрения обучения полезно пример с "join" показать.
LKU написал:
2. Зачем два вложенных loop?
Данные из mard селектить сразу в hashed table с ключем товар-завод-склад и полем для количества (в селекте сразу отбирать только строки mard с ненулевым количеством)
Вмеcто двух loop оставить один (по mseg) и внутри него collect в эту самую hashed table (сначала, конечно, знак учесть из индикатора Д/К)

Я бы вообще избавился от лишней таблицы за счёт цикла "Select ... EndSelect". Несмотря на то, что "Select... into table" работает чуть-чуть быстрее, оптимизация подразумевает не только производительность, но и экономию памяти, и читабельность (лаконичность, понятность, простота и т.д.) кода.
Code:
...
DATA:
...
      lt_mard       type sorted table of st_mard
        with unique key
          matnr
          werks
          lgort,
      wa_mard       TYPE st_mard,
      lv_shkzg type MSEG-SHKZG,
...
START-OF-SELECTION.

...

  Select
    MSEG~MATNR
    MSEG~WERKS
    MSEG~LGORT
    MSEG~SHKZG
    Sum( MSEG~MENGE ) as labst
    into (wa_mard-matnr, wa_mard-werks, wa_mard-lgort, lv_shkzg, wa_mard-labst)
    from MSEG
    join MKPF
      on MKPF~MBLNR = MSEG~MBLNR and
         MKPF~MJAHR = MSEG~MJAHR
    where MATNR in s_mat
      and LGORT in s_wh
      and WERKS = p_plant
      and MKPF~BUDAT >= p_data
    group by
      MSEG~MATNR
      MSEG~WERKS
      MSEG~LGORT
      MSEG~SHKZG
    having Sum( MSEG~MENGE ) <> 0.

    If lv_shkzg = 'S'.
      wa_mard-labst = - wa_mard-labst.
    EndIf.
    Collect wa_mard into lt_mard.
  EndSelect.

  LOOP AT lt_mard INTO wa_mard.
    WRITE: /  wa_mard-matnr,
                   wa_mard-lgort,
                   wa_mard-labst.
  ENDLOOP.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Последний раз редактировалось Parazit Пн, окт 12 2015, 20:21, всего редактировалось 3 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Пн, окт 12 2015, 17:39 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
boreich написал(а):
Благодарю всех за помощь. Стало значительно лучше по сравнению с тем, что было. Хотел только уточнить, что означает комментарий vvn - просто, чтобы было видно изменения?

Да, это я по привычке своими инициалами обозначаю свои изменения в чужом коде.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Остатки на складе
СообщениеДобавлено: Вт, окт 13 2015, 08:17 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, июн 05 2006, 13:33
Сообщения: 805
Пол: Мужской
LKU написал:
Решил вмешаться в этот учебный пример.
1. Уже несколько лет как поле mkpf-budat дублируется в mseg-mkpf_budat, лучше накладывать ограничения на поля из одной таблицы, а не разных, это позволит эффективно использовать индексы.

Да, только надо обратить внимание, что индексы содержащие mseg-mkpf_budat по умолчанию отключены


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу Пред.  1, 2

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


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

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


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

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