[Risolto] Valore predefinito ultimo record in maschera su campo Data

di il
17 risposte

[Risolto] Valore predefinito ultimo record in maschera su campo Data

Ciao a tutti. Ho cercato in varie discussioni la soluzione al problema, finendo solo per fare tanta confusione.

Nel mio db gestionale, ho una tabella DATI con campi N°Operazione (PK progressivo), Data, ecc...

Da una maschera principale Listato Operazioni, apro con un controllo una maschera Registrazione per inserire nuovi record

   DoCmd.OpenForm "Registrazione", acNormal, "", "", acAdd, acNormal
   DoCmd.GoToRecord , "", acNewRec

Su questa maschera Registrazione ho già alcuni campi con valori predefiniti su evento form_load

Ora, voglio aggiungere il valore 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.
Ho provato tre soluzioni trovate sul web, ma nessuna mi funziona:

1) creando il recordset della tbl DATI su evento corrente:


Private Sub Form_Current()
   If Me.NewRecord Then
       Dim rs As dao.Recordset
       Set rs = DBEngine(0)(0).OpenRecordset("SELECT TOP 1, Data From DATI ORDER BY N°Operazione", dbReadOnly, dbOpenDynaset)
       If Not rs.EOF Then Me.Data.DefaultValue = Nz(rs.Fields("Data").Value, 0)
       rs.Close
       Set rs = Nothing
   End If
End Sub


mi inserisce il valore 30/12/1899 laddove l'ultimo mio record ha data 19/10/2024

2) Se invece inserisco la funzione DLast: Me.Data.DefaultValue = Nz(DLast("N°Operazione", "DATI"), 0)
mi  riporta in epoca mussoliniana: 14/12/1922

La mia confusione poi aumenta dal fatto che, seguendo la guida Microsoft, la funzione DLast prevede come argomenti espr che dovrebbe identificare il campo su cui ricerco l'ultimo record, e dominio che dovrebbe identificare il recordset.
Così facendo, il valore di default dovrebbe essere = Nz(DLast("Data", "DATI"), 0) , il che mi riporta al 30/12/1899

Ho infine provato questa terza via trovata sul web, adattandola al caso:

Dim rs As Recordset
Dim valore as string
Set rs = CurrentDb.OpenRecordset("SELECT LAST (Data) AS ultimo FROM DATI;")
valore = rs("[ultimo]").Value
Me.Data = valore
Set rs = Nothing

Risultato:  msgbox "impossibile passare al record specificato", inserendomi comunque nel campo data il 04/10/2023

Inutile aggiungere che, oltre a mancare l'obiettivo, non trovo alcun senso alle date restituite

Ringrazio chiunque mi aiuti a fare un po' di luce nella mia grande ignoranza e confusione.

