Jak pobrać dane podmiotu gospodarczego z bazy GUS?

Odpowiedz Nowy wątek
2018-03-14 21:12
0

Próbuję pobrać dane podmiotu z bazy GUS na podstawie numeru NIP.

Przy pomocy WSDL Importer próbowałem zbudować interfejs do webserwisu i interfejs się tworzy, ale nie działa jak tego oczekuję (sypie błędami) , więc postanowiłem zejść poziom niżej i wykorzystać wprost klasę THTTPReqResp tak jak w poniższej, testowej funkcji:

function test: string;
var
  lHttpReqResp: THTTPReqResp;
  lSoapEnvelope: string;
  lMemStream: TMemoryStream;
begin
  result := 'OK';
  lHttpReqResp := THTTPReqResp.Create(nil);
  lMemStream := TMemoryStream.Create;
  try
    lSoapEnvelope := //
      ' <?xml version="1.0" encoding="UTF-8"?> ' + //
      '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:ns="http://CIS/BIR/PUBL/2014/07"> ' + //
      '  <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"> ' + //
      '    <wsa:To>https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc</wsa:To> ' + //
      '    <wsa:Action>http://CIS/BIR/PUBL/2014/07/IUslugaBIRzewnPubl/Zaloguj</wsa:Action> ' + //
      '  </soap:Header> ' + //
      '  <soap:Body> ' + //
      '    <ns:Zaloguj> ' + //
      '      <ns:pKluczUzytkownika>abcde12345abcde12345</ns:pKluczUzytkownika> ' + //
      '    </ns:Zaloguj> ' + //
      '  </soap:Body> ' + //
      '</soap:Envelope> ';
    try
      lHttpReqResp.UseUTF8InHeader := True;
      lHttpReqResp.Connect(False);
      lHttpReqResp.URL := 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc';
      lHttpReqResp.InvokeOptions := [soNoValueForEmptySOAPAction];
      lHttpReqResp.Execute(lSoapEnvelope, lMemStream);
    except
      on e: Exception do
        result := e.Message;
    end;
  finally
    lMemStream.Free;
    lHttpReqResp.Free;
  end;
end; 

Rezultatem funkcji jest string ''OK" albo string z opisem błędu (e.message).
Niestety, w rezultacie dostaję takie coś:

Cannot process the message because the content type 'text/xml; charset="utf-8"' was not the expected type 'multipart/related; type="application/xop+xml"'. (415) - 'https://wyszukiwarkaregontest.stat.gov.pl/wsBIR/UslugaBIRzewnPubl.svc'
edytowany 2x, ostatnio: furious programming, 2018-03-14 22:28

Pozostało 580 znaków

2018-03-15 14:51
0

@abrakadaber:
Jest różnica w kodzie , w moim Delphi (D2010) klasa TInvokableClassRegistry nie posiada metody RegisterMethodInfo, tym samym kod się nawet nie skompiluje

edytowany 3x, ostatnio: grzegorz_so, 2018-03-15 16:53

Pozostało 580 znaków

2018-04-04 10:49
0
abrakadaber napisał(a):

W załączniku masz gotowy wygenerowany moduł z WSDLa (generowałem w jakimś nowszym Delphi, XE7) oraz klasę do ogarnięcia tego. Używa się to tak (ten x to tylko żebyś wiedział co jest co :)):

procedure AddressFromNIP(const NIP: string);
const
  UserKey = 'klucz użytkownika';
var
  wyszukiwarka: TWyszukiwarkaRegon;
  node: IXMLNode;
begin
  try
    wyszukiwarka := TWyszukiwarkaRegon.Create;
    if wyszukiwarka.Login(UserKey) then
    begin
      if wyszukiwarka.InfoByNIP(NIP) then
      begin
        node := wyszukiwarka.SearchResult.ChildNodes.FindNode('root').ChildNodes.FindNode('dane');
        x.NIP := NIP;
        x.Name := node.ChildNodes.FindNode('Nazwa').Text;
        x.Street := node.ChildNodes.FindNode('Ulica').Text;
        x.Number := '';
        x.PostalCode := node.ChildNodes.FindNode('KodPocztowy').Text;
        x.City := node.ChildNodes.FindNode('Miejscowosc').Text;
        x.Country := '';

        node := node.ChildNodes.FindNode('Regon');
        if (node <> nil) and (node.text <> '') then
        begin
          if wyszukiwarka.FullReport(node.Text) then
          begin
            node := wyszukiwarka.SearchResult.ChildNodes.FindNode('root').ChildNodes.FindNode('dane');
            if (node <> nil) and node.HasChildNodes  then
            begin
              x.NIP := NIP;
              x.Name := node.ChildNodes.FindNode('praw_nazwa').Text;
              x.Street := node.ChildNodes.FindNode('praw_adSiedzUlica_Nazwa').Text;
              x.Number := node.ChildNodes.FindNode('praw_adSiedzNumerNieruchomosci').Text;
              x.PostalCode := node.ChildNodes.FindNode('praw_adSiedzKodPocztowy').Text;
              x.City := node.ChildNodes.FindNode('praw_adSiedzMiejscowosc_Nazwa').Text;
              x.Country := node.ChildNodes.FindNode('praw_adSiedzKraj_Nazwa').Text;
            end;
          end
          else
            x.ErrorMsg := wyszukiwarka.ErrorMessage;
        end;
      end
      else
        x.ErrorMsg := wyszukiwarka.ErrorMessage;
      wyszukiwarka.Logout;
    end;
  except
    on E: Exception do
    begin
      ShowMessage(E.Message);
    end;
  end;
