1

行の1つのコンポーネントが空itabであるいくつかの行を持つ内部テーブルがあります。内部テーブルの列を確認し、テーブルから取得してから、内部テーブルの列を新しい値に変更しmatnrたいと思います。これが要約です。paletmatnrpaletzlldetmatnrmatnr

itabテーブル:

+-------+-------+-----------+
| palet | matnr | something |
+-------+-------+-----------+
|  1234 | null  | abc       |
|  1235 | null  | saa       |
|  1236 | null  | ssd       |
+-------+-------+-----------+

そこで、テーブルpaletから列をチェックして、その行の値を見つけます。新しい値は次のようになります。zlldetmatnritab

+-------+--------+-----------+
| palet | matnr  | something |
+-------+--------+-----------+
|  1234 | 543213 | abc       |
|  1235 | 988876 | saa       |
|  1236 | 344545 | ssd       |
+-------+--------+-----------+

私が試したこと:

LOOP AT itab.
  SELECT SINGLE matnr INTO itab-matnr
    FROM zlldet WHERE palet = itab-palet.
  ENDIF.
ENDLOOP.

2行目の値を変更しようとしています。私はそれが間違っていることを知っています、私はいくつかのMODIFYステートメントを使うべきですが、私は方法がわかりません。

編集:

完全なコードは次のとおりです。

REPORT zwps0510 MESSAGE-ID zc LINE-SIZE 255 NO STANDARD PAGE HEADING.
TABLES: zzllog, zzldet, marc, makt.
DATA: BEGIN OF itab OCCURS 0.
    INCLUDE STRUCTURE zzllog.
DATA: END OF itab.

DATA: adet TYPE p.
*/ paket numaraları
SELECT-OPTIONS: spalet FOR zzllog-palet.      "/paket no
SELECT-OPTIONS: spaleta FOR zzllog-paleta.    "/paketnoa
SELECT-OPTIONS: spaletb FOR zzllog-paletb.    "/paketnob
SELECTION-SCREEN SKIP 1.
*/ paketle ilgili bilgiler
SELECT-OPTIONS: sdispo FOR marc-dispo.
SELECT-OPTIONS: smatnr FOR zzllog-matnr.
SELECT-OPTIONS: sharkod FOR zzllog-harkod.    "/logtaki işlem kodu
*SELECT-OPTIONS: stelf1 FOR zzllog-telf1.
SELECT-OPTIONS: starih FOR zzllog-tarih.
SELECT-OPTIONS: susr FOR zzllog-usr.
SELECT-OPTIONS: saufnr FOR zzllog-aufnr.
SELECTION-SCREEN SKIP 1.
*/ depo adres bilgileri
SELECT-OPTIONS: sflgnum FOR zzllog-flgnum.    "/kaynak depo no
SELECT-OPTIONS: sflgtyp FOR zzllog-flgtyp.    "/kaynak depo tipi
SELECT-OPTIONS: sflgpla FOR zzllog-flgpla.    "/kaynak depo numarası
SELECT-OPTIONS: stlgnum FOR zzllog-tlgnum.    "/hedef depo no
SELECT-OPTIONS: stlgtyp FOR zzllog-tlgtyp.    "/hedef depo tipi
SELECT-OPTIONS: stlgpla FOR zzllog-tlgpla.    "/hedef depo numarası
SELECTION-SCREEN SKIP 1.
*/ Çıktıda gelecek kolonların seçimi
SELECTION-SCREEN BEGIN OF BLOCK uc WITH FRAME TITLE text-001.
PARAMETERS : tarih AS CHECKBOX DEFAULT 'X',
         saat AS CHECKBOX DEFAULT 'X',
         usr AS CHECKBOX DEFAULT 'X',
         palet AS CHECKBOX DEFAULT 'X',
         paleta AS CHECKBOX DEFAULT 'X',
         paletb AS CHECKBOX DEFAULT 'X',
         harkod AS CHECKBOX DEFAULT 'X',  "/ hareket kodu
         matnr AS CHECKBOX DEFAULT 'X',
         menge AS CHECKBOX DEFAULT 'X',
         sebep AS CHECKBOX DEFAULT 'X',  "/ sipariş/red
         aufnr AS CHECKBOX DEFAULT 'X',  "/sm.siparişi
         ref2 AS CHECKBOX DEFAULT 'X',
         paufnr AS CHECKBOX DEFAULT 'X', "/enj.siparişi
         flgnum AS CHECKBOX DEFAULT 'X', "/from depo...
         flgtyp AS CHECKBOX DEFAULT 'X',
         flgpla AS CHECKBOX DEFAULT 'X',
         tlgnum AS CHECKBOX DEFAULT 'X', "/ to depo...
         tlgtyp AS CHECKBOX DEFAULT 'X',
         tlgpla AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK uc.
*
TOP-OF-PAGE.
   PERFORM baslik.
*
START-OF-SELECTION.
  PERFORM prepare_itab.
  PERFORM write_itab.
