Vai al contenuto

SWN039 - Matricole di assistenza

Nome programma SWN039 Linkage section UTILAGPRG - Linkage comune Id processo: 42 Nome processo: MATRICOLE-ASS Tabelle principali gestite

AREA AREAGATE Direzione
ASNMATRI
ASNMATR2
APASNMATRI ------>
<------

Logica generale Sincronizzazione delle matricole di assistenza. Esportazione Esportazione di tutte le matricole effettivamente modificate (con dati variati). In questa fase NON esportiamo la distinta matricola, verrà realizzato un processo indipendente come è nella logica standard delle nuove sincronizzazioni Importazione Le applicazioni WEB potranno inserire, modificare o cancellare logicamente nuove matricole Dato che per ora non è possibile riconoscere i record di distinta base aggiornati su APP, è necessario portarsi dietro l'aggiornamento delle distinte base (ASNMTRDB), che per il momento non è ottimizzato Per conformità alla gestione precedente della sincronizzazione (SWA020), le fasi rimangono strutturate come in questo programma, anche se adattate alla struttura dei programmi "SWN"; qui per non fare confusione con fasi presenti e che hanno sempre lo stesso prefisso le rinomino e evidenzio quelle standard presenti negli SWN: * A - Controllo di esecuzione * B.1 - Stato sincronizzazione e semaforo rosso * C.1 - Importazione modifiche * C.2 - Importazione nuove matricole * B - Esportazione matricole * D - Aggiornamento APSTATOSYN e semaforo verde Configurazioni possibili

Gruppo Parametro Note
abilita attiva-areaapp
areaapp cod-azienda
areaapp db-conn-string
areaapp agg-postgres-online
ass-mtr sel-dettaglio-impianto
ass-mtr gestione-db

Elaborazione Tipi di segnalazione: Vedi Tipi di segnalazione A - Controllo di esecuzione Vedi Controllo di esecuzione A.1 - Aggiornamento KEEP-ALIVE Per il momento non lo eseguiamo: il keep-alive viene tenuto aggiornato dal thread autonomo di aglancio; se il programma venisse chiamato in "tempo reale" dal programma di gestione, non necessita comunque del keep-alive. A.2 - Apertura A.2.1 Apertura tabelle Tentare l'apertura della tabella da sincronizzare: APASNMATRI Se fallita inviare una Segnalazione critica e chiudere. B.1 - Stato sincronizzazione e semaforo rosso (ex E - swa020) Sulla tabella APSTATOSYN, leggere il record relativo alla tabella/oggetto da sincronizzare "ASNMATRI"; se il record non esiste, crearlo impostando

Dato Contenuto
A_SYN_AZIENDA Codice azienda
A_SYN_TABELLA "ASNMATRI"
A_SYN_DA_GES_DATA 0
A_SYN_DA_GES_ORA 0
A_SYN_DA_ID_SINCRO 1
A-SYN-VERSIONE 2

Qui otterremo due informazioni importanti: * Data/ora ultima esportazione da gestionale a postgres (A_SYN_DA_GES_DATA e A_SY_DA_GES_ORA) * Prossimo ID sincronizzazione da memorizzare sulla tabella (A_SYN_ID_SINCRO) B.1.1 Gestione semaforo Se A-SYN-SEMAFORO = "A" significa che una APP per l'azienda sta aggiornando le matricole; quindi attendere 5 secondi. Ripetere il processo per 5 volte; dopo l'ultima se ancora il record non risulta libero, uscire dall'elaborazione. Quando abbiamo trovato il record libero alzare il semaforo

Dato Contenuto
A-SYN-SEMAFORO "G"

