三个ABAP 实用程序

一、Download ABAP Spool to PDF(代码样例)(KJ注:未下载)
http://www.sapsky.com/html/2006-11/576.htm

二、ABAP动态生成经典应用之Dynamic SQL Excute 程序
http://www.sapsky.com/html/2006-10/470.htm
ABAP动态生成经典应用之Dynamic SQL Excute 程序
[日期:2006-10-23]     来源:sapsky  作者:sapsky     [字体:大 中 小]
 
开发说明:在SAP的系统维护过程中,有时我们需要修改一些Table中的数据,可是很多Table又不能直接在Tcode:SE16中修改,使用的SAP ID又没有调试数据修改权限,这时我们应该怎么样修改数据呢?思路--> ABAP程序中的SQL 更新语句谁都有权限执行,只要我们能动态生成修改该Table字段的ABAP CODE动态执行即可!
 
开发技术:
1.SQL代码编写技术
1.动态程序代码生成技术
2.ABAP动态程序执行技术
 
注意事项:
SQL语法一定要准确,修改条件准确,修改数据后不违法数据唯一性原则
 
程序代码:如下
*******************************************************************
* (Copyright @2006 Mysingle Digital System Co.Ltd.
* All Rights Reserved|Confidential)
* System Module   :  ABAP CBO
* Use Status   :  Release 1.0
*******************************************************************
REPORT z_cbo_abap_02 MESSAGE-ID zp NO STANDARD PAGE HEADING.
 
DATA : fcode LIKE sy-ucomm,
       changed LIKE s38e-buf_varied,
       save_tabix  LIKE sy-tabix,
       tabix_count TYPE i,
       select_key(10) TYPE c,
       etc(80)  TYPE c,
       update_flag  TYPE c,
       line_cnt     TYPE i,
       prog(8)      TYPE c,
       msg(120)     TYPE c,
       msg_text(72) TYPE c,
       confirm_flag TYPE c.
DATA: itab_sql LIKE abapsource OCCURS 0 WITH HEADER LINE,
      itab_prog LIKE abapsource OCCURS 0 WITH HEADER LINE.
 
START-OF-SELECTION.
*程序执行直接进入ABAP代码编辑器
  SET PF-STATUS 'PFSTA00'.
  WRITE: /1 'Edit Your SQL ................' COLOR 2.
 
AT USER-COMMAND.
*动态生成程序修改确认
  IF sy-ucomm = 'EDIT'.
    PERFORM editor_sql.
*动态生成程序执行
  ELSEIF sy-ucomm = 'EXEC' OR sy-ucomm = 'EDEX'.
    REFRESH itab_prog.
    CLEAR itab_prog.
    IF update_flag = 'X'.
      PERFORM exec_modify.
    ENDIF.
  ENDIF.
*&------------------------------------------------------------------*
*&      Form  editor_sql
*&------------------------------------------------------------------*
FORM editor_sql.
* CALL Editor
  CALL FUNCTION 'EDITOR_APPLICATION'
       EXPORTING
            application = 'BF'
            display     = ' '
            name        = '[Edit Your SQL......]'
       IMPORTING
            fcode       = fcode
            changed     = changed
       TABLES
            content     = itab_sql.
* Translate Code Upper
  LOOP AT itab_sql.
    save_tabix  = sy-tabix.
    tabix_count = tabix_count + 1.
    IF itab_sql-line = space OR itab_sql-line+(1) = '*'.
      DELETE itab_sql INDEX save_tabix.
    ENDIF.
    TRANSLATE itab_sql-line TO UPPER CASE.
    MODIFY itab_sql INDEX save_tabix.
  ENDLOOP.
* Parsing input SQL code
  LOOP AT itab_sql.
    IF sy-tabix = 1.
      SHIFT itab_sql-line LEFT DELETING LEADING space.
    ENDIF.
    save_tabix = sy-tabix + 1.
    SPLIT itab_sql-line AT space INTO select_key etc.
    IF select_key = 'SELECT'.
      MESSAGE i433 WITH 'Donot support select syntax!^~^'.
      stop.
* hehe~~Don't bother myself.
    ELSEIF select_key = 'DELETE' OR  select_key = 'UPDATE'
       OR  select_key = 'INSERT'.
      update_flag = 'X'.
    ENDIF.
  ENDLOOP.
