Jump to content

Horizon REST interfeiss


Livingston
 Share

Recommended Posts

Sveiki,

 

Vai kādam ir pieredze ar Horizon (FMS resursu un grāmatvedības programma) REST interfeisu?

 

Galvenā problēma ir ar jaunu ierakstu pievienošanu. Cik sapratu no paskopā dokumenta  ( http://www.fmssoftware.lv/tools/download.php?file=files/doclist/REST_interfeiss_20140818.pdf  ), ar GET metodi jāpaņem pareizā sagatave, jāizmaina vajadzīgie dati un ar POST jāsūta atpakaļ. Tālāk gan apraksts nesniedzas un pieredze ar REST arī nav pietiekama ...

 

Ja kādam ir pieredze un var padalīties ar praktiskiem piemēriem, novērtēšu!

Link to comment
Share on other sites

Reiz ar šo saskāros.

 

Labākais padoms, ko saņēmu no supporta bija sazināties ar sistēmas uzturētāju/ieviesēju un noskaidrot kādi lauki ko nozīmē, jo konfigurācijas esot ļoti atšķirīgas.

 

Ja Tavs jautājums bija par to kā nosūtīt GET un POST, tad precizē ko un kā tu tur mēģini darīt.

Link to comment
Share on other sites

Horizons strādā ar MSSQL datu bāzi. Tur tabulu struktūra salīdzinoši vienkārša ;)

 

Es vismaz rakstu/lasu pa tiešo no mssql bāzes un nekādu problēmu! 

Link to comment
Share on other sites

Livingston

Datu bāzes es pārzinu perfekti, bet pagaidām vēl mēģinu izmantot REST.

 

Ja godīgi, tad pat normāla informācijas izgūšana pagaidām sagaidām grūtības. Piemēram, ja skatās klientus:

 

http://hostname/rest/TDdmKlSar/default

 

atgrieztais XML ir (saīsināta versija):

<resource>
  <collection  xmlns="TDdmKlSar.xsd">
    <metadata> -- kolonu apraksti
    ..
    </metadata>
    <row>
      <K>
        <KODS>
        <NOSAUK>
        <PK_KLIENTS>
          <href>
        <REG_NR>
        ..
      </K>
    </row>
  </collection>
</resource>

Parsējot esmu izmēģinājis dažādus XPATH (/resource/collection/row/K/KODS )  u.c., bet klienta kodu atlasīt nevaru.  Ja ar regexp nedaudz piemodificēju rezultāta XML, tad varu atlasīt man vajadzīgos datus bez problēmām, BET tāda metode nestrādās veidojot jaunu ierakstu.

 

Šo iemeslu dēļ interesē, vai kādam ir kāds piemērs, ko paskatīties - kā ierakstu pievienošana un atlase jātaisa pareizi, pēc tam jau varu strādāt ar konkrētiem parametriem.

Link to comment
Share on other sites

XPath vienmēr nepieciešams apstrādāt "xmlns" atribūtu. Tur nav elements "<row>", tas īstenībā ir "<TDdmKlSar.xsd:row>" (atkarīgs no konkrētā framework realizācijas, bet kaut kādā formā namespace tur figurē).

 

Piemērs PHP: http://stackoverflow.com/questions/5285570/xpath-fails-if-an-element-has-a-a-xmlns-attribute 

Piemērs C#: http://stackoverflow.com/questions/585812/using-xpath-with-default-namespace-in-c-sharp

Link to comment
Share on other sites

Mezavecis

Attiecībā uz lielām grāmatvedības sistēmām, tajā skaitā Horizon, es šo ieteikumu uzskatītu par kaitīgu un kuru kā pašu pēdējo var izmantot datu rakstīšanai.  Ja reiz izstrādātājs paredzējis datu apmaiņas interfeisu, tad tāds ir jāizmanto, pretējā gadījumā jebkuru problēmu gadījumu integrators atbild par sekām ar savu galvu, bet uzņēmums nesaņem bezmaksas problēmu novēršanu uzturēšanas vai garantijas ietvaros. 

 

Horizons strādā ar MSSQL datu bāzi. Tur tabulu struktūra salīdzinoši vienkārša   Es vismaz rakstu/lasu pa tiešo no mssql bāzes un nekādu problēmu! 

 

 

P.S. Es esmu taisījis datu importu/eksportu ar IFTG OLE.

  • Patīk 2
Link to comment
Share on other sites

Mežaveci, nepiekritīšu!

Ftg par saviem datu apmaiņas interfeisiem prasa diezgan kosmiskus, pa manam neadekvātus ciparus!

Bez tam vismaz ole interfeiss ir lēns un ar diezgan ierobežotām iespējām, un apmēram 5 gadi atpakaļ dokumentācija tam bija švaka....

 

Vienīgā neērtība - updeiti jāliek uz testa vides sākumā - šad tad ftg maina db struktūru.