aggiornando di conseguenza il record C - Importazione aggiornamenti (ex B - swa020) Effettuare una query per estrarre tutti gli elementi aggiornati su APP: SELECT * FROM APASNMATRI WHERE a_amtr_azi = azienda AND a_amtr_agg_app = "S" AND a_amtr_id_dispositivo = 0) Gli elementi potranno essere: * Cancellati: se A_AMTR_VAL = "C" * Aggiornati: se A_AMTR_VAL <> "C" C.1 - Importazione elemento aggiornato o cancellato logicamente Fare una ricerca su ASNMATRI impostando:

Dato Contenuto
AMTR-ID A-AMTR-ID

In questa situazione il record dovrà esistere, altrimenti inserirlo. Quindi proseguire con l'aggiornamento C.1.1 - Aggiornamento ASNMATRI

Dato Contenuto
AMTR-TIP A-AMTR-TIP
AMTR-SN A-AMTR-SN (*)
AMTR-VAL A-AMTR-VAL
AMTR-ID-SOST A-AMTR-ID-SOST
AMTR-MERCE A-AMTR-MERCE
(k-merce-null se vuoto)
AMTR-MAT A-AMTR-MAT
("000000000000" se vuoto)
AMTR-CLI A-AMTR-ANA
AMTR-DST-TIP A-AMTR-DST-TIP
AMTR-DST-IDX A-AMTR-DST-IDX
AMTR-CONTATTO A-AMTR-CONTATTO
AMTR-UBICAZIONE A-AMTR-UBICAZIONE (*)
AMTR-PERSONA A-AMTR-PERSONA (*)
AMTR-TELEFONO A-AMTR-TELEFONO (*)
AMTR-N-INV A-AMTR-N-INV (*)
AMTR-GAR-INI A-AMTR-GAR-INI
(0 se = 10101)
AMTR-GAR-FIN A-AMTR-GAR-FIN
(0 se = 10101)
AMTR-PRODUTTORE A-AMTR-PRODUTTORE
AMTR-MARCA A-AMTR-MARCA
AMTR-FL-PROVV A-AMTR-FL-PROVV
AMTR-COD-NOM A-AMTR-COD-NOM
AMTR-FUORI-CONTRATTO A-AMTR-FUORI-CONTRATTO
AMTR-FL-IMPIANTO A-AMTR-FL-IMPIANTO
AMTR-TECNICO A-AMTR-TECNICO
AMTR-MODELLO-CERT A-AMTR-MODELLO-CERT (*)
AMTR-ID-MODELLO AMOD-ID
Trovato su ASNMODEL per il primo modello avente:


Vedi CERCA-MODELLO su SWA020
AMTR-ANNO-COSTR A-AMTR-ANNO-COSTR

(*) Questi dati devono essere parsati usando GESSTR, con operazione CONV-TESTO-IMPORTATO C.1.2 - Aggiornamento ASNMATR2 Cercare l'esistenza del record su ASNMATR2:

Dato Contenuto
AMTR2-ID A-AMTR-ID

Se il record non esiste inserirlo. Quindi proseguire con l'aggiornamento

Dato Contenuto
AMTR2-NOTE-POSTIT A-AMTR-NOTE-POSTIT (*)
AMTR2-PORTALE-CATASTO A-AMTR-PORTALE-CATASTO (*)
AMTR2-PORTALE-CHIAVE A-AMTR-PORTALE-CHIAVE (*)

(*) Questi dati devono essere parsati usando GESSTR, con operazione CONV-TESTO-IMPORTATO C.1.3 - Distinta base matricola Dato che per ora non è possibile riconoscere i record di distinta base aggiornati su APP, è necessario portarsi dietro l'aggiornamento delle distinte base Come prima cosa svuotare il contenuto della distinta lato gestionale: cancellare tutti i record di ASNMTRDB collegati alla matricola. Poi eseguire una query su APASNMTRDB, a parità di:

Dato Contenuto
A-AMDB-AZIENDA A-AMTR-AZIENDA
A-AMDB-ID-DISPOSITIVO A-AMTR-ID-DISPOSITIVO
A-AMDB_IDD-PROG A-AMTR-IDD-PROG
A-AMDB-ID A-AMTR-ID

