Текущее время: Сб, июл 21 2018, 03:47

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Сравнение таблиц
СообщениеДобавлено: Ср, июн 20 2018, 15:26 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
Я опишу как я начал делать, поправьте меня,если есть проще способ.
Есть 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'


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Ср, июн 20 2018, 16:25 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
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.


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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 08:05 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 10:38
Сообщения: 137
Справку по 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.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 11:36 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
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'... ума не приложу что тут не так :/


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 11:44 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 324
Тут может быть не так :
1) что-то с условиями цикла LOOP
2) что-то не так с критериями выборки SELECT
3) не выбрались документы с видом движения 101 и кодом движения F

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 11:45 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
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.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 11:50 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 324
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 селектов


Последний раз редактировалось Kuranov.Dmitry Чт, июн 21 2018, 12:30, всего редактировалось 2 раз(а).

Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Чт, июн 21 2018, 12:17 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
что-то не так . . .
может дубли?
нам бы увидеть любую первую строку из этих дублей и если мы ее нашли, то остальные дубли пропустить . . .
или мне придется всоздать все же внутренню таблицу и туда скопировать MSEG очистив от дублей, а потом только сравнивать ?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Пт, июн 22 2018, 08:21 
Специалист
Специалист

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Пт, июн 22 2018, 09:07 
Старший специалист
Старший специалист

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

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Пт, июн 22 2018, 10:39 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
блин, какие еще мысли есть ?
не знаю я уже, что делать с этим . . . не понимаю в чем проблема.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Вт, июн 26 2018, 08:00 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 10:38
Сообщения: 137
Если по условиям все правильно, и запись должна выбираться - то ничего не может быть.

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

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


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Вт, июн 26 2018, 09:11 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
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.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Вт, июн 26 2018, 16:50 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, июл 17 2017, 15:11
Сообщения: 298
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 сравнивал только первые две цифры с первыми двумя в другой таблице.(сравнение по первым двум цифрам). В этом я увидел и косяк.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Сравнение таблиц
СообщениеДобавлено: Вт, июн 26 2018, 16:54 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Ср, сен 06 2017, 00:56
Сообщения: 324
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.



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

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


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

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


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

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