V_RIV_API()

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

  1. Patikrinimas, ar tinkamas raktas
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
  1. Naujo kliento sukūrimas
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
  1. Pardavimų operacijos pirmos detalios eilutės padalinio kodo keitimas (į "02")
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
  1. Pardavimų operacijos perkėlimas
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
  1. Papildomų laukų koregavimas, kai formuojama pilna užklausa
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
  1. Nuskaitomos filtruojamos prekių kortelės ir jų kodai sudedami į kursorių.

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.

klavišų atsisiuntimas

  1. Pardavimo operacijų importas iš EIP failo.
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.

  1. Padalinio keitimas pardavimo operacijoje
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
  1. Kiekio keitimas pardavimo detaliose eilutėse ir operacijos perkėlimas

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
  1. Vidinio važtaraščio iš kito padalinio sukūrimas, perkėlimas ir rezervavimo sukūrimas.

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