1.技术需求
接口或者BAPI传输数据日志保存。
2.技术实现
确认系统内有没有下列对象:
R3TR PROG ZFMPARAVALDELETE
R3TR PROG ZFMPARAVALREAD
R3TR PROG ZFMPARAVALSAVE
R3TR TABL ZFMPARAVALSAVE
R3TR TABL ZFMPARAVALSAVEL
如果有,请不要进行下面的步骤,否则将被覆盖。(程序和表格再后面附上)
修改需要添加Log的函数,普通函数或者Remote函数都可以。
2.1 在函数的TOP文件添加语句: INCLUDE zfmparavalsave.
2.2 在函数内添加语句:
.
后面为本函数的函数名,每个函数在最上面只需定义一次。
Zfmparavalsave2后面为备注,放到程序中每个需要记录数据的位置,记录数据即为程序执行到这个点的时候各个参数的值。
可以有多个zfmparavalsave2 语句
RTYPE和RTMSG为两个特殊参数,值会反应到查看程序的抬头上。
所以如果有返回状态和返回文本,请用RTYPE和RTMSG命名。
2.3完整的测试程序:
ZFMPARAVALREAD读取Log程序(内有彩蛋一枚)
函数名+日期+时间戳 相同的为一次调用,计数器标明此行数据为函数内的第几次保存数据,备注的值即为zfmparavalsave2后面的值,一般B代表函数的开始,参数数据为传入数据,R代表函数执行完毕返回。
如果需要内表数据,可以点击“下载”下载为制表符分隔的文本文件
如果要搜索指定参数的值(支持内表内任何字段包含此字符串):
如果不想记录某个函数的数据,请SM30维护表:ZFMPARAVALSAVEL
函数名+备注
如图,ZTEST02的zfmparavalsave2 ‘R’. 不再记录数据。
但是zfmparavalsave2 ‘B’ .还是记录数据。
删除Log程序:ZFMPARAVALDELETE
3.附件-程序
3.1 R3TR TABL ZFMPARAVALSAVE
3.2 R3TR TABL ZFMPARAVALSAVEL
3.3 R3TR PROG ZFMPARAVALDELETE
*& Report ZFMPARAVALSAVE_DEL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFMPARAVALSAVE_DEL.
tables:ZFMPARAVALSAVE.
SELECT-OPTIONS S_ERDAT FOR ZFMPARAVALSAVE-ERDAT.
START-OF-SELECTION.
delete from ZFMPARAVALSAVE where erdat IN S_ERDAT.
commit work.
3.4 ZFMLOGC
*&---------------------------------------------------------------------*
*& REPORT ZFMLOGC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFMLOGC.
TABLES:ZFMPARAVALSAVE.
SELECTION-SCREEN BEGIN OF BLOCK TEXT WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:S_ERDAT FOR ZFMPARAVALSAVE-ERDAT,
S_NAME FOR ZFMPARAVALSAVE-NAME .
SELECTION-SCREEN END OF BLOCK TEXT.
IF SY-BATCH = ''."前台
IF S_ERDAT IS INITIAL.
MESSAGE '请选择需要删除的日期' TYPE 'E'.
ENDIF.
ELSE."后台
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
DATE = SY-DATUM
DAYS = '0'
MONTHS = '2'
SIGNUM = '-'
YEARS = '0'
IMPORTING
CALC_DATE = S_ERDAT-HIGH.
S_ERDAT-LOW = '20160101'.
S_ERDAT-SIGN = 'I'.
S_ERDAT-OPTION = 'BT'.
APPEND S_ERDAT.
ENDIF.
DELETE FROM ZFMPARAVALSAVE WHERE ERDAT IN S_ERDAT AND NAME IN S_NAME.
3.5 R3TR PROG ZFMPARAVALREAD
*&---------------------------------------------------------------------*
*& REPORT ZFMLOGA
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFMLOGA NO STANDARD PAGE HEADING LINE-SIZE 1023..
TABLES: ZFMPARAVALSAVE,FUPARAREF,TFDIR,DD40L,USR02.
DATA: BEGIN OF IT_OUT OCCURS 0,
AREA LIKE ZFMPARAVALSAVE-AREA,
NAME LIKE ZFMPARAVALSAVE-NAME,
ERDAT LIKE ZFMPARAVALSAVE-ERDAT,
STAMP LIKE ZFMPARAVALSAVE-STAMP,
INDX LIKE ZFMPARAVALSAVE-INDX,
PARA LIKE ZFMPARAVALSAVE-PARA,
ERNAM LIKE ZFMPARAVALSAVE-ERNAM,
MEMO LIKE ZFMPARAVALSAVE-MEMO,
RTYPE LIKE ZFMPARAVALSAVE-RTYPE,
RTMSG LIKE ZFMPARAVALSAVE-RTMSG,
FLAG ,
END OF IT_OUT.
DATA: OK_CODE LIKE SY-UCOMM,
SAVE_OK LIKE SY-UCOMM.
DATA: GO_GRID TYPE REF TO CL_GUI_ALV_GRID,
GO_CONT TYPE REF TO CL_GUI_DOCKING_CONTAINER,
GRID_FLDCAT TYPE LVC_T_FCAT WITH HEADER LINE,
GRID_VARINT TYPE DISVARIANT,
GRID_LAYOUT TYPE LVC_S_LAYO,
SELECTED_ROWS TYPE LVC_T_ROID WITH HEADER LINE,
LS_STABLE TYPE LVC_S_STBL.
DATA: LIST_LAYOUT TYPE SLIS_LAYOUT_ALV,
LIST_PRINT TYPE SLIS_PRINT_ALV,
LIST_STRUC LIKE DD02L-TABNAME,
LIST_FLDCAT TYPE SLIS_T_FIELDCAT_ALV WITH HEADER LINE.
DATA: HEADER TYPE HEADER_FB,
TABLES_GD TYPE RSFB_PARA WITH HEADER LINE,
IMPORT_GD TYPE RSFB_PARA WITH HEADER LINE,
EXPORT_GD TYPE RSFB_PARA WITH HEADER LINE,
CHANGE_GD TYPE RSFB_PARA WITH HEADER LINE.
DATA: BEGIN OF KEYSTR,
NAME LIKE ZFMPARAVALSAVE-NAME,
ERDAT LIKE ZFMPARAVALSAVE-ERDAT,
STAMP LIKE ZFMPARAVALSAVE-STAMP,
INDX LIKE ZFMPARAVALSAVE-INDX,
PARA LIKE ZFMPARAVALSAVE-PARA,
END OF KEYSTR.
DATA: DTYPE ,
FINDFLAG,
STR TYPE STRING,
DDATA TYPE REF TO DATA,
TABIX LIKE SY-TABIX,
DATUM LIKE SY-DATUM,
HIDEPARA LIKE ZFMPARAVALSAVE-PARA.
DATA: BEGIN OF IT_INDX OCCURS 0,
INDX LIKE IT_OUT-INDX,
END OF IT_INDX.
DATA IT_EXTAB TYPE SLIS_T_EXTAB.
DATA WHERE_TAB(80) OCCURS 0 WITH HEADER LINE.
DATA DYFIELDS LIKE TABLE OF DYNPREAD WITH HEADER LINE.
DATA: BEGIN OF IT_PARA OCCURS 0,
PARA LIKE ZFMPARAVALSAVE-PARA,
END OF IT_PARA.
FIELD-SYMBOLS: <FS> TYPE ANY,
<FS_TABLE> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY,
<FS_FIELD> TYPE ANY.
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED .
DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
*---------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER DEFINITION
*---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_DOUBLE_CLICK
FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID
IMPORTING E_ROW E_COLUMN ES_ROW_NO.
ENDCLASS. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_DOUBLE_CLICK.
PERFORM ATDOUBLECLICK USING E_ROW E_COLUMN ES_ROW_NO.
ENDMETHOD. "handle_double_click
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE T1.
SELECT-OPTIONS: S_AREA FOR IT_OUT-AREA ,
S_NAME FOR TFDIR-FUNCNAME,
S_ERDAT FOR ZFMPARAVALSAVE-ERDAT,
S_STAMP FOR ZFMPARAVALSAVE-STAMP ,
S_INDX FOR ZFMPARAVALSAVE-INDX ,
S_MEMO FOR ZFMPARAVALSAVE-MEMO ,
S_ERNAM FOR USR02-BNAME ,
S_RTYPE FOR ZFMPARAVALSAVE-RTYPE,
S_RTMSG FOR ZFMPARAVALSAVE-RTMSG.
SELECTION-SCREEN END OF BLOCK B1.
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE T2.
PARAMETER: P_NAME LIKE TFDIR-FUNCNAME ,
P_PARA LIKE ZFMPARAVALSAVE-PARA,
P_VALUE(80).
SELECTION-SCREEN END OF BLOCK B2.
INITIALIZATION.
T1 = '选择数据'.
T2 = '补充选择'.
LS_STABLE-ROW = 'X'.
LS_STABLE-COL = 'X'.
LIST_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
LIST_LAYOUT-LIST_APPEND = 'X'.
LIST_LAYOUT-NO_KEYFIX = 'X'.
LIST_PRINT-NO_NEW_PAGE = 'X'.
GRID_VARINT-REPORT = SY-REPID.
GRID_VARINT-HANDLE = 1.
DATUM = SY-DATUM ."默认当天
CONCATENATE 'IBT' DATUM SY-DATUM INTO STR.
APPEND STR TO S_ERDAT.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_PARA.
CLEAR: DYFIELDS[], DYFIELDS.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SY-CPROG
DYNUMB = SY-DYNNR
REQUEST = 'A'
TABLES
DYNPFIELDS = DYFIELDS.
READ TABLE DYFIELDS WITH KEY FIELDNAME = 'P_NAME'.
IF DYFIELDS-FIELDVALUE IS INITIAL.
MESSAGE S000(OO) DISPLAY LIKE 'E' WITH '先填写函数名'.
EXIT.
ENDIF.
TRANSLATE DYFIELDS-FIELDVALUE TO UPPER CASE.
CLEAR IT_PARA[].
SELECT PARAMETER INTO TABLE IT_PARA
FROM FUPARAREF
WHERE FUNCNAME = DYFIELDS-FIELDVALUE AND
PARAMTYPE <> 'T' AND
R3STATE = 'A'.
* ORDER BY paramtype DESCENDING pposition.
SELECT PARAMETER APPENDING TABLE IT_PARA
FROM FUPARAREF
WHERE FUNCNAME = DYFIELDS-FIELDVALUE AND
PARAMTYPE = 'T' AND
R3STATE = 'A'.
* ORDER BY paramtype pposition.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'PARA'
DYNPPROG = SY-REPID
DYNPNR = SY-DYNNR
DYNPROFIELD = 'P_PARA'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = IT_PARA
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
AT USER-COMMAND.
CASE SY-UCOMM.
WHEN 'PRE'.
SORT IT_INDX BY INDX DESCENDING.
LOOP AT IT_INDX WHERE INDX < IT_OUT-INDX.
EXIT.
ENDLOOP.
WHEN 'NEXT'.
SORT IT_INDX BY INDX.
LOOP AT IT_INDX WHERE INDX > IT_OUT-INDX.
EXIT.
ENDLOOP.
ENDCASE.
IF SY-SUBRC = 0.
IT_OUT-INDX = IT_INDX-INDX.
PERFORM SHOW_DATA USING IT_OUT.
PERFORM SET_STATUS.
SY-LSIND = 0 .
ELSE.
MESSAGE S000(OO) WITH '没有找到'.
ENDIF.
AT LINE-SELECTION.
CHECK HIDEPARA IS NOT INITIAL.
PERFORM DOWNTABLE.
START-OF-SELECTION.
IF P_NAME = '' AND P_PARA <> '' OR
P_NAME <> '' AND P_PARA = '' .
MESSAGE S000(OO) DISPLAY LIKE 'E' WITH '附加条件需输入完整'.
RETURN.
ENDIF.
PERFORM GETDATA.
CALL SCREEN 9000.
*&---------------------------------------------------------------------*
*& FORM GETDATA
*&---------------------------------------------------------------------*
FORM GETDATA.
CLEAR IT_OUT[].
IF P_PARA IS INITIAL.
SELECT DISTINCT AREA NAME ERDAT STAMP INDX ERNAM MEMO RTYPE RTMSG
INTO CORRESPONDING FIELDS OF TABLE IT_OUT
FROM ZFMPARAVALSAVE
WHERE RELID = 'FL' AND
NAME IN S_NAME AND
AREA IN S_AREA AND
ERDAT IN S_ERDAT AND
STAMP IN S_STAMP AND
INDX IN S_INDX AND
ERNAM IN S_ERNAM AND
MEMO IN S_MEMO AND
RTYPE IN S_RTYPE AND
RTMSG IN S_RTMSG .
ELSE.
SELECT AREA NAME ERDAT STAMP INDX PARA AS PARA
ERNAM MEMO RTYPE RTMSG
INTO CORRESPONDING FIELDS OF TABLE IT_OUT
FROM ZFMPARAVALSAVE
WHERE RELID = 'FL' AND
NAME IN S_NAME AND
AREA IN S_AREA AND
ERDAT IN S_ERDAT AND
STAMP IN S_STAMP AND
INDX IN S_INDX AND
ERNAM IN S_ERNAM AND
MEMO IN S_MEMO AND
RTYPE IN S_RTYPE AND
RTMSG IN S_RTMSG AND
NAME = P_NAME AND
PARA = P_PARA.
SELECT SINGLE * FROM FUPARAREF
WHERE FUNCNAME = P_NAME AND R3STATE = 'A' AND PARAMETER = P_PARA.
IF FUPARAREF-STRUCTURE IS INITIAL.
FUPARAREF-STRUCTURE = 'CHAR100'.
ENDIF.
IF FUPARAREF-PARAMTYPE = 'T'.
CREATE DATA DDATA TYPE TABLE OF (FUPARAREF-STRUCTURE).
ELSE.
CREATE DATA DDATA TYPE (FUPARAREF-STRUCTURE).
ENDIF.
ASSIGN DDATA->* TO <FS>.
LOOP AT IT_OUT.
CLEAR FINDFLAG.
KEYSTR-NAME = IT_OUT-NAME.
KEYSTR-ERDAT = IT_OUT-ERDAT.
KEYSTR-STAMP = IT_OUT-STAMP.
KEYSTR-INDX = IT_OUT-INDX.
KEYSTR-PARA = IT_OUT-PARA.
IMPORT <FS> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
DESCRIBE FIELD <FS> TYPE DTYPE.
IF DTYPE = 'h'.
ASSIGN <FS> TO <FS_TABLE>.
LOOP AT <FS_TABLE> ASSIGNING <FS_WA>.
DO .
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <FS_WA> TO <FS_FIELD>.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
STR = <FS_FIELD>.
TRANSLATE STR TO UPPER CASE.
IF STR CS P_VALUE.
FINDFLAG = 'X'.
EXIT.
ENDIF.
ENDDO.
IF FINDFLAG = 'X'.
EXIT.
ENDIF.
ENDLOOP.
ELSEIF DTYPE = 'u'. "结构
ASSIGN <FS> TO <FS_WA>.
DO .
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <FS_WA> TO <FS_FIELD>.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
STR = <FS_FIELD>.
TRANSLATE STR TO UPPER CASE.
IF STR CS P_VALUE.
FINDFLAG = 'X'.
EXIT.
ENDIF.
ENDDO.
ELSEIF DTYPE = 'v'. "深层内表
MESSAGE S000(OO) DISPLAY LIKE 'E' WITH '不支持深层内表参数'.
STOP.
ELSE.
STR = <FS>.
TRANSLATE STR TO UPPER CASE.
IF STR CS P_VALUE.
FINDFLAG = 'X'.
ENDIF.
ENDIF.
IF FINDFLAG = ''.
DELETE IT_OUT.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. "getdata
*&---------------------------------------------------------------------*
*& MODULE STATUS_9000 OUTPUT
*&---------------------------------------------------------------------*
MODULE STATUS_9000 OUTPUT.
SET PF-STATUS 'STANDARD'.
SET TITLEBAR 'T100' WITH '查看、管理函数的参数数据'.
GRID_LAYOUT-ZEBRA = 'X'.
GRID_LAYOUT-SEL_MODE = 'D'.
IF GO_GRID IS INITIAL.
GRID_LAYOUT-GRID_TITLE = LINES( IT_OUT ) .
CONDENSE GRID_LAYOUT-GRID_TITLE.
CONCATENATE '条目数:' GRID_LAYOUT-GRID_TITLE INTO GRID_LAYOUT-GRID_TITLE.
PERFORM FRM_CATLG_SET USING: 'AREA' '函数组',
'NAME' '函数',
'ERDAT' '日期',
'STAMP' '时间戳',
'INDX' '计数器',
'ERNAM' '用户',
'MEMO' '备注',
'RTYPE' 'RTYPE',
'RTMSG' 'RTMSG'.
GO_CONT = NEW CL_GUI_DOCKING_CONTAINER(
REPID = SY-REPID
DYNNR = '9000'
EXTENSION = 2050
SIDE = CL_GUI_DOCKING_CONTAINER=>PROPERTY_FLOATING ).
CREATE OBJECT GO_GRID
EXPORTING
I_PARENT = GO_CONT.
CREATE OBJECT EVENT_RECEIVER.
SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR GO_GRID.
CALL METHOD GO_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
I_SAVE = 'A'
IS_VARIANT = GRID_VARINT
IS_LAYOUT = GRID_LAYOUT
CHANGING
IT_OUTTAB = IT_OUT[]
IT_FIELDCATALOG = GRID_FLDCAT[]
EXCEPTIONS
INVALID_PARAMETER_COMBINATION = 1
PROGRAM_ERROR = 2
TOO_MANY_LINES = 3
OTHERS = 4.
ENDIF.
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = GO_GRID.
ENDMODULE. " STATUS_0100 OUTPUT
*---------------------------------------------------------------------*
* FORM FRM_CATLG_SET *
*---------------------------------------------------------------------*
FORM FRM_CATLG_SET USING P_FIELD P_TEXT .
GRID_FLDCAT-FIELDNAME = P_FIELD.
GRID_FLDCAT-SCRTEXT_L = P_TEXT.
IF P_FIELD = 'INDX' .
GRID_FLDCAT-NO_MERGING = 'X'.
ENDIF.
APPEND GRID_FLDCAT .CLEAR GRID_FLDCAT.
ENDFORM. " FRM_CATLG_SET
*&---------------------------------------------------------------------*
*& MODULE USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
SAVE_OK = OK_CODE.
CLEAR OK_CODE.
CASE SAVE_OK.
WHEN 'BACK' OR 'CANCEL'.
LEAVE TO SCREEN 0 .
WHEN 'REFRESH'.
PERFORM GETDATA.
PERFORM REFRESH_GRID.
WHEN 'DEL'.
CALL METHOD GO_GRID->GET_SELECTED_ROWS
IMPORTING
ET_ROW_NO = SELECTED_ROWS[].
IF SELECTED_ROWS[] IS INITIAL.
MESSAGE S000(OO) WITH '至少选择一行'.
ELSE.
PERFORM DB_DELETE .
DELETE IT_OUT WHERE FLAG = 'X'.
PERFORM REFRESH_GRID.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& FORM REFRESH_GRID
*&---------------------------------------------------------------------*
FORM REFRESH_GRID.
GRID_LAYOUT-GRID_TITLE = LINES( IT_OUT ) .
CONDENSE GRID_LAYOUT-GRID_TITLE.
CONCATENATE '条目数:' GRID_LAYOUT-GRID_TITLE INTO GRID_LAYOUT-GRID_TITLE.
CALL METHOD GO_GRID->SET_FRONTEND_LAYOUT
EXPORTING
IS_LAYOUT = GRID_LAYOUT.
CALL METHOD GO_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = LS_STABLE
EXCEPTIONS
FINISHED = 1
OTHERS = 2.
ENDFORM. "user_command_0100 INPUT
*&---------------------------------------------------------------------*
*& FORM DB_DELETE
*&---------------------------------------------------------------------*
FORM DB_DELETE .
* LOOP AT it_out.
* READ TABLE SELECTED_ROWS WITH KEY ROW_ID = SY-TABIX.
* CHECK SY-SUBRC = 0.
*
* DELETE FROM ZFMDATA
* WHERE RELID = 'FL' AND NAME = IT_OUT-NAME AND STAMP = IT_OUT-STAMP.
* IT_OUT-FLAG = 'X'.
* MODIFY IT_OUT.
* ENDLOOP.
DATA: TABIX LIKE SY-TABIX.
LOOP AT SELECTED_ROWS.
READ TABLE IT_OUT INDEX SELECTED_ROWS-ROW_ID.
TABIX = SY-TABIX.
DELETE FROM ZFMPARAVALSAVE
WHERE RELID = 'FL' AND NAME = IT_OUT-NAME AND
STAMP = IT_OUT-STAMP AND INDX = IT_OUT-INDX.
IT_OUT-FLAG = 'X'.
MODIFY IT_OUT INDEX TABIX.
ENDLOOP.
ENDFORM. "db_delete
*&---------------------------------------------------------------------*
*& FORM ATDOUBLECLICK
*&---------------------------------------------------------------------*
FORM ATDOUBLECLICK USING P_E_ROW TYPE LVC_S_ROW P_E_COLUMN P_ES_ROW_NO.
READ TABLE IT_OUT INDEX P_E_ROW-INDEX.
CASE P_E_COLUMN.
WHEN 'NAME'.
PERFORM TO_TESTDATA USING IT_OUT.
SELECT SINGLE * FROM TFDIR WHERE FUNCNAME = IT_OUT-NAME .
CONCATENATE 'L' IT_OUT-AREA 'U' TFDIR-INCLUDE INTO TFDIR-PNAME.
CALL FUNCTION 'EDITOR_PROGRAM'
EXPORTING
DISPLAY = 'X'
PROGRAM = TFDIR-PNAME
EXCEPTIONS
OTHERS = 1.
WHEN 'STAMP' OR 'INDX' OR 'ERNAM' OR 'MEMO' OR 'RTYPE' OR 'RTMSG'.
CLEAR IT_INDX[].
SELECT INDX INTO TABLE IT_INDX
FROM ZFMPARAVALSAVE
WHERE RELID = 'FL' AND NAME = IT_OUT-NAME AND
ERDAT = IT_OUT-ERDAT AND STAMP = IT_OUT-STAMP.
PERFORM SHOW_DATA USING IT_OUT.
PERFORM SET_STATUS.
LEAVE TO LIST-PROCESSING .
SUPPRESS DIALOG.
WHEN OTHERS.
ENDCASE.
ENDFORM. " atdoubleclick
*&---------------------------------------------------------------------*
*& FORM READ_DB
*&---------------------------------------------------------------------*
FORM SHOW_DATA USING IT_OUT STRUCTURE IT_OUT.
HEADER-NAME = IT_OUT-NAME .
HEADER-STATE = 'A'.
CALL METHOD CL_FB_PARAMETER_DB=>READ
IMPORTING
TABLES = TABLES_GD[]
IMPORT = IMPORT_GD[]
EXPORT = EXPORT_GD[]
CHANGE = CHANGE_GD[]
CHANGING
HEADER = HEADER.
KEYSTR-NAME = IT_OUT-NAME.
KEYSTR-ERDAT = IT_OUT-ERDAT.
KEYSTR-STAMP = IT_OUT-STAMP.
KEYSTR-INDX = IT_OUT-INDX.
FORMAT INTENSIFIED OFF.
WRITE : '函数:', IT_OUT-NAME, IT_OUT-ERDAT ,IT_OUT-STAMP,IT_OUT-INDX.
SKIP .
IF IMPORT_GD[] IS NOT INITIAL.
WRITE / '导入参数:'.
PERFORM OUT_FBPARA TABLES IMPORT_GD USING ''.
ENDIF.
IF EXPORT_GD[] IS NOT INITIAL.
WRITE / '导出参数:'.
PERFORM OUT_FBPARA TABLES EXPORT_GD USING ''.
ENDIF.
IF CHANGE_GD[] IS NOT INITIAL.
WRITE / '更改参数:' .
PERFORM OUT_FBPARA TABLES CHANGE_GD USING ''.
ENDIF.
IF TABLES_GD[] IS NOT INITIAL.
WRITE: / '内表:' .
PERFORM OUT_FBPARA TABLES TABLES_GD USING 'T'.
ENDIF.
CLEAR HIDEPARA.
ENDFORM. "show_data
*&---------------------------------------------------------------------*
*& FORM ALLPARA
*&---------------------------------------------------------------------*
FORM OUT_FBPARA TABLES INTAB STRUCTURE RSFBPARA USING PTYPE.
DATA: CXROOT TYPE REF TO CX_ROOT,
EXCMSG TYPE STRING.
LOOP AT INTAB.
WRITE / INTAB-PARAMETER COLOR 1 .
IF PTYPE = 'T'.
HIDEPARA = INTAB-PARAMETER.
WRITE '下载' HOTSPOT COLOR 1 INVERSE ON .HIDE HIDEPARA.
ENDIF.
IF INTAB-STRUCTURE IS INITIAL.
INTAB-STRUCTURE = 'CHAR100'.
ENDIF.
IF PTYPE = ''.
CREATE DATA DDATA TYPE (INTAB-STRUCTURE).
ELSE.
CREATE DATA DDATA TYPE TABLE OF (INTAB-STRUCTURE).
ENDIF.
ASSIGN DDATA->* TO <FS>.
CHECK SY-SUBRC = 0.
KEYSTR-PARA = INTAB-PARAMETER.
TRY.
IMPORT <FS> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
CATCH CX_ROOT INTO CXROOT.
EXCMSG = CXROOT->GET_TEXT( ).
WRITE '参数所存数据与当前定义不同' COLOR 6.
CONTINUE.
ENDTRY.
IF SY-SUBRC <> 0 .
WRITE '数据保存时尚无此参数' COLOR 6.
CONTINUE.
ENDIF.
PERFORM WRITE_PARA USING INTAB.
ENDLOOP.
SKIP.
ENDFORM. "out_fbpara
*&---------------------------------------------------------------------*
*& FORM OUTLIST
*&---------------------------------------------------------------------*
FORM WRITE_PARA USING WA_REFB TYPE RSFBPARA .
DESCRIBE FIELD <FS> TYPE DTYPE.
CASE DTYPE.
WHEN 'v'. "深层内表
WRITE '不支持深层内表查看' COLOR 3.
WHEN 'u'. "结构
PERFORM WRITE_WA USING WA_REFB.
WHEN 'h' . "内表
SELECT SINGLE * FROM DD40L WHERE TYPENAME = WA_REFB-STRUCTURE.
IF SY-SUBRC = 0 . "如果是表格类型
LIST_STRUC = DD40L-ROWTYPE.
ELSE.
LIST_STRUC = WA_REFB-STRUCTURE.
ENDIF.
CLEAR LIST_FLDCAT[].
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
I_PROGRAM_NAME = SY-REPID
I_STRUCTURE_NAME = LIST_STRUC
CHANGING
CT_FIELDCAT = LIST_FLDCAT[]
EXCEPTIONS
OTHERS = 3.
LOOP AT LIST_FLDCAT.
LIST_FLDCAT-NO_CONVEXT = 'X'.
MODIFY LIST_FLDCAT.
ENDLOOP.
ASSIGN <FS> TO <FS_TABLE>.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
IT_FIELDCAT = LIST_FLDCAT[]
IS_LAYOUT = LIST_LAYOUT
IS_PRINT = LIST_PRINT
TABLES
T_OUTTAB = <FS_TABLE>
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
FORMAT INTENSIFIED OFF.
WHEN OTHERS.
WRITE <FS> COLOR 2 USING NO EDIT MASK.
ENDCASE.
ENDFORM. "write_para
*&---------------------------------------------------------------------*
*& FORM WRITE_WA
*&---------------------------------------------------------------------*
FORM WRITE_WA USING WA_REFB TYPE RSFBPARA.
DATA: STR TYPE STRING,
CHAR(256),
ULEN TYPE I.
DO .
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <FS> TO <FS_FIELD>.
IF SY-SUBRC <> 0. EXIT. ENDIF.
WRITE <FS_FIELD> TO CHAR LEFT-JUSTIFIED USING NO EDIT MASK .
ULEN = ULEN + CL_ABAP_LIST_UTILITIES=>DYNAMIC_OUTPUT_LENGTH( CHAR ) + 1.
ENDDO.
ULEN = ULEN + 1 .
WRITE AT /(ulen) SY-ULINE . NEW-LINE.
DO .
ASSIGN COMPONENT SY-INDEX OF STRUCTURE <FS> TO <FS_FIELD>.
IF SY-SUBRC <> 0 .
EXIT.
ELSE.
WRITE <FS_FIELD> TO CHAR LEFT-JUSTIFIED USING NO EDIT MASK .
STR = CHAR.
WRITE : '|' NO-GAP, STR LEFT-JUSTIFIED NO-GAP USING NO EDIT MASK COLOR 2.
ENDIF.
ENDDO.
WRITE '|' NO-GAP.
WRITE AT /(ulen) SY-ULINE .
ENDFORM. "write_wa
*&---------------------------------------------------------------------*
*& FORM WRITE_TESTDATA
*&---------------------------------------------------------------------*
FORM TO_TESTDATA USING IT_OUT STRUCTURE IT_OUT.
DATA : BEGIN OF TE_DATADIR OCCURS 10,
DATAID LIKE EUFUNC-NUMMER,
STEPID(3),
SEQID LIKE EUFUNC-SEQID,
DATUM LIKE SY-DATUM,
UZEIT LIKE SY-UZEIT,
TITLE(40),
END OF TE_DATADIR.
DATA: FT_PROG TYPE TRDIR-NAME,
FT_PARA(100),
HEADER TYPE HEADER_FB.
FIELD-SYMBOLS: <LV_PARAFLD> TYPE ANY,
<LT_PARAFLD> TYPE ANY TABLE,
<LT_PARAVAL> TYPE ANY TABLE,
<LT_DATADIR> LIKE TE_DATADIR[],
<LS_DATADIR> LIKE TE_DATADIR.
HEADER-NAME = IT_OUT-NAME .
HEADER-STATE = 'A'.
CALL METHOD CL_FB_PARAMETER_DB=>READ
IMPORTING
TABLES = TABLES_GD[]
IMPORT = IMPORT_GD[]
EXPORT = EXPORT_GD[]
CHANGE = CHANGE_GD[]
CHANGING
HEADER = HEADER.
KEYSTR-NAME = IT_OUT-NAME.
KEYSTR-ERDAT = IT_OUT-ERDAT.
KEYSTR-STAMP = IT_OUT-STAMP.
KEYSTR-INDX = IT_OUT-INDX.
PERFORM CHECK_REPORT_GENERATE(SAPLSEUJ) USING IT_OUT-NAME. "检查FT程序是否存在
FT_PROG = IT_OUT-NAME.
TRANSLATE FT_PROG USING ' ='.
FT_PROG+30 = 'FT'.
PERFORM (SPACE) IN PROGRAM (FT_PROG) IF FOUND.
LOOP AT IMPORT_GD .
CONCATENATE '(' FT_PROG ')%_I' IMPORT_GD-PARAMETER INTO FT_PARA.
ASSIGN (FT_PARA) TO <LV_PARAFLD>.
CHECK SY-SUBRC = 0.
KEYSTR-PARA = IMPORT_GD-PARAMETER.
IMPORT <FS> = <LV_PARAFLD> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
ENDLOOP.
LOOP AT CHANGE_GD .
CONCATENATE '(' FT_PROG ')%_I' CHANGE_GD-PARAMETER INTO FT_PARA.
ASSIGN (FT_PARA) TO <LV_PARAFLD>.
CHECK SY-SUBRC = 0.
KEYSTR-PARA = CHANGE_GD-PARAMETER.
IMPORT <FS> = <LV_PARAFLD> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
ENDLOOP.
LOOP AT TABLES_GD .
CONCATENATE '(' FT_PROG ')%_I' TABLES_GD-PARAMETER '[]' INTO FT_PARA.
ASSIGN (FT_PARA) TO <LT_PARAFLD>.
CHECK SY-SUBRC = 0.
KEYSTR-PARA = TABLES_GD-PARAMETER.
IMPORT <FS> = <LT_PARAFLD> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
ENDLOOP.
PERFORM DB_IMPORT_DATADIR(SAPLSEUJ) USING IT_OUT-AREA IT_OUT-NAME '999' 'X'.
ASSIGN ('(SAPLSEUJ)TE_DATADIR[]') TO <LT_DATADIR>.
LOOP AT <LT_DATADIR> ASSIGNING <LS_DATADIR>.
IF TE_DATADIR-DATAID < <LS_DATADIR>-DATAID.
TE_DATADIR-DATAID = <LS_DATADIR>-DATAID.
ENDIF.
ENDLOOP.
TE_DATADIR-DATAID = TE_DATADIR-DATAID + 1.
CONCATENATE IT_OUT-ERDAT ` ` IT_OUT-STAMP ` ` IT_OUT-INDX ` ` SY-UNAME
INTO TE_DATADIR-TITLE.
TE_DATADIR-DATUM = SY-DATUM.
TE_DATADIR-UZEIT = SY-UZEIT.
TE_DATADIR-STEPID = 'PBO'.
APPEND TE_DATADIR TO <LT_DATADIR>.
CALL FUNCTION 'SFCS_FA_PARAMETER_WRITE'
EXPORTING
FUNCTION = IT_OUT-NAME
DATASET = TE_DATADIR-DATAID.
PERFORM DB_EXPORT_DATADIR(SAPLSEUJ) USING IT_OUT-AREA IT_OUT-NAME '999'.
ENDFORM. "to_testdata
*&---------------------------------------------------------------------*
*& FORM GET_EXTTAB
*&---------------------------------------------------------------------*
FORM SET_STATUS.
CLEAR IT_EXTAB[].
LOOP AT IT_INDX WHERE INDX < IT_OUT-INDX.
EXIT.
ENDLOOP.
IF SY-SUBRC <> 0.
APPEND 'PRE' TO IT_EXTAB.
ENDIF.
LOOP AT IT_INDX WHERE INDX > IT_OUT-INDX.
EXIT.
ENDLOOP.
IF SY-SUBRC <> 0.
APPEND 'NEXT' TO IT_EXTAB.
ENDIF.
SET PF-STATUS 'LIST' EXCLUDING IT_EXTAB .
ENDFORM. "get_exttab
*&---------------------------------------------------------------------*
*& FORM DOWNTABLE
*&---------------------------------------------------------------------*
FORM DOWNTABLE.
DATA:FILE TYPE STRING, PATH TYPE STRING .
LOOP AT TABLES_GD WHERE PARAMETER = HIDEPARA.
CREATE DATA DDATA TYPE TABLE OF (TABLES_GD-STRUCTURE).
ASSIGN DDATA->* TO <FS_TABLE>.
CHECK SY-SUBRC = 0.
KEYSTR-PARA = TABLES_GD-PARAMETER.
IMPORT <FS> = <FS_TABLE> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
IF <FS_TABLE> IS INITIAL.
MESSAGE S000(OO) WITH '内表为空'.
ELSE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
EXPORTING
DEFAULT_EXTENSION = 'xls'
CHANGING
FILENAME = PATH
PATH = PATH
FULLPATH = FILE
EXCEPTIONS
CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3
OTHERS = 4.
IF FILE IS NOT INITIAL.
CALL FUNCTION 'GUI_DOWNLOAD'
EXPORTING
FILENAME = FILE
FILETYPE = 'ASC'
WRITE_FIELD_SEPARATOR = 'X'
CODEPAGE = '8401'
TABLES
DATA_TAB = <FS_TABLE>
EXCEPTIONS
OTHERS = 22.
IF SY-SUBRC <> 0.
MESSAGE E000(OO) WITH '下载失败'.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR HIDEPARA.
ENDFORM. "downtable
3.6 ZFMLOGB
*&---------------------------------------------------------------------*
*& Report ZFMLOGB
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFMLOGB.
TABLES:ZFMPARAVALSAVE,AFPO.
*--------------------------------------------------------------------*
*ALV参数声明
*--------------------------------------------------------------------*
"ALV参数定义
DATA:T_FIELDCAT TYPE LVC_T_FCAT, "字段目录内表
W_FIELDCAT TYPE LVC_S_FCAT, "字段目录工作区
W_LAYOUT TYPE LVC_S_LAYO. "用于定义ALV表单的相关格式、属性
FIELD-SYMBOLS: <FS> TYPE ANY,
<FS_TABLE> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY,
<FS_FIELD> TYPE ANY..
DATA:DDATA TYPE REF TO DATA,
DDATAX TYPE REF TO DATA,
INTAB TYPE RSFB_PARA WITH HEADER LINE,
STR TYPE STRING.
DATA: BEGIN OF KEYSTR,
NAME LIKE ZFMPARAVALSAVE-NAME,
ERDAT LIKE ZFMPARAVALSAVE-ERDAT,
STAMP LIKE ZFMPARAVALSAVE-STAMP,
INDX LIKE ZFMPARAVALSAVE-INDX,
* MEMO LIKE ZFMPARAVALSAVE-MEMO,
PARA LIKE ZFMPARAVALSAVE-PARA,
END OF KEYSTR.
DATA:GT_FMSAVE TYPE TABLE OF ZFMPARAVALSAVE WITH HEADER LINE.
DATA:L_STRU TYPE DD02L-TABNAME.
TYPES:BEGIN OF TY_JKM,
JKMC TYPE ZFMPARAVALSAVE-NAME,
END OF TY_JKM.
DATA:GT_JKM TYPE TABLE OF TY_JKM,
GS_JKM TYPE TY_JKM.
DATA:L_NBM TYPE STRING.
PARAMETERS:P_NAME LIKE ZFMPARAVALSAVE-NAME OBLIGATORY.
PARAMETERS:P_JG TYPE ZFMPARAVALSAVE-INDX DEFAULT '01' OBLIGATORY.
*PARAMETERS:P_INDX TYPE ZFMPARAVALSAVE-INDX DEFAULT '02' OBLIGATORY .
PARAMETERS:P_MEMO TYPE ZFMPARAVALSAVE-MEMO DEFAULT 'R' OBLIGATORY .
SELECT-OPTIONS:S_DATE FOR ZFMPARAVALSAVE-ERDAT OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_NAME.
PERFORM FRM_F4_HELP.
START-OF-SELECTION.
DATA: DYN_TABLE TYPE REF TO DATA.
DATA: DYN_WA TYPE REF TO DATA.
"DATA: P_NAME1 TYPE ZFMPARAVALSAVE-NAME.
FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE,
<DYN_TABLE1> TYPE TABLE,
<DYN_WA> TYPE ANY.
DATA P_NAME2 TYPE ZFMPARAVALSAVE-NAME.
"P_NAME1 = P_NAME .
DATA:GS_ZTFM TYPE ZTFM.
SELECT SINGLE *
INTO GS_ZTFM
FROM ZTFM
WHERE ZFNAME = P_NAME
AND ZSID = P_JG .
IF GS_ZTFM-ZSNAME IS NOT INITIAL AND GS_ZTFM-ZTNAME IS NOT INITIAL .
P_NAME2 = GS_ZTFM-ZSNAME .
L_NBM = GS_ZTFM-ZTNAME .
ELSE.
MESSAGE '接口不支持查询!' TYPE 'E'.
ENDIF.
* IF P_NAME = 'ZFTEST1'. "因为要生成FIELDCAT,所以,只能根据接口名称来取接口传出的结构字段名称。
* P_NAME2 = 'ZSTEST'.
* L_NBM = 'T_OUTPUT'.
* ELSE.
* MESSAGE '接口不支持查询!' TYPE 'E'.
* ENDIF.
CREATE DATA DDATA TYPE TABLE OF (P_NAME2).
ASSIGN DDATA->* TO <FS>.
*创建动态表结构
CREATE DATA DYN_TABLE TYPE TABLE OF (P_NAME2).
*创建动态内表
ASSIGN DYN_TABLE->* TO <DYN_TABLE>.
ASSIGN DYN_TABLE->* TO <DYN_TABLE1>.
*创建动态工作区结构
CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>.
*创建动态工作区
ASSIGN DYN_WA->* TO <DYN_WA>.
CONDENSE L_NBM NO-GAPS.
CLEAR L_STRU.
L_STRU = INTAB-STRUCTURE.
IF P_MEMO = 'B' .
SELECT *
FROM ZFMPARAVALSAVE "取出所有符合条件的关键字段数据
INTO CORRESPONDING FIELDS OF TABLE GT_FMSAVE
WHERE NAME = P_NAME
AND ERDAT IN S_DATE
AND INDX = '01'
* AND MEMO = P_MEMO
AND PARA = L_NBM .
ELSEIF P_MEMO = 'R'.
SELECT *
FROM ZFMPARAVALSAVE "取出所有符合条件的关键字段数据
INTO CORRESPONDING FIELDS OF TABLE GT_FMSAVE
WHERE NAME = P_NAME
AND ERDAT IN S_DATE
AND INDX = '02'
* AND MEMO = P_MEMO
AND PARA = L_NBM .
ENDIF.
LOOP AT GT_FMSAVE.
CLEAR KEYSTR.
KEYSTR-NAME = GT_FMSAVE-NAME.
KEYSTR-ERDAT = GT_FMSAVE-ERDAT.
KEYSTR-STAMP = GT_FMSAVE-STAMP.
IF P_MEMO = 'B'.
KEYSTR-INDX = '01'.
ELSEIF P_MEMO = 'R' .
KEYSTR-INDX = '02'.
ENDIF.
* KEYSTR-MEMO = P_MEMO .
KEYSTR-PARA = L_NBM. "
IMPORT <FS> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
ASSIGN <FS> TO <DYN_TABLE1>.
* IMPORT <FS> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
* ASSIGN <FS> TO <DYN_TABLE1>.
* IMPORT <DYN_WA> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
* ASSIGN <DYN_WA> TO <DYN_TABLE1>.
APPEND LINES OF <DYN_TABLE1> TO <DYN_TABLE>.
CLEAR GT_FMSAVE.
ENDLOOP.
*显示内表中的数据
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_STRUCTURE_NAME = P_NAME2
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.
*&---------------------------------------------------------------------*
*& Form FRM_F4_HELP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_F4_HELP .
* GS_JKM-JKMC = 'ZFPP_02'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFPP_05'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFPP_06'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFMM_14'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFMM_15'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'JKMC' "起作用的字段
DYNPPROG = SY-REPID "接下来连续的三个字段决定
DYNPNR = SY-DYNNR "了返回值放在哪个程序的哪个屏幕
DYNPROFIELD = 'P_NAME' "的哪个字段中
VALUE_ORG = 'S'
TABLES
VALUE_TAB = GT_JKM
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.
**Selection texts
* *----------------------------------------------------------
* * P_JG 显示内表
** P_NAME 接口名称
** S_DATE 查询日期
*
*
**Messages
* *----------------------------------------------------------
* *
* * Message class: Hard coded
* * 接口不支持查询!
3.7 ZFMLOGB1(ZFMLOGB的前版本)
*&---------------------------------------------------------------------*
*& Report ZFMLOGB
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZFMLOGB1.
TABLES:ZFMPARAVALSAVE,AFPO.
*--------------------------------------------------------------------*
*ALV参数声明
*--------------------------------------------------------------------*
"ALV参数定义
DATA:T_FIELDCAT TYPE LVC_T_FCAT, "字段目录内表
W_FIELDCAT TYPE LVC_S_FCAT, "字段目录工作区
W_LAYOUT TYPE LVC_S_LAYO. "用于定义ALV表单的相关格式、属性
FIELD-SYMBOLS: <FS> TYPE ANY,
<FS_TABLE> TYPE STANDARD TABLE,
<FS_WA> TYPE ANY,
<FS_FIELD> TYPE ANY..
DATA:DDATA TYPE REF TO DATA,
DDATAX TYPE REF TO DATA,
INTAB TYPE RSFB_PARA WITH HEADER LINE,
STR TYPE STRING.
DATA: BEGIN OF KEYSTR,
NAME LIKE ZFMPARAVALSAVE-NAME,
ERDAT LIKE ZFMPARAVALSAVE-ERDAT,
STAMP LIKE ZFMPARAVALSAVE-STAMP,
INDX LIKE ZFMPARAVALSAVE-INDX,
* MEMO LIKE ZFMPARAVALSAVE-MEMO,
PARA LIKE ZFMPARAVALSAVE-PARA,
END OF KEYSTR.
DATA:GT_FMSAVE TYPE TABLE OF ZFMPARAVALSAVE WITH HEADER LINE.
DATA:L_STRU TYPE DD02L-TABNAME.
TYPES:BEGIN OF TY_JKM,
JKMC TYPE ZFMPARAVALSAVE-NAME,
END OF TY_JKM.
DATA:GT_JKM TYPE TABLE OF TY_JKM,
GS_JKM TYPE TY_JKM.
DATA:L_NBM TYPE STRING.
PARAMETERS:P_NAME LIKE ZFMPARAVALSAVE-NAME OBLIGATORY.
PARAMETERS:P_JG TYPE ZFMPARAVALSAVE-INDX DEFAULT '01' OBLIGATORY.
*PARAMETERS:P_INDX TYPE ZFMPARAVALSAVE-INDX DEFAULT '02' OBLIGATORY .
PARAMETERS:P_MEMO TYPE ZFMPARAVALSAVE-MEMO DEFAULT 'R' OBLIGATORY .
SELECT-OPTIONS:S_DATE FOR ZFMPARAVALSAVE-ERDAT OBLIGATORY.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_NAME.
PERFORM FRM_F4_HELP.
START-OF-SELECTION.
DATA: DYN_TABLE TYPE REF TO DATA.
DATA: DYN_WA TYPE REF TO DATA.
"DATA: P_NAME1 TYPE ZFMPARAVALSAVE-NAME.
FIELD-SYMBOLS: <DYN_TABLE> TYPE TABLE,
<DYN_TABLE1> TYPE TABLE,
<DYN_WA> TYPE ANY.
DATA P_NAME2 TYPE ZFMPARAVALSAVE-NAME.
"P_NAME1 = P_NAME .
DATA:GS_ZTFM TYPE ZTFM.
SELECT SINGLE *
INTO GS_ZTFM
FROM ZTFM
WHERE ZFNAME = P_NAME
AND ZSID = P_JG .
IF GS_ZTFM-ZSNAME IS NOT INITIAL AND GS_ZTFM-ZTNAME IS NOT INITIAL .
P_NAME2 = GS_ZTFM-ZSNAME .
L_NBM = GS_ZTFM-ZTNAME .
ELSE.
* MESSAGE '接口不支持查询!' TYPE 'E'.
ENDIF.
* IF P_NAME = 'ZFTEST1'. "因为要生成FIELDCAT,所以,只能根据接口名称来取接口传出的结构字段名称。
* P_NAME2 = 'ZSTEST'.
* L_NBM = 'T_OUTPUT'.
* ELSE.
* MESSAGE '接口不支持查询!' TYPE 'E'.
* ENDIF.
* CREATE DATA DDATA TYPE TABLE OF (P_NAME2).
* ASSIGN DDATA->* TO <FS>.
*
*
*
*
*
**创建动态表结构
*
*
* CREATE DATA DYN_TABLE TYPE TABLE OF (P_NAME2).
*
*
**创建动态内表
*
*
* ASSIGN DYN_TABLE->* TO <DYN_TABLE>.
* ASSIGN DYN_TABLE->* TO <DYN_TABLE1>.
*
*
**创建动态工作区结构
*
*
* CREATE DATA DYN_WA LIKE LINE OF <DYN_TABLE>.
*
*
**创建动态工作区
*
*
* ASSIGN DYN_WA->* TO <DYN_WA>.
* CONDENSE L_NBM NO-GAPS.
CLEAR L_STRU.
L_STRU = INTAB-STRUCTURE.
IF P_MEMO = 'B' .
SELECT *
FROM ZFMPARAVALSAVE "取出所有符合条件的关键字段数据
INTO CORRESPONDING FIELDS OF TABLE GT_FMSAVE
WHERE NAME = P_NAME
AND ERDAT IN S_DATE
AND INDX = '01'
AND MEMO = 'I_OUT'
* AND PARA = L_NBM
.
ELSEIF P_MEMO = 'R'.
SELECT *
FROM ZFMPARAVALSAVE "取出所有符合条件的关键字段数据
INTO CORRESPONDING FIELDS OF TABLE GT_FMSAVE
WHERE NAME = P_NAME
AND ERDAT IN S_DATE
AND INDX = '02'
* AND MEMO = 'I_OUT'
AND PARA = 'I_OUT'
AND ERNAM = 'HANDWD'.
.
ENDIF.
TYPES:BEGIN OF TY_LFB1 ,
LIFNR TYPE STRING , "供应商代码
NAME1 TYPE STRING , "供应商描述
BUKRS TYPE STRING , "公司代码
LOEVM2 TYPE STRING,
ZDEL TYPE STRING,
END OF TY_LFB1.
DATA:LT_LFB1 TYPE TABLE OF TY_LFB1.
DATA: LRF_DESCR TYPE REF TO CL_ABAP_TYPEDESCR,
LV_JSON TYPE STRING.
LOOP AT GT_FMSAVE.
CLEAR KEYSTR.
KEYSTR-NAME = GT_FMSAVE-NAME.
KEYSTR-ERDAT = GT_FMSAVE-ERDAT.
KEYSTR-STAMP = GT_FMSAVE-STAMP.
IF P_MEMO = 'B'.
KEYSTR-INDX = '01'.
ELSEIF P_MEMO = 'R' .
KEYSTR-INDX = '02'.
ENDIF.
KEYSTR-PARA = 'I_OUT'. "
CREATE DATA DDATA TYPE STRING.
* ELSE.
* CREATE DATA DDATA TYPE TABLE OF (INTAB-STRUCTURE).
* ENDIF.
ASSIGN DDATA->* TO <FS>.
IMPORT <FS> FROM DATABASE ZFMPARAVALSAVE(FL) ID KEYSTR .
* ASSIGN <FS> TO <DYN_TABLE1>.
LV_JSON = <FS> .
/UI2/CL_JSON=>DESERIALIZE( EXPORTING JSON = LV_JSON PRETTY_NAME = /UI2/CL_JSON=>PRETTY_MODE-CAMEL_CASE
ASSOC_ARRAYS_OPT = ABAP_TRUE CHANGING DATA = LT_LFB1 ).
LRF_DESCR = CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( LT_LFB1 ).
* APPEND LINES OF <DYN_TABLE1> TO <DYN_TABLE>.
CLEAR GT_FMSAVE.
ENDLOOP.
**显示内表中的数据
*
*
* CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
* EXPORTING
* I_STRUCTURE_NAME = P_NAME2
* 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.
*
*&---------------------------------------------------------------------*
*& Form FRM_F4_HELP
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_F4_HELP .
* GS_JKM-JKMC = 'ZFPP_02'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFPP_05'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFPP_06'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFMM_14'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
* GS_JKM-JKMC = 'ZFMM_15'.
* APPEND GS_JKM TO GT_JKM.
* CLEAR GS_JKM.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'JKMC' "起作用的字段
DYNPPROG = SY-REPID "接下来连续的三个字段决定
DYNPNR = SY-DYNNR "了返回值放在哪个程序的哪个屏幕
DYNPROFIELD = 'P_NAME' "的哪个字段中
VALUE_ORG = 'S'
TABLES
VALUE_TAB = GT_JKM
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM.
**Selection texts
* *----------------------------------------------------------
* * P_JG 显示内表
** P_NAME 接口名称
** S_DATE 查询日期
*
*
**Messages
* *----------------------------------------------------------
* *
* * Message class: Hard coded
* * 接口不支持查询!
3.8 R3TR PROG ZFMPARAVALSAVE
*&---------------------------------------------------------------------*
*& 包含 ZFMPARAVALSAVE
*&---------------------------------------------------------------------*
DATA: header_gd TYPE header_fb,
tables_gd TYPE rsfb_para WITH HEADER LINE,
import_gd TYPE rsfb_para WITH HEADER LINE,
export_gd TYPE rsfb_para WITH HEADER LINE,
change_gd TYPE rsfb_para WITH HEADER LINE,
pname_gd TYPE tfdir-pname.
DATA: BEGIN OF keystr,
name LIKE zfmparavalsave-name,
erdat LIKE zfmparavalsave-erdat,
stamp LIKE zfmparavalsave-stamp,
indx LIKE zfmparavalsave-indx,
para LIKE zfmparavalsave-para,
END OF keystr.
DATA: wa_data TYPE zfmparavalsave,
wa_datal TYPE zfmparavalsavel,
tsl TYPE timestampl,tsstr(30),
indx TYPE numc2,
fsstr TYPE string.
FIELD-SYMBOLS: <fs> TYPE any .
DEFINE zfmparavalsave1.
header_gd-name = &1 .
GET TIME STAMP FIELD tsl.
keystr-name = header_gd-name.
* tsstr = |{ tsl TIMEZONE = sy-zonlo }|.
WRITE tsl TIME ZONE sy-zonlo TO tsstr .
keystr-erdat = sy-datum.
keystr-stamp = tsstr+11(15).
SELECT SINGLE pname INTO pname_gd FROM tfdir
WHERE funcname = header_gd-name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
program = pname_gd
IMPORTING
group = header_gd-area
namespace = header_gd-namespace
EXCEPTIONS
othe = 12.
IF sy-subrc = 0.
CONCATENATE header_gd-namespace header_gd-area
INTO header_gd-area.
CALL METHOD cl_fb_parameter_db=>read
IMPORTING
tables = tables_gd[]
import = import_gd[]
export = export_gd[]
change = change_gd[]
CHANGING
header = header_gd.
ENDIF.
END-OF-DEFINITION.
DEFINE zfmparavalsave2.
SELECT SINGLE pname INTO pname_gd FROM tfdir
WHERE funcname = header_gd-name.
CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
EXPORTING
program = pname_gd
IMPORTING
group = header_gd-area
namespace = header_gd-namespace
EXCEPTIONS
othe = 12.
IF sy-subrc = 0.
CONCATENATE header_gd-namespace header_gd-area
INTO header_gd-area.
CALL METHOD cl_fb_parameter_db=>read
IMPORTING
tables = tables_gd[]
import = import_gd[]
export = export_gd[]
change = change_gd[]
CHANGING
header = header_gd.
ENDIF.
SELECT SINGLE * INTO wa_datal FROM zfmparavalsavel
WHERE name = header_gd-name AND
memo = &1 .
IF sy-subrc <> 0 AND indx < 99.
indx = indx + 1 .
keystr-indx = indx.
wa_data-area = header_gd-area.
wa_data-ernam = sy-uname.
wa_data-memo = &1 .
wa_data-erdat = sy-datum.
ASSIGN ('RTYPE') TO <fs>.
IF sy-subrc = 0.
wa_data-rtype = <fs>.
ENDIF.
ASSIGN ('RTMSG') TO <fs>.
IF sy-subrc = 0.
wa_data-rtmsg = <fs>.
ENDIF.
LOOP AT import_gd.
ASSIGN (import_gd-parameter) TO <fs>.
CHECK sy-subrc = 0 .
keystr-para = import_gd-parameter.
EXPORT <fs> TO DATABASE zfmparavalsave(fl) ID keystr FROM wa_data.
ENDLOOP.
LOOP AT change_gd.
ASSIGN (change_gd-parameter) TO <fs>.
CHECK sy-subrc = 0 .
keystr-para = change_gd-parameter.
EXPORT <fs> TO DATABASE zfmparavalsave(fl) ID keystr FROM wa_data.
ENDLOOP.
LOOP AT export_gd.
ASSIGN (export_gd-parameter) TO <fs>.
CHECK sy-subrc = 0 .
keystr-para = export_gd-parameter.
EXPORT <fs> TO DATABASE zfmparavalsave(fl) ID keystr FROM wa_data.
ENDLOOP.
LOOP AT tables_gd.
CONCATENATE tables_gd-parameter '[]' INTO fsstr.
ASSIGN (fsstr) TO <fs>.
CHECK sy-subrc = 0 .
keystr-para = tables_gd-parameter.
EXPORT <fs> TO DATABASE zfmparavalsave(fl) ID keystr FROM wa_data.
ENDLOOP.
ENDIF.
* COMMIT WORK.
END-OF-DEFINITION.
以上,完毕!