0

我需要将 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 中,它确实在表格顶部正确显示了“所有者”,但没有为所有者填写数据(设备编号和描述正确显示)

4

2 回答 2

4

你需要做的是一个JOIN:

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在表中定义字段,但您在代码中将其移动到那里。您当然可以根据需要调整此示例)。

于 2012-11-30T14:51:27.370 回答
2

第二个循环不应该在表中添加新条目,而是应该填充表中的第三列,这基本上是在第一个循环中填充的,对吗?

如果是这样,将第二个选择移到第一个选择中,并以与 table 相同的方式进行操作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用作工作区,例如 writeAPPEND S_RECORD TO T_RECORD而不是APPEND T_RECORD(但这只会使您的代码更好,更易于阅读和维护)。

于 2012-11-30T00:07:05.267 回答