Цитата:
Вроде все правильно, но возникает вопрос: как все-таки исключить сторнированные документы материала? Может, SMBN <> SPACE недостаточно?
Если просто исключить все, то после отбора документов с SMBLN = '', надо пройтись по вн. таблице и удалить записи, где выполниться условие:
Code:
SELECT SINGLE ....
FROM MSEG
WHERE SMBLN = TAB-BELNR AND
SJAHR = TAB-GJAHR AND
SMBLP = TAB-ZEILE.
IF SY-SUBRC = 0.
DELETE TAB.
ENDIF.
Если отчет, что-то типа оборотки, то надо контролировать даты. Например, показывать движение, если его строно в след. периоде.
Тогда, во-первых во вн. таблицу отбираешь все документы(и с SMBLN <> ''), а затем примерно вот так:
Code:
LOOP AT TAB.
CLEAR: DUMMY_MBLNR, DUMMY_MJAHR, DUMMY_ZEILE.
SELECT SINGLE D~SMBLN D~SJAHR D~SMBLP
INTO (DUMMY_MBLNR, DUMMY_MJAHR, DUMMY_ZEILE)
FROM MSEG AS D INNER JOIN MKPF AS H
ON D~MBLNR = H~MBLNR AND
D~MJAHR = H~MJAHR
WHERE D~SMBLN <> '' AND
H~BUDAT >= B_DAT AND
H~BUDAT <= E_DAT AND
H~MBLNR = TAB-BELNR AND
H~MJAHR = TAB-GJAHR.
IF SY-SUBRC = 0.
SELECT SINGLE ....
FROM MSEG AS D INNER JOIN MKPF AS H
ON D~MBLNR = H~MBLNR AND
D~MJAHR = H~MJAHR
WHERE H~BUDAT >= B_DAT AND
H~BUDAT <= E_DAT AND
H~MBLNR = DUMMY_MBLNR AND
H~MJAHR = DUMMY_MJAHR AND
D~ZEILE = DUMMY_ZEILE.
IF SY-SUBRC = 0.
DELETE TAB.
ENDIF.
ENDIF.
SELECT SINGLE .....
FROM MSEG AS D INNER JOIN MKPF AS H
ON D~MBLNR = H~MBLNR AND
D~MJAHR = H~MJAHR
WHERE H~BUDAT >= B_DAT AND
H~BUDAT <= E_DAT AND
H~SMBLN = TAB-MBLNR AND
H~SJAHR = TAB-MJAHR AND
D~SMBLP = TAB-ZEILE.
IF SY-SUBRC = 0.
DELETE TAB.
ENDIF.
ENDLOOP.
Первые два селекта проверяют сторно ли этот документ и если в обозначенном периоде его сторнируемый, а последний проверяет сторнируемый это документ и, что сторнирующий тоже попадает в эти даты. Вернее все проверяется по позиционно.
Возможно данный алгоритм можно организовать подзапросами, чтобы избежать вн. таблиц.