Link to comment
Share on other sites

Mezavecis

Lēnums neattaisno šādu rīcību kāpt iekšā pa logu, jo atslēga par smagu un durvis par lēnu veras vaļā.  Acīmredzot neviens no taviem apkalpotiem kantoriem nav lasījis līgumus ar FMS un/vai saskāries ar reālām problēmām, kas skar pamatīgas finanses. 

Link to comment
Share on other sites

 

 

saskāries ar reālām problēmām

 

Ar horizon problēmām esam saskārušies ne reizi vien. Un visas reizes fms konsultanti ir mācējuši tikai pamatīgus rēķinus piestādīt, ne ko atrisināt! Nu vismaz tāda ir mana pieredze.....

Link to comment
Share on other sites

Žetons par REST izmantošanu. MSSQL pa tiešo līst iekšā nav labi, tā toč var kādas ziepes savārīt. Ja vēl tikai datu izgūšana, tad vēl tā (ļaunākajā gadījumā process vairs nestrādās), taču rakstīt toč nevajag. Tur ir kolonnas un tabulas, kurās dati ir saistīti savā starpā; kaut ko nomudīsi, un pēc tam sūdi būs pēc pilnas programmas.

 

Par datu izgūšanu - Tu jau esi uz pareizās takas. Ja ar XML grūti, vēl vari pamēģināt ar JSON, padodot HTTP headeri "Accept-Type: application/json". Tikai tas nav tik daudz testēts, tāpēc tur var būt vairāk bugu. Tāpat arī metadati tur nav tik daudz kā XML.

 

Runājot par metadatiem, noteikti apskaties XSD shēmas arī. Tur ir daudz vērtīgas informācijas par pieejamajām kolonnām un to datu tipiem.

 

OLE interfeiss skaitās novecojis un to neiesaka izmantot, taču compatibility nolūkā tas vēl eksistē.

 

Par XPATH taisnība būs Knagim - ja ar to nevari izvilkt, tad līkas rokas pašam strādājot ar XML.

 

Tajā dokumentā (links nestrādā, btw) nav piemēri?

  • Patīk 2
Link to comment
Share on other sites

Livingston

URL uz dokumentāciju ir šeit:

http://www.fmssoftware.lv/tools/download.php?file=files/doclist/REST_interfeiss_20140818.pdf

 

(aiz pdf nevejadzētu būt nekādiem simboliem).

 

Normālu piemēru tur nav. 

Par līkām rokām nestrīdos.

 

XSD shēma (TDdmKlSar.xsd ) ir 1007 rindiņas, ieskatam:

