Papildomi veiksmai atliekami formos saugojimo metu

Kuriant Dokumento formą gali atsirasti poreikis:

  • atlikti papildomus formos testavimus ir tikrinimus,
  • sugeneruoti ar koreguoti susijusias operacijas.

Šiuos papildomus veiksmus galima atlikti programavimui naudojant Rivile GAMA formules.

Servisas -> Kortelės -> Formulės

Programinis tekstas rašomas formulėje, o Dokumento formoje nurodomas formulės kodas.

Naudojimo pavyzdys formos XML aprašyme:

<app> 
    ... 
    <on_save> 
        <config>
            <id>KODAS_FR</id> 
            <value>MG_DVS_F01</value> 
        </config>
        ... 
    </on_save> 
    ... 
</app> 

mgama_02.png

Formulės aprašymas

Patarimai programuojantiems:
Formulės programavimą ir testavimą geriausia vykdyti naudojant SQL priemones (MSSQL SSMS arba Sybase iSQL).
Formulės pradžioje aprašomi standartiniai kintamieji, kurie bus naudojami užpildant juos testinėmis reikšmėmis. Vėliau keliant programinį kodą į formulę, šią dalį galima užkomentuoti.

Rašant formulę, kuri bus naudojama Dokumento formoje, yra pasiekiami tam tikri kintamieji bei laikinos lentelės su formoje užpildytais duomenimis.

  • Formulėje pasiekiami kintamieji:
Kintamasis Tipas Paskirtis / Reikšmė
@user char(12) Vartotojas, kuris atlieka tvirtinimą arba peržiūri tvirtinimą
@id int Formos ID
@lang char(2) Pasirinkta vartotojo kalba (lt arba en)
@form_modul char(2) Modulis, kuriame veikia forma
@form_kodas char(12) Kodas, su kuriuo susieta forma (DVS rūšis)
@result xml Užpildytos formos rezultatas XML forma
@form_modul char(2) Modulis, ryšio formavimui su kuriama operacija
@form_kodas char(12) Operacijos kodas, ryšio formavimui su kuriama operacija
@return int Grąžinamas rezultatas. Grąžinus reikšmę <0 – operacijos kūrimas nutraukiamas.
  • Laikinoje lentelėje #RGI_MGAMA_FORM_EDIT_result įkelti užpildytos formos rezultatai (išskleistas @result XML turinys):
Laukas Tipas Paskirtis / Reikšmė
id varchar(50) Formos lauko ID
type varchar(10) Formos lauko tipas (select, text, label, ...)
caption varchar(250) Formos lauko pavadinimas
value varchar(max) Lauko reikšmė
value_name varchar(max) Lauko reikšmės pavadinimas
  • Laikinoje lentelėje #RGI_MGAMA_FORM_EDIT_on_save įkelti užpildytos formos išsaugojimo parametrų reikšmės:
Laukas Tipas Paskirtis / Reikšmė
id varchar(50) Parametro ID
value varchar(max) Parametro reikšmė
  • Klaidos registravimui naudojama funkcija RGI_KLAIDA.

Funkcijos parametrų eilės tvarka:

Parametras Tipas Paskirtis / Reikšmė
@Tag varchar(50) Laukas, kuris įtakojo klaidą
@Expr2 varchar(250) Klaidos pranešimas (LT)
@Expr3 varchar(250) Klaidos pranešimas (EN)
@Expr1 varchar(8000) Papildoma išplėstinė klaidos informacija
@Err_Code int Klaidos kodas (Pagal nutylėjimą 0)

Naudojimo pavyzdys

exec dbo.RGI_KLAIDA '@data_nuo_iki','Įvestas laikotarpis turi būti ne ilgesnis nei 7 dienos', 'The entered period must not exceed 7 days!' 

Svarbu: Formulė veikia tik tuomet, jei formos aprašyme nenurodyta SAVE SQL procedūra.

mgama_01

Formulių pavyzdžiai

    1. Testavimas, neleidžiantis įvesti vienodų įrašų tam pačiam žmogui, kai formoje nurodyti intervalai susikerta. Formulės tekstas:
-- Pasiimame personalo kodą, kuris teikia prašymą
declare @kodas_4a char(12)
select @kodas_4a=K14_kodas_4a from dbo.K14_ASM where K14_KODAS_RS=@user

-- Patikriname užpildytame prašyme kokios yra pradžios ir pabaigos datos
declare @beg_date datetime, @end_date datetime
SELECT @beg_date = convert(datetime,[value],120) from #RGI_MGAMA_FORM_EDIT_result WHERE id = 'beg_date' 
SELECT @end_date = convert(datetime,[value],120) from #RGI_MGAMA_FORM_EDIT_result WHERE id = 'end_date'

-- Patikriname, ar datų intervalas ne ilgesnis nei 7 dienos
IF DATEDIFF(DAY, @beg_date, @end_date) + 1 > 7
BEGIN
    exec dbo.RGI_KLAIDA '@data_nuo_iki','Įvestas laikotarpis turi būti ne ilgesnis nei 7 dienos', 'The entered period must not exceed 7 days!'
    return
END

