Текущее время: Вс, июн 22 2025, 23:09

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


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

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


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

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