end;

Witam,
Mam takie pytanie - w jaki sposób można odczytać numer budynku? W podanym kodzie jest x.Number := ''; czy numer jest w polu z ulicą?
pozdrawiam

edytowany 1x, ostatnio: bochniaczek, 2018-04-04 10:50

Pozostało 580 znaków

2018-04-04 13:23
0

numer jest w pełnym raporcie FullReport, linia x.Number := node.ChildNodes.FindNode('praw_adSiedzNumerNieruchomosci').Text; ale kto by tam gotowce do końca czytał...


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.

Pozostało 580 znaków

2019-06-03 13:35
3

Odkopię trochę stary wątek dla potomnych.
W innym temacie szukałem "najlepszego" rozwiązania na pobranie danych firmy na podstawie nip-u. Tak jak myślałem, istnieją opinie że baza GUS-u jest trochę lepsza od bazy CEIDG.

Chcąc z niej skorzystać można samemu pokombinować lub użyć kilku gotowych rozwiązań dostępnych chociażby tutaj na forum.
Najciekawsze wydaje mi się rozwiązanie kolegi @abrakadaber Jak pobrać dane podmiotu gospodarczego z bazy GUS? Niestety pisał je dość dawno temu, gdy chyba jeszcze nie było wersji BIR1.1 tylko stara wersja BIR1.
Niby nie ma dużo różnic miedzy tymi wersjami ale jednak jest coś co jest ważne.
Przechodząc do szczegółów: interesujące dane pobiera się jako raport powiedzmy: zwykły albo pełny.
Problemem wersji BIR1, jest to że w raporcie "zwykłym" brakuje numeru nieruchomości i numeru lokalu! Jest to dość irytujące.

W wersji BIR1.1 te dane zostały już dołożone.
Oczywiście, zawsze można użyć raportu pełnego, ale tam dane są rozbite na osoby fizyczne, rolnicy, spółki, jednostki administracji. Jest to dość dużo do kodowania a szczerze, szkoda na to trochę czasu oczekując prostej funkcji do pobierania danych.

Na szczęście podłączenie się pod nową wersję BIR jest dziecinnie proste (szczerze, to już jesteśmy podłączeni, tylko używamy złego wywołania), po pierwsze, klucz który otrzymujemy z gus-u (wyjątkowo łatwo go zdobyć) działa z nową wersją bez problemu, po drugie, w kodzie kolegi @abrakadaber w pliku WyszukiwarkaRegon.pas wystarczy odszukać funkcję InfoByNIP:

function TWyszukiwarkaRegon.InfoByNIP(const NIP: string): Boolean;
var
  body: string;
begin
  body := '';
  body := body + '<ns:pParametryWyszukiwania>'#13#10;
  body := body + '  <dat:Nip>' + NIP + '</dat:Nip>'#13#10;
  body := body + '</ns:pParametryWyszukiwania>'#13#10;
  FSearchResult := XMLFromResponse(GetResponse('DaneSzukaj', body));
  Result := FSearchResult <> nil;
  if not Result then
    GetErrorMessage;
end;

I zmienić linię:

FSearchResult := XMLFromResponse(GetResponse('DaneSzukaj', body));

na

FSearchResult := XMLFromResponse(GetResponse('DaneSzukajPodmioty', body));

Później już spokojnie można użyć odpowiednich nodów w kodzie który kolega podrzucił:

node := wyszukiwarka.SearchResult.ChildNodes.FindNode('root').ChildNodes.FindNode('dane');
        x.NIP := NIP;
        x.Name := node.ChildNodes.FindNode('Nazwa').Text;
        x.Street := node.ChildNodes.FindNode('Ulica').Text;
        x.Number := node.ChildNodes.FindNode('NrNieruchomosci').Text; // już działa
        x.Nrlokalu := node.ChildNodes.FindNode('NrLokalu').Text; // i to też działa
        x.PostalCode := node.ChildNodes.FindNode('KodPocztowy').Text;
        x.City := node.ChildNodes.FindNode('Miejscowosc').Text;
        x.Country := '';

I to wszystko. Dzięki @abrakadaber

o widzisz to jedno wołanie mniej będzie - abrakadaber 2019-06-03 17:42

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0