<xsd:schema xmlns="TDdmKlSar.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:global="global.xsd" xmlns:TadmTerit="TadmTerit.xsd" xmlns:TDdmCustomer="TDdmCustomer.xsd" xmlns:TddmKlKatBL="TddmKlKatBL.xsd" xmlns:TDdmSaviRek="TDdmSaviRek.xsd" xmlns:TddmUDFormaBL="TddmUDFormaBL.xsd" xmlns:TdmAccEd="TdmAccEd.xsd" xmlns:TdmAccEdOrGroup="TdmAccEdOrGroup.xsd" xmlns:TdmBLDValsts="TdmBLDValsts.xsd" xmlns:TdmDKPers="TdmDKPers.xsd" xmlns:TdmDocType="TdmDocType.xsd" xmlns:TdmDSektBL="TdmDSektBL.xsd" xmlns:TdmGrupa="TdmGrupa.xsd" xmlns:TdmKvAktiv="TdmKvAktiv.xsd" xmlns:TdmKvAktV="TdmKvAktV.xsd" xmlns:TdmNACEClassifBL="TdmNACEClassifBL.xsd" xmlns:TdmPvnKat="TdmPvnKat.xsd" xmlns:TdmUsersOBL="TdmUsersOBL.xsd" xmlns:TKSortimentsBL="TKSortimentsBL.xsd" xmlns:TNdmAdr="TNdmAdr.xsd" xmlns:TNdmApmveids="TNdmApmveids.xsd" xmlns:TNdmCenv="TNdmCenv.xsd" xmlns:TNdmPard="TNdmPard.xsd" xmlns:TsdmValName="TsdmValName.xsd" targetNamespace="TDdmKlSar.xsd">
<xsd:import schemaLocation="../global/global.xsd" namespace="global.xsd"/>
<xsd:import schemaLocation="../TadmTerit/TadmTerit.xsd" namespace="TadmTerit.xsd"/>
<xsd:import schemaLocation="../TDdmCustomer/TDdmCustomer.xsd" namespace="TDdmCustomer.xsd"/>
<xsd:import schemaLocation="../TddmKlKatBL/TddmKlKatBL.xsd" namespace="TddmKlKatBL.xsd"/>
<xsd:import schemaLocation="../TDdmSaviRek/TDdmSaviRek.xsd" namespace="TDdmSaviRek.xsd"/>
<xsd:import schemaLocation="../TddmUDFormaBL/TddmUDFormaBL.xsd" namespace="TddmUDFormaBL.xsd"/>
<xsd:import schemaLocation="../TdmAccEd/TdmAccEd.xsd" namespace="TdmAccEd.xsd"/>
<xsd:import schemaLocation="../TdmAccEdOrGroup/TdmAccEdOrGroup.xsd" namespace="TdmAccEdOrGroup.xsd"/>
<xsd:import schemaLocation="../TdmBLDValsts/TdmBLDValsts.xsd" namespace="TdmBLDValsts.xsd"/>
<xsd:import schemaLocation="../TdmDKPers/TdmDKPers.xsd" namespace="TdmDKPers.xsd"/>
<xsd:import schemaLocation="../TdmDocType/TdmDocType.xsd" namespace="TdmDocType.xsd"/>
<xsd:import schemaLocation="../TdmDSektBL/TdmDSektBL.xsd" namespace="TdmDSektBL.xsd"/>
<xsd:import schemaLocation="../TdmGrupa/TdmGrupa.xsd" namespace="TdmGrupa.xsd"/>
<xsd:import schemaLocation="../TdmKvAktiv/TdmKvAktiv.xsd" namespace="TdmKvAktiv.xsd"/>
<xsd:import schemaLocation="../TdmKvAktV/TdmKvAktV.xsd" namespace="TdmKvAktV.xsd"/>
<xsd:import schemaLocation="../TdmNACEClassifBL/TdmNACEClassifBL.xsd" namespace="TdmNACEClassifBL.xsd"/>
<xsd:import schemaLocation="../TdmPvnKat/TdmPvnKat.xsd" namespace="TdmPvnKat.xsd"/>
<xsd:import schemaLocation="../TdmUsersOBL/TdmUsersOBL.xsd" namespace="TdmUsersOBL.xsd"/>
<xsd:import schemaLocation="../TKSortimentsBL/TKSortimentsBL.xsd" namespace="TKSortimentsBL.xsd"/>
<xsd:import schemaLocation="../TNdmAdr/TNdmAdr.xsd" namespace="TNdmAdr.xsd"/>
<xsd:import schemaLocation="../TNdmApmveids/TNdmApmveids.xsd" namespace="TNdmApmveids.xsd"/>
<xsd:import schemaLocation="../TNdmCenv/TNdmCenv.xsd" namespace="TNdmCenv.xsd"/>
<xsd:import schemaLocation="../TNdmPard/TNdmPard.xsd" namespace="TNdmPard.xsd"/>
<xsd:import schemaLocation="../TsdmValName/TsdmValName.xsd" namespace="TsdmValName.xsd"/>
<xsd:element name="collection">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="metadata" type="global:ColMetadataType"/>
<xsd:element name="row" maxOccurs="unbounded" type="TDdmKlSarCollection"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="TDdmKlSarCollection">
<xsd:complexContent>
<xsd:extension base="TDdmKlSar_qryEmptyStructure">
<xsd:sequence>
<xsd:element name="K">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Klients</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="TDdmCustomer:TDdmCustomerStructure">
<xsd:sequence>
<xsd:element name="M" type="TDdmCustomer:TDdmCustomerStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Piesaistītā organizācija</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="CV" type="TNdmCenv:TNdmCenvStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Cenas veids</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="KON" type="TdmAccEdOrGroup:TdmAccEdOrGroupStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Konts vai grupa</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="NP" type="TNdmPard:TNdmPardStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Klienta atbildīgais</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="GRU" type="TdmGrupa:TdmGrupaStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Klienta grupa</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="VAL" type="TsdmValName:TsdmValNameStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Valūta</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="PVN" type="TdmPvnKat:TdmPvnKatStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">PVN kategorija</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="KVA">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Pēdējā aktivitāte</xsd:documentation>
</xsd:annotation>
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="TdmKvAktiv:TdmKvAktivStructure">
<xsd:sequence>
<xsd:element name="KVE" type="TdmKvAktV:TdmKvAktVStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Aktivitātes veids</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="NPV" type="TNdmPard:TNdmPardStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Autors</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="NPAD" type="TNdmPard:TNdmPardStructure">
<xsd:annotation>
<xsd:documentation xml:lang="lv">Atbildīgais</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
...
Link to comment
Share on other sites

 

 

MSSQL pa tiešo līst iekšā nav labi, tā toč var kādas ziepes savārīt. Ja vēl tikai datu izgūšana, tad vēl tā (ļaunākajā gadījumā process vairs nestrādās), taču rakstīt toč nevajag. Tur ir kolonnas un tabulas, kurās dati ir saistīti savā starpā; kaut ko nomudīsi, un pēc tam sūdi būs pēc pilnas programmas.
 

 