* Display the SQL code
  sy-lsind = 0.
  DELETE itab_sql WHERE line IS initial.
  DESCRIBE TABLE itab_sql LINES line_cnt.
  IF line_cnt = 0.
    WRITE: /1 'Edit Your SQL ................' COLOR 2.
  ELSE.
    LOOP AT itab_sql.
      WRITE: /1 itab_sql-line.
    ENDLOOP.
  ENDIF.
  IF update_flag = 'Y'.
    EXIT.
  ENDIF.
ENDFORM.                    " editor_sql
*&------------------------------------------------------------------*
*&      Form  exec_modify
*&------------------------------------------------------------------*
FORM exec_modify.
  IF sy-ucomm = 'EXEC'.
* Modify dialog box
    CALL FUNCTION 'POPUP_TO_CONFIRM_STEP'
         EXPORTING
              textline1 = 'Do you want to really UPDATE?'
              titel     = 'Exit'
         IMPORTING
              answer    = confirm_flag.
    CASE confirm_flag.
      WHEN 'N'. EXIT. "NO
      WHEN 'A'. EXIT. "Cancel
      WHEN 'J'. "perform exec_sql_update. "YES
    ENDCASE.
  ENDIF.
* Modify Program ABAP Code.
  itab_prog-line = 'PROGRAM ZSQL19800526 MESSAGE-ID AT.'.
  APPEND itab_prog.
  itab_prog-line = 'DATA: COUNT TYPE I.'.
  APPEND itab_prog.
  itab_prog-line = 'FORM DYN2.'.
  APPEND itab_prog.
  itab_prog-line = 'EXEC SQL.'.
  APPEND itab_prog.
  LOOP AT itab_sql.
    itab_prog-line = itab_sql-line.
    APPEND itab_prog.
  ENDLOOP.
  itab_prog-line = 'ENDEXEC.'.
  APPEND itab_prog.
  itab_prog-line = 'MESSAGE I315 WITH ''Performed'' SY-DBCNT'.
  CONCATENATE itab_prog-line '''' 'Records!^-^' '''' '.'
              INTO itab_prog-line SEPARATED BY space.
  APPEND itab_prog.
  itab_prog-line = 'ENDFORM.'.
  APPEND itab_prog.
* Dynamic Program Display
  IF sy-ucomm = 'EDEX'.
    CALL FUNCTION 'EDITOR_APPLICATION'
         EXPORTING
              application = 'BF'
              display     = ' '
              name        = 'Modify Program...'
         IMPORTING
              fcode       = fcode
         TABLES
              content     = itab_prog.
    STOP.
  ENDIF.
* Dynamic Program Excuted
  GENERATE SUBROUTINE POOL itab_prog NAME prog
                                     MESSAGE msg.
  IF sy-subrc <> 0.
    msg_text = msg+(80).
    WRITE: /1 msg_text.
    msg_text = msg+80(40).
    WRITE: /1 msg_text.
  ELSE.
    PERFORM dyn2 IN PROGRAM (prog).
  ENDIF.
ENDFORM.                    " exec_modify
 
程序实例:
 
1.程序执行界面,显示SQL CODE录入画面
 
 
2.我们要修改的数据,材料主数据Material Master Table:MARA中的材料CODE主键
SOH-DL3C ---> SOH-DL8C
3.数据修改SQL语句编写,这里就不详叙了
 
UPDATE MARA SET MATNR = 'SOH-DL3C' WHERE MATNR = 'SOH-DL8C'
                                    AND ERSDA = '20040310'
4.修改动态ABAP程序生成确认修改
5.动态程序执行
6.程序成功执行提示信息
7.数据修改效果确认
 

三、ABAP动态生成经典应用之Table数据Upload 程序
http://www.sapsky.com/html/2006-10/471.htm
[日期:2006-10-23]      来源:sapsky  作者:sapsky      [字体:大 中 小]
 
开发说明:在CBO的程序开发过程中,需要为Table准备大量的测试数据,手动录入效率低,不专业,我们可以采用其他的高级编辑工具(例如:EXCEL, EditPlus)按照Table数据存储结构准备好数据,最后保存为ASC的文本文件,通过执行下面开发的程序,下面的程序执行的功能就是把编辑好的文本文件上的数据上载到SAP对应的Table中,小程序非常实用,也适用于我们大量更新Table数据时使用,ABAPer们的手头必备啊!
 
