ABAP动态生成经典应用之Dynamic SQL Excute 程序
生活随笔
收集整理的這篇文章主要介紹了
ABAP动态生成经典应用之Dynamic SQL Excute 程序
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
開發(fā)說明:在SAP的系統(tǒng)維護過程中,有時我們需要修改一些Table中的數(shù)據(jù),可是很多Table又不能直接在Tcode:SE16中修改,使用的SAP ID又沒有調(diào)試數(shù)據(jù)修改權(quán)限,這時我們應該怎么樣修改數(shù)據(jù)呢?思路--> ABAP程序中的SQL 更新語句誰都有權(quán)限執(zhí)行,只要我們能動態(tài)生成修改該Table字段的ABAP CODE動態(tài)執(zhí)行即可!
開發(fā)技術(shù):
1.SQL代碼編寫技術(shù)
1.動態(tài)程序代碼生成技術(shù)
2.ABAP動態(tài)程序執(zhí)行技術(shù)
注意事項:
SQL語法一定要準確,修改條件準確,修改數(shù)據(jù)后不違法數(shù)據(jù)唯一性原則
程序代碼:如下
*******************************************************************
* (Copyright @2006 Mysingle Digital System Co.Ltd.
* All Rights Reserved|Confidential)
* System Module?? :? ABAP CBO
* Program Description? :? Dynamic SQL Excute
* Developer???????? :? ZOU XIN
* Develop Date?? :? 2006.03.01
* 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. *程序執(zhí)行直接進入ABAP代碼編輯器
? SET PF-STATUS 'PFSTA00'.
? WRITE: /1 'Edit Your SQL ................' COLOR 2. AT USER-COMMAND. *動態(tài)生成程序修改確認
? IF sy-ucomm = 'EDIT'.
??? PERFORM editor_sql. *動態(tài)生成程序執(zhí)行 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 程序?qū)嵗?#xff1a; ? 1.程序執(zhí)行界面,顯示SQL CODE錄入畫面
2.我們要修改的數(shù)據(jù),材料主數(shù)據(jù)Material Master Table:MARA中的材料CODE主鍵 SOH-DL3C ---> SOH-DL8C 3.數(shù)據(jù)修改SQL語句編寫,這里就不詳敘了 UPDATE MARA SET MATNR = 'SOH-DL3C' WHERE MATNR = 'SOH-DL8C'
??????????????????????????????????? AND ERSDA = '20040310' 4.修改動態(tài)ABAP程序生成確認修改
5.動態(tài)程序執(zhí)行
6.程序成功執(zhí)行提示信息
7.數(shù)據(jù)修改效果確認
* (Copyright @2006 Mysingle Digital System Co.Ltd.
* All Rights Reserved|Confidential)
* System Module?? :? ABAP CBO
* Program Description? :? Dynamic SQL Excute
* Developer???????? :? ZOU XIN
* Develop Date?? :? 2006.03.01
* 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. *程序執(zhí)行直接進入ABAP代碼編輯器
? SET PF-STATUS 'PFSTA00'.
? WRITE: /1 'Edit Your SQL ................' COLOR 2. AT USER-COMMAND. *動態(tài)生成程序修改確認
? IF sy-ucomm = 'EDIT'.
??? PERFORM editor_sql. *動態(tài)生成程序執(zhí)行 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 程序?qū)嵗?#xff1a; ? 1.程序執(zhí)行界面,顯示SQL CODE錄入畫面
2.我們要修改的數(shù)據(jù),材料主數(shù)據(jù)Material Master Table:MARA中的材料CODE主鍵 SOH-DL3C ---> SOH-DL8C 3.數(shù)據(jù)修改SQL語句編寫,這里就不詳敘了 UPDATE MARA SET MATNR = 'SOH-DL3C' WHERE MATNR = 'SOH-DL8C'
??????????????????????????????????? AND ERSDA = '20040310' 4.修改動態(tài)ABAP程序生成確認修改
5.動態(tài)程序執(zhí)行
6.程序成功執(zhí)行提示信息
7.數(shù)據(jù)修改效果確認
總結(jié)
以上是生活随笔為你收集整理的ABAP动态生成经典应用之Dynamic SQL Excute 程序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ABAP动态生成经典应用之Table数据
- 下一篇: 批量备SAP中CBO ABAP 程序代码