abap 单元格级别的操作ALV.
單元格級別的操作ALV.
帶表頭的ALV使用結(jié)構(gòu)如下:
? CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
??? EXPORTING
????? I_LIST_TYPE = 0
??? IMPORTING
????? ET_EVENTS?? = I_EVENTS.
? READ TABLE I_EVENTS
?????? WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
?????? INTO W_EVENTS.
? IF SY-SUBRC = 0.
??? MOVE 'ALV_TOP_OF_PAGE' TO W_EVENTS-FORM.
??? MODIFY I_EVENTS FROM W_EVENTS INDEX SY-TABIX.
? ENDIF.
?CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
??? EXPORTING
????? I_CALLBACK_PROGRAM?????? = SY-REPID
????? I_CALLBACK_PF_STATUS_SET = 'SET_STATUS'
????? I_CALLBACK_USER_COMMAND? = 'USER_COMMAND'
????? IS_LAYOUT_LVC??????????? = GD_LAYOUT
????? IT_FIELDCAT_LVC????????? = IT_FIELDCAT
????? IT_EVENTS??????????????? = I_EVENTS
????? I_SAVE?????????????????? = 'X'
????? IT_SORT_LVC????????????? = IT_SORT
??? TABLES
????? T_OUTTAB???????????????? = GT_ALV
??? EXCEPTIONS
????? PROGRAM_ERROR??????????? = 1
????? OTHERS?????????????????? = 2.
一,定義部分。
TYPE-POOLS: SLIS.
1. 定義顯示字段宏
DATA: IT_FIELDCAT TYPE LVC_T_FCAT,???? "slis_t_fieldcat_alv WITH HEADER LINE,
????? WA_FIELDCAT TYPE LVC_S_FCAT.
DEFINE ALV_INIT.
? WA_FIELDCAT-FIELDNAME?? = &1.
? WA_FIELDCAT-SCRTEXT_M?? = &2.
? WA_FIELDCAT-EDIT??????? = &3.
? WA_FIELDCAT-OUTPUTLEN?? = &4.
? APPEND WA_FIELDCAT TO IT_FIELDCAT.
? CLEAR WA_FIELDCAT.
END-OF-DEFINITION.
2.定義排序定義
DATA: IT_SORT TYPE LVC_T_SORT.
?DATA: WA_SORT TYPE LVC_S_SORT.
3.定義顯示參數(shù)
DATA? GD_LAYOUT??? TYPE LVC_S_LAYO.
4.表頭定義
? DATA?? I_EVENTS??????? TYPE SLIS_T_EVENT,
?????? W_EVENTS??????? LIKE LINE OF I_EVENTS.
? DATA?? I_LIST_COMMENTS TYPE SLIS_T_LISTHEADER,
???????? W_LIST_COMMENTS LIKE LINE OF I_LIST_COMMENTS .
5.單元格可編輯狀態(tài)設(shè)置
在定義的輸出結(jié)構(gòu)中添加
? TYPES: BEGIN OF TYP_SAMPLE.
?.......
? TYPES: 測試字段名稱 TYPE 測試類型.
? TYPES: SEL?? TYPE C.???????????????? "為設(shè)置多選狀態(tài)預(yù)留
TYPES: FIELD_STYLE? TYPE LVC_T_STYL. "為設(shè)置單元格狀態(tài)預(yù)留
TYPES: ROWCOLOR???? TYPE CHAR30.???? "為添加某行數(shù)據(jù)整體顏色預(yù)留
? TYPES: END OF TYP_SAMPLE.
二、ALV FM 動態(tài)程序出口格式:
1.ALV PAI事件出口格式:
FORM USER_COMMAND USING RF_UCOMM??? LIKE SY-UCOMM
??????????????????????? RS_SELFIELD TYPE SLIS_SELFIELD.
1).使用整體設(shè)置,只要有OK_CODE就會刷新
RS_SELFIELD-REFRESH = 'X'.
2).不同按鈕條件下的刷新
CASE RF_UCOMM.
WHEN 'SAVE'."SAVE為狀態(tài)欄按鈕
"只在點擊SAVE(按鈕名稱)按鈕時候才會自動刷新
RS_SELFIELD-REFRESH = 'X'.
WHEN OTHERS.
ENDCASE.
ENDFORM.?? ?
2.表頭出口實例:
FORM ALV_TOP_OF_PAGE.
? CLEAR: I_LIST_COMMENTS[].
? W_LIST_COMMENTS-TYP? = 'H'. "H=Header, S=Selection, A=Action
? W_LIST_COMMENTS-KEY? = ''.
? CONCATENATE? ' ' '直發(fā)銷售訂單取消審批流程' INTO W_LIST_COMMENTS-INFO.
? APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
**組織機構(gòu)
? CLEAR W_LIST_COMMENTS.
? W_LIST_COMMENTS-TYP? = 'S'. "H=Header, S=Selection, A=Action
? W_LIST_COMMENTS-KEY? = ''.
? CONCATENATE? '雙擊報表中的銷售訂單那列可以進入顯示銷售訂單界面,查看銷售訂單詳細情況。'
? W_LIST_COMMENTS-INFO INTO W_LIST_COMMENTS-INFO.
? APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
** 時間范圍
? CLEAR W_LIST_COMMENTS.
? W_LIST_COMMENTS-TYP? = 'S'. "H=Header, S=Selection, A=Action
? W_LIST_COMMENTS-KEY? = ''.
? CONCATENATE? '統(tǒng)計日期:' SY-DATUM INTO W_LIST_COMMENTS-INFO.
? APPEND W_LIST_COMMENTS TO I_LIST_COMMENTS.
? CLEAR W_LIST_COMMENTS.
*調(diào)撥ALV的功能
? CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
??? EXPORTING
????? IT_LIST_COMMENTARY = I_LIST_COMMENTS.
ENDFORM.????????????????? "alv_top_of_page
3.狀態(tài)欄出口實例
FORM SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB.
ENDFORM.? ?
三 ALV整體設(shè)置以及相關(guān)功能。
1). GD_LAYOUT-BOX_FNAME? = 'SEL'.?????? “設(shè)置多選按鈕名稱???? (定義字段)
? GD_LAYOUT-STYLEFNAME = 'FIELD_STYLE'. ”設(shè)置單元格選擇名稱 (定義字段)
? GD_LAYOUT-INFO_FNAME = 'ROWCOLOR'.?? “設(shè)置顏色名稱??????? (定義字段)
單元格設(shè)置為不可編輯狀態(tài)設(shè)置:(WA_FIELDCAT-EDIT = 'X' 要操作的列 必須設(shè)為可編輯狀態(tài) )
????? LS_STYLEROW-FIELDNAME = '測試字段名稱' .
?????? LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "set field to disabled
?????? CLEAR? GT_ALV-FIELD_STYLE.
?????? APPEND LS_STYLEROW TO? GT_ALV-FIELD_STYLE.
注:通過LOOP ALV要顯示的內(nèi)表 可以根據(jù)SEL的‘X’或者其他字段的狀態(tài)值,動態(tài)設(shè)置可編輯還是不可編輯狀態(tài)
單元格設(shè)置為可編輯狀態(tài)設(shè)置:
????? LS_STYLEROW-FIELDNAME = '測試字段名稱' .
????? LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "set field to disabled
????? CLEAR? GT_ALV-FIELD_STYLE.
????? APPEND LS_STYLEROW TO? GT_ALV-FIELD_STYLE.
注:通過LOOP ALV要顯示的內(nèi)表 可以根據(jù)SEL的‘X’或者其他字段的狀態(tài)值,動態(tài)設(shè)置可編輯還是不可編輯狀態(tài)
實例備忘代碼:
? LOOP AT? GT_ALV WHERE SQYY NE ''. "SQYY 申請原因 STAT 申請狀態(tài)
??? IF GT_ALV-STAT IS NOT INITIAL.
????? LS_STYLEROW-FIELDNAME = 'SQYY' .
????? LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. "set field to disabled
????? CLEAR? GT_ALV-FIELD_STYLE.
????? APPEND LS_STYLEROW TO? GT_ALV-FIELD_STYLE.
????? MODIFY GT_ALV.
????? CLEAR LS_STYLEROW.
????? CLEAR GT_ALV.
??? ELSE.
????? LS_STYLEROW-FIELDNAME = 'SQYY' .
????? LS_STYLEROW-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. "set field to disabled
????? CLEAR? GT_ALV-FIELD_STYLE.
????? APPEND LS_STYLEROW TO? GT_ALV-FIELD_STYLE.
????? MODIFY GT_ALV.
????? CLEAR LS_STYLEROW.
????? CLEAR GT_ALV.
??? ENDIF.
2).?? 設(shè)置排序字段代碼示例
? WA_SORT-SPOS = '01'.
? WA_SORT-FIELDNAME = '測試字段名稱'.
? WA_SORT-UP = 'X'.???? "升序排列? WA_SORT-DOWN = ‘X’降序排列
? APPEND WA_SORT TO IT_SORT.
? CLEAR WA_SORT.
?
四 ALV中 PAI事件塊的操作。
?1).由于單元格可編輯狀態(tài),故要讓后臺獲取前臺(顯示層)所操作的數(shù)據(jù),需要調(diào)用一個函數(shù)。
? CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
??? IMPORTING
????? E_GRID = ALV_GRID.
分析:調(diào)用這個函數(shù)的其實是獲取 調(diào)用標準FM ALV的屏幕號已經(jīng)屏幕上的CONTROL(C)控件名稱,并將所有的屬性賦值給定義好的實例ALV_GRID,然后通過ALV_GRID 調(diào)用相關(guān)的方法。
? CALL METHOD ALV_GRID->CHECK_CHANGED_DATA.? 在里面的最重要的一句代碼就是
CALL METHOD CL_GUI_CFW=>FLUSH.這句代碼是將前臺屏幕所輸入的信息 同步到后臺CFW 服務(wù)器,然后使用ABAP代碼獲取所需要的操作信息。 CFW : CONTROL FRAMEWORK? 控件架構(gòu) 在SAP 的前臺中有個SAP GUI SERVICES (AUTOMATION HANDLER) 應(yīng)用層的是 (CONTROL FRAMEWORK SERVICES) 就是使用該語句進行同步刷新的 。
代碼示例如下:
? FORM USER_COMMAND USING RF_UCOMM??? LIKE SY-UCOMM
??????????????????????? RS_SELFIELD TYPE SLIS_SELFIELD.
??????????????????????? RS_SELFIELD TYPE SLIS_SELFIELD.
? RS_SELFIELD-REFRESH = 'X'.? "防止雙擊刷新
? CASE RF_UCOMM .
??? WHEN 'APPROVE'.“審批
?? DATA ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
? DATA LT_ZHGXS_ZFSP TYPE TABLE OF ZHGXS_ZFSP.
? DATA LS_ZHGXS_ZFSP TYPE ZHGXS_ZFSP.
? DATA L_SIGN TYPE C.
? CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
??? IMPORTING
????? E_GRID = ALV_GRID.
? CALL METHOD ALV_GRID->CHECK_CHANGED_DATA.
”偽代碼如下:
LOOP ALV輸出內(nèi)表 WHRER SEL = 'X' 被選中的行
?IF? 測試定義字段? IS INITIAL.
ELSE.
?? 結(jié)構(gòu)賦值.
添加內(nèi)表.
?ENDIF.
使用更新內(nèi)表更新數(shù)據(jù)庫。
IF 返回值 = 0.
COMMIT WORK .提交數(shù)據(jù)庫,數(shù)據(jù)將不能被回滾.(數(shù)據(jù)層執(zhí)行UPDATE隊列。調(diào)用相關(guān)FM寫入數(shù)據(jù)庫。)
ELSE.
ROLLBACK WORK . 數(shù)據(jù)庫回滾,只要有一條數(shù)據(jù)出錯,所有的數(shù)據(jù)將不能被寫入數(shù)據(jù)庫
ENDLOOP
?......
????? WHEN OTHERS.
??? ENDCASE.
? ENDFORM.?? ?
2) 單行添加顏色。
?已設(shè)置好的字段
? TYPES: BEGIN OF TYP_SAMPLE.
?.......
TYPES: ROWCOLOR???? TYPE CHAR30.???? "為添加某行數(shù)據(jù)整體顏色預(yù)留
? TYPES: END OF TYP_SAMPLE.
?GD_LAYOUT-INFO_FNAME = 'ROWCOLOR'.?? “設(shè)置顏色名稱??????? (定義字段)
?PAI 出口中
如果遇到特定的提示情況,將值 C100? C200? .... C600 等等值付給ROWCOLOR. ALV自動就會輸出顏色行。
?五、雙擊單元格控制。
在ALV函數(shù)的PAI出口中。
雙擊 是OKCODE為空時候 默認響應(yīng)事件。
所以實例代碼如下:
? FORM USER_COMMAND USING RF_UCOMM??? LIKE SY-UCOMM
??????????????????????? RS_SELFIELD TYPE SLIS_SELFIELD.
? RS_SELFIELD-REFRESH = 'X'.? "防止雙擊刷新
? CASE RF_UCOMM .
??? WHEN 'APPROVE'.
????? PERFORM? SUB_APPROVE_DATA TABLES GT_ALV.?? "提交申
??? WHEN 'REFRESH'.
????? PERFORM SUB_GET_DATA.
????? PERFORM SUB_SET_ALV.
??? WHEN OTHERS.
????? "雙擊
????? IF? RS_SELFIELD-SEL_TAB_FIELD EQ '1-VBELN'.
??????? READ TABLE GT_ALV INTO GS_ALV INDEX RS_SELFIELD-TABINDEX.
??????? SET PARAMETER ID 'AUN' FIELD GS_ALV-VBELN.
??????? CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN.
????? ELSEIF RS_SELFIELD-SEL_TAB_FIELD EQ '1-SQYY'.
??????? READ TABLE GT_ALV INTO GS_ALV INDEX RS_SELFIELD-TABINDEX.
??????? IF SY-SUBRC EQ 0.
????????? CALL SCREEN 9000 STARTING AT 60?? 6
?????????????????????????? ENDING?? AT 102? 19? .
????????? MODIFY GT_ALV FROM GS_ALV INDEX? RS_SELFIELD-TABINDEX.
??????? ENDIF.
????? ENDIF.
? ENDCASE.
? CLEAR SY-UCOMM.
ENDFORM.?? ?
其中?????????? RS_SELFIELD-SEL_TAB_FIELD EQ '1-測試字段名稱'
解釋如下:1 就是數(shù)字1. - 連接符-?? 后面就是VBELN.
1可以理解為 列的意思,雙擊哪一列的哪個格。
RS_SELFIELD-TABINDEX 是系統(tǒng)結(jié)構(gòu)的內(nèi)表INDEX.
六。自定義輸入 輸入編輯文本框。自己畫好屏幕(憑感覺畫)然后畫一個控件CONTROL 命名為G_CONTAINER
9000屏幕流? 9000屏幕屬性 :方式對話框
? PROCESS BEFORE OUTPUT.
?MODULE STATUS_9000.
*
PROCESS AFTER INPUT.
?MODULE USER_COMMAND_9000.
屏幕代碼:
? MODULE STATUS_9000 OUTPUT.
? SET PF-STATUS 'S9000'.
? CLEAR GT_SQYY[].
? APPEND GS_ALV-SQYY TO GT_SQYY.
? DATA L_SIGN TYPE C.
? IF GS_ALV-STAT NE ''.
??? L_SIGN = 'X'.
? ENDIF.
? CALL FUNCTION 'RH_EDITOR_SET'
??? EXPORTING
????? REPID????????? = SY-REPID
????? DYNNR????????? = '9000'
????? CONTROLNAME??? = 'G_CONTAINER'
????? MAX_COLS?????? = 43
????? SHOW_STATUS??? = 'X'
????? DISPLAY_MODE?? = L_SIGN
??? TABLES
????? LINES????????? = GT_SQYY[]
??? EXCEPTIONS
????? CREATE_ERROR?? = 1
????? INTERNAL_ERROR = 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.
? CLEAR L_SIGN.
ENDMODULE.???????????????? " STATUS_9000? OUTPUT
? MODULE USER_COMMAND_9000 INPUT.
? DATA L_SQYY TYPE CHAR200.
? CASE SY-UCOMM.
??? WHEN? 'EXIT' OR 'BACK' OR 'CANCLE'.
????? LEAVE TO SCREEN 0.
??? WHEN 'SAVE'.
????? CLEAR GT_SQYY[].
????? CALL FUNCTION 'RH_EDITOR_GET'
??????? EXPORTING
????????? CONTROLNAME??? = 'G_CONTAINER'
??????? TABLES
????????? LINES????????? = GT_SQYY[]
??????? EXCEPTIONS
????????? INTERNAL_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.
????? LOOP AT GT_SQYY.
??????? CONCATENATE? L_SQYY GT_SQYY INTO L_SQYY .
??????? CONDENSE L_SQYY NO-GAPS .
??????? CLEAR GT_SQYY.
????? ENDLOOP.
????? GS_ALV-SQYY = L_SQYY.
????? CLEAR L_SQYY.
????? LEAVE TO SCREEN 0.
? ENDCASE.
ENDMODULE.???????????????? " USER_COMMAND_9000? INPUT
這樣效果就是雙擊可編輯單元格就會出現(xiàn)一個可編輯文本框,定義一個對話框?qū)傩缘臓顟B(tài)欄 定義兩個按鈕 SAVE 和 BACK。
總結(jié)
以上是生活随笔為你收集整理的abap 单元格级别的操作ALV.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SD_CUSTOMER_MAINTAIN
- 下一篇: ABAP--如何创建动态结构的报表