2

たとえば、select_something という ABAP クラス メソッドがあります。select_something には、et_result などのエクスポート パラメータがあります。et_result のタイプは実行時まで判別できないため、et_result のタイプは標準テーブルです。

この方法では、「With ABAP/4 Open SQL array select, the output table is too small at " select * into table et_result from (lv_tablename) where... "という短いダンプが表示されることがあります。

エラー分析:

...この特定のケースでは、データベース テーブルは 3806 バイト幅ですが、内部テーブルは 70 バイト幅しかありません。

「任意のテーブル」も試しましたが、エラーは同じです。

4

4 に答える 4

3

データ参照を返すことができます。クエリが失敗することはなくなり、後で正しく入力されたフィールドシンボルにデータを割り当てることができます。

" Definition
class-methods select_all
  importing
    !tabname type string
  returning
    value(results) type ref to data.


...
...


" Implementation
method select_all.
  data dref type ref to data.
  create data dref type standard table of (tabname).
  field-symbols <tab> type any table.
  assign dref->* to <tab>.
  select * from (tabname) into table <tab>.
  get reference of <tab> into results.
endmethod.

また、@ vwegertには、動的クエリ(およびその問題に関するプログラミング)は可能な限り避けるべきであることに同意します。

于 2012-07-31T08:27:50.910 に答える
2

あなたがやろうとしていることは、多くのレベルでひどく間違っているように見えます。誰かがあなたの頭に銃を向け、ドアがしっかりとロックされていない限り、SELECT FROM(何でも)を使用しないでください。システムが提供できる可能性のあるあらゆる種類の静的エラーチェックを失うことになります。たとえば、コンパイラは「読み取り元のテーブルの幅は3806バイトです」と通知できなくなります。定数を使ってもわかりません。特にユニコードシステムとNUCシステムを切り替えるときに、短いダンプを生成するという困難な方法があります。これは、実動システムの一部である可能性が非常に高いです。楽しくない。

(実際には、SELECTステートメントで動的テーブル名を使用するのに適した使用法がいくつかあります。2〜3年に1回程度必要であり、非常に多くの奇妙なものをコーディングしています。可能な限り避けてください。より多くのコードを書くことを犠牲にしてさえ。後で壊れたものを修正するのに苦労する価値はありません。)

次に、一般的な仮パラメーターの型を変更しても、実際のパラメーターの型には何の影響もありません。STANRDARD TABLE OF mandt WITH DEFAULT KEYをメソッドに渡すと、そのテーブルには3文字の行が含まれます。それは標準テーブルになり、そのため、任意のテーブルにもなります。それだけです。ジェネリック型は好きな場所でひねることができます。ジェネリック型を使用する方法で正確さを強制する方法はありません。すべての適切なタイプが使用されていることを確認するのは、呼び出し元の責任です。それは飛ぶのに悪い方法です。

于 2012-07-30T17:50:22.803 に答える
0

まず、vwegert の回答に同意します。可能であれば、動的な SQL 選択を避けるようにしてください。

とはいえ、短いダンプを確認してください。エラーが例外クラスである場合は、SELECT ステートメントを try/catch ブロックでラップし、少なくともダンプを停止することができます。

" " を試すこともできますINTO CORRESPONDING FIELDS OF TABLE et_result。ET_RESULT が動的である場合、RTTS を使用して適切な構造にキャストする必要がある場合があります。これはあなたにいくつかのアイデアを与えるかもしれません...

于 2012-07-31T04:15:12.893 に答える
0

vwegert にこれ以上同意することはできませんでしたが、動的選択ステートメントと動的に型指定されたパラメーターを使用する以外にタスクを実行する方法がまったくない場合 (通常はあります) は、実行時にテーブルの型とパラメーターを確認してください。 .

これを行うには、CL_ABAP_TYPEDESCR とそのサブクラスを使用します。

このようにして、プログラムをダンプすることなく、実行時にエラーを処理できます。

しかし、vwegert が言ったように、この動的なものは純粋な悪であり、実行中のある時点で確実に壊れます。必要なエラー処理を追加することは、コードを再設計して動的 SQL や型付きパラメーターを使用しないようにするよりも、多くの作業と困難を伴う可能性があります。

于 2012-07-31T08:24:20.250 に答える