Dopodichè importare i dati di ogni record di APASNMTRDB trovati su ASNMTRDB: asnmtrdb

Nome campo Contenuto
AMDB-ID-MTR A-AMDB-ID-MTR
AMDB-PROG A-AMDB-PROG
AMDB-MERCE A-AMDB-MERCE
AMDB-QTA A-AMDB-QTA
AMBD-SEQ A-AMBD-SEQ
AMDB-NOTE A-AMDB-NOTE
AMDB-QTA-SCALARE A-AMDB-QTA-SCALARE
AMDB-TARIFFA A-AMDB-TARIFFA
AMDB-SCONTO-1 A-AMDB-SCONTO-1

C.2 - Importazione nuove matricole (ex C su SWA020) Questa parte del processo dovrà essere strutturata in modo che esegua sempre l'importazione di nuove matricole senza padre, o con padre già codificato in modo assoluto (vedi Esempio). Scorrere APASNMATRI eseguendo una apposita query che permetta di restituire i record nuovi ma senza padre nuovo: * A-AMTR-AGG-APP = "S" * A-AMTR-ID-DISPOSITIVO > 0 * A-AMTR-IDD-PADRE = 0 Per ciascun record trovato eseguire i punti: * C.2.1 Inserimento nuova matricola * C.1.3 Importazione distinta * C.2.2 Rimozione record di input * C.2.3 Reinserimento record * C.2.4 Modifica record dove la nuova matricola è padre C.2.1 - Inserimento nuovo matricola Creazione di un nuovo record su ASNMATRI, dove:

Dato Descrizione
AMTR-ID Nuovo id progressivo
AMTR-SN A-AMTR-SN
Se vuoto, sarà forzato = AMTR-ID
AMTR-* Compilare tutti i dati della matricola a parità di nome presenti in APASNMATRI
Vedi C.1.1

Se A-AMTR-ID-PADRE > 0, eseguire una chiamata a ASN049, con i dati