开发技术:
1.文本文件上载技术
2.动态程序代码生成技术
3.ABAP动态程序执行技术
4.TXT文本文件对应用Table字段编辑技术
 
注意事项:
文件文件编辑过程中时间日期格式为 20060201 120000 表示 2006.02.01 12:00:00
文本文件中不能包含除字符,数字之外的其他特殊符号。假如Table中对应的字段数据为空时,在编辑数据时也对应该列为空。
 
程序代码:如下
*******************************************************************
* (Copyright @2006 Mysingle Digital System Co.Ltd.
* All Rights Reserved|Confidential)
* System Module        :  ABAP CBO
* Program Description  :  Table Upload & Download
* Developer            :  ZOU XIN
* Develop Date         :  2006.01.01
* Use Status           :  Release 1.0
*******************************************************************
REPORT z_cbo_abap_01 NO STANDARD PAGE HEADING.
 
TABLES : dd03l,dd02t.
 
DATA: BEGIN OF tab OCCURS 10,
        fcode(4),
      END OF tab.
DATA : BEGIN OF itab OCCURS 0,
        chk(1) TYPE c,                     " check box
        tabname    LIKE dd03l-tabname,     " Table name
        fieldname  LIKE dd03l-fieldname,   " Feld Name
        position   LIKE dd03l-position,    " Table
        keyflag    LIKE dd03l-keyflag,     " Primary Key
        datatype   LIKE dd03l-datatype,    " Data Type
        intlen     LIKE dd03l-leng,
       END OF itab.
DATA itab1 LIKE itab OCCURS 0 WITH HEADER LINE.
DATA : BEGIN OF uptab OCCURS 0,
        text(72) TYPE c,
       END OF uptab.
DATA: BEGIN OF error_message,
        line1(72),
        line2(72),
        line3(72),
      END OF error_message.
DATA : cnt1(8) TYPE c,
       fcode LIKE sy-ucomm,
       changed LIKE s38e-buf_varied,
       prog(8) TYPE c,
       msg(120) TYPE c,
       er_include LIKE sy-repid,
       er_line    LIKE sy-index,
       er_off     LIKE sy-tabix,
       er_subrc   LIKE sy-subrc.
 
* 程序录入界面
PARAMETERS : tabname LIKE dd03l-tabname DEFAULT 'ZP023'.

 
START-OF-SELECTION.
*上载Table字段分析
  SELECT SINGLE * FROM dd02t WHERE tabname = tabname.
  SET PF-STATUS 'ZOUXIN'.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE itab FROM dd03l
              WHERE tabname = tabname
              AND as4local = 'A'
              ORDER BY position.
  itab-chk = 'X'.
  MODIFY itab INDEX 1 TRANSPORTING chk .
*动态上载程序代码生成函数
  PERFORM generate_upload_code.
*ABAP程序代码编辑器调用
  PERFORM edit_generator_code.
 
AT USER-COMMAND .
  IF sy-ucomm = 'EDIT'.
    PERFORM edit_generator_code.
  ELSEIF sy-ucomm = 'EXEC'.
    GENERATE SUBROUTINE POOL uptab NAME prog MESSAGE msg.
*程序代码语法检测
    PERFORM chcek_syntax_error.
*动态程序代码执行
    PERFORM dyn1 IN PROGRAM (prog).
  ENDIF.
 
