02/11/2024 - surfgarden ha scritto:
…tabella DATI con campi N°Operazione…
Pessima scelta per il nome di un campo, vedrei molto meglio un “NrOperazione”, ad esempio.
DoCmd.OpenForm "Registrazione", acNormal, "", "", acAdd, acNormal
DoCmd.GoToRecord , "", acNewRec
Forse è solo una sensazione dovuta alla crescente intolleranza alla lettura ma mi sembra sempre più frequente l'uso dei due doppiapici per indicare un parametro mancante. Scrivendo così però non si dice che un parametro manca ma che è una stringa a lunghezza zero. Se no c'è niente da mettere, non si mette niente (lo so, sembra un rigiro di parole).
DoCmd.OpenForm "Registrazione", acNormal, , , acAdd, acNormal
DoCmd.GoToRecord , , acNewRec
e se non piacciono gli spazi vuoti c'è sempre la chiamata nominativa, che aiuta anche a ricordare il significato dei vari parametri
DoCmd.OpenForm "Registrazione", View:=acNormal, DataMode:=acAdd, WindowMode:=acNormal
DoCmd.GoToRecord Record:=acNewRec
(View e WindowMode avrebbero già di default acNormal, quindi potrebbero essere omessi ma non fanno danni, magari View è pure obbligatorio se la visualizzazione predefinita è Foglio Dati mentre ma credo che non sia questo il caso)
ho già alcuni campi con valori predefiniti su evento form_load
Controlli, non campi. I valori predefiniti nei campi sono inseriti nella definizione della tabella. Potrebbe essere utile vedere come utilizzi l'evento Load.
predefinito anche sul campo Data, ma variabile, relativo all'ultimo record presente sulla tabella DATI, o per lo meno, quello dell'ultima registrazione a maschera aperta
1) creando il recordset della tbl DATI su evento corrente:
Private Sub Form_Current()
If Me.NewRecord Then
Con riserva di verificare un'altra cosa, il 30/12/1899 che vedi è la data corrispondente a 0. Hai un valore di default inserito in struttura del controllo (non via codice) o nel campo a cui è associato?
"SELECT TOP 1, Data From DATI ORDER BY N°Operazione"
Questo recordset, che sarebbe il caso di provare prima come query classica, non dà la data dell'ultimo record ma del primo record in ordine crescente di N°Operazione, quindi probabilmente l'esatto contrario di quello che ti serve. Forse andrebbe meglio con
"SELECT TOP 1 Data From DATI ORDER BY [N°Operazione] DESC"
(la virgola dopo TOP 1 non serve, racchiudere N°Operazione tra parentesi quadre l'ho già detto prima)
Attenzione ad affidarti al N°Operazione se è un contatore (campo numerico autoincrementante) che hai definito PK. La chiave primaria non dovrebbe essere usata per ordinare i record quanto e solo per identificare in modo univoco, inquivocabile un record. Che quasi sempre poi rappresenti anche l'ultimo record inserito e che le eccezioni a questa cosa siano rarissime ci sta ma non sarebbe questo il suo uso (lo dicono gli esperti e io mi fido).
Verifica con un Debug.Print cosa restituisce il recordset
Debug.Print rs.Fields("Data").Value
in modo da vedere se dà zero, un Null o altro. Altrimenti lo zero (che poi diventa 30/12/1899 in data) non si sa se è il valore vero o il risultato nella funzione Nz()
2) Se invece inserisco la funzione DLast:
Dimentica DLast. Il nome è una sfida a non essere tratti in inganno ma una volta capito che non fa quello che si pensa passa la paura. Da sito Microsoft:
Use the DLast function to return a random record from a particular field in a table or query when you need any value from that field.
https://learn.microsoft.com/en-us/office/vba/api/access.application.dlast
Random record e non c'è bisogno di dire altro.
Il risultato con una data apparentemente inesistente è probabilmente dovuto alla conversione che fa automaticamente Access quando trova una data “italiana” e la trasforma nel formato “mese/giorno/anno”. Poco importa, DLast non si usa e se ci sono problemi di date assurde si guardano i casi concreti veri.
02/11/2024 - surfgarden ha scritto:
Ho infine provato questa terza via trovata sul web, adattandola al caso:
Set rs = CurrentDb.OpenRecordset("SELECT LAST (Data) AS ultimo FROM DATI;")
Immagino che anche quella sia stata inserita nell'evento Current della maschera. Se non imponi un criterio di ordinamento esplicito, come invece avevi fatto al punto 1), ti esponi al rischio che l'ultimo record del recordset non sia quello che ti interessa. Ovviamente qui l'ordinamento deve essere ascendente (che è quello predefinito) visto che poi cerchi l'ultimo. Alla fine è la stessa cosa del punto 1, solo “rovesciata”.
Da ultimo, ma forse sarebbe stata la prima cosa da scrivere: non lavori in multiutenza con accesso concorrente, vero?
Dopo averti demolito purtroppo devo lasciarti senza dare consigli in senso positivo, cioè come ottenere il risultato voluto. Torno quando posso.