我有以下问题。
我需要编写一个脚本,从表示层读取特定文件, 每行包含一个数字字符串,该文件的内容需要输入到内部表中,然后内部表需要内部连接,使用表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
确切输出:
答案 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)
DFKKOP-VKONT字段具有alpha转换。我看到你的ID是10个字符长度。在文件中你有前导零吗?如果不是,它永远不会找到相应的记录。对输入值使用输入alpha转换方法。 - szako Jun 23 at 12:09