SAPфорум.RU
https://sapboard.ru/forum/

Сравнение таблиц
https://sapboard.ru/forum/viewtopic.php?f=13&t=96526
Страница 1 из 2

Автор:  sonics [ Ср, июн 20 2018, 14:26 ]
Заголовок сообщения:  Сравнение таблиц

Я опишу как я начал делать, поправьте меня,если есть проще способ.
Есть 5 таблиц, мы с них берем данные и сливаем в одну и есть одна 6-ая таблица.
они имеют общие поля, по которым я хочу сделать проверку.
грубо говоря это matnr mtart zbesk lgort lfgja по таким полям.
я первую таблицу select выборку сделал в gt_result1
а вторую с таблицы в gt_result2 (хотя, скорее всего это нафиг не надо, просто не понимаю как присоединиться по ключевым полям)
теперь мне через read table делать сравнение ?
и в конечный result в поле ai я бы хотел ставить индикатор X если такая строка из таблицы gt_result1 есть в моей таблице(таблица номер 6), которую я засунул в gt_result2.
я правильно мыслю? т.е. через Loop проходим gt_result1
и делаем read table itab2 with key val = gt_result1-matnr, gt_result1-mtart, gt_result1-zbesk, gt_result1-lgort, gt_result1-lfgja ?
дальше if gt_result-matnr = itab2-matrn and ..... остальные полня
тогда modify gt_result1-ai= 'x'

Автор:  sonics [ Ср, июн 20 2018, 15:25 ]
Заголовок сообщения:  Re: Сравнение таблиц

Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab>.
  IF <gs_result_tab>-MTART = 'HALB' and <gs_result_tab>-ZBESK = 'P'.
    READ TABLE MSEG with key fieldname = MATNR.
                                         LGORT.
                                         LFGJA.
                    with key BWART = '101'.
      IF MSEG-AUFNR is not INITIAL.
        <gs-result_tab>-ai = 'X'.
      ENDIF.
  ENDIF.

    <gs_result_tab>-UNCRESERVE = 1.
    <gs_result_tab>-salk3 = <gs_result_tab>-verpr * <gs_result_tab>-LABST.
ENDLOOP.


не хватает знаний синтаксиса :(
что хочу знаю, как сделать, не знаю . . .

Автор:  Saperx [ Чт, июн 21 2018, 07:05 ]
Заголовок сообщения:  Re: Сравнение таблиц

Справку по F1 отменили? :) Встаете курсором на оператор Read и жмете F1 - там и синтаксис, и примеры будут...
Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab>.
  IF <gs_result_tab>-MTART = 'HALB' and <gs_result_tab>-ZBESK = 'P'.
    READ TABLE gt_result2 assigning <check> with key matnr = <gs_result_tab>-matnr
                                              lgort = <gs_result_tab>-lgort
                                              lfgja = <gs_result_tab>-lfgja.
                                              bwart = '101'.
      IF sy-subrc = 0 AND <check>-AUFNR is not INITIAL.
        <gs-result_tab>-ai = 'X'.
         UNASSIGN <check>.
      ENDIF.
  ENDIF.

    <gs_result_tab>-UNCRESERVE = 1.
    <gs_result_tab>-salk3 = <gs_result_tab>-verpr * <gs_result_tab>-LABST.
ENDLOOP.

Автор:  sonics [ Чт, июн 21 2018, 10:36 ]
Заголовок сообщения:  Re: Сравнение таблиц

Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab> where MTART EQ 'HALB' and ZBESK EQ 'P'.
    select single * from MSEG where "BWART EQ '101' and
                                    "KZBEW EQ 'F' AND
                                    LGORT EQ <gs_result_tab>-LGORT AND
                                    MATNR EQ <gs_result_tab>-MATNR AND
                                    LFBJA EQ <gs_result_tab>-LFGJA.
    IF mseg-BWART EQ '101' and mseg-KZBEW EQ 'F'.  "sy-subrc IS INITIAL."
*       mseg-AUFNR is not INITIAL.
*        mseg-KZBEW EQ 'F'.
          <gs_result_tab>-ia = 'X'.
    ENDIF.
ENDLOOP.


неверно работает . . . не ставит где надо 'X'... ума не приложу что тут не так :/

Автор:  Kuranov.Dmitry [ Чт, июн 21 2018, 10:44 ]
Заголовок сообщения:  Re: Сравнение таблиц

Тут может быть не так :
1) что-то с условиями цикла LOOP
2) что-то не так с критериями выборки SELECT
3) не выбрались документы с видом движения 101 и кодом движения F

И еще дам совет, после SELECT обрабатывать sy-subrc, чтобы проверить как он сработал

Автор:  sonics [ Чт, июн 21 2018, 10:45 ]
Заголовок сообщения:  Re: Сравнение таблиц

