Autor Téma: CUZK - webové služby dálkového přístupu přes SOAP  (Přečteno 380 krát)

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 2
    • Verze Delphi: D7
Zdravím, prosím o radu. Pokouším se z DXE3 přistupovat k datům CUZK přes WSDP. Podařilo se mi naimportovat jejich webové služby ciselnik_v29.wsdl, informace_v29.wsdl, sestavy_v29.wsdl, ucet_v29.wsdl, vyhledat_v29.wsdl.
Funguje mi získání dat z webové služby ciselnik_v29.wsdl (seznam katastrů, okresů apod).
Aktuálně jsem se vrhnul na vyhledat_v29.wsdl a hned u první funkce "NajdiParcelu" jsem skončil .... Podle jejich manuálu je nutné zadat buď parametry Katastr a číslo parcely, nebo parcelaID. Zadávám číslo katastru a parcely, ale vyhazuje mi to chybové hlášení "... XMLSchema-instance 'nil' se nesmí objevit v prvku 'parcelaID', protože vlastnost (nillable) prvku 'parcelaid' má hodnotu false" (celé chybové hlášení v příloze).
Myslel jsem, že pomůže objekt parcelaID jen vytvořit (i.parcelaId := IdType.Create;), ale to už je služba vyhodnotí jako hledání pomocí ID a chce hodnotu.

přikládám volání služby funkci "hledej parcelu". Procedura "Registrace" dělá přihlášení uživatelským jménem a heslem ke službě - určitě funguje, viz úspěšný provoz na ciselnik_v29.wsdl.
Kód: Delphi [Vybrat]
  1. function TCUZK_WSDP_Vyhledat.HledejParcelu(var Vysl : ResponseInfoType): ParcelaListType;
  2. var
  3.   I: NajdiParceluRequest;
  4.   O: NajdiParceluResponse;
  5. begin
  6.    I := nil; O := nil;
  7.    try
  8.       (*  *)
  9.       Registrace;
  10.       (*  *)
  11.       I := NajdiParceluRequest.Create;
  12.  
  13.       i.katastrUzemiKod := KatastrUzemiKodType.Create;
  14.       i.katastrUzemiKod.DecimalString := '635171';
  15.       i.kmenoveCislo := ParcelaKmenoveCisloType.Create;
  16.       i.kmenoveCislo.DecimalString := '47';
  17.       //i.parcelaId := IdType.Create;
  18.       O := WS.najdiParcelu(I);
  19.       Vysl := o.vysledek;
  20.  
  21.       Result := O.ParcelaList;
  22.    finally
  23.  
  24.    end;
  25. end;
  26.  

unit s vygenerovanou službou "vyhledat_v29.wsdl" se bohužel nevejde, přikládám  příloze včetně chybového hlášení.

tady je popis funkce z manuálu:
*************************
Název funkce: najdiParcelu
parcelaId (ID parcely) - musí být zadán
  nebo
katastrUzemiKod (Kód katastrálního území, ve kterém se bude vyhledávat) - musí být zadán
kmenoveCislo (Číslo parcely) - musí být zadán
poddeleni

Výstupní formát: XML dokument typu NajdiParceluResponse.
Funkce: Umožní vyhledat parcelu na základě k.ú. a jejího čísla, nebo vyhledat pomocí interního identifikátoru parcelaID.
Způsob hledání A (pomocí parametrů „katastrUzemiKod“, „kmenoveCislo“ a „poddeleni“):
Vrátí seznam všech parcel, které odpovídají zadání. V případě nevyplnění podlomení se vyhledává pouze parcela bez podlomení.
Způsob hledání B (pomocí parametru „parcelaID“):
Prvek (parcela) je vyhledán s úplnou shodou interního identifikátoru (ID). Výsledkem vyhledání je nejvýše jeden prvek (parcela) – jedna jeho verze. Funkce vrátí právě tu verzi prvku (parcely), která je platná k parametru "datumK". Při nezadaném parametru "datumK" funkce vrátí verzi prvku (parcely) platnou k aktuálnímu datu.

Díky moc předem za jakýkoliv nápad.

