Creare una sezione da una tabella aggiuntiva


Le tabelle aggiuntive sono tabelle di dati collegate ad altre tabelle con una relazione padre/figlio. Ad esempio una tabella aggiuntiva potrebbero essere gli indirizzi di spedizione associati a un cliente. Ogni cliente può avere più indirizzi di spedizione e quindi per ogni record occorre poter associare altri record proveniente da un'altra tabella, in questo caso gli indirizzi.

Potrebbe essere necessario esporre i dati di queste tabelle aggiuntive all'interno di una sezione in modo da poter gestire o trovare i suoi record in modo più semplice.

In questo esempio vedremo come i database di Dtec gestiscono gli impianti sia come tabella aggiuntiva associata al cliente, sia come sezione direttamente esposta nella barra di navigazione.

Creazione della tabella aggiuntiva e dei campi necessari

Dato per scontato che siano già state create la tabella dei clienti, quella degli impianti e che quest'ultima sia stata imposta come tabella aggiuntiva occorrerà creare un campo di tipo sotto tabella che richiami la tabella clienti. 

 

Questo campo potrebbe sembrare una ripetizione visto che riportarà lo stesso nome del cliente della scheda attualmente aperta. Il suo compito in realtà è essenziale visto che servirà ad identificare il cliente dell'impianto quando questo record verrà aperto dalla sezione e quindi non direttamente dal cliente.

 

Inserito il campo procederemo poi alla creazione degli script che dovranno compilare e modificare automaticamente il valore di quest'ultimo.

 Gli script della tabella clienti

Il primo script che verrà creato sarà di tipo valore cambiato su scheda. Questo verrà utilizzato quando verrà selezionato il cliente (o cambiato) per riallineare tutti i valori del campo cliente sulla tabella impianti

if datafield.name() ~= "nome" then
    do return end
end
    
table = dataview.getatable("impianti")

rows   = table.getrows()
for i=1,table.countrows() do
    row = rows[i]
    if row.getvalue("cliente") ~= dataview.getvalue("nome") then
       row.setvalue("cliente",dataview.getvalue("nome"))
    end
end

Come si può vedere lo script agisce solo se è il campo nome ad essere stato modificato. In caso recupera la tabella degli impianti e riallinea i valori per ogni riga,

Il secondo script avrà il compito in post salvataggio di controllare i valori di ogni riga per garantire che siano allineati con il nome del cliente e con il suo id

table = dataview.getatable("impianti")
rows  = table.getrows()
for i = 1,table.countrows() do
    row = rows[i]
    if row.getvalue("gguid_cliente") ~= dataview.getvalue("gguid") or row.getvalue("cliente") ~= dataview.getvalue("nome") then
       row.setvalue("gguid_cliente", gguid_cliente)   
       row.setvalue("cliente", dataview.getvalue("nome"))
       row.save()
       database.addsyncbox("impianti",row.getvalue("gguid")) 
    end    
end

program.refreshsection("impianti")

Lo script sulla tabella impianti

Su questa tabella occorrerà creare uno script di tipo post salvataggio. Questo creerà il collegamento effettivo tra il record impianti e il suo cliente attraverso il match che viene eseguito sulle tabelle aggiuntive. Ossia tra il campo gguid e il campo gguidp.

gguid_cliente = dataview.getvalue("gguid_cliente")

if (gguid_cliente ~= nil and gguid_cliente ~= "") then
    
    if dataview.getvalue("gguidp") ~= gguid_cliente then
        dataview.setvalue("gguidp", gguid_cliente)
       
        database.setsql("UPDATE impianti set gguidp='" ..gguid_cliente.."',tid=" .. tostring(utility.tid()) .. " WHERE gguid='" .. dataview.getvalue("gguid") .. "'")
        database.addsyncbox("impianti",dataview.getvalue("gguid"))

        program.refreshsection("impianti")
    end
    
end

In questo modo, creando un nuovo impianto direttamente dalla sua sezione e selezionando il cliente. Aprendo la scheda di quest'ultimo l'impianto sarà presente nella tabella aggiuntiva.

Creazione sezione impianti

Come ultima cosa occorrerà creare la sezione che faccia riferimento alla tabella impianti per poterli modificarli e aggiungerli anche senza dover aprire le schede dei clienti.


Commenti