17 Risposte

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    Puoi spiegate perché usi la funzione Nz?

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    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.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - surfgarden ha scritto:


    Ora, voglio aggiungere il valore predefinito anche sul campo Data, ma variabile, relativo  all'ultimo record presente sulla tabella DATI,

    Questo non ha senso… se stai modificando un record del 1/1/2020 il default diventa 1/1/2020

    Idem se l'ultimo inserimento risale a giorni prima dell'attuale inserimento.

    Suppongo tu voglia inserire la data una sola volta e riproporla di default per i successivi inserimenti.

    Al primo inserimento la variabile datadefault la imposti ad oggi.

    L'utente modifica la data (supponiamo stoa lavorando dati del giorno prima) e al salvataggio (meglio un salva e continua) setti la variabile datadefault alla data del record salvato.

    Al nuovo record la data sarà quella della variabile.

    Al salva e chiudi la data ritorna a oggi.

    Se stai modificando bypassi la variabile (if variabilestato="nuovorecord" data=datadefault e il gioco è fatto.

    Niente lastrecord, niente nz, niente di tutto questo.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - Antony73 ha scritto:


    Puoi spiegate perché usi la funzione Nz?

    Nz l'ho appresa e utilizzata in altre situazioni su campi calcolati, per evitare errori su valori Null.
    Qui l'ho utilizzata perchè consigliata in più soluzioni sul web, tra cui dall'indiscutibile "sovrano mistico" Alex, che in cuor mio vivo e riverisco come "infallibile verità rivelata del VBA": qui il suo post, ma confermato uso di Nz anche qui

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - Philcattivocarattere ha scritto:


    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.

    Cia Phil. L'ho “ereditato” dal primo progetto del db, su esempio del PrimaNota di Alberto Fortunato (…impostazione orribile!: tbl Interrogativa con sql kilometriche per filtrare i record, ecc…) totalmente reimpostato da me negli anni…

       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).

    In realtà avevo una semplice macro:  Apri maschera… Vai a NuovoRecord.

    l'ho convertita in VBA, solo per ragionarci in questa discussione

       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.

    Certamente. Sono cbo. Chiedo venia per l'improprio erroneo linguaggio.  Sono questi:

    Private Sub Form_Load()
       Me.cboConto.DefaultValue = """Cassa"""
       Me.cboModalita.DefaultValue = """Cash"""
       Me.cboCategoria.DefaultValue = """."""
       Me.cboCausale.DefaultValue = """."""
    End Sub

    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? 

    No. Nessun valore predefinito. 

    Già da tempo desideravo quello dell'ultimo record tbl DATI, ma non ho ancora avuto la tenacia di cercarne il sistema di ottenerlo.

    "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"

    proprio come nel codice di Alex, ma non cambia il risultato

    (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()

    Ok. Faccio il debug e ti aggiorno appena posso.

    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.

    PROPRIO UNO DEI PRINCIPALI MOTIVI DI CONFUSIONE!!! 

    Ho letto anch'io sul supporto Microsoft che questa funzione di aggregazione utilizza un random: …È possibile usare le funzioni DFirst e DLast per restituire un record casuale da un campo specifico.. 

    ..già in programma di studiare e approfondire meglio 

     

    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?

    No, ho il db su OneDrive, ma lo utilizzo solo io anche dal notebook

    Dopo averti demolito purtroppo devo lasciarti senza dare consigli in senso positivo, cioè come ottenere il risultato voluto. Torno quando posso.

    Tranquillo Phil…anch'io ho difficoltà in questo weekend, e non posso dedicarmi. Grazie intanto dell'analisi .

    Solo una curiosità: ancora una volta tanta gentilezza e disponibilità da parte tua…

    …a che si deve il suffisso “cattivocarattere” ??

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - sihsandrea ha scritto:


    02/11/2024 - surfgarden ha scritto:


    Ora, voglio aggiungere il valore predefinito anche sul campo Data, ma variabile, relativo  all'ultimo record presente sulla tabella DATI,

    Questo non ha senso… se stai modificando un record del 1/1/2020 il default diventa 1/1/2020

    Idem se l'ultimo inserimento risale a giorni prima dell'attuale inserimento.

    Suppongo tu voglia inserire la data una sola volta e riproporla di default per i successivi inserimenti.

    Al primo inserimento la variabile datadefault la imposti ad oggi.

    Esatto. Se devo inserire 20 record di tre mesi fa, …icona calendario, indietro di tre, puntare il mouse sulla data… per ogni registrazione; oppure… ctrl+C ..nuovo record, posizionati sulla txt, ctrl+V … 

    A parte la “rottura di scatole”, delle volte mi scappa il mese sbagliato. ! …e poi l'errore mi sballa tutti i corrispettivi esportati in excel!

    L'utente modifica la data (supponiamo stoa lavorando dati del giorno prima) e al salvataggio (meglio un salva e continua) setti la variabile datadefault alla data del record salvato.

    Al nuovo record la data sarà quella della variabile.

    Al salva e chiudi la data ritorna a oggi.

    Se stai modificando bypassi la variabile (if variabilestato="nuovorecord" data=datadefault e il gioco è fatto.

    Niente lastrecord, niente nz, niente di tutto questo.

    Questo non l'ho capito. Ci studio e ragiono sopra.

    Tuttavia apprendere come impostare un valore di default su ultimo record di una tabella, non mi sembra obiettivo da schivare per vie traverse.

    Già non progredisco, perchè mi dedico a VBA pochi giorni l'anno. Se rinuncio ad imparare quelle poche volte che mi ci metto, tanto vale abbandonare l'hobby, e cercarmi un programmatore a pagamento… o forse confidare nei progressi delle AI.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - sihsandrea ha scritto:


    02/11/2024 - surfgarden ha scritto:


    Ora, voglio aggiungere il valore predefinito anche sul campo Data, ma variabile, relativo  all'ultimo record presente sulla tabella DATI,

    Questo non ha senso… se stai modificando un record del 1/1/2020 il default diventa 1/1/2020

    Direi proprio di no, o meglio dipende da cosa valorizza nella proprietà DEFAULTVALUE… se mette DMAX, anche se modifichi il primo record il DMAX su DefaultValue, e solo se è vera la proprietà NewRecord, prende e valorizza quello con la data più recente.

    Se il record è èstato salvato NewRecord=False e la proprietà DefaultValue viene skippata.

    P.S. per le date suggerisco DMAX e non DLAST… argomento trattato 25anni fa…(era riferito a quanto letto prima).

    Idem se l'ultimo inserimento risale a giorni prima dell'attuale inserimento.

    Suppongo tu voglia inserire la data una sola volta e riproporla di default per i successivi inserimenti.

    A costo di essere Ripetitivo.

    Basta mettere nella proprietà a DesignTime Valore di Default

    =DMAX("CampoData";"Dominio")

    Dove dominio è la tabella.

    Al primo inserimento la variabile datadefault la imposti ad oggi.

    L'utente modifica la data (supponiamo stoa lavorando dati del giorno prima) e al salvataggio (meglio un salva e continua) setti la variabile datadefault alla data del record salvato.

    Al nuovo record la data sarà quella della variabile.

    Al salva e chiudi la data ritorna a oggi.

    Se stai modificando bypassi la variabile (if variabilestato="nuovorecord" data=datadefault e il gioco è fatto.

    Niente lastrecord, niente nz, niente di tutto questo.

    Secondo me non hai provato quello che ho detto.

    Prova e facci sapere se quanto osservi è reale.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - Philcattivocarattere ha scritto:


    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()

      Set rs = DBEngine(0)(0).OpenRecordset("SELECT TOP 1 Data From DATI ORDER BY [N°Operazione] DESC", dbReadOnly, dbOpenDynaset)
             Debug.Print rs.Fields("Data").Value

    in immediata:
    23/10/2024
    Corretta!!!!!

    Però, anche se tolgo Nz() e 0 finale, in maschera continua a darmi il 30/12/1899 !!!

       If Me.NewRecord Then
          Dim rs As dao.Recordset
          Set rs = DBEngine(0)(0).OpenRecordset("SELECT TOP 1 Data From DATI ORDER BY [N°Operazione] DESC", dbReadOnly, dbOpenDynaset)
             ' Debug.Print rs.Fields("Data").Value
        If Not rs.EOF Then Me.Data.DefaultValue = rs.Fields("Data").Value
          rs.Close
          Set rs = Nothing
      End If

    ??? Non capisco!

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - @Alex ha scritto:

    A costo di essere Ripetitivo.

    Basta mettere nella proprietà a DesignTime Valore di Default

    =DMAX("CampoData";"Dominio")

    ….

    Ciao Alex.

    In quale proprietà ?  ..dove la trovo?

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    02/11/2024 - surfgarden ha scritto:


    02/11/2024 - @Alex ha scritto:

    A costo di essere Ripetitivo.

    Basta mettere nella proprietà a DesignTime Valore di Default

    =DMAX("CampoData";"Dominio")

    ….

    Ciao Alex.

    In quale proprietà ?  ..dove la trovo?

    April la maschera in modalità STRUTTURA(DesignTime), Seleziona il controllo associato alla tua data e guarda nelle proprietà trovi [Valore di Default] o predefinito… mi lascia molto perplesso il tuo dubbio non sei nuovo di Access…

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    03/11/2024 - @Alex ha scritto:

    April la maschera in modalità STRUTTURA(DesignTime), Seleziona il controllo associato alla tua data e guarda nelle proprietà trovi [Valore di Default] o predefinito… mi lascia molto perplesso il tuo dubbio non sei nuovo di Access…

    Ahh..Valore predefinito del controllo. 0k. Scusa. Non avevo mai sentito l'espressione Designe Time. Temevo fosse altro.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    La soluzione al problema è parzialmente risolta.

    =DMAX("Data";"DATI")   come valore predefinito del controllo finalmente non mi fa fare "..viaggi secolari nel tempo".
    Però scritto così mi restituisce l'ultima data presente in tabella. Non quella dell'ultimo record!
    Quindi, se, per esempio, ho inserito registrazioni fino a metà ottobre, e voglio inserire una cinquantina di registrazioni di maggio, sono punto e a capo.

    Provo intanto a sistemare da solo.

    Rimane poi la questione del codice che vorrei comprendere, anche se dovessi scegliere la via del valore predefinito sul controllo.
    Perchè il debug.print mi restituisce la data corretta, mentre la sub mi inserisce in maschera il 30/12/1899 ??

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    Mi sembra tu ti perda in una goccia d'acqua… però è vero che pochi sanno bene come funziona DEFAULTVALUE… spiego poi.

    DMAX, come tutte le funzioni di aggregazione sui domini supporta una WHERE Condition.

    Nella condizione metti il valore di PK che corrisponde all'ultimo record… qui, se la PK è è counter usa DLAST…

    =DMAX("TuaData";"TuoDominio;"IDPK=" & DLAST("IDPK";"TuoDominio"))

    Se vuoi usare il codice, devi farlo su LOAD e su AfterInsert… per come funziona la DEFAULTVALUE, oppure anche su AfterUpdate(del campo specifico) se il campo data è tra quelli modoficabili.

    NON LO PUOI FARE SU NEW RECORD in quanto nel momento che testi current e newrecord è true defaultvalue ha già lavorato… e tu resti a piedi.

    Facendolo su LOAD lo imposti quando apri la prima volta la Form, su AFTERINSERT, quando hai inserito un nuovo record, e su AfterUpdate quando hai modificato il campo Data.

    Se lo fai da codice tuttavia la sintassi deve prevedere oltre alla corretta valorizzazione una opportuna forzatura di tipo…

    Se valorizzi un testo devi duplicare i doppi apici

    ME!txtNome.DefaultValue="=" & chr(34) & "Pippo" & chr(34)

    Non ricordo solo se serve anche “=” all'inizio… dovrei provare ma puoi verificare tu.

    Se il default value si applica ad una data devi aggiungere #….# oltre che a formattare in accezione anglosassone.

    Questa cosa purtroppo non è scritta da nessuna parte… quindi prendila come dato di fatto.

    Questo è quanto… prova a seguire quanto esposto e vediamo.

  • Re: [Risolto] Valore predefinito ultimo record in maschera su campo Data

    03/11/2024 - @Alex ha scritto:


    Mi sembra tu ti perda in una goccia d'acqua… però è vero che pochi sanno bene come funziona DEFAULTVALUE… spiego poi.

    DMAX, come tutte le funzioni di aggregazione sui domini supporta una WHERE Condition.

    Nella condizione metti il valore di PK che corrisponde all'ultimo record… qui, se la PK è è counter usa DLAST…

    =DMAX("TuaData";"TuoDominio;"IDPK=" & DLAST("IDPK";"TuoDominio"))

    …Grazie Alex. Avevo già risolto utilizzando Dlast al posto di DMAX

    Non ho scritto subito perchè, oltre ad essere al volante, mi stavo scervellando sul codice: mi sono accorto per caso che la data corretta di default non solo risultava in finestra immediata, ma anche nel valore predefinito della DesignTime (..adesso inizio ad usarlo anch'io questo termine :)), solamente non incluso tra virgolette, com'è per tutti gli altri controlli con valore predefinito costante.

    Stavo proprio provando a concatenare il Me.Data.DefaultValue = rs.Fields("Data").Value in modo che il risultato mi uscisse tra virgolette. 

     Non ci riuscivo perche usavo solo “”" & “rs….ecc con errore di "manca fine istruzione”. 

    Tu mi hai ricordato del chr(34)!! Grazie!!!

    Una volta accettata la sintassi della stringa, avrei iniziato a provare cambiare l'evento.

    03/11/2024 - @Alex ha scritto:


    .

    NON LO PUOI FARE SU NEW RECORD in quanto nel momento che testi current e newrecord è true defaultvalue ha già lavorato… e tu resti a piedi.

    Facendolo su LOAD lo imposti quando apri la prima volta la Form, su AFTERINSERT, quando hai inserito un nuovo record, e su AfterUpdate quando hai modificato il campo Data.

    Se lo fai da codice tuttavia la sintassi deve prevedere oltre alla corretta valorizzazione una opportuna forzatura di tipo…

    Se valorizzi un testo devi duplicare i doppi apici

    ME!txtNome.DefaultValue="=" & chr(34) & "Pippo" & chr(34)

    Non ricordo solo se serve anche “=” all'inizio… dovrei provare ma puoi verificare tu.

    Se il default value si applica ad una data devi aggiungere #….# oltre che a formattare in accezione anglosassone.

    Questa cosa purtroppo non è scritta da nessuna parte… quindi prendila come dato di fatto.

    Questo è quanto… prova a seguire quanto esposto e vediamo.

    ….e tu mi confermi l'intuizione!!!

    Grazie mille Alex !!

Devi accedere o registrarti per scrivere nel forum
17 risposte