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(科目明细)事务代码,方便财务用户直接查看明细。

posted @ 2026-07-08 11:44  虚拟过客之IT老男人  阅读(7)  评论(0)    收藏  举报