Newsgroup: it.comp.lang.visual-basic
Titolo: [OT Access2000] - Trovare il cod ice più grande

Ciao,
ho un DB dove ho dei numeri progressivi "misti" tutti all'interno di una
stessa "colonna" di una tabella.
le serie sono di questo tipo nessuna delle posizioni è completa, dovrei
ricercare il record più grande per poi avere la possibilità di sapere subito
come "battezzare" il prossimo, che inserirei a mano
da 01/0001 a 01/9999
da n01/0001 a n01/9999
da a01/0001 a a01/9999
LAA/MM/PP (A=Anno, M=Mese, P= Progressivo)
Mi trovo in difficoltà in quanto non capisco come far fare la
discriminazione, bastano delle query ordinate in maniera decrescente
chiedendo di mostrare il primo record in una TXTBox?
Grazie per le risposte pazienti
Excelsior,
Stefano

LAA/MM/PP (A=Anno, M=Mese, P= Progressivo)
Il fatto che visivamente o come riferimento utilizzi un determinato
formato, non implica necessariamente che i record nel db debbano per
forza esser indicizzati per quello stesso campo...
ad esempio potresti benissimo eliminare la barra (che sai a che
posizione si trova) e magari sostituire il primo carattere (che se ho
capito bene è alfanumerico ma mi è sfuggito se vi è una relazione o una
successione anche in questo o se magari indica qualcos'altro) e
sostituirlo... che ne so, con il codice ascii del carattere formattato a
2 o 3 cifre, ad esempio...
L'importante è che la chiave sia univoca e sia ordinabile con lo stesso
criterio di quella convenzionale...
Ciao,
Moreno
-- 
sirri at morenosoft dot com
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

Moreno
Ho anch'io un problema analogo. I prodotti che memorizzo hanno un
codice che ricorda a quale categoria appartengono. Ad es. VI01, VI02,
VI03 sono vini, FR01, FR02, FR03 sono frutti. Quando inserisco un
nuovo prodotto ho bisogno di sapere qual e' il codice piu' alto di
quel tipo. Se ad esempio i vini vanno da VI01 fino a VI27 ho bisogno
di saperlo per dare al prossimo prodotto della categoria vini il
codice VI28, seguendo un certo ordine ed evitando l'inserimento di una
chiave duplicata.
Saluti.
-- 
ing. Franco Varoli
fRANC...@tin.it
Per scrivermi togliere RANCO

 ha scritto


sistema qui sopra dovrebbe essere sufficiente.
Attualmente la maschera prevede l'immissione del campo IDProdotto
(chiave primaria) e poi quella del campo TipoPr (Tipo del prodotto,
chiave esterna della tabella TipiProdotti). Supponendo di anticipare
l'immissione del campo TipoPr a quella del campo IDProdotto, potrei
inserire un pulsante di comando che lancia una query di ricerca.
Puo' andare questa query?
SELECT TOP1 IDProdotto
FROM (SELECT IDProdotto
FROM Prodotti
WHERE TipoPr LIKE Me.[CasellaCombinata22].Value)
ORDER BY IDProdotto DESC.
CasellaCombinata22 è il nome del controllo della maschera che permette
di selezionare il tipo del prodotto.


 VI03 sono vini, FR01, FR02, FR03 sono frutti.
supponendo che l'id sia assegnato in automatico e non dall'utente,
dato che con la query ottieni un rs di una sola riga, direi tu possa
fare
    n = val(right(rs!idprodotto,2))+1
    newid=cc22 & format(n,"00")
    txtNewId=newid
almeno, in vb proverei qc del genere. in access che aria tira ?
ciao, j.

"Stefano Amadei" <ama...@NAPOLIGENOVAIMOLA.it> ha scritto nel messaggio
news:V4VA9.31503$Zn2.8...@twister1.libero.it...

Non ho capito esattamente il formato delle stringhe ma farei + o - cosi':
(non ho testato il codice quindi se ci sono errori chiedo perdono)
Function GetNextID() as string
    Dim n as Long
    Set RS = DB.OpenRecordset("SELECT MAX(VAL(MID(campo,4))) FROM tabella")
    n=RS(0)+1
    RS.close
    GetNextID="String$(4-len(trim(n))),"0") & trim(n)
End Function

almeno, in vb proverei qc del genere. in access che aria tira ?
Fino ad ora l'ID era assegnato dall'utente, ma mi hai dato un'idea
fantastica. L'utente sceglie il tipo e il codice compone l'ID nel modo
che hai indicato. Credo che funzionera'.
Chiedo un paio di chiarimenti:
Nella tabella Prodotti l'IDProdotto e' un campo testo. La tua n e' una
variabile Integer. E newid? dovrebbe essere String.
Che cos'e' txtNewID? se e' il nome del controllo nel quale l'utente
assegna l'ID, poiche' il controllo e' associato ad un campo della
tabella per me dovrebbe essere IDProdotto. O sbaglio? ed anche
txtNewId o IDProdotto che dir si voglia e' String.


 txtNewId o IDProdotto che dir si voglia e' String.
si', e' lui. va benissimo e forse anche meglio idprodotto.
nb: di solito nei campi visualizzati ma da non modificare mettevo dei
label, piu' leggeri se il prog e' grosso, quindi lblIdProdotto. pero'
un textbox con ,locked=true non e' modificabile ma e' selezionabile e
copiabile in clipboard, a differenza delle eticehtte, e ho scoperto
che e' piu' comodo di quanto possa sembrare.
qualunque cosa che ti possa visualizzare la stringa ricomposta va
comunque bene. sol che l'utente non possa modificarla :)
ciao, j.

importanti: chiavi primarie ed esterne, database, nutella, ecc.
nutella? non l'ho capita.
Ho risolto e credo che funzioni a dovere. Nella maschera ho fatto
precedere la scelta della categoria a quella del codice (la cosa non
sara' forse ortodossa ma quel che conta e' il risultato). Scelta la
categoria del prodotto parte la routine che va a leggere l'ultimo
codice, lo incrementa e lo piazza nella casella di testo IDProdotto
dove l'utente fino a questo momento immetteva il codice a mano. Poi il
Focus si sposta sul campo successivo (descrizione).
Invio tutta la routine per avere un parere sulla sua ottimizzazione e
magari dare un contributo al thread (il subject parla chiaro: si
voleva trovare il codice piu' grande).
Private Sub CasellaCombinata22_AfterUpdate()
Dim ctl1 As Control
Dim cmd1 As Command
Dim rst1 As Recordset, newid As String
Dim n As Integer
On Error GoTo RecordNonTrovato:
'Configura un riferimento al controllo della casella combinata.
Set ctl1 = Me.Controls("CasellaCombinata22")
'Crea e definisce un comando
'Cerca nella tabella Prodotti quei record che appartengono alla
categoria visualizzata nella casella combinata
    Set cmd1 = New ADODB.Command
    With cmd1
        .ActiveConnection = CurrentProject.Connection
        .CommandText = "SELECT [Prodotti].[IDProdotto] FROM Prodotti "
& _
            "WHERE [Prodotti].[TipoPr] = '" & ctl1.Value & "'" & _
            "ORDER BY [Prodotti].[IDProdotto]"
        .CommandType = adCmdText
        .Execute
    End With
'Crea il recordset che potrebbe essere vuoto
'se la categoria non contiene ancora prodotti
'e si sposta sull'ultimo record (se essiste)
    Set rst1 = New ADODB.Recordset
    rst1.Open cmd1, , adOpenKeyset, adLockOptimistic
    rst1.MoveLast
 
'Qui inizia il pezzo di codice da te proposto
n = Val(Right(rst1!IDProdotto, 2)) + 1
newid = Left(Me.CasellaCombinata22, 2) & Format(n, "00")
'Inserisce il codice trovato al posto giusto
'e al momento giusto 8.)
Me.Codice = newid
'Sposta il focus al campo successivo
Me.Descrizione.SetFocus
FineCodice:
'Chiude la connessione e la pone uguale a nothing
'ed esxce dalla routine
    cnn1.Close
    Set cnn1 = Nothing
    Exit Sub
RecordNonTrovato:
'Trap degli errori se il record non esiste.
    If Err.Number = 3021 Then
        'sposta il focus sul campo codice
        'per permettere all'utente di inserirne uno
        'ad es. XX01   
        Me.Codice.SetFocus
        Resume FineCodice
    End If
End Sub


 'e al momento giusto 8.)
 questa e' sempre un'ottima idea :)
ciao, j.

 questa e' sempre un'ottima idea :)
No, non lo e' per niente. Ho parlato troppo presto. Infatti ci sono
diversi problemi che non sto a precisare per cui credo che la cosa
migliore sia non andare ad aggiornare automaticamente il codice del
prodotto (potrebbero succedre dei pasticci ad es. sui prodotti che
hanno gia' il codice) ma visualizzare il codice successivo disponibile
in una semplice msgbox aperta da un pulsante di comando. Staremo a
vedere.
