Newsgroup: it.comp.lang.visual-basic
Titolo: Contatore globale

Ciao, avrei qualcuno mi sa spiegare la soluzione piú semplice ed
efficiente per implementare un contatore globale a tutto un progetto VB
e il cui valore rimanga anche al termine dell'esecuzione del programma?
Ho pensato ad un file di testo di supporto, nel quale memorizzare il
contatore o anche ad un tabella con elemento singolo su DB. Quale
soluzione é piú efficente e come fare?
Grazie
Teo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 su DB.
dipende, imho, da alcuni fattori.
La soluzione più veloce è un file di testo: carichi il numero all'apertura del
programma in una variabile globale, e lo riscrivi prima della chiusura. Valuta
tu se può essere il caso di salvare il numero più volte durante l'esecuzione del
programma.
Questa soluzione non è però applicabile nel caso di una applicazione in
multiutenza, nel caso in cui questo contatore debba essere condiviso da più
client, nel qual caso bisognerebbe prima conoscere un po' la logica "di
business" (un altro termine utile per "riempirsi la bocca", molto utile quando
si presenta un progetto ad un cliente) del contatore stesso, per vedere quale
può essere la gestione corretta.
Anche la tabella con elemento singolo può essere utilizzabile, ma è ovviamente
consigliabile solo nel caso in cui l'applicativo si appoggi già ad un database
:-)
--
Salutoni
Sergio

Ok, dato che ho giá un DB di appoggio, provo con la tabella a elemento 
singolo.
Mi costruisco 1 procedura di Incremento del contatore ed una funzione 
Get di  ritorno del valore del puntatore.
Il problema é: qual'é la query da sottoporre al DB? Sicuramente 
sbaglio anche nei parametri del recordset, cosa devo usare per
modificare
un record all'apertura del recordset?. 
Il mio codice é questo, ma ovviamente non riesce a selezionare nessun 
record.
------------------
Public Sub IncrCount()
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
    If rsd.EOF Then
 
        rsd!Counter = rsd!Counter + 1
        rsd.Update
     End If
 
    rsd.Close
    Set rsd = Nothing
Exit Sub
End Sub
Public Function GetCount() As Long
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
    GetCount = rsd!Counter
    rsd.Close
    Set rsd = Nothing
Exit Function
End Function
-------------------------
Attendo lumi
Ancora un grande grazie


Il database ce l'ho.
Il problema é che non so selezionare il record-contatore. 
Ecco il codice.Utilizzo un procedura (IncrCont) per incrementare il
contatore e una funzione GetCont per ritornarne il valore quando mi
serve.
Probabilmente sbaglio anche i parametri del recordset, Dove sbaglio?
-----------------------------
Public Sub IncrCount()
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
s = s & "Where Counter = 0"
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
    If rsd.EOF Then
        rsd.AddNew
        rsd!Counter = rsd!Counter + 1
        rsd.Update
     End If
 
    rsd.Close
    Set rsd = Nothing
Exit Sub
End Sub
Public Function GetCount() As Long
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
s = s & "Where Counter = *"
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
    GetCount = rsd!Counter
    rsd.Close
    Set rsd = Nothing
Exit Function
End Function
------------
Ancora mille grazie


 s = s & "Where Counter = IL_NUMERO_DESIDERATO"

 > s = s & "Where Counter = IL_NUMERO_DESIDERATO"
Il problema é proprio quello: a priori non conosco il numero desiderato.
So che é dentro l'unico campo della mia tabella, ma non ne so il valore,
come fare per selezionare quell'unico record (sia in modifica per la
Incr,
che in lettura per la Get)?
Saluti


> s = s & "Where Counter = IL_NUMERO_DESIDERATO"
Il problema é proprio quello: a priori non conosco il numero desiderato.
So che é dentro l'unico campo della mia tabella, ma non ne so il valore,
come fare per selezionare quell'unico record (sia in modifica per la
Incr,
che in lettura per la Get)?
Saluti


 End Function
in questo modo avvresti subito il nuovo valore del contatore
--
Salutoni
Sergio

 Il problema é proprio quello: a priori non conosco il numero desiderato.
E ti sembra poco? Hal9000 direbbe "informazioni insufficienti".
hal1961 ... direbbe altro, dipende dalla luna...
Dando sfogo alle mie supposte capacità precognitive, non è che ti serve
sapere il numero più alto corrente?
In tal caso "Select Top 1 * From Contatore Order By Counter Desc" e avrai
nell'unico record (salvo Counter duplicati) il campo Counter maggiore.
Ehm..., non per spaventarti, ma che accade (o può accedere) se in quel
frattempo un'altra postazione fa la stessa cosa...?

 frattempo un'altra postazione fa la stessa cosa...?
No problem. Ho l'accesso esclusivo...in futuro peró il problema potrebbe
anche
presentarsi.
Adesso provo.
Grazie


Purtroppo non va, il contatore non conta. Cioé invece che incrementare 
il campo esistente ne aggiunge di continuo un altro mettendolo sempre a
"1".
che fare?


 che fare?
Facci vedere il codice.

 wrote in message
news:b577mk$25to6o$
1...@ID-174464.news.dfncis.de

Il codice é lo stesso postato da CSSoft:
-------------
Public Sub IncrCount()
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
        rsd.AddNew
        rsd!Counter = rsd!Counter + 1
        rsd.Update
        rsd.Close
 
    Set rsd = Nothing
Exit Sub
End Sub
Public Function GetCount() As Long
Dim s As String
Dim rsd As ADODB.Recordset
s = "Select * From Contatore "
    Set rsd = New ADODB.Recordset
    rsd.Open s, gCn, adOpenKeyset, adLockOptimistic
 
    GetCount = rsd!Counter
    rsd.Close
    Set rsd = Nothing
Exit Function
End Function
---------------------
Forse non va messo rsd.AddNew ???
Saluti


 Teo

 Io, sinceramente, non ho ancora capito cosa vuoi fare.
Dunque. ti spiego il contesto generale: devo produrre dei codici univoci
da associare a delle
etichette di elementi presenti sul DB.Per farlo ho pensato di crearmi
i codici prendendo la stringa della etichetta ed appendendo ad essa un
numero sempre
crescente.
Dapprima mi ero fatto una funzione random che mi appendeva un numero
qualsiasi all'etichetta,
poi ho visto che con gli interi puó sempre capitare di replicare un
numero ed avere
quindi dei doppioni.
Col contatore risolverei la questione. Il fatto é che il contatore deve
essere globale
per forza e deve avere memoria, cioé devere rimanere, una volta chiuso
il
programma.
GetCount ovviamente la richiamo quando faccio l'append della stringa.
Ok?
Teo


 programma.
Col "Select Top ..." che ti ho indicato prima (e che funziona su ogni
database) ottieni tutto: Il contatore è sul database (quindi è statico e non
si cancella quando spegni la macchina) e tu, ogni volta che ne devi
assegnare uno nuovo, ne recuperi il valore più alto e lo incrementi di 1...

 assegnare uno nuovo, ne recuperi il valore piů alto e lo incrementi di 1...
Ottimo! Col Select Top ho risolto.
Scusa del tempo che ti ho fatto perdere, grazie 1000 e alla prossima. 
