Newsgroup: it.comp.appl.access
Titolo: COMPLETARE UN CAMPO NUMERICO NEI VALORI NULL

Ciao sono Fanciullo,
Ho un listino alimenti. Ho un campo descrizione alimenti. Ho un campo dove è
registrato un codice numerico integer. Per alcuni alimenti ho il codice per
altri il valore nel campo codice è null.
CODICE
123
13
NULL
156
189
NULL
NULL    eccetera
   PROBLEMA: come faccio a riempire in valori null con dei numeri casuali
(cmq senza creare doppioni).
Grazie per l'aiuto

 (cmq senza creare doppioni).
In una volta sola od ogni volta che lo decidi, puoi richiamare una funzione VBA che riempie i campi 
null magari partendo dal valore massimo +1 e via via ad incrementare.
Una funzione potrebbe essere:
-----------------------------------------
Function RiempiNull()
Dim db As DAO.Database
Dim rcd As DAO.Recordset
Dim Max As Long
Set db = CurrentDb
Set rcd = db.OpenRecordset("SELECT * FROM [Listino Alimenti] WHERE (IsNull([Listino 
Alimenti].Codice));", dbOpenDynaset)
Max = DMax("Codice", "Listino Alimenti")
Do While Not rcd.EOF
    Max = Max + 1
    rcd.Edit
    rcd.Fields![Codice].Value = Max
    rcd.Update
    rcd.MoveNext
Loop
rcd.Close
Set rcd = Nothing
db.Close
Set db = Nothing
End Function
-------------------------------------
La copi su un modulo standard, ti assicuri che sia settato il riferimento DAO 3.6 
(Strumenti>Riferimenti), esegui la compilazione (Debug>Compila), salvi e chiami la funzione magari 
con una macro se non sei pratico.
Fammi sapere, casomai se nn riesci ti do una mano.
Michele

>
beh, la cosa si fa molto più semplice.
Se hai un controllo di nome "CtrlCodice" e sei con il cursore record in un record dove il valore di 
questo controllo (associato al campo codice) è nullo, se ti crei un tasto puoi aggiungere il numero 
progressivo al massimo che hai nel campo codici.
Su evento Click del tasto scrivi
If IsNull(Me!CtrlCodice.value) Then
    Me!CtrlCodice.Value=Dmax("Codice", "Listino Alimenti")+1
End If
Praticamente se il contenuto del controlo è nullo, allora trova il massimo per il campo Codice e lo 
va ad inserire nel controllo aumentato di 1.
Fammi sapere, non ho provato neanche questa.
Michele 

 Ciao Michele,
ha funzionato alla perfezione, scusa se ti cerco di sfruttarti
ancora....(visto che sei abile....eheh)
allora ti dico subito che questo listino è per una scuola alberghiera dove
insegno (cucina). Quindi no profit.
PROBLEMA ULTERIORE  nei valori di codice esistenti  ci sono dei buchi. Mi
spiego
Mancano valori per esempio dall' 1 al sessanta
Mancano valori dall 400 al 500
Come potrei fare per assegnare un range che vada (esempio) dal numero 400
fino al 500?
Ti viene in mente qualcosa? ....per ora siamo partiti dal valore Dmax
presente nel campo.
Grazie Vito

 Grazie Vito
Guarda, in questo caso non sto qui a scrivereti una funzione, perchè per me risulterebbe più comodo 
aver sottomano un esempio di db dove poter collaudare al volo la funzionalità del tutto.
In linea di principio, un problema di questo tipo si potrebbe risolvere aprendo un recordset in sola 
lettura di tutti i campi non null ordinati per codice, e un recordset in scrittura per i valori solo 
Null.
Con due cicli che lavorano assieme e una variabile counter di supporto, si procede nella lettura (i 
record sono ordinati in crescendo) dei codici e al primo buco si riempiono i Null sfruttando il 
self_contatore fino ad arrivare al numero prima del record a cui ci si era fermati perchè si era 
verificato il buco. In questa maniera vengono utilizzati tutti i numeri senza lasciar buchi.
Però una funzione così non posso (anche se l'ho già fatto in precedenza) spiaccicartela in un NG in 
quanto penso di andare un pò contro ai dettami del NG stesso.
Questa è più una funzione da Sito Comune. C'è niente a proposito sul Sito Comune?
Michele

 questo potresti aggiungerlo no?  grazie  Vito
Basta cha al posto delle righe scritte qui sopra tu metta:
----------------------
For Max = 50 to 100
    rcd.Edit
    rcd.Fields![Codice].Value = Max
    rcd.Update
     rcd.MoveNext
Next Max
--------------------
Se vuoi fare una cosa più pratica, se invece di
Function RiempiNull ()
Scrivi
Function RiempiNull (ByVal Inf as Long, byVal Sup as Long)
Richiamando la funzione puoi inserire i due argomenti inf e sup, basta che tu li metta al posto di 
50 e 100
----------------------
For Max = Inf to Sup
    rcd.Edit
    rcd.Fields![Codice].Value = Max
    rcd.Update
     rcd.MoveNext
Next Max
--------------------
Occhio però a non violare la chiave primaria con doppioni, devi essere sicuro di quel che passi, 
altrimenti la funzione si pianta, non è fatta per gestire questo tipo di errore.
Michele

 Grazie Michele argomento completato...ho imparato molto

> Grazie Michele argomento completato...ho imparato molto
Molto... e anche tutto spero...
Si beh poi ci sono altre trecentomila sfaccettature diverse da applicare..... Quando hai imparato 
bene un metodo che ti consente di mettere le mani dappertutto, ti conviene farne tesoro.
Michele