SAP ALV 动态日期表头行
参考说明
内容参考自CSDN博客:https://blog.csdn.net/此处是一行占位符.
效果展示
需求说明
根据物料凭证流水(MSEG表)汇总所选期间内每天的物料出入库数量
代码说明
实现原理1:
主要用到 CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE这个方法去构建一个将日期由行转成列的动态内表,然后通过指针的方式赋值就可以了
ITAB8[] = GT_DODATA[].
SORT ITAB8 BY BUDAT.
LOOP AT ITAB8.
TDATE = ITAB8-BUDAT.
COLLECT TDATE.
ENDLOOP.
PERFORM INPUT_FIELDCAT USING 'XH' '序号' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'BUTXT' '公司' 'C' '40' .
* PERFORM INPUT_FIELDCAT USING 'NAME1' '工厂' 'C' '40' .
PERFORM INPUT_FIELDCAT USING 'LGOBE' '库存地点' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'ZCLS1_N' '物料分类' 'C' '40' .
PERFORM INPUT_FIELDCAT USING 'MATNR' '物料编号' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'MAKTX' '物料描述' 'C' '40' .
LOOP AT TDATE.
PERFORM INPUT_FIELDCAT USING TDATE TDATE 'P' '20' .
ENDLOOP.
PERFORM INPUT_FIELDCAT USING 'AMOUNT' '总计' 'P' '20' .
*此方法用于构建动态内表,输入=构建的结构,输出=dy_table
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = GT_FIELDCAT
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE>.
CREATE DATA DY_WA LIKE LINE OF <DYN_TABLE>.
ASSIGN DY_WA->* TO <DYN_WA>.
实现原理2:
状态参考标准状态
全部代码展示
*&---------------------------------------------------------------------*
*& Report ZMM_RP_007
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZLEARN_WZY_002 MESSAGE-ID ZM_PP001 NO STANDARD PAGE HEADING.
********************************************************************
* 事务代码: *
* 程序名称: *
* 程序目的:物料出入库流水查询报表 *
* 使用变式: *
* 设 计 人: *
* 设计时间:2021-04-09 *
* 程序类型: ABAP/4 程序 ,报表 *
* 输入文件: *
* 输出文件: *
* 应用类型: MM *
* 描 述: 物料出入库流水查询报表 *
*(修改日志)--------------------------------------------------------*
* *
* 日志号 修改人 修改时间 修改说明 传输号码 *
* ---- ---- ------ -----------
* 001 *
********************************************************************
TABLES:MSEG,MARA,MKPF.
*--------------------参数定义------------------*
TYPES: BEGIN OF TY_DATA,
BUKRS TYPE MSEG-BUKRS, "公司
BUTXT TYPE T001-BUTXT, "公司名称
WERKS TYPE MSEG-WERKS, "工厂
NAME1 TYPE T001W-NAME1, "工厂名称
LGORT TYPE MSEG-LGORT, "库存地点
LGOBE TYPE T001L-LGOBE, "库存地点描述
ZCLS1 TYPE MARA-ZCLS1, "物料分类
ZCLS1_N TYPE ZTMM_MMEN_006T-ZLEVEL1T , "分类描述
MATNR TYPE MSEG-MATNR, "物料编码
MAKTX TYPE MAKT-MAKTX, "物料描述
ZCRKLX TYPE CHAR2, "出入库类型
BUDAT TYPE MKPF-BUDAT, "日期
ERFMG TYPE MSEG-ERFMG, "数量
XH TYPE ZXH, "序号
BWART TYPE MSEG-BWART, "移动类型
MENGE TYPE MSEG-ERFMG, "入库数量
ZMENGE TYPE MSEG-ERFMG, "出库数量
EISBE TYPE MARC-EISBE, "安全库存
Z_XYKC TYPE MSEG-ERFMG, "现有库存
Z_ZTKC TYPE MSEG-ERFMG, "在途库存
Z_HYTS TYPE P DECIMALS 2, "耗用天数
Z_KCTS TYPE P DECIMALS 2, "库存天数
END OF TY_DATA.
DATA:
GS_DATA TYPE TY_DATA,
GT_DATA TYPE TABLE OF TY_DATA.
DATA:
GS_DODATA TYPE TY_DATA,
GT_DODATA TYPE TABLE OF TY_DATA.
TYPES: BEGIN OF TY_CRKLX,
BWART TYPE MSEG-BWART, "移动类型
ZCRKLX TYPE CHAR2, "出入库类型
END OF TY_CRKLX.
DATA:
GS_CRKLX TYPE TY_CRKLX,
GT_CRKLX TYPE TABLE OF TY_CRKLX.
DATA:BEGIN OF ITAB8 OCCURS 0,
BUKRS TYPE MSEG-BUKRS, "公司
BUTXT TYPE T001-BUTXT, "公司名称
WERKS TYPE MSEG-WERKS, "工厂
NAME1 TYPE T001W-NAME1, "工厂名称
LGORT TYPE MSEG-LGORT, "库存地点
LGOBE TYPE T001L-LGOBE, "库存地点描述
ZCLS1 TYPE MARA-ZCLS1, "物料分类
ZCLS1_N TYPE ZTMM_MMEN_006T-ZLEVEL1T , "分类描述
MATNR TYPE MSEG-MATNR, "物料编码
MAKTX TYPE MAKT-MAKTX, "物料描述
CRKLX TYPE CHAR2, "出入库类型
BUDAT TYPE MKPF-BUDAT, "日期
ERFMG TYPE MSEG-ERFMG, "数量
XH TYPE ZXH, "序号
BWART TYPE MSEG-BWART, "移动类型
AMOUNT TYPE MSEG-ERFMG, "合计
END OF ITAB8.
DATA TDATE LIKE SY-DATUM OCCURS 0 WITH HEADER LINE.
DATA: DY_TABLE TYPE REF TO DATA,
DY_WA TYPE REF TO DATA.
FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE, "是一个标志,可以理解为一个指针,将来创建的内表就要通过它们来访问
<DYN_WA> TYPE ANY,
<FS> TYPE ANY.
DATA OREF TYPE REF TO CX_ROOT.
DATA ERR_TEXT TYPE STRING.
*--------------------用于ALV输出------------------*
DATA:GT_FIELDCAT TYPE LVC_T_FCAT,
GS_FIELDCAT TYPE LVC_S_FCAT,
GS_LAYOUT TYPE LVC_S_LAYO.
*----------------------------------------------------------------------*
*---------------------------------选择屏幕-----------------------------*
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-021.
SELECT-OPTIONS:S_BUKRS FOR MSEG-BUKRS NO INTERVALS ."公司
SELECT-OPTIONS:S_WERKS FOR MSEG-WERKS NO INTERVALS OBLIGATORY."工厂
SELECT-OPTIONS:S_LGORT FOR MSEG-LGORT NO INTERVALS."库存地点
SELECT-OPTIONS:S_BUDAT FOR MKPF-BUDAT OBLIGATORY DEFAULT '20210101' TO SY-DATUM."日期
SELECT-OPTIONS:S_MATNR FOR MSEG-MATNR ."OBLIGATORY . "物料编号
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-022.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(5) TEXT-008."入库
PARAMETERS: B1 TYPE C RADIOBUTTON GROUP G1 USER-COMMAND SELE DEFAULT 'X'. "go
SELECTION-SCREEN COMMENT 30(5) TEXT-009."出库
PARAMETERS: B2 TYPE C RADIOBUTTON GROUP G1.
SELECTION-SCREEN COMMENT 50(10) TEXT-010."出入库合计
PARAMETERS: B3 TYPE C RADIOBUTTON GROUP G1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK B2.
*---------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------
INITIALIZATION.
PERFORM FRM_DATE_DEFAULT.
*---------------------------------------------------------------------*
* AT SELECTION-SCREEN ON VALUE-REQUEST
*----------------------------------------------------------------------
AT SELECTION-SCREEN.
* 权限检查
PERFORM FRM_AUTO_CHECK.
*----------------------------------------------------------------------
* START-OF-SELECTION
*----------------------------------------------------------------------
START-OF-SELECTION.
PERFORM FRM_GET_DATA. "取到数据
PERFORM FRM_ASSIGN_DATA. "分配数据
PERFORM FRM_LAYOUT.
* PERFORM FRM_FIELDCAT.
PERFORM FRM_DISPLAY.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FILENAME
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_AUTO_CHECK.
AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
ID 'WERKS' FIELD S_WERKS.
IF SY-SUBRC <> 0.
MESSAGE '没有工厂权限' TYPE 'E'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_DATE_DEFAULT.
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DATE_DEFAULT.
* DATA lv_firstday TYPE sy-datum.
* DATA lv_lastday TYPE sy-datum.
*
* IF s_budat IS INITIAL.
* "获得当前日期的月初日期
* CONCATENATE sy-datum+0(6) '01' INTO lv_firstday.
*
* "该函数的作用是由月初日期得到当前月份的最后一天
* CALL FUNCTION 'BKK_GET_MONTH_LASTDAY'
* EXPORTING
* i_date = lv_firstday
* IMPORTING
* e_date = lv_lastday.
*
*
* s_budat-sign = 'I'.
* s_budat-option = 'BT'."BT(Between) – 上下限之间 ,NB(Not Between) – 不在上下限之间
* s_budat-low = lv_firstday.
* s_budat-high = sy-datum.
*
* APPEND s_budat TO s_budat.
* ENDIF.
* CLEAR s_budat.
ENDFORM.
FORM FRM_GET_DATA .
*&---------------------------------------------------------------------*
*& FORM FRM_GET_DATA
*&
*&---------------------------------------------------------------------*
*&
*& 获取数据
*&---------------------------------------------------------------------*
IF B1 = 'X'."物料入库
SELECT MSEG~BUKRS MSEG~WERKS MSEG~LGORT MKPF~BUDAT MSEG~MATNR MSEG~ERFMG MAKT~MAKTX MSEG~BWART
MARA~ZCLS1
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
FROM MSEG
INNER JOIN MKPF
ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INNER JOIN MAKT
ON MSEG~MATNR = MAKT~MATNR
INNER JOIN MARA
ON MSEG~MATNR = MARA~MATNR
INNER JOIN ZTMM_CRKLX_001 AS C
ON MSEG~BWART = C~BWART
WHERE MSEG~BUKRS IN S_BUKRS
AND MSEG~WERKS IN S_WERKS
AND MSEG~LGORT IN S_LGORT
AND MKPF~BUDAT IN S_BUDAT
AND MSEG~MATNR IN S_MATNR
AND MAKT~SPRAS = 1
AND C~ZCRKLX = '01'.
ELSEIF B2 = 'X'. "物料出库
SELECT MSEG~BUKRS MSEG~WERKS MSEG~LGORT MKPF~BUDAT MSEG~MATNR MSEG~ERFMG MAKT~MAKTX MSEG~BWART
MARA~ZCLS1
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
FROM MSEG
INNER JOIN MKPF
ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INNER JOIN MAKT
ON MSEG~MATNR = MAKT~MATNR
INNER JOIN MARA
ON MSEG~MATNR = MARA~MATNR
INNER JOIN ZTMM_CRKLX_001 AS C
ON MSEG~BWART = C~BWART
WHERE MSEG~BUKRS IN S_BUKRS
AND MSEG~WERKS IN S_WERKS
AND MSEG~LGORT IN S_LGORT
AND MKPF~BUDAT IN S_BUDAT
AND MSEG~MATNR IN S_MATNR
AND MAKT~SPRAS = 1
AND C~ZCRKLX = '02'.
ELSEIF B3 = 'X'."物料出入库汇总
SELECT MSEG~BUKRS MSEG~WERKS MSEG~LGORT MKPF~BUDAT MSEG~MATNR MSEG~ERFMG MAKT~MAKTX MSEG~BWART
MARA~ZCLS1
INTO CORRESPONDING FIELDS OF TABLE GT_DATA
FROM MSEG
INNER JOIN MKPF
ON MSEG~MBLNR = MKPF~MBLNR AND MSEG~MJAHR = MKPF~MJAHR
INNER JOIN MAKT
ON MSEG~MATNR = MAKT~MATNR
INNER JOIN MARA
ON MSEG~MATNR = MARA~MATNR
WHERE MSEG~BUKRS IN S_BUKRS
AND MSEG~WERKS IN S_WERKS
AND MSEG~LGORT IN S_LGORT
AND MKPF~BUDAT IN S_BUDAT
AND MSEG~MATNR IN S_MATNR
AND MAKT~SPRAS = 1.
SELECT BWART ZCRKLX INTO CORRESPONDING FIELDS OF TABLE GT_CRKLX
FROM ZTMM_CRKLX_001
WHERE ZCRKLX = '01' OR ZCRKLX = '02'.
ENDIF.
SORT GT_DATA BY BUKRS WERKS LGORT ZCLS1 MATNR BUDAT.
IF B1 = 'X' OR B2 = 'X'.
LOOP AT GT_DATA INTO GS_DATA.
IF GS_DATA-MATNR IS INITIAL.
"去掉无物料编号的数据
DELETE GT_DATA.
ELSE.
"取物料分类描述
SELECT SINGLE ZLEVEL1T
INTO GS_DATA-ZCLS1_N
FROM ZTMM_MMEN_006T WHERE ZCLS1 = GS_DATA-ZCLS1 AND SPRAS = SY-LANGU.
"取公司描述
SELECT SINGLE BUTXT
INTO GS_DATA-BUTXT
FROM T001 WHERE BUKRS = GS_DATA-BUKRS AND SPRAS = SY-LANGU.
"取工厂描述
SELECT SINGLE NAME1
INTO GS_DATA-NAME1
FROM T001W WHERE WERKS = GS_DATA-WERKS.
"取库存地点描述
SELECT SINGLE LGOBE
INTO GS_DATA-LGOBE
FROM T001L WHERE WERKS = GS_DATA-WERKS AND LGORT = GS_DATA-LGORT.
"去除前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GS_DATA-MATNR
IMPORTING
OUTPUT = GS_DATA-MATNR.
MODIFY GT_DATA FROM GS_DATA.
ENDIF.
ENDLOOP.
"按照日期汇总物料流水数量
LOOP AT GT_DATA INTO GS_DATA.
GS_DODATA-ERFMG = GS_DODATA-ERFMG + GS_DATA-ERFMG.
GS_DODATA-ZCLS1 = GS_DATA-ZCLS1.
GS_DODATA-ZCLS1_N = GS_DATA-ZCLS1_N.
GS_DODATA-MATNR = GS_DATA-MATNR.
GS_DODATA-MAKTX = GS_DATA-MAKTX.
GS_DODATA-BUKRS = GS_DATA-BUKRS.
GS_DODATA-WERKS = GS_DATA-WERKS.
GS_DODATA-LGORT = GS_DATA-LGORT.
GS_DODATA-BUTXT = GS_DATA-BUTXT.
GS_DODATA-NAME1 = GS_DATA-NAME1.
GS_DODATA-LGOBE = GS_DATA-LGOBE.
GS_DODATA-BUDAT = GS_DATA-BUDAT.
AT END OF BUDAT.
GS_DODATA-XH = GS_DODATA-XH + 1.
APPEND GS_DODATA TO GT_DODATA.
CLEAR:GS_DODATA.
ENDAT.
ENDLOOP.
* SORT GT_DODATA BY BUKRS WERKS LGORT ZCLS1 MATNR BUDAT.
ELSEIF B3 = 'X'.
LOOP AT GT_DATA INTO GS_DATA.
IF GS_DATA-MATNR IS INITIAL.
"去掉无物料编号的数据
DELETE GT_DATA.
ELSE.
READ TABLE GT_CRKLX INTO GS_CRKLX WITH KEY BWART = GS_DATA-BWART.
IF SY-SUBRC = 0.
GS_DATA-ZCRKLX = GS_CRKLX-ZCRKLX.
IF GS_DATA-ZCRKLX = '01'.
GS_DATA-MENGE = GS_DATA-ERFMG. "入库数量
ELSE.
GS_DATA-ZMENGE = GS_DATA-ERFMG." 出库数量
ENDIF.
"取物料分类描述
SELECT SINGLE ZLEVEL1T
INTO GS_DATA-ZCLS1_N
FROM ZTMM_MMEN_006T WHERE ZCLS1 = GS_DATA-ZCLS1 AND SPRAS = SY-LANGU.
"取公司描述
SELECT SINGLE BUTXT
INTO GS_DATA-BUTXT
FROM T001 WHERE BUKRS = GS_DATA-BUKRS AND SPRAS = SY-LANGU.
"取工厂描述
SELECT SINGLE NAME1
INTO GS_DATA-NAME1
FROM T001W WHERE WERKS = GS_DATA-WERKS.
"取库存地点描述
SELECT SINGLE LGOBE
INTO GS_DATA-LGOBE
FROM T001L WHERE WERKS = GS_DATA-WERKS AND LGORT = GS_DATA-LGORT.
MODIFY GT_DATA FROM GS_DATA.
ELSE.
DELETE GT_DATA.
ENDIF.
ENDIF.
ENDLOOP.
SORT GT_DATA BY BUKRS WERKS LGORT ZCLS1 MATNR ZCRKLX BUDAT.
DATA LV_XH TYPE I.
"按照物料汇总物料流水数量
LOOP AT GT_DATA INTO GS_DATA.
* GS_DODATA-ERFMG = GS_DODATA-ERFMG + GS_DATA-ERFMG.
GS_DODATA-MENGE = GS_DODATA-MENGE + GS_DATA-MENGE.
GS_DODATA-ZMENGE = GS_DODATA-ZMENGE + GS_DATA-ZMENGE.
GS_DODATA-ZCLS1 = GS_DATA-ZCLS1.
GS_DODATA-ZCLS1_N = GS_DATA-ZCLS1_N.
GS_DODATA-MATNR = GS_DATA-MATNR.
GS_DODATA-MAKTX = GS_DATA-MAKTX.
GS_DODATA-BUKRS = GS_DATA-BUKRS.
GS_DODATA-WERKS = GS_DATA-WERKS.
GS_DODATA-LGORT = GS_DATA-LGORT.
GS_DODATA-BUTXT = GS_DATA-BUTXT.
GS_DODATA-NAME1 = GS_DATA-NAME1.
GS_DODATA-LGOBE = GS_DATA-LGOBE.
GS_DODATA-ZCRKLX = GS_DATA-ZCRKLX.
AT END OF MATNR.
LV_XH = LV_XH + 1.
GS_DODATA-XH = LV_XH.
APPEND GS_DODATA TO GT_DODATA.
CLEAR : GS_DODATA.
ENDAT.
ENDLOOP.
DATA LV_DATS TYPE I.
LV_DATS = S_BUDAT-HIGH - S_BUDAT-LOW.
LOOP AT GT_DODATA INTO GS_DODATA.
SELECT SINGLE EISBE INTO @DATA(LV_EISBE) FROM MARC
WHERE WERKS = @GS_DODATA-WERKS AND MATNR = @GS_DODATA-MATNR.
IF LV_EISBE IS NOT INITIAL.
GS_DODATA-EISBE = LV_EISBE. "安全库存
ENDIF.
SELECT SINGLE LABST, INSME , SPEME INTO @DATA(LV_KC) FROM MARD
WHERE WERKS = @GS_DODATA-WERKS AND MATNR = @GS_DODATA-MATNR AND LGORT = @GS_DODATA-LGORT.
IF SY-SUBRC = 0.
GS_DODATA-Z_XYKC = LV_KC-LABST + LV_KC-INSME + LV_KC-SPEME."现有库存= 非限制+质检+冻结
ENDIF.
TRY.
GS_DODATA-Z_HYTS = GS_DODATA-Z_XYKC / ( GS_DODATA-ZMENGE / LV_DATS )."耗用天数
CATCH CX_ROOT INTO OREF.
ERR_TEXT = OREF->GET_TEXT( ).
GS_DODATA-Z_HYTS = 0.
ENDTRY.
TRY.
GS_DODATA-Z_KCTS = ( GS_DODATA-Z_XYKC + GS_DODATA-Z_ZTKC ) / ( GS_DODATA-ZMENGE / LV_DATS )."库存天数
CATCH CX_ROOT INTO OREF.
ERR_TEXT = OREF->GET_TEXT( ).
GS_DODATA-Z_KCTS = 0.
ENDTRY.
"去除前导零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = GS_DODATA-MATNR
IMPORTING
OUTPUT = GS_DODATA-MATNR.
MODIFY GT_DODATA FROM GS_DODATA.
CLEAR: GS_DODATA.
ENDLOOP.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_ASSIGN_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_ASSIGN_DATA. "分配数据
IF B1 = 'X' OR B2 = 'X'.
ITAB8[] = GT_DODATA[].
SORT ITAB8 BY BUDAT.
LOOP AT ITAB8.
TDATE = ITAB8-BUDAT.
COLLECT TDATE.
ENDLOOP.
PERFORM INPUT_FIELDCAT USING 'XH' '序号' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'BUTXT' '公司' 'C' '40' .
* PERFORM INPUT_FIELDCAT USING 'NAME1' '工厂' 'C' '40' .
PERFORM INPUT_FIELDCAT USING 'LGOBE' '库存地点' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'ZCLS1_N' '物料分类' 'C' '40' .
PERFORM INPUT_FIELDCAT USING 'MATNR' '物料编号' 'C' '20' .
* PERFORM INPUT_FIELDCAT USING 'MAKTX' '物料描述' 'C' '40' .
LOOP AT TDATE.
PERFORM INPUT_FIELDCAT USING TDATE TDATE 'P' '20' .
ENDLOOP.
PERFORM INPUT_FIELDCAT USING 'AMOUNT' '总计' 'P' '20' .
*此方法用于构建动态内表,输入=构建的结构,输出=dy_table
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
EXPORTING
IT_FIELDCATALOG = GT_FIELDCAT
IMPORTING
EP_TABLE = DY_TABLE.
ASSIGN DY_TABLE->* TO <DYN_TABLE>.
CREATE DATA DY_WA LIKE LINE OF <DYN_TABLE>.
ASSIGN DY_WA->* TO <DYN_WA>.
DATA FIELDNAME(20).
DATA LV_XH TYPE I .
DATA LV_AMOUNT TYPE MSEG-ERFMG.
SORT ITAB8 BY BUKRS WERKS LGORT ZCLS1 MATNR BUDAT .
LOOP AT ITAB8.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <DYN_WA> TO <FS>. "分配结构里的物料编号,用FS字段 指向它
<FS> = ITAB8-MATNR.
* ASSIGN COMPONENT 'MAKTX' OF STRUCTURE <DYN_WA> TO <FS>.
* <FS> = ITAB8-MAKTX.
* ASSIGN COMPONENT 'ZCLS1_N' OF STRUCTURE <DYN_WA> TO <FS>.
* <FS> = ITAB8-ZCLS1_N.
* ASSIGN COMPONENT 'BUTXT' OF STRUCTURE <DYN_WA> TO <FS>.
* <FS> = ITAB8-BUTXT.
* ASSIGN COMPONENT 'NAME1' OF STRUCTURE <DYN_WA> TO <FS>.
* <FS> = ITAB8-NAME1.
ASSIGN COMPONENT 'LGOBE' OF STRUCTURE <DYN_WA> TO <FS>.
<FS> = ITAB8-LGOBE.
FIELDNAME = ITAB8-BUDAT. "这里把日期类型定义为char型,因为用DATS报错。
ASSIGN COMPONENT FIELDNAME OF STRUCTURE <DYN_WA> TO <FS>. "分配结构的日期,将FS指向它
<FS> = ITAB8-ERFMG.
LV_AMOUNT = LV_AMOUNT + ITAB8-ERFMG.
AT END OF MATNR.
LV_XH = LV_XH + 1.
ASSIGN COMPONENT 'XH' OF STRUCTURE <DYN_WA> TO <FS>.
<FS> = LV_XH .
ASSIGN COMPONENT 'AMOUNT' OF STRUCTURE <DYN_WA> TO <FS>.
<FS> = LV_AMOUNT .
APPEND <DYN_WA> TO <DYN_TABLE>.
CLEAR: <DYN_WA>,LV_AMOUNT.
ENDAT.
ENDLOOP.
ELSEIF B3 = 'X'.
PERFORM INPUT_FIELDCAT USING 'XH' '序号' '' '' .
PERFORM INPUT_FIELDCAT USING 'BUTXT' '公司' '' '' .
PERFORM INPUT_FIELDCAT USING 'NAME1' '工厂' '' '' .
PERFORM INPUT_FIELDCAT USING 'LGOBE' '库存地点' '' '' .
PERFORM INPUT_FIELDCAT USING 'ZCLS1_N' '物料分类' '' '' .
PERFORM INPUT_FIELDCAT USING 'MATNR' '物料编号' '' '' .
PERFORM INPUT_FIELDCAT USING 'MAKTX' '物料描述' '' '' .
PERFORM INPUT_FIELDCAT USING 'MENGE' '入库总计' '' '' .
PERFORM INPUT_FIELDCAT USING 'ZMENGE' '出库总计' '' '' .
PERFORM INPUT_FIELDCAT USING 'Z_XYKC' '现有库存总计' '' '' .
PERFORM INPUT_FIELDCAT USING 'Z_ZTKC' '在途库存' '' '' .
PERFORM INPUT_FIELDCAT USING 'EISBE' '安全库存' '' '' .
PERFORM INPUT_FIELDCAT USING 'Z_HYTS' '耗用天数' '' '' .
PERFORM INPUT_FIELDCAT USING 'Z_KCTS' '库存天数' '' '' .
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_LAYOUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_LAYOUT .
GS_LAYOUT-ZEBRA = 'X'.
GS_LAYOUT-CWIDTH_OPT = 'X'.
GS_LAYOUT-SEL_MODE = 'C'.
GS_LAYOUT-NO_ROWMARK = 'C'.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM INPUT_FIELDCAT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM INPUT_FIELDCAT USING
P_FIELDNAME TYPE ANY
P_SCRTEXT_L TYPE ANY
P_INTTYPE TYPE ANY
P_INTLEN TYPE ANY.
GS_FIELDCAT-FIELDNAME = P_FIELDNAME.
GS_FIELDCAT-SCRTEXT_L = P_SCRTEXT_L.
GS_FIELDCAT-INTTYPE = P_INTTYPE.
GS_FIELDCAT-INTLEN = P_INTLEN.
GS_FIELDCAT-DECIMALS_O = 2.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
ENDFORM. " FRM_EDIT_FIELDCAT
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY .
IF B1 = 'X' OR B2 = 'X'.
* ALV函数输出
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_SAVE = 'A'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'FRM_GUI_SET'
TABLES
T_OUTTAB = <DYN_TABLE>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ELSEIF B3 = 'X'.
* ALV函数输出
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
IS_LAYOUT_LVC = GS_LAYOUT
IT_FIELDCAT_LVC = GT_FIELDCAT
I_SAVE = 'A'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'FRM_GUI_SET'
TABLES
T_OUTTAB = GT_DODATA[]
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDIF.
ENDFORM.
"功能状态设置
FORM FRM_GUI_SET USING RT_EXTAB TYPE SLIS_T_EXTAB. "×#####form
SET PF-STATUS 'STATUS'.
ENDFORM.
"用户命令
FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: GV_GRID TYPE REF TO CL_GUI_ALV_GRID .
*--------------------刷新-------------------*
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GV_GRID.
CALL METHOD GV_GRID->CHECK_CHANGED_DATA.
CALL METHOD GV_GRID->REFRESH_TABLE_DISPLAY.
RS_SELFIELD-REFRESH = 'X'.
CASE R_UCOMM.
WHEN 'BACK'."返回
LEAVE TO SCREEN 0.
WHEN 'EXIT'."退出
LEAVE PROGRAM.
WHEN OTHERS.
ENDCASE.
CALL METHOD GV_GRID->REFRESH_TABLE_DISPLAY.
ENDFORM.
post SAP-Garson
原文链接:https://blog.csdn.net/weixin_50324186/article/details/116998789文章来自于网络,如果侵犯了您的权益,请联系站长删除!