Gerar xml a partir de um WebService

Discussão em 'Progress 4GL' iniciado por noellen, Janeiro 15, 2013.

  1. noellen

    noellen Equipe de Suporte Moderador Equipe de Suporte

    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:

    [​IMG]

    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.

    ;)
  2. TrombiniSP

    TrombiniSP Membro Participativo

    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
  3. lwazevedo

    lwazevedo Membro Ativo

    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.
  4. noellen

    noellen Equipe de Suporte Moderador Equipe de Suporte

    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
    [​IMG]

    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

Compartilhe esta Página