Objektas Rivile API v2 (REST web service) užklausoms formuoti
(nuo 115 RIV_GAMA versijos)
Sintaksė
V_RIV_API([modul],[ApiKey])
Grąžina
Simbolinę reikšmę
Parametrai
Parametras | Aprašymas | Formatas |
---|---|---|
modul | patikslinamas modulis, kuriam priskirtas API raktas parametre SS_RIV_API | C(2) |
ApiKey | nurodomas API raktas | C |
Papildomos užklausos "Request Header" savybės:
* ApiKey - automatiškai užpildomas pagal perduotą raktą arba iš parametro SS_RIV_API
* Url - pagal nutylėjimą "https://api.manorivile.lt/client/v2"
* Send_Method - pagal nutylėjimą "POST"
* Json - pagal nutylėjimą naudojamas apsikeitimas Json formatu (.T.) Nurodžius .F. – bus naudojamas XML.
* User – nurodoma kurio vartotojo teisėmis vykdoma užklausa. Pagal nutylėjimą API vartotojo (API prefikso) teisėmis. (Ar galima pakeisti vartotoją nurodoma parametre RGI_USR_EDIT).
Siuntimas vykdomas metodu: Send([cMethod], [cOper], [cBody], [cParams], [nPage]) - grąžina .T. jei nebuvo klaidų
* cMethod - nurodomas metodas, pvz.: "GET_I06_LIST"
* cOper - nurodomas veiksmas, pvz.: "H"
* cBody - nurodomas duomenų turinys ar filtravimo sąlygos, pvz.: "I06_OP_TIP=51"
* cParams - galima nurodyti pilną jau suformuotą užklausos tekstą, kuris bus siunčiamas į Rivile API
* nPage - nurodomas, kuris rezultato puslapis reikalingas
Atsakymai grąžinami:
* message - klaidos tekstas
* responseText - tekstinis atsakymas
* responseJson() - atsakymas Json objektu
Pavyzdžiai
m.loRivApi=v_riv_api()
IF !m.loRivApi.SEND("GET_N08_LIST","H","1=0") && Pratestuojame prisijungimą prie bazės (klientų sąrašo)
l_MESSAGEBOX("Rivile API: "+m.loRivApi.MESSAGE,16,"Klaida!")
RETURN .F.
ENDIF
loRivApi=v_riv_api()
loRivApi.user=titi_pagr.useris
IF !loRivApi.Send("EDIT_N08","I","<N08><N08_PAV>Naujas klientas</N08_PAV><N08_KODAS_DS>PT001</N08_KODAS_DS><N08_RUSIS>1</N08_RUSIS><N08_KODAS_XS_P>PVM</N08_KODAS_XS_P><N08_TIPAS>2</N08_TIPAS></N08>")
f_info("Klaida kuriant klienta: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
** Atnaujiname informaciją klientų sąraše (grid'e)
IF USED("Wn08") AND TYPE("titi_pagr.ads_klij")="O"
m.loN08=m.loRivApi.responsejson()
SELECT Wn08
LOCATE FOR n08_kodas_ks=m.loN08.n08.n08_kodas_ks
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loN08.n08 FIELDS LIKE n08_*
=vyk_upd("Wn08")
titi_pagr.ads_klij.activate()
ENDIF
m.loRivApi=v_riv_api("RO")
IF !loRivApi.Send("EDIT_I07","U","<I07><I07_KODAS_PO>"+Wi06r.i06_kodas_po+"</I07_KODAS_PO><I07_EIL_NR>1</I07_EIL_NR><I07_KODAS_IS>02</I07_KODAS_IS></I07>")
RETURN .F.
ENDIF
m.loRivApi=v_riv_api("RO")
IF !loRivApi.Send("EDIT_I06","P","<I06><I06_KODAS_PO>"+Wi06r.i06_kodas_po+"</I06_KODAS_PO></I06>")
RETURN .F.
ENDIF
** Atnaujiname informaciją pardavimų sąraše (grid'e)
IF USED("Wi06r") AND TYPE("titi_pagr.ads_prh")="O"
m.loI06=m.loRivApi.responsejson()
SELECT Wi06r
LOCATE FOR i06_kodas_po=m.loI06.i06.i06_kodas_po
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loI06.i06 FIELDS LIKE i06_*
=vyk_upd("Wi06r")
titi_pagr.ads_prh.activate()
ENDIF
m.loRivApi=v_riv_api()
lcReq=""
lcReq=lcReq+"<body>"
lcReq=lcReq+" <method>EDIT_PAP</method>"
lcReq=lcReq+" <data>"
lcReq=lcReq+" <PAP>"
lcReq=lcReq+" <forma>KSN08</forma>"
lcReq=lcReq+" <kodas1>121411842</kodas1>"
lcReq=lcReq+" <papXML>"
lcReq=lcReq+" <![CDATA["
lcReq=lcReq+" <lpap>"
lcReq=lcReq+" <pap>"
lcReq=lcReq+" <id>1</id>"
lcReq=lcReq+" <value>Testas</value>"
lcReq=lcReq+" </pap>"
lcReq=lcReq+" <pap>"
lcReq=lcReq+" <name>Skola</name>"
lcReq=lcReq+" <value>100.55</value>"
lcReq=lcReq+" </pap>"
lcReq=lcReq+" </lpap>"
lcReq=lcReq+" ]]>"
lcReq=lcReq+" </papXML>"
lcReq=lcReq+" </PAP>"
lcReq=lcReq+" </data>"
lcReq=lcReq+"</body>"
IF !m.loRivApi.Send("EDIT_PAP",,,m.lcReq)
f_info("Klaida įkeliant papildomus laukus: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
get_n17_list_pvz.zip atsisiuntimas
LPARAMETERS lcFilter
** Funkcijos paleidimo pavyzdys:
* get_n17_list_pvz("n17_kodas_ps<='011'")
* get_n17_list_pvz("n17_kodas_ps='GEN000011'")
IF USED("prek_sar")
USE IN prek_sar
ENDIF
SELECT 0
CREATE CURSOR prek_sar (eil_nr N(18,0), kodas_ps C(12))
LOCAL loRivApi, lcRequest, loResp, lnPage, i, ln, loN17
m.loRivApi=v_riv_api()
m.lnPage=0
DO WHILE 1=1
m.lnPage=m.lnPage+1
IF !m.loRivApi.SEND("GET_N17_LIST","H",xml_encode(m.lcFilter),,m.lnPage)
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
m.loResp=m.loRivApi.responseJson()
** Rezultatas grįžta:
* Jei vienas elementas, tai: m.loResp.N17.N17_KODAS_PS
* Jei keli elementai, tai masyvas: m.loResp.N17(1).N17_KODAS_PS
m.ln=0
IF TYPE("m.loResp.N17.N17_KODAS_PS")="C"
m.ln=1
ENDIF
IF TYPE("ALEN(m.loResp.N17,1)")="N"
m.ln=ALEN(m.loResp.N17,1)
ENDIF
IF m.ln<1
EXIT
ENDIF
m.i=1
FOR m.i=1 TO m.ln
m.loN17=IIF(TYPE("m.loResp.N17(m.i)")="U",m.loResp.N17,m.loResp.N17(m.i))
INSERT INTO prek_sar (eil_nr, kodas_ps) VALUES (RECCOUNT("prek_sar")+1, TRANSFORM(m.loN17.N17_KODAS_PS)) && Rezultate gali būti laukas tiek C, tiek ir N, priklausomai nuo reikšmės. Todėl visada formatą reiktų suvienodinti
ENDFOR
ENDDO
SELECT prek_sar
perziura()
USE IN prek_sar
RETURN .T.
Toliau (7-10) pateikiami pavyzdžiai kaip galima užsiprogramuoti klavišus įvairių funkcionalumų realizavimui naudojant API metodus.
Siūlome kreipti dėmesį tik į funkcijų naudojimą, nes logika kiekvienu atveju priklauso nuo konkretaus uždavinio.
EXECSCRIPT(SUBSTR(komanda_v,ATC(CHR(13),komanda_v,ij_k+1)))
EXIT
ON ERROR
m.lcEipFile=GETFILE("EIP")
IF EMPTY(m.lcEipFile)
RETURN .F.
ENDIF
* Importuojame *
loRivApi=v_riv_api()
IF !loRivApi.Send("EDIT_I06_FULL","I",FILETOSTR(m.lcEipFile))
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
* Perkeliame *
*m.loI06=m.loRivApi.responsejson()
*IF !loRivApi.Send("EDIT_I06","P","<I06><I06_KODAS_PO>"+TRANSFORM(m.loI06.i06.i06_kodas_po)+"</I06_KODAS_PO></I06>")
* f_info("Klaida: "+m.loRivApi.Message,.T.)
* RETURN .F.
*ENDIF
** Atnaujiname informaciją klientų sąraše (grid'e)
IF USED("Wi06r") AND TYPE("titi_pagr.ads_prh")="O"
m.loI06=m.loRivApi.responsejson()
SELECT Wi06r
LOCATE FOR i06_kodas_po=m.loI06.i06.i06_kodas_po
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loI06.i06 FIELDS LIKE i06_*
=vyk_upd("Wi06r")
titi_pagr.ads_prh.activate()
ENDIF
Pastaba. Reikėtų atkreipti dėmesį, kad tam tikri importui skirto failo laukai, pvz., bar_kodas, kiekis_u, skiriasi nuo tų, kurie standartiškai naudojami EIP failuose.
Informaciją apie kiekvieno metodo naudojamus laukus ir specifines to metodo savybes galima rasti prie jų aprašymo Metodų sąrašas.
Pavyzdžiui, apie pirkimų/ pardavimų detalios eilutės laukus ir koregavimą aprašyta EDIT_I07.
EXECSCRIPT(SUBSTR(komanda_v,ATC(CHR(13),komanda_v,ij_k+1)))
EXIT
ON ERROR
LOCAL lcKodas_is
m.lcKodas_is=PS_KOD("IS","Naujas padalinys")
IF EMPTY(m.lcKodas_is)
RETURN .F.
ENDIF
* Keičiame *
loRivApi=v_riv_api()
IF !loRivApi.Send("EDIT_I06_KOP","",;
"<I06>"+;
" <P_OPER>2</P_OPER>"+;
" <OLD_I06_KODAS_PO>"+Wi06r.i06_kodas_po+"</OLD_I06_KODAS_PO>"+;
" <NEW_I06_OP_TIP>"+TRANSFORM(Wi06r.i06_op_tip)+"</NEW_I06_OP_TIP>"+;
" <NEW_I06_DOK_NR>"+xml_encode(Wi06r.i06_dok_nr)+"</NEW_I06_DOK_NR>"+;
" <NEW_I07_KODAS_IS>"+xml_encode(m.lcKodas_is)+"</NEW_I07_KODAS_IS>"+;
"</I06>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
** Atnaujiname informaciją klientų sąraše (grid'e)
IF USED("Wi06r") AND TYPE("titi_pagr.ads_prh")="O"
m.loI06=m.loRivApi.responsejson()
SELECT Wi06r
DELETE
GO TOP
LOCATE FOR i06_kodas_po=m.loI06.i06.i06_kodas_po
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loI06.i06 FIELDS LIKE i06_*
=vyk_upd("Wi06r")
titi_pagr.ads_prh.activate()
ENDIF
Pavyzdyje visų detalių eilučių kiekiai sumažinami vienetu.
EXECSCRIPT(SUBSTR(komanda_v,ATC(CHR(13),komanda_v,ij_k+1)))
EXIT
ON ERROR
* Keičiame *
loRivApi=v_riv_api()
f_select("select I07_KODAS_PO, I07_EIL_NR, I07_ALT_KIEKIS, I07_ALT_FRAK from I07_PARD where I07_KODAS_PO=?Wi06r.i06_kodas_po and i07_alt_kiekis>0","I07_LIST")
SELECT I07_LIST
GO TOP
SCAN
IF !loRivApi.Send("EDIT_I07","U",;
"<I07>"+;
" <I07_KODAS_PO>"+I07_LIST.I07_KODAS_PO+"</I07_KODAS_PO>"+;
" <I07_EIL_NR>"+TRANSFORM(I07_LIST.I07_EIL_NR)+"</I07_EIL_NR>"+;
" <I07_ALT_KIEKIS>"+TRANSFORM((I07_LIST.I07_ALT_KIEKIS/I07_LIST.I07_ALT_FRAK-1)*I07_LIST.I07_ALT_FRAK)+"</I07_ALT_KIEKIS>"+;
"</I07>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
ENDSCAN
* Perkeliame *
IF !loRivApi.Send("EDIT_I06","P","<I06><I06_KODAS_PO>"+Wi06r.i06_kodas_po+"</I06_KODAS_PO></I06>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
** Atnaujiname informaciją klientų sąraše (grid'e)
IF USED("Wi06r") AND TYPE("titi_pagr.ads_prh")="O"
m.loI06=m.loRivApi.responsejson()
SELECT Wi06r
LOCATE FOR i06_kodas_po=m.loI06.i06.i06_kodas_po
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loI06.i06 FIELDS LIKE i06_*
=vyk_upd("Wi06r")
titi_pagr.ads_prh.activate()
ENDIF
Pavyzdyje yra pardavimo pasiūlymas, kurį reikia pakeisti į rezervavimą. Prieš tai sugeneruojamas vidinis važtaraštis iš 01 padalinio, jis du kartus perkeliamas, o kai atsiranda prekės pasiūlyme nurodytame padalinyje, pasiūlymas pakeičiamas rezervavimu.
EXECSCRIPT(SUBSTR(komanda_v,ATC(CHR(13),komanda_v,ij_k+1)))
EXIT
ON ERROR
* Generuojame vidinį *
lcEip=""
m.lcKodas_is=""
f_select("select I07_KODAS, I07_KODAS_US_A, I07_ALT_KIEKIS, I07_ALT_FRAK, I07_KODAS_IS from I07_PARD where I07_KODAS_PO=?Wi06r.i06_kodas_po and i07_alt_kiekis>0 and i07_tipas=1","I07_LIST")
SELECT I07_LIST
GO TOP
SCAN
m.lcKodas_is=I07_LIST.I07_KODAS_IS
lcEip=lcEip+;
"<I10>"+;
" <I10_TIPAS>1</I10_TIPAS>"+;
" <I10_KODAS_PS>"+xml_encode(I07_LIST.I07_KODAS)+"</I10_KODAS_PS>"+;
" <I10_KODAS_US1>"+xml_encode(I07_LIST.I07_KODAS_US_A)+"</I10_KODAS_US1>"+;
" <I10_KIEKIS1>"+TRANSFORM(I07_LIST.I07_ALT_KIEKIS)+"</I10_KIEKIS1>"+;
" <I10_FRAKCIJA1>"+TRANSFORM(I07_LIST.I07_ALT_FRAK)+"</I10_FRAKCIJA1>"+;
"</I10>"
ENDSCAN
IF EMPTY(m.lcEIP)
RETURN .F.
ENDIF
lcEip=;
"<I09>"+;
" <I09_TIPAS>1</I09_TIPAS>"+;
" <I09_IS_DATA>"+TRANSFORM(Wi06r.i06_op_data)+"</I09_IS_DATA>"+;
" <I09_GAV_DATA>"+TRANSFORM(Wi06r.i06_op_data)+"</I09_GAV_DATA>"+;
" <I09_KODAS_IS1>01</I09_KODAS_IS1>"+;
" <I09_KODAS_IS2>"+xml_encode(m.lcKodas_is)+"</I09_KODAS_IS2>"+;
lcEip+;
"</I09>"
loRivApi=v_riv_api()
* Kuriame vidinį *
IF !loRivApi.Send("EDIT_I09_FULL","I",lcEip)
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
m.loI09=m.loRivApi.responsejson()
m.lcKodas_vd=m.loI09.i09.i09_kodas_vd
* Perkeliame vidinį *
IF !loRivApi.Send("EDIT_I09","P","<I09><I09_KODAS_VD>"+m.lcKodas_vd+"</I09_KODAS_VD></I09>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
* Perkeliame vidinį 2 *
IF !loRivApi.Send("EDIT_I09","P","<I09><I09_KODAS_VD>"+m.lcKodas_vd+"</I09_KODAS_VD></I09>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
* Keičiame pardavimo dokumentą *
loRivApi=v_riv_api()
IF !loRivApi.Send("EDIT_I06_KOP","",;
"<I06>"+;
" <P_OPER>2</P_OPER>"+;
" <OLD_I06_KODAS_PO>"+Wi06r.i06_kodas_po+"</OLD_I06_KODAS_PO>"+;
" <NEW_I06_OP_TIP>54</NEW_I06_OP_TIP>"+;
" <NEW_I06_DOK_NR>"+xml_encode(Wi06r.i06_dok_nr)+"</NEW_I06_DOK_NR>"+;
" <NEW_I07_KODAS_IS>"+xml_encode(m.lcKodas_is)+"</NEW_I07_KODAS_IS>"+;
"</I06>")
f_info("Klaida: "+m.loRivApi.Message,.T.)
RETURN .F.
ENDIF
** Atnaujiname informaciją klientų sąraše (grid'e)
IF USED("Wi06r") AND TYPE("titi_pagr.ads_prh")="O"
m.loI06=m.loRivApi.responsejson()
SELECT Wi06r
DELETE
GO TOP
LOCATE FOR i06_kodas_po=m.loI06.i06.i06_kodas_po
IF !FOUND()
APPEND BLANK
ENDIF
GATHER NAME m.loI06.i06 FIELDS LIKE i06_*
=vyk_upd("Wi06r")
titi_pagr.ads_prh.activate()
ENDIF