我为可能的初学者问题道歉,但我的时间很短。基本上我需要将2个表中的数据拉入1个对象。两个表共享设备编号,我需要从表EQKT和EQUZ的所有者ID中获取相应的描述。
DATA: BEGIN OF t_report OCCURS 3,
matnr LIKE eqkt-equnr,
mtart LIKE eqkt-eqktx,
maktx LIKE equz-J_3GEIGNER,
END OF t_report.*-
DATA: d_repid LIKE sy-repid.
*-----------------------------------------
*--Selection Screen
SELECT-OPTIONS: s_matnr FOR eqkt-equnr.
*-----------------------------------------
START-OF-SELECTION.
*-Read data
SELECT * FROM eqkt
WHERE equnr IN s_matnr.
CLEAR makt.
SELECT SINGLE *
FROM makt
WHERE matnr = eqkt-equnr AND
spras = sy-langu.
MOVE: eqkt-equnr TO t_report-matnr,
eqkt-eqktx TO t_report-mtart.
APPEND t_report.
ENDSELECT.
*This is where it stops working.
SELECT * FROM EQUZ
WHERE equnr IN s_matnr.
MOVE: EQUZ-J_3GEIGNER TO t_report-maktx.
APPEND t_report.
ENDSELECT.
代码编译,在我显示它的ALV中,它正确显示表格顶部的“所有者”,但没有为所有者填写数据(设备编号和描述正确显示)
答案 0 :(得分:4)
你需要做的是加入:
SELECT T~EQUNR T~EQKTX Z~J_3GEIGNER
INTO TABLE T_REPORT
FROM EQKT AS T
JOIN EQUZ AS Z
ON T~EQUNR = Z~EQUNR
WHERE T~EQUNR IN S_MATNR
AND T~SPRAS = SY-LANGU.
(在您的示例中,您的表格中没有定义字段MTART
,但您可以在代码中将其移动到那里。您当然可以根据需要调整此示例。)
答案 1 :(得分:2)
第二个循环不应该在表中添加新条目,但它应该填充表中的第三列,它基本上填充在第一个循环中,是否正确?
如果是这样,将第二个选择移动到第一个选择中,并使用与表MAKT
相同的方式执行,即
SELECT SINGLE J_3GEIGNER
FROM EQUZ
INTO T_REPORT-MAKTX
WHERE equnr = eqkt-equnr.
但是如果你真的要保留两个循环,你需要在第二个循环中使用字段符号,如下所示:
FIELD-SYMBOLS: <T_REPORT> LIKE LINE OF T_REPORT.
SELECT * FROM EQUZ WHERE equnr IN s_matnr.
READ TABLE T_REPORT ASSIGNING <T_REPORT>
WITH KEY MATNR = EQUZ-EQUNR.
CHECK SY-SUBRC EQ 0. " skip unknown material numbers
<T_REPORT>-MAKTX = EQUZ-J_3GEIGNER.
ENDSELECT.
这样,表EQUZ
中的值将被添加到内部表T_RECORD
中的正确记录中。
顺便说一句,另外一个提示:不要使用OCCURS
,而是明确声明表格。在你的情况下它应该是这样的:
DATA: BEGIN OF S_report,
matnr LIKE eqkt-equnr,
mtart LIKE eqkt-eqktx,
maktx LIKE equz-J_3GEIGNER,
END OF S_report,
T_REPORT like standard table of S_REPORT.
当然,您不能使用标题行,但使用S_REPORT
作为工作区,例如写APPEND S_RECORD TO T_RECORD
而不是APPEND T_RECORD
(但它会使您的代码只有更好,更容易阅读和维护。)