0

xml ファイルに変換する必要があるファイルを入力していますが、xml の作成に使用される一時テーブルの定義を含む .i も入力したいと考えています。また、区切り文字が機能していません (変数をコマンドが読み取れるものに変換する方法が必要です)。ありがとう!

define input  parameter pInputFile   as character no-undo.
define input  parameter pDelimiter   as character no-undo.
???define input  parameter pIncludeFile as character no-undo.???
define output parameter pOutputFile  as character no-undo init "/tmp/out..

/* start of .i */
define temp-table ttGeneric no-undo
  field cust_id  as integer
  field name     as character
  field address  as character
  field address2 as character
  field city     as character
  field state    as character
  field zip      as character
  field cust_key as character
index idx is primary cust_id.
/* end of .i */



input stream sImport from value(pInputFile) no-echo.
repeat:      
  create ttGeneric.
  import stream sImport delimiter pDelimiter ttGeneric.
 end.
input stream sImport close.

temp-table ttGeneric:write-xml("LONGCHAR", pOutputFile, yes).

呼び出しプログラムにプリプロセッサを設定するかもしれません(何らかの方法で)。

4

1 に答える 1

3

IMPORT および EXPORT の区切り文字は、リテラル文字列でなければなりません。変数、フィールド、パラメーターなどは使用できません。

私はときどき、CASE ステートメントを使用してこれを回避しました。すなわち:

case pDelimiter:
  when "," then import stream sImport delimiter "," ttGeneric.
  when "|" then import stream sImport delimiter "|" ttGeneric.
end.

醜い。しかし、それは機能します。

TT 定義を含むインクルード ファイルの名前を渡したいと言っているのではないでしょうか。そして、どういうわけかその定義を一時テーブルに関連付けますか?

それが多かれ少なかれ正しい場合、要件について具体的すぎる可能性があります。おそらく、定義がプログラムの外部にあり、コンパイル時に不明な TT を動的に作成したいだけです。

これを行う 1 つの方法は、 read-xmlschema() メソッドを使用することです。すでに write-xml() を使用しているため、小さなステップです...最初に .i を小さな .p に次のように変換します。

define temp-table ttGeneric no-undo
  field cust_id  as integer
  field name     as character
  field address  as character
  field address2 as character
  field city     as character
  field state    as character
  field zip      as character
  field cust_key as character
index idx is primary cust_id.

buffer ttGeneric:write-xmlschema( "file", "ttgeneric.xsd", true, ?, ?, ? ).

return.

(この小さなスタブを使用すると、.XSD ファイルを作成できます。それ以外の目的はありません。一度実行するだけで、そのファイルを取得できます。)

次に、その一時テーブルを使用する場合:

define variable tx as handle no-undo.

create temp-table tx.
tx:read-xmlschema( "ttgeneric.xsd", "file", ?, ?, ? ).

(注: 区切り文字とは異なり、xsd 名に変数やパラメーターなどを使用でき、ファイルではなく longchar にすることができます...)

次に遭遇する冒険は、動的一時テーブルで動作する IMPORT の代わりを見つけることです。バッファハンドルには import() および export() メソッドがありません:(

次のスニペットが役立つ場合があります。

define variable dummy as character no-undo extent 128.
...
dummy = ?.
import dummy.
...
do i = 1 to 128:
  if dummy[i] = ? then leave.
  tx:buffer-field( i ):buffer-value() = dummy[i].
end.
于 2013-07-02T19:49:54.080 に答える