ABAP - 内部使用db表加入itab

时间:2017-06-23 11:03:29

标签: database abap

我有以下问题。

我需要编写一个脚本,从表示层读取特定文件, 每行包含一个数字字符串,该文件的内容需要输入到内部表中,然后内部表需要内部连接,使用表dfkkop生成与内部表中每个数字字符串对应的等效行

我最近读到,在itab和db表之间无法进行传统的内连接,而是应该使用“FOR ALL ENTRIES IN”。问题是它似乎不起作用,这是代码:

TYPES:
  BEGIN OF type_dfkkop_vkont,
    vkont TYPE dfkkop-vkont,
  END OF type_dfkkop_vkont.

DATA: gt_dfkkop_file TYPE STANDARD TABLE OF type_dfkkop_vkont.
DATA: wa_gt_dfkkop_file LIKE LINE OF gt_dfkkop_file.

DATA: gt_dfkkop LIKE DFKKOP OCCURS 0 WITH HEADER LINE. 
DATA: wa_gt_dfkkop LIKE dfkkop.

DATA: gv_filename TYPE string,
      gv_filetype TYPE char10.


*----------------------------------------------------------------------*
*     START-OF-SELECTION
*----------------------------------------------------------------------*
PERFORM read_file.
PERFORM process_data.


*&---------------------------------------------------------------------*
*&      Form  read_file
*&---------------------------------------------------------------------*
FORM read_file.
*Move complete file path to file name
  gv_filename = 'C:\Users\p.doulgeridis\Desktop\data.txt'.

*Upload the data from a file in SAP presentation server to internal
*table
  CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename            = gv_filename
      filetype            = 'ASC'
      has_field_separator = 'X'
    TABLES
     data_tab            = gt_dfkkop_file.

ENDFORM.                    " read_file

*&---------------------------------------------------------------------*
*&      Form  process_data
*&---------------------------------------------------------------------*
FORM process_data.
   SELECT *
    FROM dfkkop
    INTO CORRESPONDING FIELDS OF TABLE gt_dfkkop
    FOR ALL ENTRIES IN gt_dfkkop_file
    WHERE vkont = gt_dfkkop_file-vkont.

*Display the internal table data
*  LOOP AT gt_dfkkop_file INTO wa_gt_dfkkop_file.
*    WRITE:/ wa_gt_dfkkop_file-vkont.
*    CLEAR: wa_gt_dfkkop_file.
*  ENDLOOP.
*  

IF gt_dfkkop_file IS NOT INITIAL.
    WRITE: / 'TABLE GT_DFKKOP_FILE IS NOT INITIAL'.
  ELSE.
    WRITE: / 'TABLE GT_DFKKOP_FILE IS INITIAL'.
  ENDIF.



  IF gt_dfkkop IS NOT INITIAL.
    WRITE: / 'TABLE GT_DFKKOP IS NOT INITIAL'.
  ELSE.
    WRITE: / 'TABLE GT_DFKKOP IS INITIAL'.
  ENDIF.


 LOOP AT gt_dfkkop_file INTO wa_gt_dfkkop_file.
    WRITE: /"'1',
      wa_gt_dfkkop_file-vkont.
 ENDLOOP.

  LOOP AT gt_dfkkop INTO wa_gt_dfkkop.
    WRITE: / "'1',
     wa_gt_dfkkop-vkont,
     wa_gt_dfkkop-opbel,
  wa_gt_dfkkop-OPUPW.
  ENDLOOP.

ENDFORM.                    " process_data

目前,我没有收到语法错误,程序执行,但不会产生任何输出。有人能帮助我吗?

编辑1:输出看起来像这样,就像它没有找到要查询的文本文件中的值一样,请记住我正在阅读的文件大约有11行值,这些值已经存在于表dfkkop所以他们应该产生一个结果,而不是我得到:

[blank11spaces]             4000000187   000

确切输出:

enter image description here

3 个答案:

答案 0 :(得分:2)

在for all entries部分中,您必须引用包含键条目的内部表。忘记ENDSELECT也是因为您可以立即将所有条目移动到内部表中。

正确的语法是:

  SELECT *
    FROM dfkkop
    INTO CORRESPONDING FIELDS OF TABLE gt_dfkkop
    FOR ALL ENTRIES IN gt_dfkkop_file
    WHERE vkont = gt_dfkkop_file-vkont.

有关命令here的更多信息。顺便说一下,这个命令最重要的部分如下:记住这一点:

  

在使用FOR ALL ENTRIES之后的内部表格之前,始终   检查内部表是否不是初始的。在最初的内部   表,所有行都是从数据库中读取的,无论如何都是如此   WHERE之后指定的条件。这通常不是必需的   行为。

答案 1 :(得分:2)

你选择的问题是你使用“FOR ALL ENTRIES IN gt_dfkkop”而不是“ FOR ALL ENTRIES IN gt_dfkkop_file ”,此外,你可以使用INTO而不是SELECT - ENDSELECT,将导致szako已经完成的查询。

如果您处理大量数据并且您希望在gt_dfkkop_file中找到许多合同帐户(VKONT)重复项,则可以提高将vkont移动到另一个临时表并使用它而不是gt_dfkkop_file的性能。检查您使用的表格是否为空。

答案 2 :(得分:1)

szako似乎在上面的评论中回答了这个问题:

DFKKOP-VKONT字段具有alpha转换。我看到你的ID是10个字符长度。在文件中你有前导零吗?如果不是,它永远不会找到相应的记录。对输入值使用输入alpha转换方法。 - szako Jun 23 at 12:09