2012-11-29 35 views
0

對於可能的初學者問題,我表示歉意,但我時間不夠。基本上我需要從2個表中將數據拖入1個對象。兩個表共享設備號,我需要從表EQKT和EQUZ的所有者ID獲取相應的說明。sap abap將多個表格中的數據轉換爲1個對象

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,它並正確顯示「所有者」在表的頂部,但沒有數據被填充在用於所有者(設備號和說明已正確顯示)

回答

2

第二個循環不應該向表中添加新條目,而應該填充表中的第三列,該表基本上填充在第一個循環中,對嗎?

如果是這樣的話,將第二選擇爲第一選擇,做同樣的方式,你有桌子MAKT做到這一點,即

SELECT SINGLE J_3GEIGNER 
    FROM EQUZ 
    INTO T_REPORT-MAKTX 
    WHERE equnr = eqkt-equnr. 

但是,如果你真的要保持兩個迴路,你需要在第二循環中使用現場的符號,就像這樣:從表EQUZ

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. 

這樣的值將在內部表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(但它會使你的代碼只有更好,更容易閱讀和維護)。

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,但你在你的代碼移到該處當然你也可以只根據需要調整此示例)。