Rispondo solo ora perché mi sono preso un week-end in famiglia lontano da tutto (l'unico contatto con internet era Youtube per i cartoni di Peppa Pig e della Pimpa per il pupo, che altrimenti non mangia... ::) ;D )
Comunque grazie! Ho cercato un po' in rete e ho trovato un articolo (http://www.drbob42.com/examine/examinE2.htm) per Delphi XE2 e, dopo qualche affanno, sono riuscito a farlo funzionare anche con Lazarus. Si tratta di un semplice programmino che controlla la validità del VAT dei membri di uno Stato europeo.
Occorre prima di tutto generare le unit dal file WSDL disponibile qui:
http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl (http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl)
che, grazie all'aiuto di WST è un'operazione da un paio di click :D
Il progetto richiede un tedit (edVAT) e un tbutton (btnVAT). Bisogna aggiungere wst_synapse e wst_core tra i packages richiesti dal progetto, oltre che aggiungere tra gli uses le unit generate da WST.
Senza dilungarmi troppo, per chi fosse interessato, ecco il codice:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
checkVatService, checkVatService_proxy,
urn_ec_europa_eu_taxud_vies_services_checkVat_types,
synapse_http_protocol;
type
{ TForm1 }
TForm1 = class(TForm)
btnVAT: TButton;
edVAT: TEdit;
procedure btnVATClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.btnVATClick(Sender: TObject);
var
WS: checkVatPortType;
inp: checkVat_Type;
outp: checkVatResponse;
begin
SYNAPSE_RegisterHTTP_Transport();
WS := wst_CreateInstance_checkVatPortType();
inp := checkVat_Type.Create;
try
inp.countryCode := Copy(edVAT.Text,1,Pos(#32,edVAT.Text)-1);
inp.vatNumber := Copy(edVAT.Text,Pos(#32,edVAT.Text)+1,255);
outp := WS.checkVat(inp);
if outp.valid then
ShowMessage('OK: ' + outp.name + #13#10 + outp.address)
else ShowMessage(outp.vatNumber + ' not OK')
finally
inp.Free;
outp.Free
end
end;
end.
E' solo un inizio, ma ora credo di aver capito come funziona il tutto :)
Aggiornamento, devi portare due modifiche ai wrapper creati.
Nel file "checkvatService_proxy.pas" alla riga 19 devi eseguire la sostituzione come indicato qui sotto:
//Dichiarazione orignale
//TcheckVatPortType_Proxy=class(TBaseProxy,urn_ec_europa_eu_taxud_vies_services_checkVat_types.checkVatPortType,urn_ec_europa_eu_taxud_vies_services_checkVat_types.checkVatPortTypeEasy)
//Dichiarazione corretta
TcheckVatPortType_Proxy=class(TBaseProxy, checkVatService.checkVatPortType, CheckVatService.checkVatPortTypeEasy)
e alla riga 69 (o giù di li) sempre dello stesso file:
class function TcheckVatPortType_Proxy.GetServiceType() : PTypeInfo;
begin
result := TypeInfo(checkVatService.checkVatPortType);
end;
Ultima cosa: l'immisione della partita IVA è:
codice paese (le due lettere internazionali, per l'Italia è IT)
SPAZIO
PARTITA IVA
Ciao
Buondì, potrebbe tornare utile questa modifica che ho apportato al TButton, considerando che la dimensione massima della partita IVA europea è di 12 cifre e che il codice ISO2 della nazione è di 2 cifre, togliendo lo spazio tra l'iso2 e il vat code il sorgente verrebbe così modificato:
procedure TForm1.btnVATClick(Sender: TObject);
var
WS: checkVatPortType;
inp: checkVat_Type;
outp: checkVatResponse;
begin
if edVAT.Text = '' then Exit;
if Length(edVAT.Text) > 14 then Exit;
INDY_RegisterHTTP_Transport();
WS := wst_CreateInstance_checkVatPortType();
inp := checkVat_Type.Create;
try
inp.countryCode := Copy(edVAT.Text,1,2);
inp.vatNumber := Copy(edVAT.Text,3);
outp := WS.checkVat(inp);
if outp.valid then
ShowMessage('P.IVA valida: ' + outp.name + #13#10 + outp.address)
else
ShowMessage(outp.vatNumber + ' P.IVA non valida');
outp.Free;
finally
inp.Free;
end;
end;
l'output.free l'ho spostato su subito dopo lo showmessage, in modo che se si dovesse generare un errore per errata digitazione o lasciando vuoto il campo dopo il return il programma non smetta di funzionare.
Spero che ciò sia utile. Ringrazio DragoRosso, perchè senza di lui non sarei giunto al risultato.