-- Patikriname, ar personalo kodui, kuris pildo prašymą, yra tos rūšies DVS dokumentai, kurių intervalai persikerta
-- Jei yra tos rūšies dokumentų tame intervale - išduodama klaida
IF exists(
        SELECT K42_APRASYMAS1, K42_APRASYMAS2
        FROM K42_OD WHERE K42_KODAS_RD=@form_kodas AND K42_KODAS_4A=@kodas_4a
            and K42_APRASYMAS1<>'' and K42_APRASYMAS2<>''
            and K42_APRASYMAS1 like '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
            and K42_APRASYMAS2 like '20[0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
            and convert(datetime,LEFT(K42_APRASYMAS1,10),120)<=@end_date and convert(datetime,LEFT(K42_APRASYMAS2,10),120)>=@beg_date
        )
BEGIN
    exec dbo.RGI_KLAIDA '@data_nuo_iki','Įvestam laikotarpiui jau yra sukurti prašymai!', 'Requests have already been created for the entered period!'
    return
END
    1. Forma sukurianti pirkimo operaciją (be detalių eilučių), o iš DVS operacijos sukurianti informacijos ryšį su šia pirkimo operacija. Taip pat šiame pavyzdyje parodyta testavimo dalis, kuri yra užkomentuota.
/*
-- TESTING DATA --
declare @user char(12), @rys_kodas char(12), @rys_modul char(2)
select @user='MASTER'
if dbo.RGI_ver2_tmp_exists('#RGI_MGAMA_FORM_EDIT_result')=1
    drop table #RGI_MGAMA_FORM_EDIT_result
select cast('' as varchar(250)) as [id], cast('' as varchar(250)) as [value] into #RGI_MGAMA_FORM_EDIT_result where 1=0
insert into #RGI_MGAMA_FORM_EDIT_result ([id],[value]) values ('kodas_ks','121411842')
insert into #RGI_MGAMA_FORM_EDIT_result ([id],[value]) values ('dok_nr','DD-TEST123')
insert into #RGI_MGAMA_FORM_EDIT_result ([id],[value]) values ('dok_data','2024-10-03')
-- TESTING DATA --
*/

-- Pasiimame informaciją iš užpildytos formos
declare @kodas_ks char(12), @dok_nr char(20), @dok_data char(23)
SELECT @kodas_ks = [value] from #RGI_MGAMA_FORM_EDIT_result WHERE id = 'kodas_ks'
SELECT @dok_nr = [value] from #RGI_MGAMA_FORM_EDIT_result WHERE id = 'dok_nr'
SELECT @dok_data = [value] from #RGI_MGAMA_FORM_EDIT_result WHERE id = 'dok_data'

-- Patikriname ar toks dokumentas jau įvestas
IF exists(
        SELECT I06_KODAS_PO
        FROM I06_PARH
        WHERE I06_OP_TIP<50 and I06_DOK_NR=@dok_nr AND I06_KODAS_KS=@kodas_ks
        )
BEGIN
    exec dbo.RGI_KLAIDA '@dok_nr','Toks dokumentas jau įvestas!', 'This document already exists!'
    return
END

-- Sukuriame pirkimo užsakymo operaciją
declare @duom varchar(8000)
select @duom='
    <DATA><I06>
        <I06_OP_TIP>3</I06_OP_TIP>
        <I06_KODAS_KS>'+dbo.RGI_F_XML_ENCODE(rtrim(@kodas_ks))+'</I06_KODAS_KS>
        <I06_DOK_DATA>'+dbo.RGI_F_XML_ENCODE(rtrim(@dok_data))+'</I06_DOK_DATA>
        <I06_DOK_NR>'+dbo.RGI_F_XML_ENCODE(rtrim(@dok_nr))+'</I06_DOK_NR>
    </I06></DATA>'

select * into #I06 from dbo.I06_PARH where 1=0
EXEC dbo.RGI_API_EDIT_I06 
    @user=@user,
    @params='<PARAMS><OPER>I</OPER></PARAMS>', 
    @data=@duom,
    @response_type=3

-- Sukuriame ryšį
select @rys_kodas=i06_kodas_po, @rys_modul='PO' from #I06

drop table #I06 
    1. Tikrinimas, kad būtų galima prašyti avanso tik 1 kartą per mėnesį ir ne didesnei nei 1000 EUR sumai.
-- Pasiimame formoje nurodytą datą
declare @date datetime
SELECT @date = convert(datetime,LEFT([value],10),120) from #RGI_MGAMA_FORM_EDIT_result WHERE [id] = '@k42_op_data' 

-- Patikriname ar tą mėnesį dar yra užpildytų prašymų
IF exists(
        SELECT K42_OP_DATA
        FROM K42_OD WHERE K42_KODAS_RD=@form_kodas AND K42_KODAS_RS=@user and K42_bukle=1
            and LEFT(convert(varchar,K42_OP_DATA,120),7)=LEFT(convert(varchar,@date,120),7)
        )
BEGIN
    exec dbo.RGI_KLAIDA 'DATA','Šį mėnesį prašymą jau pildėte!'
    return
END

-- Patikriname sumą
IF exists(SELECT * from #RGI_MGAMA_FORM_EDIT_result WHERE [id] = '@k42_aprasymas1' AND CAST([value] as numeric(10,2))>1000)
BEGIN
    exec dbo.RGI_KLAIDA 'SUMA','Viršijama leistina maksimali suma!'
    return
END