Sincronizzazioni incrementali
Caso: un'app per gli agenti si aggiorna ogni notte e vuole scaricare solo i clienti e gli articoli modificati.
Principio
GET /api/sync/{Resource}?LastUtcRun=<data UTC> restituisce i record con dat_ultvar successiva alla data indicata.
Passi
- Prima esecuzione:
LastUtcRun=1900-01-01 00:00:00.000scarica tutto. - Prima di iniziare, annota l'istante di avvio in UTC: sarà il
LastUtcRundella prossima esecuzione. - Leggi tutte le pagine (
PageSize,PageNumber) fino aTotalRowsCount. - Applica i record: inserisci, aggiorna, oppure elimina quelli con
flg_isdeleted = true. - Solo se tutto è andato a buon fine, salva l'istante del punto 2.
Margine di sicurezza
Usare l'istante di inizio invece di quello di fine evita di perdere i record variati durante la lettura. Qualche record potrà arrivare due volte: rendi idempotente l'applicazione, abbinando i record per chiave.
- C#
- JavaScript
var avvio = DateTime.UtcNow;
var last = stato.Load("CliFor") ?? new DateTime(1900, 1, 1);
await foreach (var rec in ecube.ReadChangesAsync("CliFor", last))
Applica(rec); // upsert per (ind_clifor, cod_clifor); flg_isdeleted = true -> elimina
stato.Save("CliFor", avvio);
const avvio = new Date();
const last = stato.get("CliFor") ?? new Date("1900-01-01T00:00:00Z");
for await (const rec of readChanges("CliFor", last)) applica(rec);
stato.set("CliFor", avvio);
ReadChangesAsync e readChanges sono negli esempi C# e JavaScript.
Formato della data
YYYY-MM-DD HH:MM:SS.000 in UTC, ad esempio 2025-06-30 12:00:00.000, codificato nell'URL. Usa sempre il tuo orologio UTC per calcolare LastUtcRun.