abap 关联集团公司,公司代码,账目表,总账科目这些数据库表,然后显示在alv
REPORT z_gl_account_display.
*----------------------------------------------------------------------*
* 选择屏幕 - 多公司代码(方案二:参考变量)
*----------------------------------------------------------------------*
DATA: gv_bukrs TYPE t001-bukrs.
SELECT-OPTIONS: s_bukrs FOR gv_bukrs DEFAULT '1000' TO '1005'.
*----------------------------------------------------------------------*
* 内表定义
*----------------------------------------------------------------------*
TYPES: BEGIN OF ty_output,
mandt TYPE t001-mandt,
bukrs TYPE t001-bukrs,
butxt TYPE t001-butxt,
ktopl TYPE t004-ktopl,
saknr TYPE skat-saknr,
txt50 TYPE skat-txt50,
xbilk TYPE ska1-xbilk,
END OF ty_output.
DATA: gt_output TYPE STANDARD TABLE OF ty_output.
*----------------------------------------------------------------------*
* ALV 事件处理类(双击跳转 FBL3N 行项目明细)
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS handle_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD handle_double_click.
DATA: ls_output TYPE ty_output.
READ TABLE gt_output INDEX row INTO ls_output.
IF sy-subrc = 0.
" 设置 FBL3N 所需参数(公司代码+科目号+年度)
SET PARAMETER ID 'BUK' FIELD ls_output-bukrs. " 公司代码
SET PARAMETER ID 'SAK' FIELD ls_output-saknr. " 总账科目
SET PARAMETER ID 'GJR' FIELD sy-datum(4). " 会计年度
CALL TRANSACTION 'FBL3N' AND SKIP FIRST SCREEN. " ✅ 跳转行项目显示
ENDIF.
ENDMETHOD.
ENDCLASS.
DATA: lo_handler TYPE REF TO lcl_event_handler.
*----------------------------------------------------------------------*
* 取数逻辑
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM get_data.
PERFORM display_alv.
FORM get_data.
SELECT
t001~mandt,
t001~bukrs,
t001~butxt,
t004~ktopl,
skat~saknr,
skat~txt50,
ska1~xbilk
INTO CORRESPONDING FIELDS OF TABLE @gt_output
FROM t001
INNER JOIN t004 ON t004~ktopl = t001~ktopl
INNER JOIN skb1 ON skb1~bukrs = t001~bukrs
INNER JOIN skat ON skat~saknr = skb1~saknr
AND skat~ktopl = t001~ktopl
AND skat~spras = @sy-langu
INNER JOIN ska1 ON ska1~saknr = skb1~saknr
AND ska1~ktopl = t001~ktopl
WHERE t001~bukrs IN @s_bukrs
ORDER BY t001~bukrs, skat~saknr.
IF sy-subrc <> 0.
MESSAGE '未找到符合条件的数据' TYPE 'I'.
ENDIF.
ENDFORM.
*----------------------------------------------------------------------*
* ALV 显示 + 双击事件注册
*----------------------------------------------------------------------*
FORM display_alv.
DATA: lo_alv TYPE REF TO cl_salv_table,
lo_events TYPE REF TO cl_salv_events_table.
IF gt_output IS INITIAL.
RETURN.
ENDIF.
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = gt_output
).
lo_alv->get_columns( )->set_optimize( abap_true ).
lo_events = lo_alv->get_event( ).
CREATE OBJECT lo_handler.
SET HANDLER lo_handler->handle_double_click FOR lo_events.
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx).
MESSAGE lx->get_text( ) TYPE 'E'.
ENDTRY.
ENDFORM.
支持多公司代码查询:将 PARAMETERS p_bukrs 改为 SELECT-OPTIONS(选择区间),这样您可以一次查看多个公司代码,或使用 * 全选。
修改方法:将 PARAMETERS 那行替换为 SELECT-OPTIONS: s_bukrs FOR t001-bukrs DEFAULT '1000' TO '9999'.,并将 SQL 中的 WHERE t001~bukrs = @p_bukrs 改为 WHERE t001~bukrs IN @s_bukrs。
显示更多描述性文本:虽然我们移除了有问题的 T004T,但如果您需要“科目表名称”,可以单独用 T004T 表补全,或者通过数据字典视图 V_T004 来获取。
增加交互功能:可以给 CL_SALV_TABLE 添加双击事件,双击科目号时自动跳转到 FS10N(科目余额)或 FBL3N(科目明细)事务代码,方便财务用户直接查看明细。
浙公网安备 33010602011771号