SAP-ABAP-查询特定时间生产订单状态-自建function

在项目中经常遇见需要查询生产订单在具体某个时间是什么状态,但是标准的function都是查询当前状态的,在此写下一个function查询具体某个时间点生产订单状态

先看结果,下图为测试结果,没有问题

源码如下

FUNCTION Z_PP_AUFNR_STATE.
*"----------------------------------------------------------------------
*"*"區域介面:
*"  IMPORTING
*"     REFERENCE(I_AUFNR) TYPE  AUFNR OPTIONAL
*"     REFERENCE(I_DATUM) TYPE  DATUM2 OPTIONAL
*"  TABLES
*"      OT_STAST STRUCTURE  ZSPP_AUFNE_STAST
*"      IT_AUFNR STRUCTURE  ZSPP_AUFNE_DATUM OPTIONAL
*"  SUTHOR
*"      Qunending 李强 2021年3月29日
*"----------------------------------------------------------------------
  DATA LS_AUFNR TYPE ZSPP_AUFNE_DATUM .
  DATA LS_STAST TYPE ZSPP_AUFNE_STAST .
  DATA LT_STAST TYPE TABLE OF ZSPP_AUFNE_STAST .
  DATA LT_AUFNR TYPE TABLE OF ZSPP_AUFNE_DATUM .

  "*-无传入数据不往下执行
  CHECK ( I_AUFNR IS NOT INITIAL AND I_DATUM IS NOT INITIAL ) OR IT_AUFNR IS NOT INITIAL .

  "*-后面用到了取内表,不能带表头行
  CLEAR : LS_AUFNR .
  LOOP AT IT_AUFNR INTO LS_AUFNR.
    APPEND LS_AUFNR TO LT_AUFNR .
  ENDLOOP.

  "*-将单笔传入资料放入表中
  IF I_AUFNR IS NOT INITIAL AND I_DATUM IS NOT INITIAL.
    LS_AUFNR-AUFNR  = I_AUFNR .
    LS_AUFNR-DATUM  = I_DATUM .
    APPEND LS_AUFNR TO LT_AUFNR .
    CLEAR : LS_AUFNR .
  ENDIF.

  "*-查找传入工单的最大日期
  SELECT MAX( DATUM ) AS D FROM @LT_AUFNR AS A INTO @DATA(LV_MAXDATE) .  "选出传入表中最大的日期

  "*-查找工单状态修改记录
  SELECT JCDS~OBJNR,CHGNR, ONROR~AUFNR , STAT, UDATE, UTIME,INACT    "查出所有的订单修改数据
    INTO TABLE @DATA(LT_JCDSN)
    FROM ONROR
    INNER  JOIN JCDS ON ONROR~OBJNR = JCDS~OBJNR
    FOR ALL ENTRIES IN @LT_AUFNR
    WHERE  JCDS~UDATE <= @LV_MAXDATE
      AND  ONROR~AUFNR = @LT_AUFNR-AUFNR .
  SORT LT_JCDSN  BY AUFNR UDATE DESCENDING UTIME DESCENDING.

  "*-建立活动内表,用来存储工单状态
  "*--取所有的工单状态用作活动内表表头
  SELECT * FROM TJ02T WHERE SPRAS = @SY-LANGU INTO TABLE @DATA(LT_TJ02) .
  PERFORM FRM_CREATE_FIELDCAT USING: GT_FIELD 'AUFNR' '订单'  '12' '' '' '' '' '' '' '' ''  'C' '12'  '' ''.
  PERFORM FRM_CREATE_FIELDCAT USING: GT_FIELD 'DATUM' '日期'  '8' '' '' '' '' '' '' '' ''  'D' '8'  '' ''.
  LOOP AT LT_TJ02 INTO DATA(LS_TJ02).
    PERFORM FRM_CREATE_FIELDCAT USING: GT_FIELD LS_TJ02-ISTAT LS_TJ02-TXT30  '1' '' '' '' '' '' '' '' ''  'P' '1'  '' ''.
  ENDLOOP.
  PERFORM FRM_CREATE_INTABLE."生成动态内表


  "*-循环工单修改状态记录工单状态
  CLEAR : LS_AUFNR .
  LOOP AT LT_AUFNR INTO LS_AUFNR.
    READ TABLE LT_JCDSN WITH KEY AUFNR = LS_AUFNR-AUFNR TRANSPORTING NO FIELDS BINARY SEARCH.
    IF SY-SUBRC = 0.
      LOOP AT LT_JCDSN FROM SY-TABIX INTO DATA(LS_JCDS).
        IF LS_AUFNR-AUFNR <> LS_JCDS-AUFNR.
          EXIT .
        ENDIF.
        IF LS_JCDS-UDATE <= LS_AUFNR-DATUM.
          ASSIGN COMPONENT LS_JCDS-STAT OF STRUCTURE <WA> TO FIELD-SYMBOL(<FS_VAULE>) .
          IF <FS_VAULE> IS ASSIGNED.
            IF LS_JCDS-INACT = 'X' .
              <FS_VAULE> = <FS_VAULE> - 1 .
            ELSEIF LS_JCDS-INACT = '' .
              <FS_VAULE> = <FS_VAULE> + 1 .
            ENDIF.
            UNASSIGN <FS_VAULE>.
          ENDIF.
        ENDIF.
      ENDLOOP.
      ASSIGN COMPONENT 'AUFNR' OF STRUCTURE <WA> TO <FS_VAULE> .
      IF <FS_VAULE> IS ASSIGNED.
        <FS_VAULE> = LS_AUFNR-AUFNR .
        UNASSIGN <FS_VAULE>.
      ENDIF.
      ASSIGN COMPONENT 'DATUM' OF STRUCTURE <WA> TO <FS_VAULE> .
      IF <FS_VAULE> IS ASSIGNED.
        <FS_VAULE> = LS_AUFNR-DATUM .
        UNASSIGN <FS_VAULE>.
      ENDIF.
      APPEND <WA> TO <ITAB> .
      CLEAR : <WA> .
    ENDIF.
  ENDLOOP.

  "*-循环工单记录表如果数字小于0则该状态为激活状态
  LOOP AT <ITAB> ASSIGNING <WA> .
    DO LINES( LT_TJ02 ) + 2 TIMES .
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE <WA> TO <FS_VAULE> .
      IF <FS_VAULE> IS ASSIGNED.
        CASE SY-INDEX.
            WHEN 1.
            LS_STAST-AUFNR = <FS_VAULE> .
            WHEN 2.
            LS_STAST-DATUM = <FS_VAULE> .
            WHEN OTHERS.
            IF <FS_VAULE> > 0.
              READ TABLE LT_TJ02 INDEX SY-INDEX - 2 INTO LS_TJ02 .
              IF SY-SUBRC = 0.
                LS_STAST-STAT  = LS_TJ02-ISTAT .
                LS_STAST-TXT04 = LS_TJ02-TXT04 .
                LS_STAST-TXT30 = LS_TJ02-TXT30 .
                APPEND LS_STAST TO LT_STAST .
              ENDIF.
            ENDIF.
        ENDCASE.
      ELSE .
        EXIT .
      ENDIF.
    ENDDO.
    APPEND LINES OF LT_STAST TO OT_STAST .
    CLEAR : LS_STAST ,LT_STAST,LT_STAST[] .
  ENDLOOP.
  UNASSIGN : <WA> ,<ITAB>,<FS_VAULE>.
  CLEAR : LS_STAST ,LT_STAST,LT_STAST[],LS_AUFNR,LT_AUFNR,LT_AUFNR[],LT_JCDSN,LV_MAXDATE ,LT_TJ02.
