DDV Inetis wsdl struktura

Vse drugo, kar ne spada v nobeno zgornjo kategorijo.
flyingv
Prispevkov: 567
Pridružen: 29.11.2001 17:06:20

DDV Inetis wsdl struktura

Odgovor Napisal/-a flyingv » 13.02.2009 13:04:14

Živjo,

Imam vprašanje o uvažanju wsdl datoteke (http://ddv.inetis.com/Iskalnik.asmx?wsdl) za uporabo
spletne storitve iskanja oseb. Je možno da je wsdl datoteka malo čudno strukturirana glede na to
da vrača podatek tipa ArrayOfAnyType, namesto da bi vrnil polje najdenih zavezancev oz. ArrayOfXmlZavezanec...
Po uvozu wsdl datoteke z delphijevim importerjem mi razredov za tipa xmlZavezanec in xmlTransakcijskiRacun
ploh ne kreira... Pri uvozu z gSoap importerjem mi sicer razreda za zavazanca in davčno številko kreira, vendar
pa mi spletna storitev vrne polje nizov (char*), ki vsebuje najdene osebe in njihove podatke vendar v xml obliki...
Če bi jih hotel prirediti objektu zavezanca bi moral ta rezultat spet preparsati... Ko uvozim wsdl datoteko v .Net okolju
pa mi spletna storitev vrača polje objektov (object[]), in spet ne vem kako bi ta rezultat enostavno shranil v objekt zavezanca.

Ali kdo uporablja to storitev in kako imate vi to rešeno...

Hvala za odgovore

zippo
Prispevkov: 264
Pridružen: 14.07.2002 12:11:29

DDV Inetis wsdl struktura

Odgovor Napisal/-a zippo » 10.09.2009 13:50:51

Zdaj sem pa še jaz naletzel na enako mino.. :(

Ima kdo primer kode? Meni vrne metoda:

Koda: Izberi vse

  
  Iskalnik := GetIskalnikSoap(false, 'http:/ /ddv.inetis.com/Iskalnik.asmx');
  Result := Iskalnik.Isci(WideString(edtFind.Text));
Result = nil, neglede na vnos (vpisal sem npr. 'mercator').. Kaj delam narobe?
Zadnjič spremenil zippo, dne 10.09.2009 13:51:11, skupaj popravljeno 1 krat.

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

DDV Inetis wsdl struktura

Odgovor Napisal/-a odisej » 10.09.2009 14:37:34

Ne vem, če obstaja enostavna rešitev. Imam pa jaz kodo, ki parsa wsdl in potem na osnovi tega lahko pokličeš funkcijo, podaš parametre in potem se parsa rezultat.
Ko sem probal vpisati mercator sem kar nekajkrat dobil kot rezultat xmlZavezanec. To je tisti tip, record. Do tu imam narejeno, naprej žal ne. Če ne najdeš bolj enostavne rešitve, ti lahko posodim kodo in če mi narediš še naprej, lahko potem uporabljaš. Treba bi blo parsat še kakšen record je xmlZavezanec, pa pol glede na tipe naprej. In glede na to, da je naprej spet array, bi mogl tole bit rekurzivno nekako.

zippo
Prispevkov: 264
Pridružen: 14.07.2002 12:11:29

DDV Inetis wsdl struktura

Odgovor Napisal/-a zippo » 10.09.2009 14:48:31

Najprej hvala za hiter odgovor. Parsanje? Ja, lahko, ampak potem ne vem, čemu sploh služi WSDL import in vsa ta štala, ki jo reklamirajo kot feature v Delphiju. V bistvu sem mislil, da je enostavno, pa ni. Kje pa je sploh problem, glede na to, da enostavno ne vrne nič?
Zadnjič spremenil zippo, dne 10.09.2009 14:49:58, skupaj popravljeno 1 krat.

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

DDV Inetis wsdl struktura

Odgovor Napisal/-a odisej » 10.09.2009 15:21:38

Sej vrne. Samo Delphi ne zna to sparsat. Verjetno ima že probleme, kako bi nastavil recorde, ko prebere wsdl. Pol je pa glede na to treba še sparsat response.

ervins
Prispevkov: 86
Pridružen: 03.12.2004 15:49:24

DDV Inetis wsdl struktura

Odgovor Napisal/-a ervins » 11.09.2009 10:29:45

Nič ni potrebno na roke parsat, samo pravilno je potrebno definirat, ker Delphijev WSDL importer ( v tolažbo tudi VS je ne) ne obvlada dobro te WSDL datoteke.

Ker sem danes dobre volje sem naredil v D2009 import WSDL-ja in prilagam popravljeno kodo.

xmlStatus in xmlVrstaRacuna sem pustil kar string, če pa kdo ve lahko zamenja z ustreznim tipom.

Koda: Izberi vse

  
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL     : http://ddv.inetis.com/Iskalnik.asmx?wsdl
//  >Import : http://ddv.inetis.com/Iskalnik.asmx?wsdl>0
//  >Import : http://ddv.inetis.com/Iskalnik.asmx?wsdl>1
// Encoding : utf-8
// Version  : 1.0
// (11.9.2009 8:45:59 - - $Rev: 16699 $)
// ************************************************************************ //

unit Iskalnik;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_UNBD = $0002;
  IS_NLBL = $0004;
  IS_REF  = $0080;


type

  // ************************************************************************ //
  // The following types, referred to in the WSDL document are not being represented
  // in this file. They are either aliases[@] of other types represented or were referred
  // to but never[!] declared in the document. The types from the latter category
  // typically map to predefined/known XML or Borland types; however, they could also 
  // indicate incorrect WSDL documents that failed to declare or import a schema type.
  // ************************************************************************ //
  // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]



  TxmlTransakcijskiRacun = class(TRemotable)
  private
    FxmlTRR: String;
    FxmlVrstaRacuna: TXSString;
    FxmlZaprt: Boolean;
    FxmlDatumZaprtja: TXSDateTime;
    FxmlDatumZadnjeSpremembe: TXSDateTime;
    FxmlImeBanke: String;
    FxmlDatumOdprtja: TXSDateTime;
  published
    property xmlTRR: String  read FxmlTRR write FxmlTRR;

    property xmlVrstaRacuna: TXSString read FxmlVrstaRacuna write FxmlVrstaRacuna;
    property xmlImeBanke: String  read FxmlImeBanke write FxmlImeBanke;
    property xmlDatumOdprtja: TXSDateTime  read FxmlDatumOdprtja write FxmlDatumOdprtja;
    property xmlDatumZadnjeSpremembe: TXSDateTime  read FxmlDatumZadnjeSpremembe write FxmlDatumZadnjeSpremembe;
    property xmlZaprt: Boolean  read FxmlZaprt write FxmlZaprt;
    property xmlDatumZaprtja: TXSDateTime  read FxmlDatumZaprtja write FxmlDatumZaprtja;
  end;

  TArrayOfTxmlTransakcijskiRacun = array of TxmlTransakcijskiRacun;

  TXmlZavezanec = class(TRemotable)
  private
    FxmlDavcnaStevilka: String;
    FxmlMaticnaStevilka: String;
    FxmlNaslov: String;
    FxmlStatus: String;
    FxmlNaziv: String;
    FxmlZavezanecZaDDV: Boolean;
    FTxmlTransakcijskiRacun: TArrayOfTxmlTransakcijskiRacun;
  published
    property xmlDavcnaStevilka: String  read FxmlDavcnaStevilka write FxmlDavcnaStevilka;
    property xmlMaticnaStevilka: String read FxmlMaticnaStevilka write FxmlMaticnaStevilka;
    property xmlStatus: String read FxmlStatus write FxmlStatus;
    property xmlNaziv: String read FxmlNaziv write FxmlNaziv;
    property xmlNaslov: String read FxmlNaslov write FxmlNaslov;
    property xmlZavezanecZaDDV: Boolean read FxmlZavezanecZaDDV write FxmlZavezanecZaDDV;
    property xmlTransakcijskiRacuni: TArrayOfTxmlTransakcijskiRacun read FTxmlTransakcijskiRacun write FTxmlTransakcijskiRacun;
  end;

  anyType        =  type TXmlZavezanec;    
  ArrayOfAnyType = array of anyType;           

  // ************************************************************************ //
  // Namespace : http://ddv.inetis.com/
  // soapAction: http://ddv.inetis.com/Isci
  // transport : http://schemas.xmlsoap.org/soap/http
  // style     : document
  // binding   : IskalnikSoap
  // service   : Iskalnik
  // port      : IskalnikSoap
  // URL       : http://ddv.inetis.com/Iskalnik.asmx
  // ************************************************************************ //

  IskalnikSoap = interface(IInvokable)
  ['{F1C4A65E-6E4B-E029-0CE4-7BF71E71C4FF}']
    function  Isci(const iskalni_niz: string): ArrayOfAnyType; stdcall;
  end;

function GetIskalnikSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IskalnikSoap;


implementation
  uses SysUtils;

function GetIskalnikSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IskalnikSoap;
const
  defWSDL = 'http://ddv.inetis.com/Iskalnik.asmx?wsdl';
  defURL  = 'http://ddv.inetis.com/Iskalnik.asmx';
  defSvc  = 'Iskalnik';
  defPrt  = 'IskalnikSoap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IskalnikSoap);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(IskalnikSoap), 'http://ddv.inetis.com/', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IskalnikSoap), 'http://ddv.inetis.com/Isci');
  InvRegistry.RegisterInvokeOptions(TypeInfo(IskalnikSoap), ioDocument);
  RemClassRegistry.RegisterXSInfo(TypeInfo(anyType), 'http://ddv.inetis.com/', 'anyType');
  RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfAnyType), 'http://ddv.inetis.com/', 'ArrayOfAnyType');