**
FORM prepare_itab.
*/ Paketle ilgili tüm geçmiş hareketler log tablosundan okunur
  SELECT * INTO CORRESPONDING FIELDS OF TABLE itab
      FROM zzllog WHERE palet IN spalet
                    AND paleta IN spaleta
                    AND paletb IN spaletb
                    AND matnr IN smatnr
                    AND harkod IN sharkod
                    AND tarih IN starih
                    AND flgnum IN sflgnum
                    AND flgtyp IN sflgtyp
                    AND flgpla IN sflgpla
                    AND tlgnum IN stlgnum
                    AND tlgtyp IN stlgtyp
                    AND tlgpla IN stlgpla
                    AND aufnr IN saufnr
                    AND usr IN susr.
  IF sdispo[] IS NOT INITIAL.
    LOOP AT itab.
      SELECT SINGLE dispo INTO marc-dispo
                FROM marc WHERE matnr = itab-matnr
                            AND werks = '3001'
                            AND dispo IN sdispo.
      IF sy-subrc <> 0.
        DELETE itab.
      ENDIF.
    ENDLOOP.
  ENDIF.




  DESCRIBE TABLE itab LINES adet.
*/ tüm hareketler tarih ve saate göre sıralanır
 SORT itab BY tarih saat.
 WRITE:/ 'ADET: ', adet.
 ULINE.
   ENDFORM.   

だから、私がやりたいのは正確です:が含まれている場合sharkodDzzldetをチェックする必要がありますmatnr

4

3 に答える 3

3

を使用する代わりにMODIFY、フィールド記号を使用します。

DATA: lt_materials TYPE TABLE OF zzllog.
FIELD-SYMBOLS: <ls_line> TYPE zzllog.

* other code with strange comments :-)

LOOP AT lt_materials ASSIGNING <ls_line> WHERE matnr IS INITIAL.
  SELECT SINGLE MATNR
    FROM zlldet
    INTO <ls_line>-matnr
    WHERE palet = <ls_line>-palet.
ENDLOOP.

これは正しい構文の単なる例です。実際のプログラムでこれを行うのは良い考えではありません。何千ものリクエストでデータベースにアクセスし、かなりのパフォーマンスを引き出す可能性があるためです。PALETない番号をMATNR別のテーブルに事前に選択してから、1つのクエリでFOR ALL ENTRIES INすべての番号を読み取るために使用することをお勧めします。MATNR

編集:タイプ名を追加しました。ところで、内部テーブルを宣言するあなたの方法はやや時代遅れです...

于 2012-09-07T11:37:35.720 に答える
2

フィールドシンボルではなくmodifyでそれを実行したい場合、それは正しい解決策になります。

LOOP AT itab.
  SELECT SINGLE matnr INTO itab-matnr
    FROM zlldet WHERE palet = itab-palet.
  MODIFY itab.
ENDLOOP.

itabをヘッダー行のあるテーブルとして宣言しました(ちなみに、これは非推奨です)。つまり、テーブルitabと構造itabがあります。どの状況でどちらが使用されるかはコンテキストによって異なり、LOOPATやMODIFYなどの一部のコマンドは両方を同時に使用します。これは、ヘッダー行の代わりに作業領域を持つコードになります。読みやすくなっています。

DATA itab TYPE TABLE OF [something].
DATA wa TYPE [something].

LOOP AT itab INTO wa.  " copies each line into wa
  SELECT SINGLE matnr INTO wa-matnr
    FROM zlldet WHERE palet = itab-palet.
  MODIFY itab FROM wa.  " writes the changed line back to the table
ENDLOOP.

説明されているフィールドシンボルvwegertを使用してソリューションを使用することもできます。フィールドシンボルは、テーブルの行へのポインタです。フィールドシンボルへの変更は自動的にテーブルに書き戻されるため、この場合はMODIFYは必要ありません。また、データをコピーする必要がないため、特に非常に幅の広いテーブルの場合は高速です。

于 2012-09-07T11:54:58.960 に答える
1

ループ内で毎回selectステートメントを回避することもできます。代わりに、パフォーマンスが向上するため、範囲テーブルを使用して、ループの前に一度だけselectステートメントを使用してみることができます。

ユーザー定義の構造を定義し、変数を宣言します

types: begin of ty_p_m,
         palet type zlldet-palet,
         matnr type zlldet-matnr,
       end of ty_p_m.

data: r_palet type range table of zlldet-palet,
      r_line_palet like line of r_palet,
      i_p_matnr type standard table of ty_p_m,
      wa_p_m type ty_p_m.


field-symbols: <fs> type wa_p_m.

次のステップの選択クエリで使用される範囲テーブルに入力します。

r_line_palet-sign = 'I'.
r_line_palet-option = 'EQ'.

loop at itab into wa.
r_line_palet-low = wa-palet.
append  r_line_palet to r_palet.
endloop.

次に、範囲テーブルを参照してselectステートメントを使用し、宣言された内部テーブル内のデータを取得します。

select palet matnr from zlldet into i_p_matnr
where palet in r_palet.

次に、宣言された内部テーブルをループします。その内部で、入力値を使用して内部テーブルを読み取り、modifyステートメントの代わりにフィールドシンボルを使用してテーブル自体を変更します。

loop at i_p_matnr into wa_p_matnr.
read table itab with key palet = wa_p_matnr-palet assigning <fs>.
if sy-subrc = 0.
<fs>-matnr = wa_p_matnr-matnr.
endif.
clear wa_p_matnr.
endloop.
于 2012-09-13T09:40:35.583 に答える