ENDFUNCTION.


FORM FRM_CREATE_FIELDCAT USING PR_FCAT TYPE LVC_T_FCAT
                                P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15.
  GS_FIELD-FIELDNAME     =  P1.
  GS_FIELD-REPTEXT       =  P2.
  GS_FIELD-OUTPUTLEN     =  P3.
  GS_FIELD-DECIMALS      =  P4.
  GS_FIELD-CONVEXIT      =  P5.
  GS_FIELD-KEY           =  P6.
  GS_FIELD-ICON          =  P7.
  GS_FIELD-DO_SUM        =  P8.
  GS_FIELD-HOTSPOT       =  P9.
  GS_FIELD-EDIT          =  P10.
  GS_FIELD-NO_ZERO       =  P11.
  GS_FIELD-INTTYPE       =  P12.
  GS_FIELD-INTLEN        =  P13.
  GS_FIELD-REF_TABLE     =  P14.
  GS_FIELD-REF_FIELD     =  P15.
  APPEND GS_FIELD TO PR_FCAT.
  CLEAR GS_FIELD.
ENDFORM.

FORM FRM_CREATE_INTABLE .
  CLEAR :GT_ITEM .
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      IT_FIELDCATALOG = GT_FIELD
    IMPORTING
      EP_TABLE        = GT_ITEM.
  ASSIGN GT_ITEM->* TO <ITAB>.
  CREATE DATA GS_ITEM LIKE LINE OF <ITAB>.
  ASSIGN GS_ITEM->* TO <WA>.
ENDFORM.

参数如下

总结:IMPORT参数可输入单个生产订单及日期查询具体某个生产订单状态,也可在IT_AUFNR表输入许多生产订单及日期查询大量生产订单状态

function逻辑整体不复杂,已生产订单状态修改记录表JCDS为主体,简单的循环遍历状态,记录修改,最终取得生产订单状态。

程序中使用了查询内表获得输入生产订单中最大日期。

使用了活动内表记录生产订单所有的状态。

以上为查询特定时间下生产订单状态function,欢迎大家评论交流

猜你喜欢

转载自blog.csdn.net/Qunending/article/details/115292678