Kuranov.Dmitry написал(а):
Тут может быть не так :
1) что-то с условиями цикла LOOP
2) что-то не так с критериями выборки SELECT
3) не выбрались документы с видом движения 101 и кодом движения F

И еще дам совет, после SELECT обрабатывать sy-subrc, чтобы проверить как он сработал

я попробовал, дебагер дал значение 4
Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab> where MTART EQ 'HALB' and ZBESK EQ 'P'.
    select single * from MSEG where BWART EQ '101' and
                                    KZBEW EQ 'F' AND
                                    LGORT EQ <gs_result_tab>-LGORT AND
                                    MATNR EQ <gs_result_tab>-MATNR AND
                                    LFBJA EQ <gs_result_tab>-LFGJA.
    IF sy-subrc IS INITIAL.
          <gs_result_tab>-ia = 'X'.
    ENDIF.
ENDLOOP.

Автор:  Kuranov.Dmitry [ Чт, июн 21 2018, 10:50 ]
Заголовок сообщения:  Re: Сравнение таблиц

sonics написал(а):
Kuranov.Dmitry написал(а):
Тут может быть не так :
1) что-то с условиями цикла LOOP
2) что-то не так с критериями выборки SELECT
3) не выбрались документы с видом движения 101 и кодом движения F

И еще дам совет, после SELECT обрабатывать sy-subrc, чтобы проверить как он сработал

я попробовал, дебагер дал значение 4



у вас может сработать такой сценарий

обрабатываем строку 1 первой таблицы
селект находит 101 F . ставим у строки 1 Х

обрабатываем строку 2 первой таблицы
селект не находит ничего. sy-subrc =4 но структура mseg содержит данные от предыдущего селекта и ставит опять лишний X

Правильно так:


Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab> where MTART EQ 'HALB' and ZBESK EQ 'P'.
     CLEAR mseg. " очистим от мусора. если селектт обломается, то он не затронет структуру и оставит что было до него
    select single * from MSEG where "BWART EQ '101' and
                                    "KZBEW EQ 'F' AND
                                    LGORT EQ <gs_result_tab>-LGORT AND
                                    MATNR EQ <gs_result_tab>-MATNR AND
                                    LFBJA EQ <gs_result_tab>-LFGJA.
    check sy-subrc eq 0. "Если нет документа, то Х не ставим
    IF mseg-BWART EQ '101' and mseg-KZBEW EQ 'F'. "проверим наш ли документ
*       mseg-AUFNR is not INITIAL.
*        mseg-KZBEW EQ 'F'.
          <gs_result_tab>-ia = 'X'.
    ENDIF.
ENDLOOP.


и то я не уверен что вам именно это надо.
я бы сделал так.

Code:


LOOP AT gt_result_tab ASSIGNING <gs_result_tab> where MTART EQ 'HALB' and ZBESK EQ 'P'.
   
    select  single * from MSEG where BWART EQ '101' and
                                    KZBEW EQ 'F' AND
                                    LGORT EQ <gs_result_tab>-LGORT AND
                                    MATNR EQ <gs_result_tab>-MATNR AND
                                    LFBJA EQ <gs_result_tab>-LFGJA.
     check sy-subrc = 0.
     <gs_result_tab>-ia = 'X'.


ENDLOOP


Конечно с производительностью тут есть над чем поработать, например сначала собрать из mseg в внутреннюю таблицу, чтоб не делать 100500 селектов

Автор:  sonics [ Чт, июн 21 2018, 11:17 ]
Заголовок сообщения:  Re: Сравнение таблиц

что-то не так . . .
может дубли?
нам бы увидеть любую первую строку из этих дублей и если мы ее нашли, то остальные дубли пропустить . . .
или мне придется всоздать все же внутренню таблицу и туда скопировать MSEG очистив от дублей, а потом только сравнивать ?

Автор:  Saperx [ Пт, июн 22 2018, 07:21 ]
Заголовок сообщения:  Re: Сравнение таблиц

Если запрос у вас возвращает 4, то тут не в дублях дело. Это значит что переданным критериям не соответствует ни одна запись в БД, внутренняя таблица тут ничем не поможет.
А с чего вы взяли что это поле должно заполнятся? Вы точно учли еще и условие в цикле?
И условие проверьте, возможно тут опечатка:
Code:
LFBJA EQ <gs_result_tab>-LFGJA.

Автор:  sonics [ Пт, июн 22 2018, 08:07 ]
Заголовок сообщения:  Re: Сравнение таблиц

Saperx написал(а):
Если запрос у вас возвращает 4, то тут не в дублях дело. Это значит что переданным критериям не соответствует ни одна запись в БД, внутренняя таблица тут ничем не поможет.
А с чего вы взяли что это поле должно заполнятся? Вы точно учли еще и условие в цикле?
И условие проверьте, возможно тут опечатка:
Code:
LFBJA EQ <gs_result_tab>-LFGJA.

