【问题标题】:Native SQL Program and ALV Layout原生 SQL 程序和 ALV 布局
【发布时间】:2014-03-31 15:03:02
【问题描述】:

我使用 from tCode = SE38 创建了一个程序 我正在使用本机 SQL。

这是我的代码:

DATA: BEGIN OF GetData OCCURS 0,
        AUFNR Type COAS-AUFNR,
        AUART     Type COAS-AUART,
        END OF GetData.

EXEC SQL PERFORMING loop_output.
SELECT AUFNR, AUART 
INTO STRUCTURE :GetData 
FROM Mytable
Where (MANDT = 450)
ENDEXEC.
FORM loop_output.

  WRITE: / GetData-AUFNR,
        GetData- AUART.
ENDFORM.

一切运行良好。

现在我想将此报表添加到 ALV 布局中,我该怎么做?

【问题讨论】:

  • 我这样做了:wa-fieldname = 'Month'。 wa-seltext_m = 'nMonth'。将 wa 附加到字段目录。清除哇。 * "2 wa-fieldname = 'Year'。wa-seltext_m = 'nYear'。将 wa 附加到 fieldcatalog。清除 wa。调用函数 'REUSE_ALV_GRID_DISPLAY' 导出 IT_FIELDCAT = fieldcatalog TABLES T_OUTTAB = GetData。如果 SY-SUBRC 0。*在ENDIF这里实现合适的错误处理。结果是空的。它返回列但结果是空的。请指教。谢谢,
  • 如果您有其他信息,您可以编辑您的问题;最好发表评论。我改进了您的格式以显示代码(缩进 4 个空格)。
  • 到底为什么要使用 Native SQL?
  • 如果你想使用原生 SQL,至少要借助 ADBC(例如类 CL_SQL_STATEMENT 和 CL_SQL_RESULT_SET)。其次,仅当您想使用给定数据库的特定功能时才使用它,例如来自 Oracle 的XMLSERIALIZE。在您的示例中,您使用标准 SQL,请为此目的使用 Open SQL。

标签: abap alv native-sql


【解决方案1】:

好的,首先我会将您的结构创建为一个类型,然后创建一个该类型的表以传递给 SALV。我在这个例子中使用了 SALV,因为它更容易。您需要一个表类型作为结构格式传递给 SALV,它目前无法通过您的声明识别。我删除了代码中的 mant where 子句,因为在我们的系统中,我们无法通过客户端查询。 perform设置alv设置,然后display方法执行。

TYPES: BEGIN OF ty_getdata,
         aufnr TYPE coas-aufnr,
         auart     TYPE coas-auart,
         END OF ty_getdata.

 DATA: lt_getdata type TABLE OF ty_getdata.

 DATA: gr_salv      TYPE REF TO cl_salv_table,
       gr_functions TYPE REF TO cl_salv_functions,
       gr_display   TYPE REF TO cl_salv_display_settings,
       gr_columns   TYPE REF TO cl_salv_columns.

 SELECT aufnr auart
   INTO CORRESPONDING FIELDS OF TABLE lt_getdata
 FROM mytable.

   PERFORM alvsettings.

   gr_salv->display( ).

*&---------------------------------------------------------------------*
*&      Form  alvsettings
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alvsettings .

  cl_salv_table=>factory( IMPORTING r_salv_table = gr_salv
                          CHANGING t_table = lt_getdata ).

  gr_functions = gr_salv->get_functions( ).
  gr_functions->set_all( abap_true ).

  gr_display = gr_salv->get_display_settings( ).
  gr_display->set_striped_pattern( cl_salv_display_settings=>true ).
  gr_display->set_list_header( 'SALV Output' ).

  gr_columns = gr_salv->get_columns( ).
  gr_columns->set_optimize( 'X' ).

ENDFORM.                    " alvsettings

【讨论】:

    【解决方案2】:

    这里是一些 cmets 的示例。

    一、数据定义

    TYPE-POOLS slis. "import you need for REUSE_ALV_FIELDCATALOG_MERGE
    
    DATA:
      lt_fieldcat TYPE slis_t_fieldcat_alv,
    
      BEGIN OF G_IT_MATERIAL occurs 0,
        MATNR LIKE MARA-MATNR,
        MTART LIKE MARA-MTART,
        MAKTX_DE LIKE MAKT-MAKTX,
        MAKTX_FR LIKE MAKT-MAKTX,
        MAKTX_IT LIKE MAKT-MAKTX,
        ERNAM LIKE MARA-ERNAM,
        ERSDA LIKE MARA-ERSDA,
        LAEDA LIKE MARA-LAEDA,
      END OF G_IT_MATERIAL.
    

    绝对有必要直接用 LIKE 定义本地结构,否则 REUSE_ALV_FIELDCATALOG_MERGE 的解析器将找不到它。

    选择你的东西:

     SELECT ma~matnr ma~mtart ma~ernam ma~ersda ma~laeda
     de~maktx as maktx_de fr~maktx as maktx_fr it~maktx as maktx_it
     FROM mara as ma
     LEFT JOIN MAKT as de ON de~matnr = ma~matnr AND de~spras = 'DE'
     LEFT JOIN MAKT as fr ON fr~matnr = ma~matnr AND fr~spras = 'FR'
     LEFT JOIN MAKT as it ON it~matnr = ma~matnr AND it~spras = 'IT'
     INTO CORRESPONDING FIELDS OF TABLE g_it_material
          WHERE ...
    

    动态创建字段目录

    CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
    I_PROGRAM_NAME        = sy-repid
    
    I_INTERNAL_TABNAME    = 'G_IT_MATERIAL'
    
    I_INCLNAME            = sy-repid
    CHANGING
    ct_fieldcat            = lt_fieldcat
    EXCEPTIONS
    inconsistent_interface = 1
    program_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.
    

    现在显示该 ALV 网格

    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
    it_fieldcat   = lt_fieldcat                 "you could also give a structure
    "i_structure_name      = 'ZMM_SMATERIAL'    "here instead of the fieldcat
    TABLES
    t_outtab      = g_it_material
    EXCEPTIONS
    program_error = 1
    OTHERS        = 2.
    

    请注意,解析器还需要最大行大小为 72。

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多