在项目中经常遇见需要查询生产订单在具体某个时间是什么状态,但是标准的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,欢迎大家评论交流