Ziepes var savārīt arī caur kādu no interfeisiem - sarakstot muļķības iekš bāzes.

Protams ka dati glabājas saistītās tabulās - kurai nopietnai db ir savādāk? ;)

protams ka fms nepatīk un viņi nekad nerekomendēs līst pa tiešo db jo tad klients nemaksā viņiem par datu apmaiņas interfeisu...

Bet manējās datu apmaiņas programmas jau kādus gadus 7 strādā un problēmu nav.

Tieši otrādi - zināšanas par db struktūru man ir pāris reizes palīdzējušas salabot db, kad konsultants pateica ka vienīgais ko viņš var izdarīt ir piestādīt rēķinu...

Un gļuki bija tabulās kuras neaiztieku - ne dēļ manas datu importa programmas! 

Link to comment
Share on other sites

versatile

Read only no datu bāzes pa tiešo nav nekas traks, lai gan arī, jāskatās, ko licences saka.

Rakstīt nevajadzētu, un tur ir čupa iemeslu, daļa no kuriem te ir uzskaitīta un daļa nav.

Link to comment
Share on other sites

Emm... stipri apšaubu to, ka lietojot REST/Ole tiek rakstīts pa tiešo DB. Noteikti tas notiek pielietojot Horizon objektus, kuri ievadīto infu validē atbilstoši atbilstošā objekta biznesa loģikai utt, un tikai kad viss ir OK - ieraksts notiek. Tas ir - pēc būtības tas ir tas pats, kas veidot konkrēto klientu (whatever Hor objektu baksti) no paša Horizon.

Labots - rubb
Link to comment
Share on other sites

  • 3 years later...
jurij 21

es daudzus gadus arī strādāju pa tiešo ar Horizon SQL. Sabojāt neko nevar, ja izdari tikai datu pieprasījumus (SELECTi). Tas ir 100%. Tad nākamais solis (teorētiski riskantāks) ir pamainīt kaut kādas konkrētas lietas (piemēram purchase ordera statusu apstiprināšanas procesā). Vai kontaktpersonas datus (email, telefons utt). Protams, ka FMS (un neviens cits) nekad nerekomendēs strādāšanu pa tiešo ar datubāzi, jo tas ir viņu bizness - pārdot FTG serveri, pārdot lietotāju licences utml. Un izmanto bailes kaut ko sabojāt kā motivējošu elementu. Bet tas viss ir bulšits. Pa tiešo var strādāt ar jebkuru SQL datubāzi, ja zini ko dari. Esmu strādājis gan ar Tildi, gan Navision, visur viens un tas pats. To, ko saku, sapratīs jebkurš programmētājs. Bez tam... sabojāt tur nemaz nav tik vienkārši (pat gribot, vēl jo vairāk nejauši), jo labi uzprogrammētā SQL datubāzē ir dažādi 'constraints', kas neļauj veikt izmaiņas vienā tabulā, ja vienlaicīgi to nedara citā, saistītā. Tādi ir, piemēram, Tildes SQL datubāzē, jo vairāk esmu strādājis ar to. Visticamāk ir arī Horizon, jo tas arī nav nekāds 'pagrīdes' produkts.  

Link to comment
Share on other sites

166.pants. Pornogrāfiska vai erotiska rakstura materiālu ievešanas, izgatavošanas un izplatīšanas noteikumu pārkāpšana

(2) Par tādu pornogrāfiska vai erotiska rakstura materiālu lejupielādi, iegādāšanos, ievešanu, izgatavošanu, publisku demonstrēšanu, reklamēšanu vai citādu izplatīšanu, kuros aprakstīta vai attēlota bērnu seksuāla izmantošana, cilvēku seksuālas darbības ar dzīvniekiem, nekrofilija vai pornogrāfiska vai erotiska rakstura vardarbība, kā arī par šādu materiālu glabāšanu —

soda ar brīvības atņemšanu uz laiku līdz trim gadiem vai ar piespiedu darbu, vai ar naudas sodu līdz piecdesmit minimālajām mēnešalgām, konfiscējot mantu vai bez mantas konfiskācijas.

  • Patīk 1
Link to comment
Share on other sites

Anonīms Alkoholiķis

Murlo, par tevi ir jāziņo liberastu un pederastu tiesībi aizstāvjiem, jo pat līķiem ir tiesības uz īstu mīlestību, bet tu mēģini uztaisīt mīlestības trijstūri starp topiku, juriju21 un sevi.. Un kā savādāk šis mironis tiks pie tam pienākošās mīlestības devas, ja ne ar nolādēto nekromanceru un nekrofīlu palīdzību?

Labots - Anonīms Alkoholiķis
  • Kādas šausmas! 1
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...