Ok Alfredo, si … Nedi non ha tutti i torti, ho trovato comodo anche io utilizzare le classi per gestire i dati dal database.
Sono molto flessibili, e quando devi utilizzare gli stessi dati in giro per la tua applicazione vengono davvero comode.
Faccio un piccolo esempio la classe per gestire un semaforo sui record …
creo una classe vuota che chiamo tablelock
nella classe aggiungo due propriet, la prima la chiamo procredura, di tipo string, e la seconda un’array con il nome delle tabelle da bloccare, la chiamo tabelle() sempre di tipo string
creo un metodo che chiamo contructor
[code]Public Sub constructor(nomeprocedura as string)
procedura = nomeprocedura
End Sub
[/code]
e una seconda classe che chiamo destructor
Public Sub destructor()
if tabelle.Ubound > -1 then
// probabilmente non sono state sbloccate tutte le tabelle
self.unlock
end if
End Sub
In realt constructor istanziato quando dichiaro una nuova classe di tipo ‘tablelock’ e destructor quando la distruggo.
Il metodo ‘addtable’ per aggiungere nuove tabelle alla classe
[code]Public Sub addtable(tabella as String)
// aggiunge una tabella all’array delle tabelle bloccate
tabelle.Append(tabella)
End Sub
[/code]
Ora la classe che effettua il lock delle tabelle, in realt va a scrivere su una tabella del db l’elenco delle tabelle che sono in sola lettura…
[code]if tabelle.Ubound < 0 then
Return true
exit Function
end if
// blocca una o pi tabelle
// se una di queste gi bloccata mi fermo
// e ritorno false
If Not app.db.Connected() then
koalamsgbox(app.msg_errore_aperturadatabase + ": " + app.db.errormessage,“Blocco Tabelle”)
Return false
exit Function
else
// 21/05/2014 Mods per codicepage Mysql
if app.db.type = “MySQL” then app.db.SQLExecute(“SET NAMES utf8 COLLATE utf8_general_ci; SET CHARACTER SET utf8”)
Dim sql As String
sql = “”
sql = sql + “SELECT * from semafori "
‘sql = sql + “WHERE utente = '” + app.utente + "’ "
if tabelle.Ubound > 0 then
sql = sql + “WHERE tabella in (”
sql = sql + “’” + join(tabelle(),”’,’") + “’”
sql = sql + “);”
else
sql = sql + “WHERE tabella = '” + tabelle(0) + "’ "
sql = sql + “AND utente <> '” + app.utente + “’;”
end if
dim rsitem as RecordSet
rsitem = app.db.SQLSelect(sql)
if app.db.Error then
koalamsgbox("Errore durante la selezione dei dati dalla tabella semafori : " + app.db.ErrorMessage,“Blocco Tabelle”)
Return false
exit Function
else
if rsitem.eof then
// perfetto non ho blocchi !!!
// quindi andesso li metto
for contatore as integer = 0 to tabelle.Ubound
dim row as new DatabaseRecord
row.Column("utente") = app.utente
row.Column("procedura") = procedura
row.Column("tabella") = tabelle(contatore)
row.Column("host") = gethostname()
if app.db.type = "Sqlite" then app.db.sqlexecute("BEGIN Transaction;")
app.db.InsertRecord("semafori",row)
if app.db.Error then
koalamsgbox("Errore durante l'inserimento di un blocco nella tabella semafori : " + app.db.ErrorMessage,"Blocco Tabelle")
Return false
exit Function
else
app.db.Commit()
if app.db.Error then
koalamsgbox("Errore durante l'apporto delle modifiche alla tabella semafori : " + app.db.ErrorMessage,"Blocco Tabelle")
Return false
exit Function
end if
end if
next
Return true
exit Function
else
dim msg as string
msg = "Attenzione, alcune tabelle risultano impegnate : " + EndOfLine
while not rsitem.eof
msg = msg + "- " + rsitem.Field("utente").utfValue + ", Proc. : " + rsitem.Field("procedura").utfValue + EndOfLine
rsitem.MoveNext
wend
msg = msg + "attendere qualche secondo e riprovare"
koalamsgbox(msg,"Blocco Tabelle")
Return false
end if
end if
end if
[/code]
koalamsgbox un messaggio di dialogo …
E ora il metodo unlock per elimanare dalla tabella dei semafori le tabelle che non sono pi bloccate.
[code]
If Not app.db.Connected() then
koalamsgbox(app.msg_errore_aperturadatabase + ": " + app.db.errormessage,“Blocco Tabelle”)
exit sub
else
// 21/05/2014 Mods per codicepage Mysql
if app.db.type = “MySQL” then app.db.SQLExecute(“SET NAMES utf8 COLLATE utf8_general_ci; SET CHARACTER SET utf8”)
Dim sql As String
sql = “”
sql = sql + “DELETE from semafori "
sql = sql + “WHERE utente = '” + app.utente + “’ "
if tabelle.Ubound > 0 then
sql = sql + “AND tabella in (”
sql = sql + “’” + Join(tabelle(),”’,’”) + “’”
sql = sql + “);”
else
sql = sql + “AND tabella = '” + tabelle(0) + “’;”
end if
if app.db.type = “Sqlite” then app.db.sqlexecute(“BEGIN Transaction;”)
app.db.SQLExecute(sql)
if app.db.Error then
koalamsgbox("Errore durante lo sbloccaggio delle tabelle : " + app.db.ErrorMessage,“Blocco Tabelle”)
exit sub
else
app.db.Commit
if app.db.Error then
koalamsgbox("Errore durante l’apporto delle modifiche alla tabella semafori : " + app.db.ErrorMessage,“Blocco Tabelle”)
exit sub
end if
end if
end if[/code]
come la uso.
mettiamo caso devo emettere una fattura e st salvando i dati …
avr diverse tabelle ( tante ) che devo bloccare per impedire ad altri utenti che utilizzano lo stesso programma di andare a fare casini con i dati .
quindi
dim dlock as new tablelock(“Emissione Documenti”)
dlock.addtable(“testedocumenti”)
dlock.addtable(“righedocumenti”)
dlock.addtable(“movimentimagazzino”)
dlock.addtable(“giacenze”)
dlock.addtable(“righe”)
dlock.addtable(“teste”)
dlock.addtable(“saldi”)
dlock.addtable(“scadenze”)
dlock.lock
… metto il codice per salvare la mia fattura, creare i movimenti di contabili, inserire i movimenti di magazzino, aggiornare saldi contabili, saldi di magazzino e creare le scadenze
dlock.unlock
dlock = NIL
oppure semplicemente
dlock = NIL ( hai presente abbiamo un metodo destructor che si istanzia proprio adesso )
Esattamente cosa fa questa classe
se una delle tabelle aggiunte non sono impegnate e quindi non sono a sola lettura mi consente di salvare un nuovo documento
se in caso contrario mi avvisa, blocca l’operazione di salvataggio perch la tabella e/o le tabelle sono impegnate.