1.excel表格上传
*&---------------------------------------------------------------------* ** 程序名称:ZSDR0076 ** 程序描述: ** 创建人 :ZHAIMING ** 创建日期: *&---------------------------------------------------------------------* ** 修改记录: ** 序号:1 日期: 修改人: ** 描述: *&---------------------------------------------------------------------* REPORT ZSDR0076. *----------------------------------------------------------------------* * SCREEN *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-001. PARAMETERS: P_FILE LIKE RLGRAP-FILENAME. SELECTION-SCREEN END OF BLOCK BL1. *----------------------------------------------------------------------* * AT SELECTION-SCREEN *----------------------------------------------------------------------* AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE. PERFORM FRM_VALUE_REQUEST. *----------------------------------------------------------------------* * START-OF-SELECTION. * *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM FRM_UPLOAD_DATA. PERFORM FRM_CALL_BAPI. *&---------------------------------------------------------------------* *& Form FRM_VALUE_REQUEST *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_VALUE_REQUEST . DATA: WA_FILETABLE TYPE FILE_TABLE, IT_FILETABLE TYPE FILETABLE, V_RC TYPE SY-SUBRC. CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG EXPORTING WINDOW_TITLE = '请选择导入文件' DEFAULT_EXTENSION = 'XLS' CHANGING FILE_TABLE = IT_FILETABLE RC = V_RC . IF SY-SUBRC <> 0. MESSAGE '读取EXCEL文件出错!' TYPE 'S'. STOP. ELSE. READ TABLE IT_FILETABLE INTO WA_FILETABLE INDEX 1. P_FILE = WA_FILETABLE-FILENAME. ENDIF. IF P_FILE IS INITIAL. MESSAGE '请选择导入的文件' TYPE 'S'. STOP. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_UPLOAD_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_UPLOAD_DATA . DATA: BEGIN OF I_EXCEL OCCURS 0. INCLUDE STRUCTURE ALSMEX_TABLINE. DATA: END OF I_EXCEL. DATA: L_ANSWER TYPE CHAR1. DATA: L_COLUMN TYPE I. DATA: L_PATHNAME LIKE RLGRAP-FILENAME. DATA: C_BEGIN_ROW TYPE I VALUE 1, "Beginning row of excel file C_BEGIN_COL TYPE I VALUE 1, "Beginning column of excel file C_END_ROW TYPE I VALUE 1000, "Ending row of excel file C_END_COL TYPE I VALUE 9. "Ending column of excel file FIELD-SYMBOLS: <FS>. MOVE P_FILE TO L_PATHNAME. CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' EXPORTING FILENAME = L_PATHNAME I_BEGIN_COL = C_BEGIN_COL I_BEGIN_ROW = C_BEGIN_ROW I_END_COL = C_END_COL I_END_ROW = C_END_ROW TABLES INTERN = I_EXCEL EXCEPTIONS INCONSISTENT_PARAMETERS = 1 UPLOAD_OLE = 2 OTHERS = 3. IF SY-SUBRC <> 0. MESSAGE '读取EXCEL文件出错!' TYPE 'E'. ELSE. IF I_EXCEL[] IS INITIAL. CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE' EXPORTING DIAGNOSETEXT1 = '数据为空!' TEXTLINE1 = '请检查文件是否正确' TITEL = '警告' IMPORTING ANSWER = L_ANSWER . LEAVE TO SCREEN 0. ELSE. DELETE I_EXCEL WHERE ROW = '0001'. SORT I_EXCEL BY ROW COL. LOOP AT I_EXCEL. MOVE I_EXCEL-COL TO L_COLUMN. ASSIGN COMPONENT L_COLUMN OF STRUCTURE TO <FS>. MOVE I_EXCEL-VALUE TO <FS>. AT END OF ROW. APPEND . CLEAR . ENDAT. ENDLOOP. ENDIF. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form FRM_CALL_BAPI *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM FRM_CALL_BAPI . ENDFORM.
1.DESCRIBE TABLE itab LINES wrk_n.
将内表的行数赋值给wrk_n。
2.wrk_n = LINES( itab ).
内表作为函数LINES的参数,返回itab的行数给wrk_n。
注意,itab的前后各有一个空格,否则会提示LINES未定义的错误信息。
3.使用AT new f 是 f 必须为内表的第一个字段 ,AT NEW f 会判断 f 字段左边的字段是否为新值。
4. BDC更新模式
"A" 显示所有输入屏幕,如果在 bdc_tab 中包含该屏幕的功能码,则会出现小窗口显示这个功能码。它也是默认值,如果指定不是下面的值,则都认为是 A。
"E" 只有在出现错误时才显示屏幕,用户可以修正数据,修正后程序可以继续处理。
"N" 不显示屏幕的静默模式。如果到达被调用事务的断点,则系统处理终止,并设置一些系统字段。sy-subrc 为 1001,sy-msgty 为 "S"、sy-msgid 为 "00"、sy-msgno 为 "344"、sy-msgv1 为 "SAPMSSY3"、sy-msgv2 为 "0131"。
"P" 不显示屏幕的调试模式。如果到达被调用事务的断点,则系统自动转到 ABAP 调试器,这种方式主要用于调试过程。
更新模式,有下列可选值(更新模式常用的是S)
"A" 异步更新。被调用程序的更新按照没有指定 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由另一个专门的更新进程执行,主程序一旦提交数据就继续执行,而不管提交的更新是否执行完成。这种方式比较适合于用一个事务码大量更新指定数据,比如维护主数据等。
"S" 同步更新。被调用程序的更新按照指定了 COMMIT WORK 语句和 AND WAIT 附加的方式执行。也就是说,数据更新被放到更新队列里,由专门的更新进程执行,但是主程序会等到数据提交完成,返回结果信息后才继续执行。这种方式比较适合于数据一致性要求比较高,多个不同事务码的连续处理。
"L" 本地更新。被调用程序的更新按照执行 SET UPDATE TASK LOCAL 语句的方式执行。也就是说,数据更新在主程序所在的进程中完成,主程序必定等到被调用事务完成才继续执行。
5. sy-repid 与 sy-cprog 的区别
1. sy-repid is the name of the current program.
sy-cprog is the name of the calling program.
比如在一个Function里面设置断点,sy-repid的这个FM所在FunctionPool的名字,sy-cprog是调用这个FM的Report的程序名。
2. sy-repid 不可以人为更改,sy-cprog可以
sy-cprog is the name of the calling program.
比如在一个Function里面设置断点,sy-repid的这个FM所在FunctionPool的名字,sy-cprog是调用这个FM的Report的程序名。
2. sy-repid 不可以人为更改,sy-cprog可以
6. div / mod
1、div
div是用于取两数相除的商的,c = a div b,得到的c的值就是a除b的商。
2、/
/ 是用于取两数相除的结果的。c = a / b,如果c是i数据类型的,这个语法会进行四舍五入的。
3、mod
mod 是用于取两数相除的余数,c = a mod b,得到的c的值的就是a除b的余数。
div是用于取两数相除的商的,c = a div b,得到的c的值就是a除b的商。
2、/
/ 是用于取两数相除的结果的。c = a / b,如果c是i数据类型的,这个语法会进行四舍五入的。
3、mod
mod 是用于取两数相除的余数,c = a mod b,得到的c的值的就是a除b的余数。