NAV Online számla API, XML, XSD, C++ Builder
2020-12-12T00:11:06+01:00
2020-12-12T23:46:27+01:00
2022-08-11T23:35:30+02:00
antusz
Sziasztok!

Olyan kérdésem lenne, valaki olyanhoz akinek sikerült megcsinálni a NAV-os online számla beküldéshez az xsd alapján a validációt és az xsd alapján használni az előállított fv-eket.

Fejlesztő környezet Rad Studio 10.2 C++ Builder

Data Bindig-el hozzáadtam már a common.xsd-t. Ez ment is rendben. Majd az invoiceApi.xsd és többi hozzáadásánál mindig hibát dobott "unknow dataType common:SimpleText50...". Ezt a hiba üzenetet miért kaphatom? Mit nem csinálok jól?

A következő kérdés, hogy hogyan tudom használni a data bindig által létrehozott eljárásokat.
Olvasnom nem sikerült egyikkel sem, mindig null érték van benne, pedig próbáltam a GetBasicResponse, LoadBasicResponse eljárásokat de nem sikerült semmi értelmeset kicsikarnom.

Remélem valaki tud segíteni, esetleg kód részletet küldeni.

Előre is köszönöm.
Mutasd a teljes hozzászólást!

  • Mutasd a teljes hozzászólást!
  • Doksit 193. oldaltól olvasd el, de a lényeg:

    <xs:import namespace="http://schemas.nav.gov.hu/NTCA/1.0/common" schemaLocation="./common.xsd"/> <xs:import namespace="http://schemas.nav.gov.hu/OSA/3.0/base" schemaLocation="./invoicebase.xsd"/>
    Mutasd a teljes hozzászólást!
  • Megpróbálhatsz egy tartalomjegyzék-XSD-t készíteni, valahogy így:

    <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://schemas.nav.gov.hu/NTCA/1.0/common" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="common.xsd"/> <xs:import schemaLocation="invoiceBase.xsd" namespace="http://schemas.nav.gov.hu/OSA/3.0/base"/> <xs:import schemaLocation="invoiceAnnulment.xsd" namespace="http://schemas.nav.gov.hu/OSA/3.0/annul"/> <xs:import schemaLocation="invoiceApi.xsd" namespace="http://schemas.nav.gov.hu/OSA/3.0/api"/> <xs:import schemaLocation="invoiceData.xsd" namespace="http://schemas.nav.gov.hu/OSA/3.0/data"/> <xs:import schemaLocation="serviceMetrics.xsd" namespace="http://schemas.nav.gov.hu/OSA/3.0/metrics"/> </xs:schema>
    Azonkívül az egyes xsd-kben az import-ot ki lehetne egészíteni schemaLocation-nal, és a catalog-on is finomítanék. Csatolom a módosított változatot.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Köszönöm a segítséget, ez részben megoldotta a problémát, mert így már tudom importálni az xsd-ket.

    De a következő probléma amibe belefutottam és nem találtam rá megoldást, az az hogy importálom a common-t, invoiceBase-t eddig semmi probléma, majd a invoiceData import után a builder a következő hibaüzenetet dobja fordításkor

    [bcc32 Error] invoiceData.cpp(618): E2014 Member is ambiguous: 'TXMLTaxNumberType_base::GetChildNodes' and 'IXMLNode::GetChildNodes'
      Full parser context
        invoiceData.cpp(617): parsing: _di_IXMLTaxNumberType_base _fastcall TXMLCustomerTaxNumberType::Get_groupMemberTaxNumber()

    A kódban lévő rész pedig ez ahol a hibát dobja
    _di_IXMLTaxNumberType_base __fastcall TXMLCustomerTaxNumberType::Get_groupMemberTaxNumber()
    {
      return (_di_IXMLTaxNumberType_base) GetChildNodes()->Nodes[System::UnicodeString("groupMemberTaxNumber")];
    };

    Az invoiceApi-nál ugyanilyen hibákat kapok.

    az xsd importnál próbálkoztam több mindennel.
    A Generate binding mindig be van pipálva. 
    A Document Element Type ha aktív akkor kipipálom és van hogy felismeri az Element Name értéket (pl: InvoiceData), de van hogy nem (pl: InvoiceDataType).
    Kell egyáltalán minden elemhez generáltatnom Document Element Type-ot már ahol lehet egyáltalán? (bár ez gondolom csak annak mond valamit aki ismeri a builder xml data binding wizard-ot).
    Mutasd a teljes hozzászólást!
  • Szerintem csak a tartalomjegyzéket (NAV_OSAv3.xsd) kellene importálni, az behúzza magával a többit.
    Mutasd a teljes hozzászólást!
  • Sajnos az nem elég
    Mutasd a teljes hozzászólást!
  • Ezt milyen mérésekkel állapítottad meg?
    Mutasd a teljes hozzászólást!
  • Ezt próbáltam

    _di_IXMLBasicResponseType f = GetBasicResponseType(XMLDocument1);
     AnsiString s = f->Get_header()->Get_requestId();

    és itt már a f értéke null és a Get_requestId()-ra is kiakad.

    Az XMLDocument1-ben egy NAV-tól érkező QueryTransactionStatusResponse eredmény xml van.

    Mit rontottam el?
    Mutasd a teljes hozzászólást!
  • > Mit rontottam el?

    Mondjuk elfelejtetted elmondani, hogy ez GetBasicResponseType pontosan micsoda, honnan jön, hol a leírása.

    Akár fájlként is csatolhatod a kérdéses XML-t, hogy kipróbálhassam a validációt az xmllint nevű programmal,
    Mutasd a teljes hozzászólást!
  • A GetBasicResponseType egy az xsd importálásakor generálódott osztály a builderben.

    Csatolom az xml-t is.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Pedig ez a fájl valid a sémához; érdekessége, hogy a tartalma az, hogy a te inputod nem valid. Csatolom formázva, a 27. sort nézd meg.

    $ xmllint -debugent -noout -schema NAV_OSAv3.xsd QueryTransactionStatusRes ponse.xml new input from file: NAV_OSAv3.xsd new input from file: common.xsd new input from file: invoiceBase.xsd new input from file: invoiceAnnulment.xsd new input from file: invoiceApi.xsd new input from file: invoiceData.xsd new input from file: serviceMetrics.xsd new input from file: QueryTransactionStatusResponse.xml QueryTransactionStatusResponse.xml validates
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Igen, ezt tudom hogy valid. A hiba azért van benne, mert ez még egy csütörtöki beküldés eredménye v3-al és akkor még nem volt cserélve a teszt rendszer a navnál.

    Sima xml-elekkel megyen a beküldés, lekérdezés minden kommunikáció és funkció, ezzel nincs probléma, csak most akartam megcsinálni ezt az xsd-s data bindinges c++ builderes cuccot, gondoltam kipróbálom ezzel mi lenne más, de sehogy nem akar működni.
    Mutasd a teljes hozzászólást!
  • Szerintem "Member is ambiguous" - több azonos nevű metódusod van implementálva és nem tudja melyiket hívd meg. Ha kölök - szülő osztályokon van, akkor kell egy virtual - override, amúgy meg attól a kódtól függ, amit a toolod létrehozott.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd