Newsgroup: it.comp.lang.delphi
Titolo: Farmaclick, unit incriminata.

Ciao a tutti,
  mi rendo conto che la richiesta in corso non e' tra le piu' facili da 
soddisfare in quanto i parametri richiesti per le prove non sono di dominio 
pubblico.
Quindi gli eventuali test, da farsi dietro i vostri suggerimenti (che 
seguiro' scrupolosamente), saranno fatti in seguito.
Quello che e' pubblico e' il sito di farmaclick dove si trovano i file 
originali wsdl che e'
 
http://www.farmaclick.it/I-servizi-documentazione_0204.html
 
 
In linea ci sono 3 livelli diversi di standard pubblicati
2005
2008
2010
 
Quello maggiormente in uso e' il 2005, in pratica _anche_ il 2005 puo' 
essere usato sui server che, di fatto, utilizzano il 2010.
 
Prima di procedere alla richiesta di un ddt, si deve fare la procedura di 
login per ottenere un ID di sessione
 
procedure TFRL.OttieniID;
Var LogIn              : LoginInputBean;  // nel file importato da wsdl 
importer
      LogInOutput   : LoginOutputBean;
      CF                   :  ArrayOf_soapenc_string;
      FornitoriBean : ArrayOf_tns1_FornitoreBean;
      I,B                   : Integer;
      S                     : string;
 
begin
  MM1.Clear;   // TMemo
  SetLength(CF,1);
  CF[0]:='';
  LogIn:=LoginInputBean.Create;
  LogIn.nomeTerminale:='01';
  LogIn.userName:='UserName';  // UserName usato per quel fornitore di 
servizio
  LogIn.password:='Password';    //  Password
  LogIn.arrayCodiciFornitori:=CF;
  LogInOutput:=(HTLog As farmaclick2005001).FCKLogin(LogIn); // 
HTLog=THTTPRIO
  if LogInOutput.esitoServizio=0 then
  begin
    FornitoriBean:=LogInOutput.arrayFornitori;
    for I:=0 to High(FornitoriBean) do
    begin
      SessionID:=FornitoriBean[I].IDSessione; // E' sempre lo stesso .... 
non cambia
      MM1.Lines.Add('ID Sessione: ' + FornitoriBean[I].IDSessione);
      MM1.Lines.Add('CAP: ' + FornitoriBean[I].cap);
      MM1.Lines.Add('CODICE: ' + FornitoriBean[I].codice);
      MM1.Lines.Add('CODICE INTERNO: ' + 
FornitoriBean[I].codiceInternoGrossista);
      MM1.Lines.Add('Nodo Principale: ' + 
FornitoriBean[I].indirizzoNodoPrincipale);
      MM1.Lines.Add('Servizzi');
      for B:=0 to High(FornitoriBean[I].arrayServiziAttivi) do
      begin
        MM1.Lines.Add(IntToStr(B)+' - ' + 
FornitoriBean[I].arrayServiziAttivi[B]);
      end;
      MM1.Lines.Add('');
    end;
  end;
 
  FreeAndNil(LogIn);
  MM1.Update;
 
end;
 
Questa procedura funziona benissimo !!!
 
L'ID di sessione 'e salvato in SessionID
 
Qui la procedura per richiedere il documento elettronico ....
 
procedure TFRL.RichiediDocumento;
var RInDocumento  : RichiestaDocumentoInputBean;  // nel file importato da 
wsdl importer
      ROutDocumento : RichiestaDocumentoOutputBean;
      DT : TXSDateTime;
 
begin
  MM1.Lines.Add('');
  MM1.Lines.Add('Bolla Elettronica');
  MM1.Lines.Add('');
 
  RInDocumento:=RichiestaDocumentoInputBean.Create;
  RInDocumento.dataDocumento:=TXSDateTime.Create;
//  RInDocumento.dataDocumento.AsDateTime:=StrToDate('02/05/2013/');
//  RInDocumento.numeroDocumento:=''; // credo sia il numero di bolla .... 
ma non ne sono certo !!
  RInDocumento.IDSessione:=SessionID;  // ottenuto con la procedura sopra 
indicata
  RInDocumento.codiceFornitore:='Pippo'; // In realta' e' il nome del 
fornitore del servizio
  DT:=TXSDateTime.Create;
  DT.AsDateTime :=Date;
  RInDocumento.dataDocumento:=DT;
  RInDocumento.numeroDocumento:=''; // Numero del documento, ma puo' essere 
null
 
  RInDocumento.descrizioneArticoli:=True;
  RInDocumento.dataContenitori:=True;
  RInDocumento.siglaDocumento:=''; // anche questo come il precedente
  RInDocumento.tipoDocumento:=1;
  ROutDocumento:=(HTDoc as 
farmaclick2005001).FCKRichiestaDocumento(RInDocumento);
  MM1.Lines.Add('Esito Servizio: ' + IntToStr(ROutDocumento.esitoServizio)); 
// Restituisce SEMPRE errore 10, ovvero errore interno server farmaclick
  RInDocumento.dataDocumento.Free;
  RInDocumento.dataDocumento:=nil;
  FreeAndNil(RInDocumento);
//  DT.Free // qui mi da un errore ... scusate .... non lo scritto !!!!
If Assigned(DT) then DT:=nil; // e' corretto fare cosi' ???
end;
 
In pratica non invia neanche la richiesta al server.
 
Ovviamente ho cercato lumi al servizio assistenza del "fornitore" il quale 
mi ha risposto che non conoscono i formati wsdl e non sanno come vanno 
configurati (sempre che non sia una risposta cortese per evitare di dirmi 
.... non romprere !!!!).
 
Sempre in delphi xe 2.
 
qualche suggerimento ???
 
Grazie
 
Ciao
 
Daniele
 
 
 
 

 Daniele
 
Ciao Daniele,
mi ï¿œ sembrato di vedere nella documentazione che esiste una funzione di 
test. L'hai provata?
Eventualmente hai provato a contattare Infarma?
Inoltre ti consiglio di dare un'occhiata qui (pag.10)
http://www.farmaclick.it/wsite/FARMACLICK/archive/SpecificheAPI2005/DocInterInfar.pdf
 
non so se ï¿œ un'informazione ancora valida, ma forse vale la pena 
verificare.
Un saluto
 
-- 
Emanuele Desideri
 
 

 verificare.
Tutto gia' noto !!!
Il problema e' come passare i parametri e come interpretare il codice di 
errore.
Cosa significa errore interno???
Se passava errore 11, allora sapevo che i parametri erano sbagliati!!!!!
Ma errore 10 significa tutto e niente (detto da loro).
 
Continuo a testare con altri servizi !!!
 
Grazie
 
Ciao
 
Daniele