Offline Palino

  • Nováček
  • *
  • Příspěvků: 11
  • Karma: 0
    • Verze Delphi: 7, XE, Seattle
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #1 kdy: 19-05-2021, 15:03:03 »
Neviem ci to pomoze (nepozeral som schemu) ale niekedy staci aby vznikol xml tag bez údajov. Napis len:  i.parcelaId;  To donuti tento TAG vytvorit.

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 2
    • Verze Delphi: D7
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #2 kdy: 19-05-2021, 15:26:52 »
Dík za odpověď, ale to nepomůže.
i.parcelaId je objekt, ten je buď nil, nebo jej vytvořím i.parcelaId.Create.
Když je nil hlásí to chybu, když jej vytvořím, CUZK si myslí že chci zadávat podle ParcelaID a chce údaj (pokud zadám jen
Kód: Delphi [Vybrat]
  1. i.parcelaId.create
tak zas hlásí chybu prázdné ID ...
Ale já jej podle jejich manuálu nechci vůbec zadávat.

Offline Palino

  • Nováček
  • *
  • Příspěvků: 11
  • Karma: 0
    • Verze Delphi: 7, XE, Seattle
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #3 kdy: 20-05-2021, 09:41:52 »
Excellent
Rated 1 time
Ruzumiem, skus teda rychly test. Opoznamkuj:

NajdiParceluRequestType = class(TRemotable)
..
  // FparcelaId: IdType;
..
  //  property parcelaId:       IdType                   read FparcelaId write FparcelaId;


Offline Palino

  • Nováček
  • *
  • Příspěvků: 11
  • Karma: 0
    • Verze Delphi: 7, XE, Seattle
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #4 kdy: 20-05-2021, 10:20:50 »
Excellent
Rated 1 time
Este pozri nasledujuci odkaz, mozno pomoze:

https://codeverge.com/embarcadero.delphi.webservices/where-can-i-find-tremotable-pr/1080924

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 2
    • Verze Delphi: D7
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #5 kdy: 20-05-2021, 14:21:43 »
Ruzumiem, skus teda rychly test. Opoznamkuj:

NajdiParceluRequestType = class(TRemotable)
..
  // FparcelaId: IdType;
..
  //  property parcelaId:       IdType                   read FparcelaId write FparcelaId;

Ale no tak to je geniální, funguje to  ;) Ještě jsem musel odremovat Destroy
Kód: Delphi [Vybrat]
  1. destructor NajdiParceluRequestType.Destroy;
  2. begin
  3.   //SysUtils.FreeAndNil(FparcelaId);
  4.   SysUtils.FreeAndNil(FkatastrUzemiKod);
  5.   SysUtils.FreeAndNil(FkmenoveCislo);
  6.   SysUtils.FreeAndNil(Fpoddeleni);
  7.   SysUtils.FreeAndNil(FdatumK);
  8.   inherited Destroy;
  9. end;

fakt díky! Takže to bych měl, jen se obávám, že u jiné funkce ve vyhledání se dostanu k tomu, že se budu muset odkazovat na NajdiParcelu podle ID....
Nejde
Kód: Delphi [Vybrat]
  1. NajdiParceluRequestType = class(TRemotable)
vytvořit "overload" ?
myslím pokud budu chtít zadat podle ID bude funkce jen s IDType, nebo druhá jen tahle bez IdType?

Offline Palino

  • Nováček
  • *
  • Příspěvků: 11
  • Karma: 0
    • Verze Delphi: 7, XE, Seattle
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #6 kdy: 20-05-2021, 14:33:06 »
Excellent
Rated 1 time
Skus pozriet ten link co som dal vyssie. Pravdepodobne asi pouzit IS_OPTN.

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 2
    • Verze Delphi: D7
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #7 kdy: 20-05-2021, 14:59:58 »
Este pozri nasledujuci odkaz, mozno pomoze:

https://codeverge.com/embarcadero.delphi.webservices/where-can-i-find-tremotable-pr/1080924

Palino, tady bude ta odpověď, ale to nedám, to je na mne vyšší dívčí .... Nerozumím tomu, ale pocitem si myslím, že ParcelID nemůže být "napevno" jako konkrétní typ, ale obdobně jako "poddeleni" a "datumk" (nepovinné parametry)...

Kód: Delphi [Vybrat]
  1.   NajdiParceluRequestType = class(TRemotable)
  2.   private
  3.     //FparcelaId: IdType;
  4.     FkatastrUzemiKod: KatastrUzemiKodType;
  5.     FkmenoveCislo: ParcelaKmenoveCisloType;
  6.     Fpoddeleni: ParcelaPoddeleniType;
  7.     Fpoddeleni_Specified: boolean;
  8.     FdatumK: TXSDateTime;
  9.     FdatumK_Specified: boolean;
  10.     procedure Setpoddeleni(Index: Integer; const AParcelaPoddeleniType: ParcelaPoddeleniType);
  11.     function  poddeleni_Specified(Index: Integer): boolean;
  12.     procedure SetdatumK(Index: Integer; const ATXSDateTime: TXSDateTime);
  13.     function  datumK_Specified(Index: Integer): boolean;
  14.   public
  15.     constructor Create; override;
  16.     destructor Destroy; override;
  17.   published
  18.     //property parcelaId:       IdType                   read FparcelaId write FparcelaId;
  19.     property katastrUzemiKod: KatastrUzemiKodType      read FkatastrUzemiKod write FkatastrUzemiKod;
  20.     property kmenoveCislo:    ParcelaKmenoveCisloType  read FkmenoveCislo write FkmenoveCislo;
  21.     property poddeleni:       ParcelaPoddeleniType     Index (IS_OPTN) read Fpoddeleni write Setpoddeleni stored poddeleni_Specified;
  22.     property datumK:          TXSDateTime              Index (IS_OPTN) read FdatumK write SetdatumK stored datumK_Specified;
  23.   end;

