1、Find SO status error record
REPORT SDSTATU1.
* Report in order to find inconsistencies between the sales document
* and status management. The inconsistencies can be repaired using
* report ZZOBJNR1.
TABLES: JSTO, VBAK, VBAP.
SELECT-OPTIONS S_VBELN FOR VBAK-VBELN.
WRITE: TEXT-001.
SELECT * FROM VBAK WHERE OBJNR <> SPACE AND
VBELN IN S_VBELN.
SELECT SINGLE * FROM JSTO WHERE OBJNR = VBAK-OBJNR.
IF SY-SUBRC <> 0.
* OBJNR does not exist in table JSTO
WRITE: / 'VBELN: ', VBAK-VBELN.
ENDIF.
ENDSELECT.
WRITE: / TEXT-002.
SELECT * FROM VBAP WHERE OBJNR <> SPACE AND
VBELN IN S_VBELN.
SELECT SINGLE * FROM JSTO WHERE OBJNR = VBAP-OBJNR.
IF SY-SUBRC <> 0.
WRITE: / 'VBELN: ', VBAP-VBELN,
'POSNR: ', VBAP-POSNR.
ENDIF.
ENDSELECT.
2、Update SO status error record
REPORT SDSTATU2.
* Report in order to repair inconsistencies between the sales document
* and status management. The sales documents with inconsistencies can
* be listed using the report ZZOBJNR2.
* This report checks all sales documents and the corresponding items
* in the respective system/client and repairs the documents.
tables: jsto, vbak, vbap, tvak, tvap, t459k, cobrb, tvta.
SELECT-OPTIONS S_VBELN FOR VBAK-VBELN.
DATA: BEGIN OF XVBAK OCCURS 100.
INCLUDE STRUCTURE VBAK.
DATA: END OF XVBAK.
DATA: BEGIN OF XVBAP OCCURS 100.
INCLUDE STRUCTURE VBAP.
DATA: END OF XVBAP.
WRITE: TEXT-001.
SELECT * FROM VBAK WHERE OBJNR <> SPACE AND
VBELN IN S_VBELN.
SELECT SINGLE * FROM JSTO WHERE OBJNR = VBAK-OBJNR.
IF SY-SUBRC <> 0.
* OBJNR does not exist in table JSTO
XVBAK = VBAK.
APPEND XVBAK.
ENDIF.
ENDSELECT.
LOOP AT XVBAK.
SELECT SINGLE * FROM TVAK WHERE AUART = XVBAK-AUART.
CALL FUNCTION 'STATUS_OBJECT_CREATE'
EXPORTING
CHGKZ = 'X'
CLIENT = SY-MANDT
OBJNR = XVBAK-OBJNR
OBTYP = 'VBK'
STSMA = TVAK-STSMA
IMPORTING
OBJNR = XVBAK-OBJNR
EXCEPTIONS
OBTYP_INVALID = 1
STATUS_OBJECT_ALREADY_EXISTS = 2
STSMA_INVALID = 3
STSMA_OBTYP_INVALID = 4
OTHERS = 5.
IF SY-SUBRC = 0.
COMMIT WORK.
WRITE: / 'VBELN: ', XVBAK-VBELN, TEXT-003.
ENDIF.
ENDLOOP.
WRITE: / TEXT-002.
SELECT * FROM VBAP WHERE OBJNR <> SPACE AND
VBELN IN S_VBELN.
SELECT SINGLE * FROM JSTO WHERE OBJNR = VBAP-OBJNR.
IF SY-SUBRC <> 0.
XVBAP = VBAP.
APPEND XVBAP.
ENDIF.
ENDSELECT.
LOOP AT XVBAP.
SELECT SINGLE * FROM TVAP WHERE PSTYV = XVBAP-PSTYV.
CALL FUNCTION 'STATUS_OBJECT_CREATE'
EXPORTING
CHGKZ = 'X'
CLIENT = SY-MANDT
OBJNR = XVBAP-OBJNR
OBTYP = 'VBP'
STSMA = TVAP-STSMA
IMPORTING
OBJNR = XVBAP-OBJNR
EXCEPTIONS
OBTYP_INVALID = 1
STATUS_OBJECT_ALREADY_EXISTS = 2
STSMA_INVALID = 3
STSMA_OBTYP_INVALID = 4
OTHERS = 5.
IF SY-SUBRC = 0.
VBAP = XVBAP.
* Einzelfertigungsstaus setzen
IF XVBAP-KZVBR = 'E'.
PERFORM STATUS_SETZEN(SAPFV45P) USING 'I0234' 'X'.
ELSE.
PERFORM STATUS_SETZEN(SAPFV45P) USING 'I0235' 'X'.
ENDIF.
* Kopf nachlesen (tvta wird in t459k_lesen ben?tigt)
if vbak-vbeln ne xvbap-vbeln.
select single * from vbak where
vbeln = xvbap-vbeln.
endif.
perform tvta_select(sapmv45a)
using vbak-vkorg
vbak-vtweg
vbak-spart.
* Kalkulationsstatus setzen
PERFORM T459K_LESEN(SAPMV45A).
IF VBAP-KALNR IS INITIAL.
IF NOT T459K-KALKU IS INITIAL AND
T459K-MNTGA NE '2'.
PERFORM STATUS_SETZEN(SAPFV45P) USING 'I0164' 'X'.
ENDIF.
ELSE.
PERFORM STATUS_SETZEN(SAPFV45P) USING 'I0165' 'X'.
ENDIF.
* Abrechnungsvorschrift erfa?t?
SELECT SINGLE * FROM COBRB WHERE OBJNR = VBAP-OBJNR.
IF SY-SUBRC = 0.
PERFORM STATUS_SETZEN(SAPFV45P) USING 'I0028' 'X'.
ENDIF.
COMMIT WORK.
WRITE: / 'VBELN: ', XVBAP-VBELN,
'POSNR: ', XVBAP-POSNR,
TEXT-003.
ENDIF.
ENDLOOP.