Tipo Dato Contenuto
INPUT ASN049-CALLER Nome programma chiamante
ASN049-CALLED "ASN049"
ASN049-OPE "AGGIUNGI-MATR-BKG"
ASN049-ID-IMPIANTO A-AMTR-ID-PADRE
ASN049-ID-MTR Id matricola creata
OUTPUT ASN049-ESITO Restituirà "S" se l'operazione è stata eseguita con successo
ASN049-MSG Restituirà un eventuale messaggio di avvertimento o di errore (a seconda dell'esito), oppure nulla
Per il momento non emettiamo nessun messaggio

C.2.2 - Rimozione record di input Il record di origine da cui siamo partiti su APASNMATRI va cancellato. C.2.3 - Reinserimento record A questo punto, avendo l'area di working del record ancora piena, occorre inserirlo di nuovo dopo aver cambiato la chiave primaria:

Dato Contenuto
A-AMTR-AZIENDA Azienda
A-AMTR-ID-DISPOSITIVO 0
A-AMTR-IDD-PROG 0
A-AMTR-ID ID matricola appena inserita (AMTR-ID)

C.2.4 - Modifica record dove la nuova matricola è padre In questa fase molto importante andremo a sostituire l'id usato dalla APP per gestire il collegamento con il nuovo ID assoluto. Quindi dovremo eseguire una nuova query su APASNMATRI impostando:

Dato Contenuto
A-AMTR-AZIENDA Azienda
A-AMTR-IDD-PADRE Id dispositivo del record appena modificato
A-AMTR-IDD-PROG-PADRE Progressivo di dispositivo del record appena modificato

Per ciascun record trovato dovremo eseguire la sostituzione del padre:

Dato Contenuto
A-AMTR-AZIENDA Azienda
A-AMTR-IDD-PADRE 0
A-AMTR-IDD-PROG-PADRE 0
A-AMTR-ID-PADRE AMTR-ID

A questo punto dovremo in ogni caso ripetere la query iniziale descritta al punto "C" e ripetere il processo, finchè questa query non restituisce più record nuovi da inserire. B - Esportazione elementi aggiornati (ex A - SWA020) * ID SINCRO: gestito * Esportazione differenziale: gestita ma non ottimizzata: non esiste una chiave diretta per ottenere solo i record aggiornati * Cancellazione logica: non gestita In questa fase si dovrà tenere conto di * Limite record * Limite errori * "Esporta tutto" B.2 - Ricerca record da esportare B.2.1 Ricerca record da esportare

Tipo di elaborazione Condizione Cosa fare
Singolo record AGPRG-KEY <> " "
(conterrà AMTR-ID)
Si legge direttamente il record da aggiornare su ASNMATRI
Verrà eseguita se agg-postgres-online è attiva
Se viene sincronizzato un record cancellato, verrà effettuata la cancellazione logica
Esportazione totale AGPRG-ESPORTA-TUTTO = "S" Si scorrono tutti i record di ASNMATRI; ogni record va considerato, ignorando il controllo sulla variazione dei record
Esportazione standard Si scorrono tutti i record di ASNMATRI, considerando solo le matricole aggiornate dopo la data/ora ultimo aggiornamento
Pulizia AGPRG-OPE = "PULIZIA" Eseguire solo il giro di cancellazione logica B.3 quindi uscire

Per ciascun record valido si cercano tutti i record collegati: ASNMATR2 B.2.2 Verifica ed esportazione record Dopodichè si effettua la ricerca del record su APASNMATRI

Dato Contenuto
A-AMTR-AZI Codice azienda
A-AMTR-ID-DISPOSITIVO 0
A-AMTR-IDD-PROG 0
A-AMTR-ID AMTR-ID

Se non esiste, inserirlo. Se esiste, aggiornarlo l'aggiornamento del record deve avvenire solo se almeno un dato tra quelli da modificare è diverso. NB: se è stata richiesta l'esportazione completa (AGPRG-ESPORTA-TUTTO = "S") allora il record dovrà essere esportato a prescindere dal confronto Suggerimento Invece di popolare direttamente i dati del record di destinazione, portarli su delle copie in w/s. Al termine confrontare i dati sulla destinazione con la copia in w/s. Aggiornamento da ASNMATRI NB: se a questo punto A-AMTR-AGG-APP = "S" o "C", significa che nel lasso di tempo tra la fase di importazione e questa, qualcuno ha aggiornato il record su APP: quindi segnalare sul log e ignorare l'esportazione.

Dato Contenuto Confronto?
A-AMTR-AZIENDA Codice azienda
A-AMTR-ID-DISPOSITIVO 0
A-AMTR-IDD-PROG 0
A-AMTR-ID AMTR-ID
A-AMTR-TIP AMTR-TIP Si
A-AMTR-SN AMTR-SN (*) Si
A-AMTR-VAL AMTR-VAL Si
A-AMTR-ID-SOST AMTR-ID-SOST Si
A-AMTR-MERCE AMTR-MERCE Si
A-AMTR-MAT AMTR-MAT Si
A-AMTR-ANA AMTR-CLI Si
A-AMTR-DST-TIP AMTR-DST-TIP Si
A-AMTR-DST-IDX AMTR-DST-IDX Si
A-AMTR-CONTATTO AMTR-CONTATTO Si
A-AMTR-UBICAZIONE AMTR-UBICAZIONE (*) Si
A-AMTR-PERSONA AMTR-PERSONA (*) Si
A-AMTR-TELEFONO AMTR-TELEFONO (*) Si
A-AMTR-N-INV (*) AMTR-N-INV (*) Si
A-AMTR-GAR-INI AMTR-GAR-INI Si
A-AMTR-GAR-FIN AMTR-GAR-FIN Si
A-AMTR-PRODUTTORE AMTR-PRODUTTORE Si
A-AMTR-MARCA AMTR-MARCA Si
A-AMTR-FL-PROVV AMTR-FL-PROVV Si
A-AMTR-COD-NOM AMTR-COD-NOM Si
A-AMTR-FUORI-CONTRATTO AMTR-FUORI-CONTRATTO Si
A-AMTR-FL-IMPIANTO AMTR-FL-IMPIANTO Si
A-AMTR-TECNICO AMTR-TECNICO Si
A-AMTR-MODELLO-CERT AMTR-MODELLO-CERT Si
A-AMTR-MODELLO AMOD-NOME
Trovato su ASNMODEL:

Si
A-AMTR-ID-PADRE Ricerca su ASNMTRLK di un record avente:

Se esiste, impostare questo campo = AMLK-ID-PADRE
Si
A-AMTR-ID-IMPIANTO Come sopra, ma in questo caso si deve risalire fino alla radice dell'impianto Si
A-AMTR-DES-IMP Descrizione impianto/matricola
La descrizione viene composta in base alla configurazione sel-dettaglio-impianto
Si
A-AMTR-ANNO-COSTR AMTR-ANNO-COSTR Si
A-AMTR-FL-CANC " " Si
A-AMTR-ID-SINCRO Prossimo id sincro
A-AMTR-AGG-APP "N"

In questa fase tenere memoria di data+ora dell'ultimo record di input considerato. Per tutti i campi alfanumerici significativi (non flag, non valori fissi) effettuare il parsing tramite GESSTR, come già fatto negli altri programmi di sincronizzazione B.3 Verifica record cancellati Sulla tabella di origine ASNMATRI esiste il flag di cancellazione logica, ma può essere effettuata anche la cancellazione fisica di una matricola. Nel processo originale SWA020 non è previsto il giro di cancellazione, perchè potrebbe essere veramente poco performante. Ora pero' lo implementiamo qui. 1. Scorrere tutti i record di APASNMATRI per l'azienda 2. Ricerca, per ciascuno, del corrispondente record su ASNMATRI A questo punto la situazione potrebbe essere la seguente:

ASNMATRI
trovato?
A-AMTR-FL-CANC Cosa fare
Si "C" Aggiornare APASNMATRI impostando


Si " " Nessuna operazione
No "C" Nessuna operazione
No " " Aggiornare APASNMATRI impostando


B.9 - Aggiornamento id syncro Al termine dell'elaborazione, aggiornare il record APSTATOSYN:

Dato Contenuto
A_SYN_AZIENDA Codice azienda
A_SYN_TABELLA "ASNMATRI"
A_SYN_DA_GES_DATA Data/ora dell'ultimo record aggiornato
A_SYN_DA_GES_ORA
A_SYN_DA_ID_SINCRO Ultimo id sincro + 1
A-SYN-VERSIONE 2

Esempio

Abbiamo le seguenti matricole: * 0/0/100 * 0/0/101 * 34/1/0 inserita su APP * 34/2/0 inserita su APP * 34/3/0 inserita su APP * 34/4/0 inserita su APP * 34/5/0 inserita su APP * 34/6/0 inserita su APP Il processo di importazione dovrà ripetere il processo di importazione in due fasi: 1. Importazione matricole aggiornate (AGG-APP = "S" e ID-DISPOSITIVO = 0) 2. Importazione matricole nuove (AGG-APP = "S" e ID-DISPOSITIVO > 0 e IDD-PADRE = 0); per ciascuna matricola nuova trovata: 1. Creazione nuova matricola sul gestionale con attribuzione ID assoluto 2. Sostituzione dell'ID assoluto sul record con la matricola in esame 3. Ricerca delle matricole nuove dove IDD-PADRE/IDD-PROG-PADRE corrispondono a ID-DISPOSITIVO/IDD-PROG appena aggiornato, e sostituzione dell'ID 1. Se trovate matricole in cui la matricola elaborata era padre: ripetere il punto B interamente finchè non ci sono più matricole nuove 3. Importazione matricole nuove con padre "provvisorio" - arrivate dalla APP perchè create quando ancora hanno il padre "provvisorio" - (AGG-APP = "S" e ID-DISPOSITIVO > 0 e IDD-PADRE > 0); per ciascuna matricola nuova trovata: 1. Ricerca del padre con query dove si cerca un record di APASNMATRI con: 1. IDD-ORIG = IDD-PADRE 2. IDD-PROG-ORIG = IDD-PROG-PADRE 2. Creazione nuova matricola sul gestionale con attribuzione ID assoluto e impostazione del padre trovato 3. Modifica dei dati su APASNMATRI 4. Ripetere il caso B.III Esempio Prima di iniziare

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
34 1 0 0 0 100 34 1 S
34 2 0 34 1 0 34 2 S
34 3 0 34 1 0 34 3 S
34 4 0 0 0 100 34 4 S
34 5 0 34 4 0 34 5 S
34 6 0 34 4 0 34 6 S

B - Passata 1 - Fasi B.I e B.II Esamino la prima matricola nuova senza padre, e gli assegno l'id assoluto 102. La matricola verrà rimossa dal database, finchè non inizia l'esportazione

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
34 2 0 34 1 0 34 2 S
34 3 0 34 1 0 34 3 S
34 4 0 0 0 100 34 4 S
34 5 0 34 4 0 34 5 S
34 6 0 34 4 0 34 6 S

B - Passata 1 - Fase B.III Sostituisco l'id assoluto alle matricole dove è padre

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
34 2 0 0 0 102 34 2 S
34 3 0 0 0 102 34 3 S
34 4 0 0 0 100 34 4 S
34 5 0 34 4 0 34 5 S
34 6 0 34 4 0 34 6 S

B - Passata 2 - Fasi B.I B.II B.III Trovo una seconda matricola nuova senza padre: assegno l'id, e poi lo sostituisco nelle matricole dove è padre

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
34 2 0 0 0 102 34 2 S
34 3 0 0 0 102 34 3 S
0 0 103 0 0 100 34 4
34 5 0 0 0 103 34 5 S
34 6 0 0 0 103 34 6 S

B - Passata 3 - Fasi B.I B.II B.III Non esistono più matricole nuove presenti anche come "padre", quindi questa passata le elabora tutte quante insieme:

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
0 0 104 0 0 102 34 2 S
0 0 105 0 0 102 34 3 S
0 0 103 0 0 100 34 4
0 0 106 0 0 103 34 5 S
0 0 107 0 0 103 34 6 S

C -

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
0 0 104 0 0 102 34 2
0 0 105 0 0 102 34 3
0 0 103 0 0 100 34 4
0 0 106 0 0 103 34 5
0 0 107 0 0 103 34 6
34 7 0 34 1 0 34 7 S

Ricerca padre provvisorio:

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
0 0 104 0 0 102 34 2
0 0 105 0 0 102 34 3
0 0 103 0 0 100 34 4
0 0 106 0 0 103 34 5
0 0 107 0 0 103 34 6
34 7 0 34 1 0 34 7 S
34 8 0 34 7 0 34 8 S

Trovo che il padre è ID=102

ID-DISPOSITIVO IDD-PROG ID IDD-PADRE IDD-PROG-PADRE ID-PADRE IDD-ORIG IDD-PROG-ORIG AGG_APP
0 0 100 0 0 0 0 0
0 0 101 0 0 100 0 0
0 0 102 0 0 100 34 1
0 0 104 0 0 102 34 2
0 0 105 0 0 102 34 3
0 0 103 0 0 100 34 4
0 0 106 0 0 103 34 5
0 0 107 0 0 103 34 6
0 0 108 0 0 102 34 7 S

Estratto da documentazione interna ClickUp