Passa al contenuto principale

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​

  1. Prima esecuzione: LastUtcRun=1900-01-01 00:00:00.000 scarica tutto.
  2. Prima di iniziare, annota l'istante di avvio in UTC: sarà il LastUtcRun della prossima esecuzione.
  3. Leggi tutte le pagine (PageSize, PageNumber) fino a TotalRowsCount.
  4. Applica i record: inserisci, aggiorna, oppure elimina quelli con flg_isdeleted = true.
  5. 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.

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);

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.