end.
Branje pa zgleda takole.

Koda: Izberi vse

procedure TForm1.Button1Click(Sender: TObject);
var
  res: ArrayOfAnyType;
  zavezanec: anyType;
  racun: TxmlTransakcijskiRacun;

begin
  Memo1.Clear;
  res := GetIskalnikSoap().Isci('Mercator');

  for zavezanec in res do
  begin
    Memo1.Lines.Add(Format('Status: %s Davcna: %s, Naziv: %s', [Chr(StrToInt(zavezanec.xmlStatus)), zavezanec.xmlDavcnaStevilka, zavezanec.xmlNaziv]));
    for racun in zavezanec.xmlTransakcijskiRacuni do
    begin
      Memo1.Lines.Add(Format('    TRR: %s Banka: %s Zaprt %s', [racun.xmlTRR, racun.xmlImeBanke, FormatDateTime('dd.mm.yyyy hh:mm:ss.zzz', racun.xmlDatumZaprtja.AsDateTime)]));
    end;
  end;

end;  

LP, ervins

zippo
Prispevkov: 264
Pridružen: 14.07.2002 12:11:29

DDV Inetis wsdl struktura

Odgovor Napisal/-a zippo » 11.09.2009 10:39:08

Najlepša hvala - točno tako rešitev sem iskal. Pa še naučil sem se nekaj novega :)

odisej
Prispevkov: 1363
Pridružen: 09.05.2003 12:58:10

DDV Inetis wsdl struktura

Odgovor Napisal/-a odisej » 11.09.2009 12:35:51

Super si. Sem pa tudi jaz btw dopolnil mojo kodo. Drži, da če nekaj v naprej sprogramiraš, je tale pristop pravi. Z mojo kodo pa lahko seveda poganjaš poljuben (recimo no) web service s tem, da ni potrebno že ob compile vedeti kako bodo stvari tekle. Če je kdo karkoli pripravljen v prihodnosti prispevati, rade volje delim.


TonyCaker
Prispevkov: 312
Pridružen: 27.09.2003 18:33:35

DDV Inetis wsdl struktura

Odgovor Napisal/-a TonyCaker » 15.09.2009 10:18:13

@ervins: vse pohvale ! Tudi jaz se bom prej ali slej omastil s tvojo kodo. Ko se naslednjič pojaviš na Delphi-si pijači, piješ in ješ (lahko tudi žreš) na moj račun.

LP
A s ti tut not padu ?

Odgovori