Ver la Versión Completa : [PowerCOBOL + COM/OLE] Ligar ao Site da União Europeia VAT Number
Rapinto
2 de marzo de 2015, 17:09
Código para aceder ao Site da União Europeia, para validar se o Numero VAT é Válido.
No caso de Numeros VAT (NIF) Portugues, o site devolve o nome, morada e Código Postal a quem pertence o Numero.
No caso Espanhol, só devolve "válido" ou "inválido" .
De qualquer modo apenas pretendo dar uma ajuda na utilização do COM+ (OLE2).
O ficheiro ZIP anexo é um PPJ da versão 9 do Fujitsu Cobol.
Quem não tiver a versão 9, aqui vai o código.
REPOSITORY
CLASS COM AS "*COM"
CLASS COMEXCEPTION AS "*COM-EXCEPTION".
Criar 2 textbox como "CmPais-ISO" e "CMNRCONTR"
Criar + 3 textbox como "CMNOME" "CMMORADA" "CMCODP"
Criar um botão e no "Click" colocar o código:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WINHTTP PIC X(128) VALUE "WinHttp.WinHttpRequest.5.1".
01 WSDL PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl".
01 xTraffic-Conditions.
03 xtr01 pic x(060) value "<?xml version=""1.0"" encoding=""UTF-8""?>".
03 xtr02 pic x(080) value "<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"">".
03 xtr03 pic x(019) value " <SOAP-ENV:Body>".
03 xtr04 pic x(086) value " <tns1:checkVat xmlns:tns1=""urn:ec.europa.eu:taxud:vies:services:checkVat:type s"">".
03 xtr05 pic x(024) value " <tns1:countryCode>".
03 xtrPais PIC X(02) VALUE "PT".
03 XTR05A PIC X(20) VALUE "</tns1:countryCode>".
03 xtr06 pic x(022) value " <tns1:vatNumber>".
03 XTRNIF PIC X(050) VALUE SPACE.
03 xtr07 pic x(022) value " </tns1:checkVat>".
03 xtr08 pic x(020) value " </SOAP-ENV:Body>".
03 xtr09 pic x(022) value "</SOAP-ENV:Envelope>".
01 Traffic-Conditions redefines xTraffic-Conditions pic x(386).
01 WEBSERVICE USAGE OBJECT REFERENCE COM.
01 OP1 PIC X(256) VALUE "POST".
01 OP2 PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/services/checkVatService/".
01 OP3 PIC X(256) VALUE "FALSE".
*
01 OP4 PIC X(256) VALUE "Content-Type".
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
01 OP6 PIC X(256) VALUE "SOAPAction".
01 COUNTER pic s9(09) comp-5.
01 DMICON pic s9(09) comp-5.
01 returnvalue pic s9(09) comp-5.
01 RESPOSTA PIC X(8192).
01 NOME PIC X(0064).
01 MORADA PIC X(0256).
01 WMORADA PIC X(0256).
01 MOR PIC X(100).
01 LOCP PIC X(100).
01 CODP PIC X(012).
*
01 MSG.
03 MSG01 PIC X(016) VALUE "O resultado é: " .
03 MSG02 PIC X(015) VALUE SPACE.
03 MSG03 PIC X(006) VALUE "Nome: ".
03 MSG04 PIC X(061) VALUE SPACE.
03 MSG05 PIC X(008) VALUE "Morada: ".
03 MSG06 PIC X(061) VALUE SPACE.
03 MSG07 PIC X(010) VALUE "C.Postal:".
03 MSG08 PIC X(010) VALUE SPACE.
03 MSG09 PIC X(080) VALUE "Se pretende passar os dados para a Ficha, pressione o botão SIM.".
*
*
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
MOVE SPACE TO XTRNIF.
IF "text" OF CmPais-ISO NOT = SPACE MOVE "text" OF CmPais-ISO TO xtrPais
ELSE
MOVE ZERO TO DMICON
INVOKE POW-SELF "DisplayMessage" USING "Não tem País definido!" "Teste" POW-DMICONINFORMATION
GO TO MAIN-99-EXIT.
IF "TEXT" OF CMNRCONTR NOT = SPACE MOVE "TEXT" OF CMNRCONTR TO XTRNIF
ELSE
GO TO MAIN-99-EXIT.
MOVE ZERO TO COUNTER.
INSPECT XTRNIF TALLYING COUNTER FOR ALL SPACES.
SUBTRACT COUNTER FROM 50 GIVING COUNTER. ADD 1 TO COUNTER.
MOVE "</tns1:vatNumber>" TO XTRNIF(COUNTER:).
* INVOKE ButtonPlus1 "OpenWebsite" USING sAddress.
INVOKE COM "CREATE-OBJECT" USING WINHTTP RETURNING WEBSERVICE.
*
INVOKE WEBSERVICE "OPEN" USING op1 op2 op3.
*
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
*
INVOKE WEBSERVICE "send" USING TRAFFIC-CONDITIONS.
*
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA.
*****
MOVE RESPOSTA TO XMLLINHA.
MOVE "valid" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
MOVE XMLFIELDRESULT TO OK.
IF XMLFIELDRESULT = "true" MOVE " VALIDO " TO MSG02
ELSE MOVE "INVALIDO" TO MSG02.
MOVE X"0A0A0A" TO MSG02(12:3).
*
MOVE "name" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
move XMLFIELDRESULT TO MSG04.
*
MOVE "address" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
move XMLFIELDRESULT TO MORADA.
*
MOVE X"0A" TO MSG04(60:1).
UNSTRING MORADA DELIMITED BY "<" INTO WMORADA.
UNSTRING WMORADA DELIMITED BY X"0A" INTO MOR COUNT IN COUNTER
LOCP COUNT IN COUNTER
CODP COUNT IN COUNTER.
MOVE MOR TO MSG06.
MOVE CODP TO MSG08.
MOVE SPACE TO MSG08(9:).
MOVE X"0D0A" TO MSG06(60:1).
MAIN-70.
IF OK NOT = "t" GO TO MAIN-80.
IF "ENABLED" OF CMNOME = POW-FALSE GO TO MAIN-80.
MOVE X"0A0A" TO MSG09.
MOVE " Se pretende passar os dados para a Ficha, pressione o botão SIM." TO MSG09.
MOVE X"0A0A" TO MSG09(1:2).
MOVE ZERO TO DMICON.
ADD POW-DMICONINFORMATION POW-DMYESNO POW-DMDEFBUTTON2 TO DMICON.
INVOKE POW-SELF "DisplayMessage" USING MSG "R.P.S. - Faturação" DMICON
RETURNING ReturnValue.
IF RETURNVALUE = POW-DMRYES
MOVE MSG04 TO "TEXT" OF CMNOME
MOVE MSG06 TO "TEXT" OF CMMORADA
MOVE MSG08 TO "TEXT" OF CMCODP.
GO TO MAIN-90.
MAIN-80.
MOVE SPACE TO MSG09.
MOVE ZERO TO DMICON.
INVOKE POW-SELF "DisplayMessage" USING MSG "R.P.S. - Faturação" POW-DMICONINFORMATION
RETURNING ReturnValue.
MAIN-90.
SET WEBSERVICE TO NULL.
MOVE SPACE TO NOME MOR LOCP CODP RESPOSTA.
MAIN-99-EXIT.
EXIT PROGRAM.
Espero que ajude alguém.
Saludos,
Rui Pinto
Rapinto
2 de marzo de 2015, 17:14
Como já não aceitava mais vai neste Post o código para a "New Procedure" GETXMLFIELD":
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WFIELDSEARCH PIC X(0128).
01 WFIELDSEARCHEND PIC X(0128).
01 XMLIDX.
03 XMLIDX1 PIC S9(009).
03 XMLIDX2 PIC S9(009).
03 XMLIDX3 PIC S9(009).
03 XMLIDX8 PIC S9(009).
03 XMLIDX9 PIC S9(009).
*
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
*
INITIALIZE XMLIDX WFIELDSEARCH WFIELDSEARCHEND XMLFIELDRESULT.
IF XMLLINHA = SPACE GO TO MAIN-99-EXIT.
IF XMLFIELDSEARCH = SPACE GO TO MAIN-99-EXIT.
MOVE "<" TO WFIELDSEARCH.
MOVE XMLFIELDSEARCH TO WFIELDSEARCH(2:)
PERFORM VARYING XMLIDX8 FROM 128 BY -1 UNTIL XMLIDX8 < 1
IF WFIELDSEARCH(XMLIDX8:1) NOT = SPACE
ADD 1 TO XMLIDX8
MOVE ">" TO WFIELDSEARCH(XMLIDX8:1)
EXIT PERFORM
END-IF
END-PERFORM.
* SUBTRACT XMLIDX8 FROM 128 GIVING XMLIDX8.
MOVE "</" TO WFIELDSEARCHEND.
MOVE WFIELDSEARCH(2:) TO WFIELDSEARCHEND(3:).
MOVE XMLIDX8 TO XMLIDX9.
ADD 1 TO XMLIDX9.
MAIN-05.
PERFORM VARYING XMLIDX1 FROM 1 BY 1 UNTIL XMLIDX1 > 8196
IF XMLLINHA(XMLIDX1:XMLIDX8) = WFIELDSEARCH
ADD XMLIDX8 TO XMLIDX1
EXIT PERFORM
END-IF
END-PERFORM
IF XMLIDX1 > 8195 GO TO MAIN-99-EXIT.
PERFORM VARYING XMLIDX2 FROM XMLIDX1 BY 1 UNTIL XMLIDX2 > 8196
IF XMLLINHA(XMLIDX2:XMLIDX9) = WFIELDSEARCHEND
ADD 1 TO XMLIDX2
EXIT PERFORM
END-IF
IF XMLLINHA(XMLIDX2:1) = "<"
MOVE "<" TO XMLFIELDRESULT
MOVE 8186 TO XMLIDX2
EXIT PERFORM
END-IF
END-PERFORM
IF XMLIDX2 > 8195 GO TO MAIN-99-EXIT.
SUBTRACT 1 FROM XMLIDX2.
SUBTRACT XMLIDX1 FROM XMLIDX2 GIVING XMLIDX3.
MOVE XMLLINHA(XMLIDX1:XMLIDX3) TO XMLFIELDRESULT.
MAIN-99-EXIT.
EXIT PROGRAM.
Joseg
29 de enero de 2018, 17:37
Como já não aceitava mais vai neste Post o código para a "New Procedure" GETXMLFIELD":
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WFIELDSEARCH PIC X(0128).
01 WFIELDSEARCHEND PIC X(0128).
01 XMLIDX.
03 XMLIDX1 PIC S9(009).
03 XMLIDX2 PIC S9(009).
03 XMLIDX3 PIC S9(009).
03 XMLIDX8 PIC S9(009).
03 XMLIDX9 PIC S9(009).
*
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
*
INITIALIZE XMLIDX WFIELDSEARCH WFIELDSEARCHEND XMLFIELDRESULT.
IF XMLLINHA = SPACE GO TO MAIN-99-EXIT.
IF XMLFIELDSEARCH = SPACE GO TO MAIN-99-EXIT.
MOVE "<" TO WFIELDSEARCH.
MOVE XMLFIELDSEARCH TO WFIELDSEARCH(2:)
PERFORM VARYING XMLIDX8 FROM 128 BY -1 UNTIL XMLIDX8 < 1
IF WFIELDSEARCH(XMLIDX8:1) NOT = SPACE
ADD 1 TO XMLIDX8
MOVE ">" TO WFIELDSEARCH(XMLIDX8:1)
EXIT PERFORM
END-IF
END-PERFORM.
* SUBTRACT XMLIDX8 FROM 128 GIVING XMLIDX8.
MOVE "</" TO WFIELDSEARCHEND.
MOVE WFIELDSEARCH(2:) TO WFIELDSEARCHEND(3:).
MOVE XMLIDX8 TO XMLIDX9.
ADD 1 TO XMLIDX9.
MAIN-05.
PERFORM VARYING XMLIDX1 FROM 1 BY 1 UNTIL XMLIDX1 > 8196
IF XMLLINHA(XMLIDX1:XMLIDX8) = WFIELDSEARCH
ADD XMLIDX8 TO XMLIDX1
EXIT PERFORM
END-IF
END-PERFORM
IF XMLIDX1 > 8195 GO TO MAIN-99-EXIT.
PERFORM VARYING XMLIDX2 FROM XMLIDX1 BY 1 UNTIL XMLIDX2 > 8196
IF XMLLINHA(XMLIDX2:XMLIDX9) = WFIELDSEARCHEND
ADD 1 TO XMLIDX2
EXIT PERFORM
END-IF
IF XMLLINHA(XMLIDX2:1) = "<"
MOVE "<" TO XMLFIELDRESULT
MOVE 8186 TO XMLIDX2
EXIT PERFORM
END-IF
END-PERFORM
IF XMLIDX2 > 8195 GO TO MAIN-99-EXIT.
SUBTRACT 1 FROM XMLIDX2.
SUBTRACT XMLIDX1 FROM XMLIDX2 GIVING XMLIDX3.
MOVE XMLLINHA(XMLIDX1:XMLIDX3) TO XMLFIELDRESULT.
MAIN-99-EXIT.
EXIT PROGRAM.
Este código deixou de funcionar. Houve alterações?
Rapinto
29 de enero de 2018, 19:53
Joseg,
Depois de tanto tempo a funcionar, eles devem ter acertado qualquer coisa.
O erro parece-me ser no:
Traffic-Conditions redefines xTraffic-Conditions pic x(386).
tem que ter pic x(417)
Enganei-me a somar os tamanhos todos.
A string não chegava lá completa mas funcionava e eu nunca dei por ela.
Agora devem ter acertado alguma coisa e o programa queixou-se.
Um abraço,
Rui Pinto
Joseg
30 de enero de 2018, 13:14
Joseg,
Depois de tanto tempo a funcionar, eles devem ter acertado qualquer coisa.
O erro parece-me ser no:
Traffic-Conditions redefines xTraffic-Conditions pic x(386).
tem que ter pic x(417)
Enganei-me a somar os tamanhos todos.
A string não chegava lá completa mas funcionava e eu nunca dei por ela.
Agora devem ter acertado alguma coisa e o programa queixou-se.
Um abraço,
Rui Pinto
Obrigado, já esta ok :)
Abraço
Joseg
9 de noviembre de 2021, 17:41
Código para aceder ao Site da União Europeia, para validar se o Numero VAT é Válido.
No caso de Numeros VAT (NIF) Portugues, o site devolve o nome, morada e Código Postal a quem pertence o Numero.
No caso Espanhol, só devolve "válido" ou "inválido" .
De qualquer modo apenas pretendo dar uma ajuda na utilização do COM+ (OLE2).
O ficheiro ZIP anexo é um PPJ da versão 9 do Fujitsu Cobol.
Quem não tiver a versão 9, aqui vai o código.
REPOSITORY
CLASS COM AS "*COM"
CLASS COMEXCEPTION AS "*COM-EXCEPTION".
Criar 2 textbox como "CmPais-ISO" e "CMNRCONTR"
Criar + 3 textbox como "CMNOME" "CMMORADA" "CMCODP"
Criar um botão e no "Click" colocar o código:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WINHTTP PIC X(128) VALUE "WinHttp.WinHttpRequest.5.1".
01 WSDL PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl".
01 xTraffic-Conditions.
03 xtr01 pic x(060) value "<?xml version=""1.0"" encoding=""UTF-8""?>".
03 xtr02 pic x(080) value "<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"">".
03 xtr03 pic x(019) value " <SOAP-ENV:Body>".
03 xtr04 pic x(086) value " <tns1:checkVat xmlns:tns1=""urn:ec.europa.eu:taxud:vies:services:checkVat:type s"">".
03 xtr05 pic x(024) value " <tns1:countryCode>".
03 xtrPais PIC X(02) VALUE "PT".
03 XTR05A PIC X(20) VALUE "</tns1:countryCode>".
03 xtr06 pic x(022) value " <tns1:vatNumber>".
03 XTRNIF PIC X(050) VALUE SPACE.
03 xtr07 pic x(022) value " </tns1:checkVat>".
03 xtr08 pic x(020) value " </SOAP-ENV:Body>".
03 xtr09 pic x(022) value "</SOAP-ENV:Envelope>".
01 Traffic-Conditions redefines xTraffic-Conditions pic x(386).
01 WEBSERVICE USAGE OBJECT REFERENCE COM.
01 OP1 PIC X(256) VALUE "POST".
01 OP2 PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/services/checkVatService/".
01 OP3 PIC X(256) VALUE "FALSE".
*
01 OP4 PIC X(256) VALUE "Content-Type".
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
01 OP6 PIC X(256) VALUE "SOAPAction".
01 COUNTER pic s9(09) comp-5.
01 DMICON pic s9(09) comp-5.
01 returnvalue pic s9(09) comp-5.
01 RESPOSTA PIC X(8192).
01 NOME PIC X(0064).
01 MORADA PIC X(0256).
01 WMORADA PIC X(0256).
01 MOR PIC X(100).
01 LOCP PIC X(100).
01 CODP PIC X(012).
*
01 MSG.
03 MSG01 PIC X(016) VALUE "O resultado é: " .
03 MSG02 PIC X(015) VALUE SPACE.
03 MSG03 PIC X(006) VALUE "Nome: ".
03 MSG04 PIC X(061) VALUE SPACE.
03 MSG05 PIC X(008) VALUE "Morada: ".
03 MSG06 PIC X(061) VALUE SPACE.
03 MSG07 PIC X(010) VALUE "C.Postal:".
03 MSG08 PIC X(010) VALUE SPACE.
03 MSG09 PIC X(080) VALUE "Se pretende passar os dados para a Ficha, pressione o botão SIM.".
*
*
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
MOVE SPACE TO XTRNIF.
IF "text" OF CmPais-ISO NOT = SPACE MOVE "text" OF CmPais-ISO TO xtrPais
ELSE
MOVE ZERO TO DMICON
INVOKE POW-SELF "DisplayMessage" USING "Não tem País definido!" "Teste" POW-DMICONINFORMATION
GO TO MAIN-99-EXIT.
IF "TEXT" OF CMNRCONTR NOT = SPACE MOVE "TEXT" OF CMNRCONTR TO XTRNIF
ELSE
GO TO MAIN-99-EXIT.
MOVE ZERO TO COUNTER.
INSPECT XTRNIF TALLYING COUNTER FOR ALL SPACES.
SUBTRACT COUNTER FROM 50 GIVING COUNTER. ADD 1 TO COUNTER.
MOVE "</tns1:vatNumber>" TO XTRNIF(COUNTER:).
* INVOKE ButtonPlus1 "OpenWebsite" USING sAddress.
INVOKE COM "CREATE-OBJECT" USING WINHTTP RETURNING WEBSERVICE.
*
INVOKE WEBSERVICE "OPEN" USING op1 op2 op3.
*
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
*
INVOKE WEBSERVICE "send" USING TRAFFIC-CONDITIONS.
*
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA.
*****
MOVE RESPOSTA TO XMLLINHA.
MOVE "valid" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
MOVE XMLFIELDRESULT TO OK.
IF XMLFIELDRESULT = "true" MOVE " VALIDO " TO MSG02
ELSE MOVE "INVALIDO" TO MSG02.
MOVE X"0A0A0A" TO MSG02(12:3).
*
MOVE "name" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
move XMLFIELDRESULT TO MSG04.
*
MOVE "address" TO XMLFIELDSEARCH.
CALL "GETXMLFIELD".
move XMLFIELDRESULT TO MORADA.
*
MOVE X"0A" TO MSG04(60:1).
UNSTRING MORADA DELIMITED BY "<" INTO WMORADA.
UNSTRING WMORADA DELIMITED BY X"0A" INTO MOR COUNT IN COUNTER
LOCP COUNT IN COUNTER
CODP COUNT IN COUNTER.
MOVE MOR TO MSG06.
MOVE CODP TO MSG08.
MOVE SPACE TO MSG08(9:).
MOVE X"0D0A" TO MSG06(60:1).
MAIN-70.
IF OK NOT = "t" GO TO MAIN-80.
IF "ENABLED" OF CMNOME = POW-FALSE GO TO MAIN-80.
MOVE X"0A0A" TO MSG09.
MOVE " Se pretende passar os dados para a Ficha, pressione o botão SIM." TO MSG09.
MOVE X"0A0A" TO MSG09(1:2).
MOVE ZERO TO DMICON.
ADD POW-DMICONINFORMATION POW-DMYESNO POW-DMDEFBUTTON2 TO DMICON.
INVOKE POW-SELF "DisplayMessage" USING MSG "R.P.S. - Faturação" DMICON
RETURNING ReturnValue.
IF RETURNVALUE = POW-DMRYES
MOVE MSG04 TO "TEXT" OF CMNOME
MOVE MSG06 TO "TEXT" OF CMMORADA
MOVE MSG08 TO "TEXT" OF CMCODP.
GO TO MAIN-90.
MAIN-80.
MOVE SPACE TO MSG09.
MOVE ZERO TO DMICON.
INVOKE POW-SELF "DisplayMessage" USING MSG "R.P.S. - Faturação" POW-DMICONINFORMATION
RETURNING ReturnValue.
MAIN-90.
SET WEBSERVICE TO NULL.
MOVE SPACE TO NOME MOR LOCP CODP RESPOSTA.
MAIN-99-EXIT.
EXIT PROGRAM.
Espero que ajude alguém.
Saludos,
Rui Pinto
Este código deixou de funcionar :(
Alguém pode ajudar?
Saludos!
Kuk
9 de noviembre de 2021, 18:21
@Joseg, qué error te sale? Esto ayudará entender qué es lo que falla.
Joseg
9 de noviembre de 2021, 19:12
@Joseg, qué error te sale? Esto ayudará entender qué es lo que falla.
Nesta linha:
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA.
"RESPOSTA" é a seguinte:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>The given SOAPAction
Content-Type does not match an operation.</faultstring></soap:Fault></soap:Body></soap:Envelope>
Kuk
9 de noviembre de 2021, 20:05
@Joseg, el tiene pinta de venir de aquí:
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
Te propongo que te descargues el programa SoapUI o hagas unos test en un cliente Soap Online como este: SOAP Web Client (http://www.soapclient.com/soapclient?template=%2Fclientform.html&fn=soapform&SoapTemplate=%2FSoapResult.html&SoapWSDL=https%3A%2F%2Fec.europa.eu%2Ftaxation_cus toms%2Fvies%2FcheckVatService.wsdl&_ArraySize=2)
Una vez hayas encontrado el problema, corrijas el código Cobol.
Joseg
9 de noviembre de 2021, 20:39
@Joseg, el tiene pinta de venir de aquí:
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
Te propongo que te descargues el programa SoapUI o hagas unos test en un cliente Soap Online como este: SOAP Web Client (http://www.soapclient.com/soapclient?template=%2Fclientform.html&fn=soapform&SoapTemplate=%2FSoapResult.html&SoapWSDL=https%3A%2F%2Fec.europa.eu%2Ftaxation_cus toms%2Fvies%2FcheckVatService.wsdl&_ArraySize=2)
Una vez hayas encontrado el problema, corrijas el código Cobol.
Gracias pela dica !!!!
Pode ser um problema no servidor, mas no link que me enviaste também não dá.
Consegues validar um NIF de Espanha, ou de outro país?
Saludos,
Kuk
10 de noviembre de 2021, 11:35
@Joseg, acabo de probar con https https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl y funciona con SoapUI 2.5.1 (https://dl.eviware.com/soapuios/2.5.1/soapui-2.5.1-bin.zip)
fastpho
10 de noviembre de 2021, 14:02
Nesta linha:
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA.
"RESPOSTA" é a seguinte:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>The given SOAPAction
Content-Type does not match an operation.</faultstring></soap:Fault></soap:Body></soap:Envelope>
Hola @Joseg, El problema esta en el dato de envio es invalido, estuve probando el ejemplo original de RUI , y le falta el cierre de </tns1:checkVat> agregando esta linea a la variable de envio Traffic-Conditions funciona bien ....
Me trajo los datos correctos
Saludos..
Kuk
10 de noviembre de 2021, 14:38
@fastpho, bien visto compañero :bien:
Yo utilicé el WSDL original con el SoapUI y será por eso que me funcionó.
Lo raro es que antes haya funcionado...
fastpho
10 de noviembre de 2021, 16:11
Hola @Joseg, El problema esta en el dato de envio es invalido, estuve probando el ejemplo original de RUI , y le falta el cierre de </tns1:checkVat> agregando esta linea a la variable de envio Traffic-Conditions funciona bien ....
Me trajo los datos correctos
Saludos..
Perdon , copie mal , el cierre que falta es ....
"</tns1:vatNumber>". *> falta del ejemplo de RUI
Saludos ....
Joseg
11 de noviembre de 2021, 00:43
Perdon , copie mal , el cierre que falta es ....
"</tns1:vatNumber>". *> falta del ejemplo de RUI
Saludos ....
Não esta a faltar !!
Ver este código. Continua a não funcionar :(
MOVE ZERO TO COUNTER.
INSPECT XTRNIF TALLYING COUNTER FOR ALL SPACES.
SUBTRACT COUNTER FROM 50 GIVING COUNTER. ADD 1 TO COUNTER.
MOVE "</tns1:vatNumber>" TO XTRNIF(COUNTER:).
INVOKE COM "CREATE-OBJECT" USING WINHTTP RETURNING WEBSERVICE
Kuk
11 de noviembre de 2021, 09:54
@Joseg, has probado con https?
Joseg
11 de noviembre de 2021, 10:48
@Joseg, has probado con https?
Com https tb não dá :(
fastpho
11 de noviembre de 2021, 12:12
Hola @Joseg, te paso un ejemplo funcionando con tus datos ......
La respuesta del servidor es leida con chilkat xml
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*----------------------------------------------------------------------
* Variables para el Objeto WinHttpRequest
*----------------------------------------------------------------------
01 HttpJob pic x(128) value "WinHttp.WinHttpRequest.5.1".
01 WinHttpReq usage object reference OLE.
*> POST , GET , PUT
01 TipoEnvio pic x(4) value "POST".
* Verdero o falso dependiendo si la comunicacion es asyn - sync
01 OLE-TRUE PIC 1(1) BIT VALUE B"1".
01 OLE-FALSE PIC 1(1) BIT VALUE B"0".
*https:
01 ServerName pic x(256) value "http://ec.europa.eu/taxation_customs/vies/services/checkVatService".
01 ReqHead1 pic x(256) value "Content-Type".
01 ReqHead2 pic x(256) value "application/soap+xml; charset=utf-8".
01 status-string pic x(256).
01 Respuesta PIC x(450).
01 xTraffic-Conditions.
03 xtr01 pic x(42) value "<?xml version=""1.0"" encoding=""UTF-8""?>".
03 xtr02 pic x(80) value "<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"">".
03 xtr03 pic x(17) value " <SOAP-ENV:Body>".
03 xtr04 pic x(86) value " <tns1:checkVat xmlns:tns1=""urn:ec.europa.eu:taxud:vies:services:checkVat:type s"">".
03 xtr05 pic x(24) value " <tns1:countryCode>".
03 xtrPais pic X(02) VALUE "PT". *>IT
03 XTR05A pic X(19) VALUE "</tns1:countryCode>".
03 xtr06 pic x(22) value " <tns1:vatNumber>". *> 03 XTRNIF pic X(11) VALUE "07392740960".
03 XTRNIF pic X(9) VALUE "510944299".
03 xtr06C pic x(17) value "</tns1:vatNumber>". *> falta del ejemplo de RUI
03 xtr07 pic x(16) value "</tns1:checkVat>".
03 xtr08 pic x(18) value " </SOAP-ENV:Body>".
03 xtr09 pic x(20) value "</SOAP-ENV:Envelope>".
01 Traffic-Conditions redefines xTraffic-Conditions pic x(374).
01 ReturnValue pic s9(5) comp-5 VALUE ZEROS.
01 Campo-Valida pic x(10).
01 Campo-Name pic x(30).
01 Campo-Address pic x(30).
PROCEDURE DIVISION.
*-----------------
INICIO-Peticion.
*-----------------------------
* Crea el objeto WinHttpRequest
invoke OLE "CREATE-OBJECT" using HttpJob returning WinHttpReq.
*------------------------------
* Open la HTTP request.
invoke WinHttpReq "OPEN" using TipoEnvio , ServerName , ole-true.
*
invoke WinHttpReq "setRequestHeader" using ReqHead1 ReqHead2.
*
* ------------------------------
* Envia HTTP request.
invoke WinHttpReq "send" using Traffic-Conditions.
*------------------------------
* Espera la respuesta completa
invoke WinHttpReq "WaitForResponse" using ole-true.
*-------------------------------
*--------------------------------------------
* Muestra Estado de comunicacion
invoke WinHttpReq "get-StatusText" returning status-string.
display "*---------------------------------*"
display "Respuesta Server: " , status-string
* ---------------------------------------------------------------------------
invoke WinHttpReq "get-Responsetext" RETURNING Respuesta.
display "*-------xml de salida--------*"
display Respuesta.
display "*-------fin de salida--------*".
* ---------------------------------------------------------------------------
Leo-Xml. *>chilkat xml
INVOKE ChilkatXml1 "LoadXml" USING Respuesta RETURNING ReturnValue.
if ReturnValue not = 1 then
INVOKE pow-self "DisplayMessage" USING "error"
exit program
end-if.
INVOKE ChilkatXml1 "TagContent" USING "valid" RETURNING Campo-Valida.
INVOKE ChilkatXml1 "TagContent" USING "name" RETURNING Campo-Name.
INVOKE ChilkatXml1 "TagContent" USING "address" RETURNING Campo-Address.
display "valid : " , Campo-Valida.
display "name : " , Campo-Name.
display "address:" , Campo-Address.
Saludos
fastpho
11 de noviembre de 2021, 13:43
@Joseg, revisando detenidamente el ejemplo de RUI , no me había dado cuenta
que inserta a la variable Traffic-Conditions , cuando el usuario ingresa el
valor del NIF con las siguientes lineas
MOVE ZERO TO COUNTER.
INSPECT XTRNIF TALLYING COUNTER FOR ALL SPACES.
SUBTRACT COUNTER FROM 50 GIVING COUNTER. ADD 1 TO COUNTER.
MOVE "</tns1:vatNumber>" TO XTRNIF(COUNTER:).
el problema que le veo al ejemplo es la peticion en las cabeceras
cambiando estas lineas :
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4.
Por esta sola :
INVOKE WEBSERVICE "setRequestHeader" USING OP4 OP5 .
Funciona perfectamente
Saludos .....
Kuk
11 de noviembre de 2021, 15:08
@Joseg, he hecho pruebas (acabé instalando el Fujitsu).
Funciona en mi caso comentando las siguientes líneas:
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
*>INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
Este es mi código:
*>
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST001.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
CLASS COM AS "*COM"
CLASS COMEXCEPTION AS "*COM-EXCEPTION".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WINHTTP PIC X(128) VALUE "WinHttp.WinHttpRequest.5.1".
01 WSDL PIC X(256) VALUE "https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl".
01 xTraffic-Conditions PIC X(384).
*>01 Traffic-Conditions redefines xTraffic-Conditions pic x(386).
01 WEBSERVICE USAGE OBJECT REFERENCE COM.
01 OP1 PIC X(256) VALUE "POST".
01 OP2 PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/services/checkVatService/".
01 OP3 PIC X(256) VALUE "FALSE".
*
01 OP4 PIC X(256) VALUE "Content-Type".
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
01 OP6 PIC X(256) VALUE "SOAPAction".
01 RESPOSTA PIC X(8192).
01 resultado1 PIC X(5).
01 resultado2 PIC X(5).
*>01 long PIC 9(4) COMP-5.
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
STRING
'<?xml version="1.0" encoding="UTF-8"?>' & X"0D0A"
'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">' & X"0D0A"
' <SOAP-ENV:Body>' & X"0D0A"
' <tns1:checkVat xmlns:tns1="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">' & X"0D0A"
' <tns1:countryCode>ES</tns1:countryCode>' & X"0D0A"
' <tns1:vatNumber>B63272603</tns1:vatNumber>' & X"0D0A"
' </tns1:checkVat>' & X"0D0A"
' </SOAP-ENV:Body>' & X"0D0A"
'</SOAP-ENV:Envelope>' & X"0D0A"
* '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">' & X"0D0A"
* ' <soapenv:Header/>' & X"0D0A"
* ' <soapenv:Body>' & X"0D0A"
* ' <urn:checkVat>' & X"0D0A"
* ' <urn:countryCode>ES</urn:countryCode>' & X"0D0A"
* ' <urn:vatNumber>B63272603</urn:vatNumber>' & X"0D0A"
* ' </urn:checkVat>' & X"0D0A"
* ' </soapenv:Body>' & X"0D0A"
* '</soapenv:Envelope>' & X"0D0A"
DELIMITED BY SIZE INTO xTraffic-Conditions
display xTraffic-Conditions
display " "
INVOKE COM "CREATE-OBJECT" USING WINHTTP RETURNING WEBSERVICE.
*
INVOKE WEBSERVICE "OPEN" USING op1 op2 op3.
*
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
*>INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
*
*>compute long = function stored-char-length(xTRAFFIC-CONDITIONS)
*>display long
INVOKE WEBSERVICE "send" USING xTRAFFIC-CONDITIONS
*
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA
display RESPOSTA
display " "
unstring RESPOSTA delimited by "<valid>" into resultado1 resultado2
inspect resultado2 replacing all "<" by spaces
display "RESULTADO: " resultado2
EXIT PROGRAM
.
Resultado:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<tns1:checkVat xmlns:tns1="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">
<tns1:countryCode>ES</tns1:countryCode>
<tns1:vatNumber>B63272603</tns1:vatNumber>
</tns1:checkVat>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><checkVatResponse xmlns="urn:ec.europa.eu:taxud:vies:services:checkVat:type s"><countryCode>ES</countryCode><vatNumber>B63272603</vatNumber><requestDate>2021-11-11+01:00</requestDate><valid>true</valid><name>---</name><address>---</address></checkVatResponse></soap:Body></soap:Envelope>
RESULTADO: true
Joseg
11 de noviembre de 2021, 18:45
@Joseg, he hecho pruebas (acabé instalando el Fujitsu).
Funciona en mi caso comentando las siguientes líneas:
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
*>INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
Este es mi código:
*>
IDENTIFICATION DIVISION.
PROGRAM-ID. TEST001.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
REPOSITORY.
CLASS COM AS "*COM"
CLASS COMEXCEPTION AS "*COM-EXCEPTION".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WINHTTP PIC X(128) VALUE "WinHttp.WinHttpRequest.5.1".
01 WSDL PIC X(256) VALUE "https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl".
01 xTraffic-Conditions PIC X(384).
*>01 Traffic-Conditions redefines xTraffic-Conditions pic x(386).
01 WEBSERVICE USAGE OBJECT REFERENCE COM.
01 OP1 PIC X(256) VALUE "POST".
01 OP2 PIC X(256) VALUE "http://ec.europa.eu/taxation_customs/vies/services/checkVatService/".
01 OP3 PIC X(256) VALUE "FALSE".
*
01 OP4 PIC X(256) VALUE "Content-Type".
01 OP5 PIC X(256) VALUE "text/xml; charset=utf-8".
01 OP6 PIC X(256) VALUE "SOAPAction".
01 RESPOSTA PIC X(8192).
01 resultado1 PIC X(5).
01 resultado2 PIC X(5).
*>01 long PIC 9(4) COMP-5.
PROCEDURE DIVISION.
MAIN SECTION.
MAIN-00.
STRING
'<?xml version="1.0" encoding="UTF-8"?>' & X"0D0A"
'<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">' & X"0D0A"
' <SOAP-ENV:Body>' & X"0D0A"
' <tns1:checkVat xmlns:tns1="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">' & X"0D0A"
' <tns1:countryCode>ES</tns1:countryCode>' & X"0D0A"
' <tns1:vatNumber>B63272603</tns1:vatNumber>' & X"0D0A"
' </tns1:checkVat>' & X"0D0A"
' </SOAP-ENV:Body>' & X"0D0A"
'</SOAP-ENV:Envelope>' & X"0D0A"
* '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">' & X"0D0A"
* ' <soapenv:Header/>' & X"0D0A"
* ' <soapenv:Body>' & X"0D0A"
* ' <urn:checkVat>' & X"0D0A"
* ' <urn:countryCode>ES</urn:countryCode>' & X"0D0A"
* ' <urn:vatNumber>B63272603</urn:vatNumber>' & X"0D0A"
* ' </urn:checkVat>' & X"0D0A"
* ' </soapenv:Body>' & X"0D0A"
* '</soapenv:Envelope>' & X"0D0A"
DELIMITED BY SIZE INTO xTraffic-Conditions
display xTraffic-Conditions
display " "
INVOKE COM "CREATE-OBJECT" USING WINHTTP RETURNING WEBSERVICE.
*
INVOKE WEBSERVICE "OPEN" USING op1 op2 op3.
*
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
*>INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
*>INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
*
*>compute long = function stored-char-length(xTRAFFIC-CONDITIONS)
*>display long
INVOKE WEBSERVICE "send" USING xTRAFFIC-CONDITIONS
*
INVOKE WEBSERVICE "get-Responsetext" RETURNING RESPOSTA
display RESPOSTA
display " "
unstring RESPOSTA delimited by "<valid>" into resultado1 resultado2
inspect resultado2 replacing all "<" by spaces
display "RESULTADO: " resultado2
EXIT PROGRAM
.
Resultado:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<tns1:checkVat xmlns:tns1="urn:ec.europa.eu:taxud:vies:services:checkVat:type s">
<tns1:countryCode>ES</tns1:countryCode>
<tns1:vatNumber>B63272603</tns1:vatNumber>
</tns1:checkVat>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><checkVatResponse xmlns="urn:ec.europa.eu:taxud:vies:services:checkVat:type s"><countryCode>ES</countryCode><vatNumber>B63272603</vatNumber><requestDate>2021-11-11+01:00</requestDate><valid>true</valid><name>---</name><address>---</address></checkVatResponse></soap:Body></soap:Envelope>
RESULTADO: true
Ja esta ok :beber:
Gracias a todos pela ajuda :sis:
Paulo
6 de septiembre de 2022, 17:56
Olá a todos.
Talvez possa interessar a alguém esta solução.
O serviço SOAP do VIES deixou outra vez de responder na semana passada (para o codigo feito pelo Rui).
Para solucionar basta fazer o seguinte: (inclui a alteração para resolver o erro anterior de 2021)
***** alterado 2021-11-16 para resolver erro de comunicação
* INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP4 .
* INVOKE WEBSERVICE "setRequestHeader" USING OP6 OP5 .
* INVOKE WEBSERVICE "setRequestHeader" using OP6 OP4 .
****** fim alteração
*
***** alterado 2022-09-06 para resolver erro de comunicação
INVOKE WEBSERVICE "setRequestHeader" USING OP4 OP5 .
****** fim alteração
Saludos
Paulo
7 de septiembre de 2022, 10:19
Também alteraram a resposta XML
Os campos <valid> <name> <address>
passaram a <ns2:valid> <ns2:name> <ns2:address>
vBulletin v3.8.7, Derechos ©2000-2026, Jelsoft Enterprises Ltd.