SAP: SO Error Status record

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.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值