тут все как надо, попробую другими критериями поиграться..

Автор:  sonics [ Пт, июн 22 2018, 09:39 ]
Заголовок сообщения:  Re: Сравнение таблиц

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

Автор:  Saperx [ Вт, июн 26 2018, 07:00 ]
Заголовок сообщения:  Re: Сравнение таблиц

Если по условиям все правильно, и запись должна выбираться - то ничего не может быть.

Скиньте типы полей в вашей внутренней таблице, + скриншоты из отладки той записи во внутр. таблице по которой идет отбор в цикле и выборка в селекте, и саму строку в таблице(например, из se16).
Если условия правильные и записи должны выбираться - то значит где из этих двух моментов ошибка, либо условия все таки не правильные, либо записи не идентичны по каким либо критериям.

p.s. ну есть еще один момент, иногда бывает разрабатываешь что-то, тестируешь и нифига не работает. А потом оказывается что таблицу смотришь в манданте песочницы, а программу тестируешь в разработке... У вас сколько мандантов в системе? :)

Автор:  sonics [ Вт, июн 26 2018, 08:11 ]
Заголовок сообщения:  Re: Сравнение таблиц

Saperx написал(а):
Если по условиям все правильно, и запись должна выбираться - то ничего не может быть.

Скиньте типы полей в вашей внутренней таблице, + скриншоты из отладки той записи во внутр. таблице по которой идет отбор в цикле и выборка в селекте, и саму строку в таблице(например, из se16).
Если условия правильные и записи должны выбираться - то значит где из этих двух моментов ошибка, либо условия все таки не правильные, либо записи не идентичны по каким либо критериям.

p.s. ну есть еще один момент, иногда бывает разрабатываешь что-то, тестируешь и нифига не работает. А потом оказывается что таблицу смотришь в манданте песочницы, а программу тестируешь в разработке... У вас сколько мандантов в системе? :)

4 манданта)
она работает, но не во всех записях, подходящих под условия ставит 'X'.
после добавления CLEAR mseg.
кол-во данных отмеченных возросло, но не все.
Code:
LOOP AT gt_result_tab ASSIGNING <gs_result_tab>.
    CLEAR mseg.
    IF <gs_result_tab>-MTART EQ 'HALB' and <gs_result_tab>-ZBESK EQ 'P'.
      select  single * from MSEG where BWART EQ '101' and
                                      KZBEW EQ 'F' AND
                                      LGORT EQ <gs_result_tab>-LGORT AND
                                      MATNR EQ <gs_result_tab>-MATNR.
            check sy-subrc = 0.
            <gs_result_tab>-ia = 'X'.
    ENDIF.
    <gs_result_tab>-salk3 = <gs_result_tab>-verpr * <gs_result_tab>-LABST.
ENDLOOP.

Автор:  sonics [ Вт, июн 26 2018, 15:50 ]
Заголовок сообщения:  Re: Сравнение таблиц

Code:
LGORT EQ <gs_result_tab>-LGORT



как мне сравнить LGORT первые две цифры (это склад) с reusult_tab-LGORT(2) тоже первые две цирфы

я пробовал так:
Code:
F <gs_result_tab>-MTART EQ 'HALB' and <gs_result_tab>-ZBESK EQ 'P'.
      SELECT * from MSEG into ls_mseg where BWART EQ '101' and
                                      KZBEW EQ 'F' AND
                                      LGORT EQ <gs_result_tab>-LGORT(2) AND
                                      MATNR EQ <gs_result_tab>-MATNR AND
                                      MJAHR EQ <gs_result_tab>-LFGJA.
            <gs_result_tab>-UNCRESERVE = 1.
            check sy-subrc = 0.
            <gs_result_tab>-ia = 'X'.
      ENDSELECT.
    ENDIF.

но это не сработало :(
не отметилось вообще ничего
смысл в том, чтобы в LGORT сравнивал только первые две цифры с первыми двумя в другой таблице.(сравнение по первым двум цифрам). В этом я увидел и косяк.

Автор:  Kuranov.Dmitry [ Вт, июн 26 2018, 15:54 ]
Заголовок сообщения:  Re: Сравнение таблиц

Code:
DATA lgort_tpl(3).
lgort_tpl(2) = <gs_result_tab>-LGORT(2).
lgort_tpl+2(1) = '%'.

SELECT * from MSEG into ls_mseg where BWART EQ '101' and
                                      KZBEW EQ 'F' AND
                                      LGORT LIKE lgort_tpl AND
                                      MATNR EQ <gs_result_tab>-MATNR AND
                                      MJAHR EQ <gs_result_tab>-LFGJA.
            <gs_result_tab>-UNCRESERVE = 1.
            check sy-subrc = 0.
            <gs_result_tab>-ia = 'X'.
      ENDSELECT.


Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/