Actualizarea numelui unui client in cadrul documentelor
In acest exemplu vom vedea cum, in cateva randuri, datele din cadrul bazei dumneavoastra de date pot fi actualizate rapid.
Grup Script
Program
Eveniment
Actiune pe program
Dupa cum stiti, tabelele sunt legate intre ele cu ajutorul campului special Subtabel, aceasta permitand selectarea unui rand de valori dintr-un alt tabel decat cel gestionat de fisa curenta. Alegerea acestui rand permite apoi completarea automata a campurilor dorite. Intrucat este vorba de o copie a datelor si nu de o legatura, daca, de exemplu, s-ar schimba numele clientului din fisa sa, cel vechi va ramane in cadrul documentelor unde este mentionat. Multumita acestui script, numele din cadrul documentului vor putea fi realiniate.
Pentru a utiliza acest script este necesar sa il tratam ca pe o actiune asupra programului, permitandu-ne astfel sa il lansam atunci cand vrem.
table_rows = database.getsql("SELECT * FROM names")
nrows = table_rows.countrows()
rows = table_rows.getrows()
Mai intai, cream tabelul de nume in care sunt introdusi clientii proprii, preluand randurile si numerele acestora.
for i = 1,nrows do
gguid = rows[i].getvalue("gguid")
name = rows[i].getvalue("name")
database.setsql("UPDATE invoices set customer='" .. name .. "' WHERE gguid_name='" .. gguid .. "'")
end
In acest ciclu recuperam GGUID-ul denumirii si numele acestuia pentru a-l putea reintroduce in cadrul facturilor care il folosesc, astfel incat sa fie actualizat.
Sistemul este cu siguranta foarte rapid, dar prezinta unele probleme.
Prima este ca, scriind interogarea SQL in acest fel, daca numele clientului ar avea o virgula sus, in interior, ar genera o eroare. Pentru a-l gestiona, nu uitati ca este suficient sa le dublati sau sa utilizati functia convap ca in acest exemplu: convap come in questo esempio:
"update invoices set customers='" ... utility.convap(name) .. "' where ...."
A doua problema este ca, daca ar fi o baza de date Cloud, modificarile aduse nu ar fi sincronizate. Sincronizarea se bazeaza, de fapt, pe alte valori si functiuni.
Daca se doreste efectuarea sincronizarii, acest sistem ar fi oricum gresit, deoarece, dupa actualizarea datelor, nu va mai fi posibil sa verificati care s-au modificat. Acest lucru ar insemna retrimiterea tuturor clientilor catre server, chiar daca nu au fost efectuate modificarii ale acestora.
Daca este necesara sincronizarea datelor, exista intotdeauna doi pasi de facut cu ajutorul script-urilor.
database.setsql("UPDATE invoices SET tid=" .. tostring(utility.tid()) .. " WHERE gguid_name='" .. gname .. "'")
In primul rand, trebuie actualizat tid-ul cu data curenta, deoarece este vorba despre registrul temporal al randului de date.
In faza de sincronizare, programul verifica ce randuri au fost actualizate de la ultima data si le trimite doar pe acelea.
table_rows = database.getsql("SELECT * FROM invoices WHERE gguid_name=' " .. gname .. "'")
nrows = table_rows.countrows()
rows = table_rows.getrows()
for i = 1,nrows do
database.addsyncbox("invoices",rows[i].getvalue("gguid"))
end
A doua operatiune este efectuata in realitate numai daca script-ul trebuie utilizat si pe dispozitive mobile. Acestea, de fapt, au un sistem de sincronizare care clasifica datele care trebuie trimise intr-un mod usor diferit.
In aceasta parte a scriptului sunt preluate toate liniile facturilor pe care le utilizeaza clientul nostru si sunt marcate pentru a fi transmise la sincronizare cu comanda addsyncbox.
Ultima precizare: retineti, ca filtru, este intotdeauna o regula buna sa adaugati „and eli=0” pentru a evita recuperarea datelor care in prezent sunt eliminate!