2013-07-02 2 views
0

Я ввожу файл, который нужно преобразовать в xml-файл, но я также хочу ввести .i с определением таблицы temp, используемой для создания xml. Кроме того, разделитель не работает (мне нужен способ преобразования переменной в команду, которую может читать команда). Благодаря!Введите a .i в прогресс 10.2b

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). 

Возможно, в вызывающей программе может быть установлен предварительный процессор (некоторые из них).

ответ

3

Разделители для ИМПОРТА и ЭКСПОРТА должны быть буквальными строками. Вы не можете использовать переменные, поля, параметры или что-то в этом роде.

У меня, порой, работало с этим оператором CASE. то есть:

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

Ugly. Но это работает.

Возможно, вы пытаетесь сказать, что хотите передать имя файла include, содержащего определение TT? И как-то связать это определение с помощью temp-table?

Если это более или менее корректно, вы, вероятно, слишком специфичны в отношении своего требования - вы, вероятно, просто хотите динамически создать TT, определение которого является внешним по отношению к программе и неизвестно во время компиляции.

Один из способов сделать это - использовать метод read-xmlschema() - вы уже используете write-xml(), поэтому это небольшой шаг ... сначала преобразуйте ваш .i в немного .p like так:

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 Это не служит никакой другой цели, просто запустите его один раз, чтобы получить этот файл.)

Затем, когда вы хотите использовать этот TEMP- стол:

define variable tx as handle no-undo. 

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

(Примечание: в отличие от разделителей вы можете использовать переменные & и т. Д. Для имени xsd, и это может быть в longchar, а не в файле ...)

Следующее приключение, в которое вы столкнетесь, представляет собой замену для IMPORT, который работает с динамическими temp-таблицами. Буферные ручки не импорт() и экспорт() методы :(

Следующие фрагменты могут помочь:

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. 
+0

Спасибо Это помогло много, и дал мне более глубокое понимание динамических временных столов. – Bill