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 语句解决了这个问题。IE:

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

丑陋的。但它有效。

我想您可能想说您想传递包含 TT 定义的包含文件的名称?并以某种方式将该定义与临时表相关联?

如果这或多或少是正确的,那么您可能对您的要求过于具体——您可能真的只想动态创建一个 TT,其定义在程序外部并且在编译时未知。

一种方法是使用 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 回答