[SAP ABAP] ALV报表练习6
销售订单凭证流追踪报表业务目的根据选择屏幕的筛选条件使用ALV报表显示以销售订单为原点实时、可视化地追溯从 订单录入 到 收款过账 的全链路单据流转状态信息支撑订单履行过程中的异常监控与高效协同效果展示输入指定筛选条件点击执行按钮效果如下所示完整代码如下所示主程序(zrs0511)*---------------------------------------------------------------------* * Report ZRS0511 *---------------------------------------------------------------------* REPORT zrs0511. INCLUDE zrs0511_top. 數據定義 INCLUDE zrs0511_f01. 子例程 *----------------------------------------------------------------------* * DESC: INITIALIZATION 事件 *----------------------------------------------------------------------* INITIALIZATION. *----------------------------------------------------------------------* * DESC: AT SELECTION-SCREEN OUTPUT 事件 *----------------------------------------------------------------------* AT SELECTION-SCREEN OUTPUT. *----------------------------------------------------------------------* * DESC: AT SELECTION-SCREEN 事件 *----------------------------------------------------------------------* AT SELECTION-SCREEN. *----------------------------------------------------------------------* * DESC: START-OF-SELECTION 事件 *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM frm_get_data. 獲取數据 檢查數据是否為空 IF gt_item IS INITIAL. MESSAGE 不存在滿足條件的數据請确認選擇條件 TYPE I. ENDIF. *---------------------------------------------------------------------* * END-OF-SELECTION 事件 *---------------------------------------------------------------------* END-OF-SELECTION. PERFORM frm_display_data. ALV呈現數据INCLUDE程序(zrs0511_top)*---------------------------------------------------------------------* * 包含 ZRS0511_TOP *---------------------------------------------------------------------* TABLES: vbrk, vbrp, vbak, lips, vbap, likp, bseg, konv. * 選擇屏幕 SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-001. SELECT-OPTIONS: s_vkorg FOR vbak-vkorg NO INTERVALS NO-EXTENSION, Sales Org s_erdat FOR vbak-erdat. SO開單日期範圍 SELECTION-SCREEN END OF BLOCK b01. * 自定義數据類型 TYPES: BEGIN OF ty_item, so_vbeln TYPE vbak-vbeln, SO單號 dn_vbeln TYPE lips-vbeln, DN交貨單 lfdat TYPE likp-lfdat, DN出貨日期 matnr TYPE vbap-matnr, 料號 arktx TYPE vbap-arktx, 品名描述 kwmeng TYPE vbap-kwmeng, 銷售訂單數量(SO現有數量) vrkme TYPE vbap-vrkme, 銷售單位 bukrs TYPE vbrk-bukrs, 公司代碼 werks TYPE vbap-werks, 廠別 lgort TYPE vbap-lgort, 倉碼 bstnk TYPE vbak-bstnk, 客戶訂單 mblnr TYPE mkpf-mblnr, 過賬編號(GD goods issue) belnr TYPE bseg-belnr, SAP發票號(Accounting document) billing_vbeln TYPE vbrk-vbeln, BillingNo fkdat TYPE vbrk-fkdat, Billing日期 unit_price TYPE netwr_fp, 未稅單價 netwr TYPE vbrp-netwr, 未稅金額(Net value) fkimg TYPE vbrp-fkimg, 開票數量 kbetr TYPE konv-kbetr, 稅率(Tax code) mwsbp TYPE vbrp-mwsbp, 稅金(Tax amount) brtwr TYPE vbrp-brtwr, 含稅金額(Gross value) END OF ty_item. TYPES: BEGIN OF ty_bseg, belnr TYPE bseg-belnr, 會計憑證號 gjahr TYPE bseg-gjahr, 會計年度 vbeln TYPE bseg-vbeln, 參考憑證發票號 bukrs TYPE bseg-bukrs, 公司代碼 END OF ty_bseg. TYPES: BEGIN OF ty_bseg_key, vbeln TYPE vbrk-vbeln, 發票號 gjahr TYPE bseg-gjahr, 會計年度 bukrs TYPE bseg-bukrs, 公司代碼 END OF ty_bseg_key. * 定義內表和結構體變量 DATA: gs_item TYPE ty_item, gt_item TYPE STANDARD TABLE OF ty_item, gs_bseg TYPE ty_bseg, gt_bseg TYPE STANDARD TABLE OF ty_bseg, gs_bseg_key TYPE ty_bseg_key, gt_bseg_key TYPE STANDARD TABLE OF ty_bseg_key. * ALV參數定義 DATA: gs_layout TYPE lvc_s_layo, 用于定義ALV表單的相關格式、屬性 gs_fcat TYPE lvc_s_fcat, 字段目錄工作區 gt_fcat LIKE TABLE OF gs_fcat. 字段目錄內表INCLUDE程序(zrs0511_f01)*---------------------------------------------------------------------* * 包含 ZRS0511_F01 *---------------------------------------------------------------------* *---------------------------------------------------------------------* * Form frm_get_data *---------------------------------------------------------------------* FORM frm_get_data . SELECT DISTINCT likp~lfdat DN出貨日期 vbak~vbeln AS so_vbeln SO單號 lips~vbeln AS dn_vbeln DN交貨單 vbap~matnr 料號 vbap~arktx 品名描述 vbap~kwmeng 銷售訂單數量(SO現有數量) vbap~vrkme 銷售單位 vbap~werks 廠別 vbap~lgort 倉碼 vbak~bstnk 客戶訂單 mkpf~mblnr 過賬編號 vbrk~vbeln AS billing_vbeln BillingNo vbrk~fkdat Billing日期 vbrk~bukrs 公司代碼 vbrp~netwr 未稅金額(Net value) vbrp~fkimg 開票數量 vbrp~mwsbp 稅金(Tax amount) INTO CORRESPONDING FIELDS OF TABLE gt_item FROM vbrp INNER JOIN vbrk ON vbrk~vbeln vbrp~vbeln INNER JOIN lips ON lips~vbeln vbrp~vgbel AND lips~posnr vbrp~vgpos INNER JOIN likp ON likp~vbeln lips~vbeln INNER JOIN mkpf ON mkpf~xblnr lips~vbeln INNER JOIN vbap ON vbap~vbeln lips~vgbel AND vbap~posnr lips~vgpos INNER JOIN vbak ON vbak~vbeln vbap~vbeln LEFT JOIN vbkd ON vbkd~vbeln vbap~vbeln AND vbkd~posnr vbap~posnr WHERE vbak~vkorg IN s_vkorg AND vbak~erdat IN s_erdat AND vbrp~fkimg 0. * 構建查詢BSEG表的關鍵字段 LOOP AT gt_item INTO gs_item. gs_bseg_key-vbeln gs_item-billing_vbeln. gs_bseg_key-gjahr gs_item-fkdat0(4). 從Billing日期取年度 gs_bseg_key-bukrs gs_item-bukrs. 公司代碼 COLLECT gs_bseg_key INTO gt_bseg_key. ENDLOOP. * 查詢BSEG表數据 IF gt_bseg_key[] IS NOT INITIAL. SELECT belnr gjahr vbeln bukrs INTO CORRESPONDING FIELDS OF TABLE gt_bseg FROM bseg FOR ALL ENTRIES IN gt_bseg_key WHERE vbeln gt_bseg_key-vbeln AND gjahr gt_bseg_key-gjahr AND bukrs gt_bseg_key-bukrs. ENDIF. LOOP AT gt_item INTO gs_item. 根据發票號、會計年度、公司代碼查找對應的BSEG記錄 READ TABLE gt_bseg INTO gs_bseg WITH KEY vbeln gs_item-billing_vbeln gjahr gs_item-fkdat0(4) bukrs gs_item-bukrs. IF sy-subrc 0. 找到匹配記錄填充會計憑證號 gs_item-belnr gs_bseg-belnr. ELSE. 未找到匹配記錄會計憑證號保持初始值 CLEAR gs_item-belnr. ENDIF. 更新內表 MODIFY gt_item FROM gs_item. ENDLOOP. FIELD-SYMBOLS: fs_item TYPE ty_item. * 計算未稅單價、稅率和含稅金額、转换销售单位 LOOP AT gt_item ASSIGNING fs_item. 未稅單價 IF fs_item-fkimg 0. fs_item-unit_price fs_item-netwr / fs_item-fkimg. ELSE. fs_item-unit_price 0. ENDIF. 含稅金額 未稅金額 稅金 fs_item-brtwr fs_item-netwr fs_item-mwsbp. 稅率 稅金 / 未稅金額 fs_item-kbetr fs_item-mwsbp / fs_item-netwr. 转换销售单位 IF fs_item-vrkme IS NOT INITIAL. CALL FUNCTION CONVERSION_EXIT_CUNIT_OUTPUT EXPORTING input fs_item-vrkme language sy-langu 当前登录语言 IMPORTING output fs_item-vrkme EXCEPTIONS unit_not_found 1 OTHERS 2. IF sy-subrc 0. CONTINUE. 转换失败时字段保持原值不变 ENDIF. ENDIF. ENDLOOP. * 排序 SORT gt_item. ENDFORM. frm_get_data *---------------------------------------------------------------------* * Form frm_display_data *---------------------------------------------------------------------* FORM frm_display_data . PERFORM frm_alv_set_fields. 調用函數展示ALV數据 CALL FUNCTION REUSE_ALV_GRID_DISPLAY_LVC EXPORTING i_callback_program sy-repid it_fieldcat_lvc gt_fcat 設置ALV列屬性 is_layout_lvc gs_layout 設置ALV布局 TABLES t_outtab gt_item 內表數据 EXCEPTIONS program_error 1 OTHERS 2. ENDFORM. frm_display_data *---------------------------------------------------------------------* * Form frm_alv_set_fields *---------------------------------------------------------------------* FORM frm_alv_set_fields . CLEAR: gs_fcat, gt_fcat, gs_layout. * 設置行的屬性(ALV界面格式) gs_layout-zebra X. 斑馬條紋顯示 gs_layout-cwidth_opt X. 优化列寬設置 * ALV字段處理宏 DEFINE catalog. gs_fcat-fieldname 1. 設置要輸出的表格列的值在內表中定義的字段名(必須大寫) gs_fcat-fix_column 2. 固定列 gs_fcat-ref_table 3. gs_fcat-edit 4. gs_fcat-colddictxt L. gs_fcat-scrtext_l 5. 設置要輸出的表格列的列名即ALV報表顯示的列名 gs_fcat-ref_field 6. gs_fcat-outputlen 7. gs_fcat-emphasize 8. 列顏色 gs_fcat-hotspot 9. 熱點 APPEND gs_fcat TO gt_fcat. END-OF-DEFINITION. * 1 2 3 4 5 6 7 8 9 catalog: SO_VBELN X SO單號 , DN_VBELN X DN交貨單 , LFDAT X DN出貨日期 , MATNR 料號 , ARKTX 品名描述 , KWMENG 銷售訂單數量 , VRKME 銷售單位 , WERKS 廠別 , LGORT 倉碼 , BSTNK 客戶訂單 , MBLNR 過賬編號 , BELNR 會計憑證 , BILLING_VBELN BillingNo , FKDAT Billing日期 , UNIT_PRICE 未稅單價 , NETWR 未稅金額 , FKIMG 開票數量 , KBETR 稅率 , MWSBP 稅金 , BRTWR 含稅金額 . 處理SO_VBELN字段的Excel導出問題 LOOP AT gt_fcat INTO gs_fcat WHERE fieldname SO_VBELN. gs_fcat-scrtext_l SO單號. 長文本 gs_fcat-scrtext_m SO單號. 中文本 gs_fcat-scrtext_s SO. 短文本 gs_fcat-edit_mask ALPHA. gs_fcat-datatype CHAR. 字符類型 gs_fcat-inttype C. 內部類型為字符 gs_fcat-outputlen 10. 明确指定長度為10 gs_fcat-no_zero . 關鍵不刪除前導零 MODIFY gt_fcat FROM gs_fcat. EXIT. ENDLOOP. 處理DN_VBELN字段的Excel導出問題 LOOP AT gt_fcat INTO gs_fcat WHERE fieldname DN_VBELN. gs_fcat-scrtext_l DN交貨單. 長文本 gs_fcat-scrtext_m DN交貨單. 中文本 gs_fcat-scrtext_s DN. 短文本 gs_fcat-edit_mask ALPHA. gs_fcat-datatype CHAR. 字符類型 gs_fcat-inttype C. 內部類型為字符 gs_fcat-outputlen 10. 明确指定長度為10 gs_fcat-no_zero . 關鍵不刪除前導零 MODIFY gt_fcat FROM gs_fcat. EXIT. ENDLOOP. ENDFORM. frm_alv_set_fields