SAP-ABAP-Запрос статуса производственных заказов с помощью определенной функции, созданной самим во времени

В проекте я часто сталкиваюсь с необходимостью запросить статус производственного заказа в определенное время, но стандартные функции - это запрос текущего статуса. Напишите здесь функцию, чтобы запросить статус производственного заказа в определенной точке в время

Сначала посмотрите на результаты, на следующем рисунке показаны результаты теста, проблем нет

Исходный код выглядит следующим образом

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, чтобы запросить статус большого количества производственных заказов.

Функциональная логика в целом несложная.Таблица записей модификации статуса производственного заказа JCDS является основным телом, статус просто прокручивается, и модификация записывается, и, наконец, получается статус производственного заказа.

Программа использует внутреннюю таблицу запроса для получения максимальной даты во входном производственном заказе.

Внутренняя таблица действий используется для записи всего статуса производственного заказа.

 

 

Вышеупомянутая функция для запроса статуса производственных заказов в определенное время.Добро пожаловать в комментарии и обмен.

рекомендация

отblog.csdn.net/Qunending/article/details/115292678
рекомендация