Pessoal, por favor, estou precisando de ajuda para gerar um arquivo XML a partir de um WebService. Quase não achei documentação sobre isso na internet, então agradeço muito se alguém tiver um exemplo. O seguinte: Precisamos integrar o HCM com um sistema web, isso será feito através de troca de arquivos XML através do WebService. Estou fazendo várias tentativas, mas não consigo ver em que momento vou apresentar a temp-table para o WS para que ele gere no formato XML, se é que da pra entender mais ou menos o que estou precisando. Através de uma documentação estou fazendo assim: Código: DEFINE VARIABLE hWebService AS HANDLE NO-UNDO. DEFINE VARIABLE hcapObj AS HANDLE NO-UNDO. DEFINE VARIABLE cXMLResult AS CHAR NO-UNDO. DEFINE VARIABLE lReturn AS LOGICAL NO-UNDO. /*saber se o WS conectou*/ DEFINE TEMP-TABLE ttTitAp NO-UNDO NAMESPACE-URI "" FIELD cdn_empresa LIKE funcionario.cdn_empresa FIELD cdn_estab LIKE funcionario.cdn_estab FIELD cdn_funciona LIKE funcionario.cdn_funciona FIELD nome LIKE funcionario.nom_pessoa_fisic FIELD turma LIKE funcionario.cdn_turma_trab FIELD imprime AS LOG FIELD hrJornada AS CHAR FORMAT "X(25)" FIELD cargo AS CHAR FORMAT "X(40)" FIELD ccusto LIKE funcionario.cod_rh_ccusto FIELD lotacao LIKE funcionario.cod_unid_lotac FIELD ativo AS LOG FIELD rede LIKE cap_login_rede.login_rede FIELD reSuper LIKE funcionario.cdn_funciona FIELD loginRedeGer LIKE cap_login_rede.login_rede FIELD reCoord LIKE funcionario.cdn_funcionario. DEFINE TEMP-TABLE ttErroTitAp NO-UNDO NAMESPACE-URI "" FIELD seq_msg AS INTEGER FIELD cod_msg AS INTEGER FIELD texto_msg AS CHARACTER FIELD tipo_msg AS INTEGER FIELD stack_msg AS CHARACTER . DEFINE VARIABLE rawParam AS RAW NO-UNDO. DEF TEMP-TABLE ttFuncionario NO-UNDO NAMESPACE-URI "" FIELD cdn_empresa LIKE funcionario.cdn_empresa FIELD cdn_estab LIKE funcionario.cdn_estab FIELD cdn_funciona LIKE funcionario.cdn_funciona FIELD nome LIKE funcionario.nom_pessoa_fisic FIELD turma LIKE funcionario.cdn_turma_trab FIELD imprime AS LOG FIELD hrJornada AS CHAR FORMAT "X(25)" FIELD cargo AS CHAR FORMAT "X(40)" FIELD ccusto LIKE funcionario.cod_rh_ccusto FIELD lotacao LIKE funcionario.cod_unid_lotac FIELD ativo AS LOG FIELD rede LIKE cap_login_rede.login_rede FIELD reSuper LIKE funcionario.cdn_funciona FIELD loginRedeGer LIKE cap_login_rede.login_rede FIELD reCoord LIKE funcionario.cdn_funcionario. DEF TEMP-TABLE ttArquivo NO-UNDO NAMESPACE-URI "urn:cap:cap" FIELD cdn_empresa LIKE funcionario.cdn_empresa FIELD cdn_estab LIKE funcionario.cdn_estab FIELD cdn_funciona LIKE funcionario.cdn_funciona FIELD nome LIKE funcionario.nom_pessoa_fisic FIELD turma LIKE funcionario.cdn_turma_trab FIELD imprime AS LOG FIELD hrJornada AS CHAR FORMAT "X(25)" FIELD cargo AS CHAR FORMAT "X(40)" FIELD ccusto LIKE funcionario.cod_rh_ccusto FIELD lotacao LIKE funcionario.cod_unid_lotac FIELD ativo AS LOG FIELD rede LIKE cap_login_rede.login_rede FIELD reSuper LIKE funcionario.cdn_funciona FIELD loginRedeGer LIKE cap_login_rede.login_rede FIELD reCoord LIKE funcionario.cdn_funcionario. /*Temp Table regra negocio*/ DEF TEMP-TABLE tt-jorn NO-UNDO FIELD cdn_jorn_trab LIKE jorn_trab.cdn_jorn_trab FIELD hrJornada AS CHAR. DEF TEMP-TABLE tt-cc NO-UNDO FIELD cdn_empresa LIKE func_ccusto.cdn_empresa FIELD cdn_estab LIKE func_ccusto.cdn_estab FIELD cdn_funciona LIKE func_ccusto.cdn_funciona FIELD cod_rh_ccusto LIKE func_ccusto.cod_rh_ccusto. DEF TEMP-TABLE tt-cargo NO-UNDO FIELD cdn_cargo_basic LIKE cargo.cdn_cargo_basic FIELD cargo LIKE cargo.des_cargo. DEF TEMP-TABLE tt-lotac NO-UNDO FIELD cdn_empresa LIKE func_unid_lotac_plano.cdn_empresa FIELD cdn_estab LIKE func_unid_lotac_plano.cdn_estab FIELD cdn_funciona LIKE func_unid_lotac_plano.cdn_funciona FIELD cdn_plano_lotac LIKE func_unid_lotac_plano.cdn_plano_lotac FIELD cod_unid_lotac LIKE func_unid_lotac_plano.cod_unid_lotac. DEF TEMP-TABLE tt-rede NO-UNDO FIELD cdn_empresa LIKE cap_login_rede.cdn_empresa FIELD cdn_estab LIKE cap_login_rede.cdn_estab FIELD cdn_funcionario LIKE cap_login_rede.cdn_funcionario FIELD login_rede LIKE cap_login_rede.login_rede . DEF TEMP-TABLE tt-afast NO-UNDO FIELD cdn_empresa LIKE sit_afast_func.cdn_empresa FIELD cdn_estab LIKE sit_afast_func.cdn_estab FIELD cdn_funciona LIKE sit_afast_func.cdn_funcionario FIELD cdn_sit_afast_func LIKE sit_afast_func.cdn_sit_afast_func. DEFINE BUFFER bf-lotacao FOR dthrpyc.funcionario. EMPTY TEMP-TABLE tt-jorn. EMPTY TEMP-TABLE tt-cc. EMPTY TEMP-TABLE tt-cargo. EMPTY TEMP-TABLE tt-lotac. EMPTY TEMP-TABLE tt-rede. EMPTY TEMP-TABLE tt-afast. EMPTY TEMP-TABLE ttFuncionario. /*****fim tts regra de negócio****/ /*Conectando servidor*/ CREATE SERVER hWebService. /*hWebService:CONNECT("-WSDL 'http://serverwsus:8080/wsa/wsa1/wsdl?targetURI=urn:cap'"). */ /*Testa Conexão*/ lReturn = hWebService:CONNECT("-WSDL 'http://serverwsus:8080/wsa/wsa1/wsdl?targetURI=urn:cap'"). /*IF (lReturn = NO) THEN DO: DISP "Nao pode conectar no WebService.". APPLY "CLOSE":U TO THIS-PROCEDURE. RETURN. END. ELSE MESSAGE "conectei" VIEW-AS ALERT-BOX INFO BUTTONS OK.*/ /*Carrega PortType*/ RUN capObj SET hcapObj ON hWebService. /*IF NOT VALID-HANDLE (hcapObj) THEN DO: DISP "Handle inválido.". APPLY "CLOSE":U TO THIS-PROCEDURE. END. ELSE MESSAGE "encontrei" VIEW-AS ALERT-BOX INFO BUTTONS OK. */ RUN geraDadosCAP IN hcapObj. RUN esfp0003rp IN hcapObj(INPUT TABLE ttTitAp, OUTPUT TABLE ttErroTitAp, INPUT rawParam). /* Desconecta o serviço */ hWebService:DISCONNECT(). MESSAGE "Retorno" SKIP cXMLResult VIEW-AS ALERT-BOX INFO BUTTONS OK. /*Definição das Procedures*/ PROCEDURE esfp0003rp: DEFINE INPUT PARAMETER TABLE FOR ttTitAp. DEFINE OUTPUT PARAMETER TABLE FOR ttErroTitAp. DEFINE INPUT PARAMETER rawParam AS RAW NO-UNDO. END PROCEDURE. PROCEDURE geraDadosCAP: MESSAGE 'entra na procedure' VIEW-AS ALERT-BOX INFO BUTTONS OK. DEFINE INPUT PARAMETER TABLE FOR ttTitAp. DEFINE OUTPUT PARAMETER TABLE FOR ttErroTitAp. DEFINE INPUT PARAMETER rawParam AS RAW NO-UNDO. /******************/ DEF VAR data-servidor AS DATE NO-UNDO. DEF VAR hora-servidor AS CHAR NO-UNDO. DEF VAR c-hr-ini AS CHAR NO-UNDO. DEF VAR c-hr-fim AS CHAR NO-UNDO. DEF VAR lotac_gestor AS CHAR NO-UNDO. /* FOR EACH cap_ult_atualiz NO-LOCK. ASSIGN data-servidor = cap_ult_atualiz.dat_ult_atualiz hora-servidor = cap_ult_atualiz.hra_ult_atualiz. END. */ ASSIGN data-servidor = 01/01/2012 hora-servidor = '00:00'. /*Verificar se teve alguma alteracao no cadastro de jornada de trabalho*/ FOR EACH jorn_trab WHERE jorn_trab.dat_ult_atualiz >= data-servidor AND /*data e hora que virá do WebService*/ jorn_trab.hra_ult_atualiz >= hora-servidor NO-LOCK. /*DISP 'Jornada - ' jorn_trab.cdn_jorn_trab WITH WIDTH 300. PAUSE 0.*/ FIND FIRST tt-jorn WHERE tt-jorn.cdn_jorn_trab = jorn_trab.cdn_jorn_trab NO-ERROR. IF NOT AVAIL tt-jorn THEN DO: CREATE tt-jorn. ASSIGN tt-jorn.cdn_jorn_trab = jorn_trab.cdn_jorn_trab c-hr-ini = string(jorn_trab.num_horar_inic_interv_refei ,"hh:mm") c-hr-fim = string(jorn_trab.num_horar_term_interv_refei ,"hh:mm") tt-jorn.hrJornada = c-hr-ini + ' - ' + c-hr-fim . END. END. /*Verifica se teve alguma alteracao no historico dos cc's dos funcionarios*/ FOR EACH func_ccusto WHERE func_ccusto.dat_ult_atualiz >= data-servidor AND func_ccusto.hra_ult_atualiz >= hora-servidor NO-LOCK. /*DISP 'CC - ' func_ccusto.cod_rh_ccusto WITH WIDTH 300. PAUSE 0.*/ FIND FIRST tt-cc WHERE tt-cc.cdn_empresa = func_ccusto.cdn_empresa AND tt-cc.cdn_estab = func_ccusto.cdn_estab AND tt-cc.cdn_funciona = func_ccusto.cdn_funciona AND tt-cc.cod_rh_ccusto = func_ccusto.cod_rh_ccusto NO-ERROR. IF NOT AVAIL tt-cc THEN DO: CREATE tt-cc. ASSIGN tt-cc.cdn_empresa = func_ccusto.cdn_empresa tt-cc.cdn_estab = func_ccusto.cdn_estab tt-cc.cdn_funciona = func_ccusto.cdn_funciona tt-cc.cod_rh_ccusto = func_ccusto.cod_rh_ccusto. END. END. /*Verificar se teve alguma alteracao no cadastro de cargo*/ FOR EACH cargo WHERE cargo.dat_ult_atualiz >= data-servidor AND cargo.hra_ult_atualiz >= hora-servidor NO-LOCK. /*DISP 'Cargo - ' cargo.cdn_cargo_basic WITH WIDTH 300. PAUSE 0.*/ FIND FIRST tt-cargo WHERE tt-cargo.cdn_cargo_basic = cargo.cdn_cargo_basic NO-ERROR. IF NOT AVAIL tt-cargo THEN DO: CREATE tt-cargo. ASSIGN tt-cargo.cdn_cargo_basic = cargo.cdn_cargo_basic tt-cargo.cargo = cargo.des_cargo. END. END. /*Verifica se teve alguma alteracao no historico de lotacao dos funcionarios*/ FOR EACH func_unid_lotac_plano WHERE func_unid_lotac_plano.dat_ult_atualiz >= data-servidor AND func_unid_lotac_plano.hra_ult_atualiz >= hora-servidor NO-LOCK. /*DISP 'Lotac - ' func_unid_lotac_plano.cod_unid_lotac WITH WIDTH 300. PAUSE 0.*/ FIND FIRST tt-lotac WHERE tt-lotac.cdn_empresa = func_unid_lotac_plano.cdn_empresa AND tt-lotac.cdn_estab = func_unid_lotac_plano.cdn_estab AND tt-lotac.cdn_funciona = func_unid_lotac_plano.cdn_funciona AND tt-lotac.cdn_plano_lotac = func_unid_lotac_plano.cdn_plano_lotac AND tt-lotac.cod_unid_lotac = func_unid_lotac_plano.cod_unid_lotac NO-ERROR. IF NOT AVAIL tt-lotac THEN DO: CREATE tt-lotac. ASSIGN tt-lotac.cdn_empresa = func_unid_lotac_plano.cdn_empresa tt-lotac.cdn_estab = func_unid_lotac_plano.cdn_estab tt-lotac.cdn_funciona = func_unid_lotac_plano.cdn_funciona tt-lotac.cdn_plano_lotac = func_unid_lotac_plano.cdn_plano_lotac tt-lotac.cod_unid_lotac = func_unid_lotac_plano.cod_unid_lotac. END. END. /*Verifica alteração no login de rede*/ /*FOR EACH cap_login_rede WHERE cap_login_rede.dat_ult_atualiz >= data-servidor AND cap_login_rede.hra_ult_atualiz >= hora-servidor NO-LOCK. FIND FIRST tt-rede WHERE tt-rede.cdn_empresa = cap_login_rede.cdn_empresa AND tt-rede.cdn_estab = cap_login_rede.cdn_estab AND tt-rede.cdn_funcionario = cap_login_rede.cdn_funcionario AND tt-rede.login_rede = cap_login_rede.login_rede NO-LOCK NO-ERROR. IF NOT AVAIL tt-rede THEN DO: CREATE tt-rede. ASSIGN tt-rede.cdn_empresa = cap_login_rede.cdn_empresa tt-rede.cdn_estab = cap_login_rede.cdn_estab tt-rede.cdn_funcionario = cap_login_rede.cdn_funcionario tt-rede.login_rede = cap_login_rede.login_rede . END. END. */ /*Verifica situacao de afastamento*/ FOR EACH sit_afast_func WHERE sit_afast_func.dat_ult_atualiz >= data-servidor AND sit_afast_func.hra_ult_atualiz >= hora-servidor NO-LOCK. IF sit_afast_func.cdn_sit_afast_func <> 03 AND sit_afast_func.cdn_sit_afast_func <> 06 AND sit_afast_func.cdn_sit_afast_func <> 10 AND sit_afast_func.cdn_sit_afast_func <> 80 AND sit_afast_func.cdn_sit_afast_func <> 81 AND sit_afast_func.cdn_sit_afast_func <> 82 AND sit_afast_func.cdn_sit_afast_func <> 83 AND sit_afast_func.cdn_sit_afast_func <> 84 AND sit_afast_func.cdn_sit_afast_func <> 85 AND sit_afast_func.cdn_sit_afast_func <> 86 AND sit_afast_func.cdn_sit_afast_func <> 87 AND sit_afast_func.cdn_sit_afast_func <> 88 AND sit_afast_func.cdn_sit_afast_func <> 89 AND sit_afast_func.cdn_sit_afast_func <> 90 THEN NEXT. IF sit_afast_func.dat_term_sit_afast <= TODAY THEN NEXT. /*DISP 'Afast - ' sit_afast_func.cdn_sit_afast_func WITH WIDTH 300. PAUSE 0.*/ FIND FIRST tt-afast WHERE tt-afast.cdn_empresa = sit_afast_func.cdn_empresa AND tt-afast.cdn_estab = sit_afast_func.cdn_estab AND tt-afast.cdn_funciona = sit_afast_func.cdn_funcionario AND tt-afast.cdn_sit_afast_func = sit_afast_func.cdn_sit_afast_func NO-ERROR. IF NOT AVAIL tt-afast THEN DO: CREATE tt-afast. ASSIGN tt-afast.cdn_empresa = sit_afast_func.cdn_empresa tt-afast.cdn_estab = sit_afast_func.cdn_estab tt-afast.cdn_funciona = sit_afast_func.cdn_funcionario tt-afast.cdn_sit_afast_func = sit_afast_func.cdn_sit_afast_func . END. END. FOR EACH funcionario NO-LOCK. IF funcionario.cdn_empresa <> 100 THEN NEXT. /*Demitidos*/ IF funcionario.dat_desligto_func <> ? THEN DO: IF funcionario.dat_desligto_func >= data-servidor THEN ASSIGN ttFuncionario.ativo = NO. ELSE NEXT. END. FIND LAST tt-afast WHERE tt-afast.cdn_empresa = funcionario.cdn_empresa AND tt-afast.cdn_estab = funcionario.cdn_estab AND tt-afast.cdn_funciona = funcionario.cdn_funciona NO-LOCK NO-ERROR. IF AVAIL tt-afast THEN DO: ASSIGN ttFuncionario.ativo = NO. END. /*DISP funcionario.cdn_estab funcionario.cdn_funciona WITH WIDTH 300. PAUSE 0.*/ FIND FIRST ttFuncionario WHERE ttFuncionario.cdn_empresa = funcionario.cdn_empresa AND ttFuncionario.cdn_estab = funcionario.cdn_estab AND ttFuncionario.cdn_funciona = funcionario.cdn_funciona NO-LOCK NO-ERROR. IF NOT AVAIL ttFuncionario THEN CREATE ttFuncionario. ASSIGN ttFuncionario.cdn_empresa = funcionario.cdn_empresa ttFuncionario.cdn_estab = funcionario.cdn_estab ttFuncionario.cdn_funciona = funcionario.cdn_funciona ttFuncionario.nome = funcionario.nom_pessoa_fisic ttFuncionario.turma = funcionario.cdn_turma_trab ttFuncionario.imprime = NO ttFuncionario.ativo = YES. /*Jornada de Trabalho*/ FIND FIRST jorn_turno_trab WHERE jorn_turno_trab.cdn_turno_trab = funciona.cdn_turno NO-LOCK NO-ERROR. IF AVAIL jorn_turno_trab THEN DO: FIND FIRST tt-jorn WHERE tt-jorn.cdn_jorn_trab = jorn_turno_trab.cdn_jorn_trab NO-LOCK NO-ERROR. IF AVAIL tt-jorn THEN DO: ASSIGN ttFuncionario.hrJornada = tt-jorn.hrJornada ttFuncionario.imprime = YES. END. ELSE DO: FIND FIRST jorn_trab WHERE jorn_trab.cdn_jorn_trab = jorn_turno_trab.cdn_jorn_trab NO-LOCK NO-ERROR. IF AVAIL jorn_trab THEN ASSIGN c-hr-ini = string(jorn_trab.num_horar_inic_interv_refei ,"hh:mm") c-hr-fim = string(jorn_trab.num_horar_term_interv_refei ,"hh:mm") ttFuncionario.hrJornada = c-hr-ini + ' - ' + c-hr-fim . END. END. /*Cargo*/ FIND FIRST tt-cargo WHERE tt-cargo.cdn_cargo_basic = funcionario.cdn_cargo_basic NO-LOCK NO-ERROR. IF AVAIL tt-cargo THEN DO: ASSIGN ttFuncionario.cargo = tt-cargo.cargo ttFuncionario.imprime = YES. END. /*CC*/ FIND FIRST tt-cc WHERE tt-cc.cdn_empresa = funcionario.cdn_empresa AND tt-cc.cdn_estab = funcionario.cdn_estab AND tt-cc.cdn_funciona = funcionario.cdn_funciona NO-LOCK NO-ERROR. IF AVAIL tt-cc THEN DO: ASSIGN ttFuncionario.ccusto = funcionario.cod_rh_ccusto ttFuncionario.imprime = YES. END. /*Lotac*/ FIND FIRST tt-lotac WHERE tt-lotac.cdn_empresa = funcionario.cdn_empresa AND tt-lotac.cdn_estab = funcionario.cdn_estab AND tt-lotac.cdn_funciona = funcionario.cdn_funciona NO-LOCK NO-ERROR. IF AVAIL tt-lotac THEN DO: ASSIGN ttFuncionario.lotacao = funcionario.cod_unid_lotac ttFuncionario.imprime = YES. END. /*rede*/ FIND FIRST cap_login_rede where cap_login_rede.cdn_empresa = funcionario.cdn_empresa AND cap_login_rede.cdn_estab = funcionario.cdn_estab AND cap_login_rede.cdn_funcionario = funcionario.cdn_funcionario NO-LOCK NO-ERROR. IF AVAIL cap_login_rede THEN ASSIGN ttFuncionario.rede = cap_login_rede.login_rede. /*Supervisor*/ IF SUBSTRING(funcionario.cod_unid_lotac, 11, 1) = "9" THEN DO: ASSIGN lotac_gestor = SUBSTRING(funcionario.cod_unid_lotac, 1, 5) + "000000". FIND FIRST bf-lotacao WHERE bf-lotacao.dat_desligto_func = ? AND SUBSTRING(bf-lotacao.cod_unid_lotac, 1, 11) = lotac_gestor NO-LOCK NO-ERROR. IF AVAIL bf-lotacao THEN ASSIGN ttFuncionario.reSuper = bf-lotacao.cdn_funcionario. /*Login Rede Supervisor*/ FIND FIRST cap_login_rede WHERE cap_login_rede.cdn_empresa = bf-lotacao.cdn_empresa AND cap_login_rede.cdn_estab = bf-lotacao.cdn_estab AND cap_login_rede.cdn_funcionario = bf-lotacao.cdn_funcionario NO-LOCK NO-ERROR. IF AVAIL cap_login_rede THEN ASSIGN ttFuncionario.loginRedeGer = cap_login_rede.login_rede. END. /*Coordenador*/ FOR EACH bf-lotacao WHERE SUBSTRING(bf-lotacao.cod_unid_lotac, 1, 5) = SUBSTRING(lotac_gestor, 1, 5): IF SUBSTRING(bf-lotacao.cod_unid_lotac, 9, 1) <> "0" AND SUBSTRING(bf-lotacao.cod_unid_lotac, 11, 9) = "0" THEN ASSIGN ttFuncionario.reCoord = bf-lotacao.cdn_funcionario. END. END. /******************/ END PROCEDURE. Mas está dando o seguinte erro: E além desse problema, não estou conseguindo vizualizar em que momento direciono para o diretório que quero que imprima o xml e propriamente a geração do arquivo. Agradeço pelas dicas. Att.
noellen, Não entendi bem seu cenário. Vc tem que fornecer um Webservice para que o produto em ambiente web faça a conexão e colete dados em XML ou partindo do HCM vc deve se conectar em um Webservice (disponibilizado pelo seu fornecedor) e obter as informações em XML? Se for o primeiro cenário; vc deve desenvolver o programa que gera os dados. Trabalhe com TTs mas depois use o PRODATASET para transformar os dados em XML (usando uma variável LONGCHAR). Nota: Vc pode ver como fazer isso buscando por WRITE-XML no help do Progress. Depois de transportar a TT para XML vc vai usar a varável LONGCHAR como parâmetro de OUTPUT deste seu programa. Este programa vc vai passar pelo ProxyGen para ele gerar o arquivo para o WSA. Use este arquivo para fazer o deploy no WSA. Uma vez que o WSA estaja rodando com tudo certo e o deploy foi feito com sucesso certifique-se de que o programa .P que passou pelo ProxyGen está dentro do PROPATH do APPSERVER usado pelo seu WSA e que este APPSERVER está conectando os bancos que seu programa acessa. Já a chamada do Webservice deve ser feita pelo seu fornecedor (do sistema web) na liguangem nativa do sistema. Dai pra frente cada liguagem trabalha com Webservice da sua forma. Att. Trombini
Olá, Vou tentar explicar como eu faço aqui no meu caso, eu tanto envio quanto recebo um retorno do webService, só que eu uso wsdl mas acredito que possa servir de exemplo para você. bom eu tenho este cara aqui, que envia e retorna um valor em uma longchar. RUN Executar IN hConsultaValorPortType(input ConsultaValorEnvia, output ConsultaValorResponse). como nota-se tenho uma parâmetro consultaValorResponse este cara me traz o retorno do webService, então eu crio x-document que possui uma função load que lê uma longchar e armazena para mim. logo após crio um root para poder passar como parâmetro e usa-lo mais a frente. def var Hdoc as handle. def var Hroot as handle. create x-document HDoc. Hdoc:load("LONGCHAR",ConsultaValorResponse,false). create x-noderef hroot. hDoc:get-document-element(hroot). Depois disso eu chamo minha procedure que realmente faz o trabalho passando como parâmetro a variável hroot. ex: run obtemnode (input hroot). procedure obtemnode. def input parameter vh as handle. def var hc as handle. def var loop as int. create x-noderef hc. do loop = 1 to vh:num-children: vh:get-child(hc,loop). run obtemnode (input hc:handle). case vh:name : when "campoEspecificoWSDL" then do: create sua temp-table. if hc:node-value <> "" then assign tt-campo = hc:node-value. end. when "campoEspecificoWSDL" then do: if hc:node-value <> "" then assign tt-campo = hc:node-value. end. when "campoEspecificoWSDL" then do: if hc:node-value <> "" then assign tt-campo = hc:node-value. end. when "campoEspecificoWSDL" then do: if hc:node-value <> "" then assign tt-campo = hc:node-value. end. end case. end. end. lembrando que esta tt e montada conforme a especificação do meu arquivo wsdl pois eu já sei o que ele vai me retorna. bom feito isso já temos os dados de retorno em uma temp-table agora basta criar o xml. lembrando que estamos trabalhando com RETORNO e não ENVIO DE DADOS, pois seria um pouco diferente. então vamos lâ. Primeiro eu crio um buffer da temp. hBuf = BUFFER tt-suatemp:HANDLE. depois fazemos um for each na temp. FOR EACH tt-suatemp: REPEAT ix = 1 TO hBuf:NUM-FIELDS: hDBFld = hBuf:BUFFER-FIELD(ix). IF hDBFld:NAME = "tt-dadosenvio.RecordType" OR hDBFld:NAME = "Name" THEN NEXT. hDocxml:CREATE-NODE(hField, hDBFld:NAME, "ELEMENT"). hRow1:APPEND-CHILD(hField). hDocxml:CREATE-NODE(hText, "", "TEXT"). hField:APPEND-CHILD(hText). hText:NODE-VALUE = STRING(hDBFld:BUFFER-VALUE). END. /*Fim do repeatt*/ end. /*Fim do for each */ e assim ele cria o xml conforme sua temp, onde as tags serão os campos e os valores serão os valores que contém na temp. agora temos que salvar em um diretório, então fazemos o seguinte. hDocxml:SAVE("file":U,"seuDiretório\nomeDoArquivo.xml":U). está pronto, espero que te ajude.
Olá TrombiniSP, lwazevedo e af.Duns( que gentilmente me respondeu por MP) obrigada pelo retorno. lwazevedo, mto interessante a forma como exemplificou, vou até salvar pra usar em outros casos, obrigada, mas consegui resolver de outra forma e vou postar aqui para esclarecer para os próximos. Inicialmente, meu problema ocorreu pq realmente o WS não estava com os mesmos parâmetros que eu estava enviando. Para resolver isso, gerei um novo proxy de acordo com a nova versão do programa e dei um deploy no WS. A partir disso, ao conferir o funcionamento pelo SoapUI, os campos apareceram corretamente Quanto ao programa, por se tratar de um WebService, não há necessidade de gerar um arquivo fixo, ele mesmo se encarrega de fazer a comunicação das informações. No meu caso eu não consumo o WS, o outro sistema consome e faz uma chamada para a minha geração de dados, portanto a programação ficou da seguinte forma, apenas com um exemplo fixo ok: Código: DEF TEMP-TABLE ttFuncionario NO-UNDO FIELD cdn_empresa AS CHAR FORMAT "X(3)" FIELD cdn_estab AS CHAR FORMAT "X(3)" FIELD cdn_funciona AS CHAR FORMAT "X(7)" FIELD nome AS CHAR FORMAT "X(40)" FIELD turma AS CHAR FORMAT "X(4)" FIELD imprime AS CHAR FORMAT "X(3)" FIELD hrJornada AS CHAR FORMAT "X(25)" FIELD cargo AS CHAR FORMAT "X(40)" FIELD ccusto AS CHAR FORMAT "X(8)" FIELD lotacao AS CHAR FORMAT "X(11)" FIELD ativo AS CHAR FORMAT "X(3)" FIELD rede AS CHAR FORMAT "X(30)" FIELD reSuper AS CHAR FORMAT "X(7)" FIELD loginRedeGer AS CHAR FORMAT "X(30)" FIELD reCoord AS CHAR FORMAT "X(7)" FIELD reGer AS CHAR FORMAT "X(7)". EMPTY TEMP-TABLE ttFuncionario. DEFINE DATASET funcionario FOR ttFuncionario. DEFINE OUTPUT PARAMETER TABLE FOR ttFuncionario. /*Onde está a regra de negócio e alimenta a ttFuncionario*/ FIND FIRST funcionario WHERE funciona.cdn_empresa = 100 AND funciona.cdn_estab = 10 AND funciona.cdn_funciona = 8104 NO-LOCK NO-ERROR. IF AVAIL funcionario THEN CREATE ttFuncionario. ASSIGN ttFuncionario.cdn_empresa = string(funciona.cdn_empresa) ttFuncionario.cdn_estab = string(funciona.cdn_estab) ttFuncionario.cdn_funciona = string(funciona.cdn_funciona) ttFuncionario.nome = string(funciona.nom_pessoa_fisic) ttFuncionario.turma = "1" ttFuncionario.imprime = "SIM" ttFuncionario.hrJornada = "12:12 - 15:15" ttFuncionario.cargo = "Teste Cargo" ttFuncionario.ccusto = "12346" ttFuncionario.lotacao = "12345678" ttFuncionario.ativo = "YES" ttFuncionario.rede = "iara" ttFuncionario.reSuper = "8105" ttFuncionario.loginRedeGer = "testeGestor" ttFuncionario.reCoord = "2345" ttFuncionario.reGer = "6789". return "OK":U. Os créditos por ter dado certo é do Marcelo Assreuy, que gentilmente me explicou o funcionamento das ferramente e orientou o passo a passo do programa Vlw