*&---------------------------------------------------------------*
*&      Form  generate_upload_code
*&---------------------------------------------------------------*
FORM generate_upload_code.
  REFRESH uptab.
  uptab-text = 'REPORT ZUP19800526.'.
  APPEND uptab.
  CONCATENATE 'TABLES :' tabname '.' INTO uptab-text
  SEPARATED BY space.
  APPEND uptab.
  uptab-text = 'DATA : BEGIN OF UPTAB OCCURS 0,'.
  APPEND uptab.
  LOOP AT itab WHERE chk = ''.
    CLEAR uptab.
    CONCATENATE '  ' itab-fieldname '(' itab-intlen  ')'  ' TYPE C ,'
                INTO uptab-text+10(80).
    APPEND uptab.
  ENDLOOP.
  uptab-text+6(82) = 'END OF UPTAB.'.
  APPEND uptab.
  uptab-text = 'DATA : BEGIN OF RESULT OCCURS 0.'.
  APPEND uptab.
  CLEAR uptab.
  CONCATENATE 'INCLUDE STRUCTURE' itab-tabname '.'
               INTO uptab-text+10(80) SEPARATED BY space.
  APPEND uptab.
  uptab-text = 'DATA : END OF RESULT.'.
  APPEND uptab.
  uptab-text = 'FORM DYN1.'.
  APPEND uptab.
  CLEAR uptab.
  uptab-text+2(88) = 'CALL FUNCTION ''UPLOAD'''.
  APPEND uptab.
  CLEAR uptab.
  uptab-text+4(86) = 'EXPORTING'.
  APPEND uptab.
  CLEAR uptab.
  uptab-text+6(84) = 'FILENAME = ''C:/'''.
  APPEND uptab.
  uptab-text+6(84) = 'FILETYPE = ''DAT'''.
  APPEND uptab.
  uptab-text+4(86) = 'TABLES'.
  APPEND uptab.
  CLEAR uptab.
  uptab-text+6(84) = 'DATA_TAB = UPTAB.'.
  APPEND uptab.
  uptab-text+2(88) = 'LOOP AT UPTAB.'.
  APPEND uptab.
  CLEAR uptab.
  uptab-text+4(86) = 'CLEAR RESULT.'.
  APPEND uptab.
  uptab-text+4(86) = 'MOVE-CORRESPONDING UPTAB TO RESULT.'.
  APPEND uptab.
  uptab-text+4(86) = 'APPEND RESULT.'.
  APPEND uptab.
  uptab-text+2(88) = 'ENDLOOP.'.
  APPEND uptab.
  CLEAR uptab.
  CONCATENATE 'INSERT'  itab-tabname 'FROM TABLE RESULT.'
              INTO uptab-text+2(88) SEPARATED BY space.
  APPEND uptab.
  uptab-text = 'ENDFORM.' .
  APPEND uptab.
  CLEAR uptab.
ENDFORM.                    " generate_upload_code
*&---------------------------------------------------------------*
*&      Form  edit_generator_code
*&---------------------------------------------------------------*
FORM edit_generator_code.
  CALL FUNCTION 'EDITOR_APPLICATION'
       EXPORTING
            application = 'BF'
            display     = ' '
            name        = 'Source Code.....'
       IMPORTING
            fcode       = fcode
            changed     = changed
       TABLES
            content     = uptab.
  LOOP AT uptab.
    WRITE:/1 uptab-text.
  ENDLOOP.
ENDFORM.                               " PRINT_GENERATOR_CODE
*&---------------------------------------------------------------*
*&      Form  chcek_syntax_error
*&---------------------------------------------------------------*
FORM chcek_syntax_error.
  CALL FUNCTION 'EDITOR_SYNTAX_CHECK'
       EXPORTING
            i_global_check   = ' '
            i_global_program = ' '
            i_program        = 'ZUP19800526'
            i_r2_check       = ' '
            i_r2_destination = ' '
            i_trdir          = ' '
       IMPORTING
            o_error_include  = er_include
            o_error_line     = er_line
            o_error_message  = error_message
            o_error_offset   = er_off
            o_error_subrc    = er_subrc
       TABLES
            i_source         = uptab.
  IF er_subrc <> 0.
    er_line = er_line - 2.
    WRITE:/1 'Error Line : ',er_line.
    WRITE:/1 error_message-line1,error_message-line2,
             error_message-line3.
    STOP.
  ENDIF.
ENDFORM.                    " chcek_syntax_error
1.程序初始界面,输入Upload的table名.
 
2.程序运行第一界面,显示程序自动生成的上载程序代码
 
3.程序运行第二界面,确认程序自动生成的上载程序代码,执行
 
4.程序运行第三界面中小界面,程序执行提示输入上在数据具体路径
 
4.OK,数据上载成功
 
补充1:上载数据文件格式,*.TXT DAT格式文件,俗称纯文本文件
 
补充2:SAP Table格式,注意不要理会Mandt Client字段,其他字段数据对应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值