a pod tím tvým odkazem https://codeverge.com/embarcadero.delphi.webservices/where-can-i-find-tremotable-pr/1080924je popis konstant, kde to určitě bude...
Citace
IS_OPTN = $0001;
 This element is optional (minOccurs=0); Don't serialize it
 if its value was not explicitly set

IS_UNBD = $0002;
 This array element is unbounded (The runtime serializes
 dyn arrays as either collection or unbounded elements)

IS_NLBL = $0004;
 This element is nillable (xsi:nillable=true)

IS_UNQL = $0008;
 This element is unqualified
 (see http://www.w3schools.com/schema/el_schema.asp)
 Runtime defaults to qualified otherwise

IS_ATTR = $0010;
 This property is an attribute (otherwise the runtime
 serializes it as an element)

IS_TEXT = $0020;
 This property is text (typically of the parent element)
 (see http://www.w3schools.com/schema/schema_complex_text.asp)

IS_ANY  = $0040;
 This property represents an xsd:any element (not
 really used by runtime)

IS_REF  = $0080;
 This property is a ref (i.e. ref=QName) element
 (see http://www.w3schools.com/schema/el_element.asp)

IS_QUAL = $0100;
 This attribute is qualified (the runtime defaults
 to unqualified otherwise)
{code}

Nenapadá vás někoho, jak
Kód: Delphi [Vybrat]
  1. //property parcelaId:       IdType                   read FparcelaId write FparcelaId;
změnit aby se nevynucovalo?

Offline Palino

  • Nováček
  • *
  • Příspěvků: 11
  • Karma: 0
    • Verze Delphi: 7, XE, Seattle
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #8 kdy: 20-05-2021, 15:33:45 »
Skusal si:

property parcelaId:       IdType         Index (IS_OPTN)           read FparcelaId write FparcelaId;

Offline pospisil.lada

  • Plnoletý
  • ***
  • Příspěvků: 160
  • Karma: 2
    • Verze Delphi: D7
Re:CUZK - webové služby dálkového přístupu přes SOAP
« Odpověď #9 kdy: 20-05-2021, 15:39:36 »
ty bláho, já to dokázal !!  :o
Kód: Delphi [Vybrat]
  1.   NajdiParceluRequestType = class(TRemotable)
  2.   private
  3.     FparcelaId: IdType;
  4.     FparcelaId_Specified: boolean;
  5.     FkatastrUzemiKod: KatastrUzemiKodType;
  6.     FkmenoveCislo: ParcelaKmenoveCisloType;
  7.     Fpoddeleni: ParcelaPoddeleniType;
  8.     Fpoddeleni_Specified: boolean;
  9.     FdatumK: TXSDateTime;
  10.     FdatumK_Specified: boolean;
  11.     procedure Setpoddeleni(Index: Integer; const AParcelaPoddeleniType: ParcelaPoddeleniType);
  12.     function  poddeleni_Specified(Index: Integer): boolean;
  13.     procedure SetdatumK(Index: Integer; const ATXSDateTime: TXSDateTime);
  14.     function  datumK_Specified(Index: Integer): boolean;
  15.     function ParcelaID_Specified(const Index: Integer): Boolean;
  16.     procedure SetParcelaID(const Index: Integer; const AParcelaID: IdType);
  17.   public
  18.     constructor Create; override;    (* * *)
  19.     destructor Destroy; override;
  20.   published
  21.     //property parcelaId:       IdType                   read FparcelaId write FparcelaId;
  22.     property parcelaId:       IdType                   Index (IS_OPTN) read FparcelaID write SetParcelaID stored ParcelaID_Specified;
  23.     property katastrUzemiKod: KatastrUzemiKodType      read FkatastrUzemiKod write FkatastrUzemiKod;
  24.     property kmenoveCislo:    ParcelaKmenoveCisloType  read FkmenoveCislo write FkmenoveCislo;
  25.     property poddeleni:       ParcelaPoddeleniType     Index (IS_OPTN) read Fpoddeleni write Setpoddeleni stored poddeleni_Specified;
  26.     property datumK:          TXSDateTime              Index (IS_OPTN) read FdatumK write SetdatumK stored datumK_Specified;
  27.   end;

ne
Kód: Delphi [Vybrat]
  1. property parcelaId:       IdType                   Index (IS_OPTN) read FparcelaId write FparcelaId;
ale
Kód: Delphi [Vybrat]
  1. property parcelaId:       IdType                   Index (IS_OPTN) read FparcelaID write SetParcelaID stored ParcelaID_Specified;

Fakt díky moc! To jsou věci ....
A taky díky "Jan Fiala", s kterým jsem to řešil soukromě.
Jen faktická poznámka: vůbec netuším jak to funguje, vzal jsem to jenom citem podle šablony "ParcelaPoddeleniType". Musím to nastudovat co to vlastně dělá. Ale vrací to výsledek jak má. Ještě jednou všem dík!
« Poslední změna: 20-05-2021, 15:44:30 od pospisil.lada »