Olá colégas... Eu precisando gerar um XML Serializado para um determinado WebService (requisição SOAP). O comando WRITE-XML converte uma tabela em um XML simples. Alguém teria um modelo ou me informaria o comando para gerar este XML? Desde já, obrigado!
Veja se este exemplo ajuda: Código: def var hXdoc as handle no-undo. def var hRoot as handle no-undo. def var hFirst as handle no-undo. def var hText as handle no-undo. def var hSec as handle no-undo. def var hDet as handle no-undo. def var bh as handle no-undo. def var fh as handle no-undo. def var loop as int no-undo. def var vArq as char no-undo. create x-document hXdoc. create x-noderef hRoot. create x-noderef hFirst. create x-noderef hSec. create x-noderef hDet. create x-noderef hText. hXdoc:create-node(hRoot,"Cadastro","element"). hXdoc:append-child(hRoot). for each customer where custnum < 5: bh = buffer customer:handle. hXdoc:create-node(hFirst,bh:name,"element"). hRoot:append-child(hFirst). hFirst:set-attribute("CustNum",string(customer.custnum)). do loop = 2 to bh:num-fields: fh = bh:buffer-field(loop). hXdoc:create-node(hSec,fh:name,"element"). hXdoc:create-node(hText,"","text"). hText:node-value = string(fh:buffer-value). hFirst:append-child(hSec). hSec:append-child(hText). end. for each invoice of customer: bh = buffer invoice:handle. hXdoc:create-node(hSec,bh:name,"element"). hFirst:append-child(hSec). do loop = 1 to bh:num-fields: fh = bh:buffer-field(loop). if fh:name = "custnum" then next. hXdoc:create-node(hDet,fh:name,"element"). hXdoc:create-node(hText,"","text"). hText:node-value = string(fh:buffer-value). hSec:append-child(hDet). hDet:append-child(hText). end. end. end. vArq = session:temp-dir + "Teste.xml". hXdoc:save("file",vArq). os-command no-wait value(vArq).
Olá, Você pode usar o buffer da tabela, pra retirar, conforme a procedure: ps.: Se nao for Webspeed troque o {&out} concatenando em uma variavel e depois trate. Código: procedure pi-xml-table: def input parameter p-buffer as handle no-undo. def var h-field as handle no-undo. def var i-cont as integer no-undo. {&OUT} "<" + replace(p-buffer:name,"-","_") + ">". do i-cont = 1 to p-buffer:num-fields: assign h-field = p-buffer:buffer-field(i-cont). if h-field:extent = 0 then {&OUT} "<" + replace(h-field:name,"-","_") + ">" + (if h-field:data-type = 'character' then cpc-out(h-field:buffer-value) else h-field:buffer-value) + "</" + replace(h-field:name,"-","_") + ">". end. {&OUT} "</" + replace(p-buffer:name,"-","_") + ">". end procedure.
Obrigado pelas ajudas, já estou conseguindo gerar o xml corretamente. O esquema é o seguinte: conecto no webservice informando usuário e senha, entao retorna o número de id. Gero um xml com os dados, inclusive o ID fornecido e deveria me retornar alguma resposta, mas neste momento está ocorrendo o seguinte erro: "Malformed XML fragment: only whitespace content allowed outside root element at line 1 and column 33 (11781).", ou seja, "Fragmento de XML mal formado: o conteúdo só é permitido espaço em branco fora do elemento raiz na linha 1 e coluna 33 (11.781)." Já testei a aplicação com o XML modelo enviado pela empresa fornecedora do webservice e ocorre o mesmo erro. Será que vcs podem me ajudar neste problema tbém?! Obrigado!
Neirezende, Se o problema ocorreu até com o modelo que a empresa forneceu. O problema é no tratamento no servidor deles, não tem o que você fazer além de reportar o problema. Se tiver outras coisas que podemos ajudar, bastar postar aqui. Abs
Romuloccomp, Muito obrigado pela ajuda. Passei para a empresa fornecedora do webservice e pedi para testar o xml gerado em outro programa. Estou aguardando o retorno deles. Valeu.