使用 SELECT 获取空结果 ... FOR ALL ENTRIES
Getting empty result with SELECT ... FOR ALL ENTRIES
我有以下问题。
我需要写一个脚本,从表示层读取一个特定的文件,每行包含一个数字字符串,这个文件的内容需要输入到一个内部table,然后internal table 需要内部连接,用 table dfkkop
生成对应于 internal table.
中每个数字字符串的等效行
我最近读到不能在内部 table(“itab”)和数据库 table 之间进行传统的内部联接,而我应该使用 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,
wa_gt_dfkkop_file LIKE LINE OF gt_dfkkop_file,
gt_dfkkop LIKE DFKKOP OCCURS 0 WITH HEADER LINE,
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.
gv_filename = 'C:\Users\p.doulgeridis\Desktop\data.txt'.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = gv_filename
filetype = 'ASC'
has_field_separator = 'X'
TABLES
data_tab = gt_dfkkop_file.
ENDFORM.
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.
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: / wa_gt_dfkkop_file-vkont.
ENDLOOP.
LOOP AT gt_dfkkop INTO wa_gt_dfkkop.
WRITE: / wa_gt_dfkkop-vkont, wa_gt_dfkkop-opbel, wa_gt_dfkkop-OPUPW.
ENDLOOP.
ENDFORM.
目前,我没有收到语法错误,程序执行了,但没有产生任何输出。有人可以帮助我吗?
编辑 1:输出看起来像这样,好像它没有在文本文件中找到要查询的值,请记住我正在阅读的文件有大约 11 行值,这已经存在于 table dfkkop
所以他们应该产生一个结果,而不是我得到:
[blank11spaces] 4000000187 000
精确输出:
在所有条目部分,您必须参考包含关键条目的内部 table。也忘记 ENDSELECT 因为您可以一次将所有条目移动到内部 table。
正确的语法是:
SELECT *
FROM dfkkop
INTO CORRESPONDING FIELDS OF TABLE gt_dfkkop
FOR ALL ENTRIES IN gt_dfkkop_file
WHERE vkont = gt_dfkkop_file-vkont.
有关命令的更多信息 here。顺便说一句,此命令最重要的部分如下,请记住:
Before using an internal table itab after FOR ALL ENTRIES, always
check that the internal table is not initial. In an initial internal
tables, all rows are read from the database regardless of any further
conditions specified after WHERE. This is not usually the required
behavior.
您 select 中的问题是您使用的是 "FOR ALL ENTRIES IN gt_dfkkop" 而不是“FOR ALL ENTRIES IN gt_dfkkop_file”,此外,您可以使用 INTO 而不是 SELECT - ENDSELECT,这将导致 szako 完成查询。
如果您处理大量数据并且您希望在 gt_dfkkop_file 中找到许多合约账户 (VKONT) 重复项,您可以将 vkont 移动到另一个时间 table 并使用它来提高性能,而不是gt_dfkkop_file。始终检查您使用的 table 是否为空。
szako 似乎在上面的评论中回答了这个问题:
DFKKOP-VKONT 字段具有 alpha 转换。如我所见,您拥有的 ID 长度为 10 个字符。在文件中你有前导零吗?如果不是,它将永远找不到相应的记录。对输入值使用输入 alpha 转换方法。 – szako 6 月 23 日 12:09
我有以下问题。
我需要写一个脚本,从表示层读取一个特定的文件,每行包含一个数字字符串,这个文件的内容需要输入到一个内部table,然后internal table 需要内部连接,用 table dfkkop
生成对应于 internal table.
我最近读到不能在内部 table(“itab”)和数据库 table 之间进行传统的内部联接,而我应该使用 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,
wa_gt_dfkkop_file LIKE LINE OF gt_dfkkop_file,
gt_dfkkop LIKE DFKKOP OCCURS 0 WITH HEADER LINE,
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.
gv_filename = 'C:\Users\p.doulgeridis\Desktop\data.txt'.
CALL FUNCTION 'GUI_UPLOAD'
EXPORTING
filename = gv_filename
filetype = 'ASC'
has_field_separator = 'X'
TABLES
data_tab = gt_dfkkop_file.
ENDFORM.
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.
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: / wa_gt_dfkkop_file-vkont.
ENDLOOP.
LOOP AT gt_dfkkop INTO wa_gt_dfkkop.
WRITE: / wa_gt_dfkkop-vkont, wa_gt_dfkkop-opbel, wa_gt_dfkkop-OPUPW.
ENDLOOP.
ENDFORM.
目前,我没有收到语法错误,程序执行了,但没有产生任何输出。有人可以帮助我吗?
编辑 1:输出看起来像这样,好像它没有在文本文件中找到要查询的值,请记住我正在阅读的文件有大约 11 行值,这已经存在于 table dfkkop
所以他们应该产生一个结果,而不是我得到:
[blank11spaces] 4000000187 000
精确输出:
在所有条目部分,您必须参考包含关键条目的内部 table。也忘记 ENDSELECT 因为您可以一次将所有条目移动到内部 table。
正确的语法是:
SELECT *
FROM dfkkop
INTO CORRESPONDING FIELDS OF TABLE gt_dfkkop
FOR ALL ENTRIES IN gt_dfkkop_file
WHERE vkont = gt_dfkkop_file-vkont.
有关命令的更多信息 here。顺便说一句,此命令最重要的部分如下,请记住:
Before using an internal table itab after FOR ALL ENTRIES, always check that the internal table is not initial. In an initial internal tables, all rows are read from the database regardless of any further conditions specified after WHERE. This is not usually the required behavior.
您 select 中的问题是您使用的是 "FOR ALL ENTRIES IN gt_dfkkop" 而不是“FOR ALL ENTRIES IN gt_dfkkop_file”,此外,您可以使用 INTO 而不是 SELECT - ENDSELECT,这将导致 szako 完成查询。
如果您处理大量数据并且您希望在 gt_dfkkop_file 中找到许多合约账户 (VKONT) 重复项,您可以将 vkont 移动到另一个时间 table 并使用它来提高性能,而不是gt_dfkkop_file。始终检查您使用的 table 是否为空。
szako 似乎在上面的评论中回答了这个问题:
DFKKOP-VKONT 字段具有 alpha 转换。如我所见,您拥有的 ID 长度为 10 个字符。在文件中你有前导零吗?如果不是,它将永远找不到相应的记录。对输入值使用输入 alpha 转换方法。 – szako 6 月 23 日 12:09