Formattazione stringa per anteporre zeri ad un numero

Anonimo
2019-07-22T18:19:24+00:00

Ciao a tutti,

come sempre, quando sono in difficoltà cerco consiglio ed aiuto a Voi esperti.

Ho creato, nell'amnbito del mio dbase, un campo testo (NUM_CERTIFICATO) dove registro i certificati di pagamento dei lavori eseguiti.

La lunghezza del campo è impostata su 3, perchè, la numerazione progressiva dei certificati, deve essere nel formato 001 .....999.

Nella runtime per la numerazione progressiva ottenuta tramite codice VBA con valore (NUM_CERTIFICATO = N_CERT + 1) tutto funziona bene avendo adottato format (NUM_CERT, "000") e format (NUM_CERTIFICATO, "000").

Quello che non riesco a ottenere è registrare il valore ottenuto dal codice Vba (NUM_CERTIFICATO) in formato "000" nella tabella come valore 001...999.

Nella simulazione tutto funziona correttamente ma quando vado a verificare nella tabella anzichè essere stato registrato valore 067 mi registra 67.

Come posso rimediare a questo incoveniente e ottere anche nella tabella il valore 067???

Grazie

Luca

Allego immagini:

immagine 1 (messaggio dell'ultimo certificato registrato)

Immagine 2 (Sottomaschera Certificati con il numero del certificato inserito in formato "67" e non in formato "067"

Immagine 3 (Estratto della tabella)

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-24T09:37:10+00:00

ciao Luca,

quella che segue:

[…]

Me.NUM_CERTIFICATO= Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]"), 0) + 1, "000")

[…]

e' la soluzione che permette la numerazione progressiva assoluta indipendentemente da date, cantiere, numerazione progressiva nel senso che generera' buchi nella progressione come da tua immagine del cantiere36 e cioe' 004, 009, 012, 019.

Questa invece:

[…]

Me.NUM_CERTIFICATO = Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]", "[id_cantiere]=" & Me.Parent!ID_CANTIERE), 0) + 1, "000")

[…]

numerazione legata al cantiere in tal modo, sempre riferimento al cantiere 36 avrai 001, 002, 003, 004 e non 004, 009, 012, 019.

A te la scelta, avevo lasciato quest'ultima perche' cosi' avevo inteso…!

Quindi, il messaggio deve mostrare il progressivo assoluto e su questo siamo allineati, se e' lo stesso per quanto alla numerazione adotterai la prima di questo post, che tecnicamente e' priva di clausola where.

ciao e buona giornata.

Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-24T07:55:32+00:00

ciao Luca,

allora…..se la numerazione progressiva deve essere senza buchi, come ti dicevo in precedenza, quello che mostri del cantiere 36 non e' corretto perche' con la correzione del codice in :

    Me.NUM_CERTIFICATO = Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]", "[id_cantiere]=" & Me.Parent!ID_CANTIERE), 0) + 1, "000")

la numerazione diventa 001,002,003,004.

E' questo che vuoi ottenere oppure una numerazione progressiva INDIPENDENTE dal numero cantiere ? se si bisogna ripristinare la soluzione precendente:

Me.NUM_CERTIFICATO= Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]"), 0) + 1, "000")

Ancora.

Il numero e la data precedentemente acquisita da mostrare nel messaggio e' relativa al cantiere - nel caso sopra citato il messaggio deve mostrare che il certificato ha il progressivo 004 e relativa data- OPPURE deve essere mostrato l'ultimo progressivo acquisito in senso generale?

Se la seconda, testa quanto segue :

Private Sub Form_BeforeInsert(Cancel As Integer)

Dim rst As DAO.Recordset

Set rst = DBEngine(0)(0).OpenRecordset("SELECT  Max(CERTIFICATI.NUM_CERTIFICATO) AS mCert, Max(CERTIFICATI.DATA_CERTIFICATO) AS mData FROM CERTIFICATI;", 4)  'dbOpenSnapshot

With rst

    Me.NUM_CERTIFICATO = Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]", "[id_cantiere]=" & Me.Parent!ID_CANTIERE), 0) + 1, "000")

    If .RecordCount Then

        .MoveLast

        If VBA.MsgBox(prompt:="L'ultimo Certificato registrato ? il n. " & .Fields("mCert") & " in data " & Format$(.Fields("mData"), "dd/mm/yyyy") & "  Continuare?", _

                      buttons:=vbQuestion + vbCritical + vbYesNo, _

                      title:="Warning") = vbNo Then

            Me.Undo

            Cancel = True

        End If

    End If

    .Close

End With

Set rst = Nothing

End Sub

Facci sapere.

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-24T06:50:31+00:00

ciao Luca,

quindi se ho capito bene, la progressione della numerazione relativa ai certificati non e' legata alla data, ma al cantiere quindi.

Nel senso che cambiando il cantiere la numerazione deve essere progressiva e senza "buchi".

del tipo vedi la sequenza delle tre immagini che seguono in cui appunto la numerazione si ripete, ma e' consecutiva e legata al cantiere :

e

se cosi', testa quanto segue :

Private Sub Form_BeforeInsert(Cancel As Integer)

With Me.RecordsetClone

    Me.NUM_CERTIFICATO = Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]", "[id_cantiere]=" & Me.Parent!ID_CANTIERE), 0) + 1, "000")

    If .RecordCount Then

        .MoveLast

        If VBA.MsgBox(prompt:="L'ultimo Certificato registrato ? il n. " & .Fields("NUM_CERTIFICATO") & " in data " & Format$(.Fields("DATA_CERTIFICATO"), "dd/mm/yyyy") & "  Continuare?", _

                      buttons:=vbQuestion + vbCritical + vbYesNo, _

                      title:="Warning") = vbNo Then

            Me.Undo

            Cancel = True

        End If

        .Bookmark = Me.Recordset.Bookmark

    End If

End With

End Sub

vedi modifica in grassetto.

Facci sapere.

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-23T19:39:21+00:00

ciao Luca,

si intendo l'origine dati che effettivamente coindice con il recordSetClone.

boh..! non capisco cosa non vada...se hai voglia prova a pubblicare una demo con qualche dato giusto per prova.

Nessun dato sensibile mi raccomando.

Attendiamo news.

Ciao e buona serata.

Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-23T15:16:31+00:00

ciao Luca,

il codice lavora con il recordSetClone della form supponendo che coincida con quello in cui ricercare il progressivo maggiore.

Nel tuo scenario le cose non stanno in tal modo.

Quale e' il recorSource della form o subForm che dir si voglia?

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-23T13:56:32+00:00

ciao Luca,

non che abbia capito tanto, sorry....

la Dmax impostata nel codice restituisce gia' quanto richiesto dalla tabella certificati indipendentemente da altre condizioni che infatti non ci sono.

Da qui la domanda precedente se fosse legato, il numero progressivo, alla data.

Per come e' impostata, ripeto, l' estrazione viene effettuata dal dominio di riferimento senza condizioni.

Facci sapere.

Apporterei anche questa modifica :

Me.NUM_CERTIFICATO= Format$(Nz(DMax("val([NUM_CERTIFICATO])", "[CERTIFICATI]"), 0) + 1, "000")

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-23T09:26:02+00:00

ciao Luca,

visto che la mschera e' continua, suggerirei quanto segue :

Private Sub Form_BeforeInsert(Cancel As Integer)

With Me.RecordsetClone

    Me.NUM_CERTIFICATO= Format$(Nz(DMax("[NUM_CERTIFICATO]", "[CERTIFICATI]"), 0) + 1, "000")

    If .RecordCount Then

        .MoveLast

        If VBA.MsgBox(prompt:="L'ultimo Certificato registrato ? il n. " & .Fields("NUM_CERTIFICATO") & " in data " & .Fields("DATA_CERTIFICATO") & "  Continuare?", _

                      buttons:=vbQuestion + vbCritical + vbYesNo, _

                      title:="Warning") = vbNo Then

            Me.Undo

            Cancel = True

        End If

        .Bookmark = Me.Recordset.Bookmark

    End If

End With

End Sub

ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-23T08:05:22+00:00

Ciao Luca,

se ho capito bene il problema memorizza il campo con

right("000" & tuoCampo,3)

Ciao Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-22T19:58:43+00:00

ciao Luca,

[…]

in merito al precedente problema, avevo già messo risolto al tuo primo suggerimento, ma ho contrassegnato anche le altre risposte come utili.

[…]

contrassegna gentilmente anche la o le risposte come risposte così consideriamo il 3d chiuso altrimenti resta aperto. grazie.

[…]

N_CERT = DMax("NUM_CERTIFICATO", "CERTIFICATI")

D_CERT = DMax("DATA_CERTIFICATO", "CERTIFICATI")

Quindi il tuo suggerimento lo devo inserire nella runtime

o dove?

[…]

il progressivo è legato alla data? siccome le tabelle sono set e per definizione prive di ordinamento serve una correzione alla soluzione che ti ho proposto, ma prima di andare a casaccio o a tentivi, meglio accertarsene.

In ogni caso non serve tutto il codice che hai impostato, definendo l'espressione suggerita come valore predefinito hai la progressione che cerchi Vba free.

Inoltre che la modalità che mostri non mi pare gestisca correttamente il valore null quando la tabella è priva di righe.

Per la gestione di un progressivo si potrebbe anche procedere con la creazione di una tabella dedicata con un solo campo che contiene appunto l'ultimo progressivo creato utile in caso anche di scenario multiUser....però...per ora vediamo di risolvere più semplicemente.

[…]

Scusa, ma forse sono un pò stanco e non ho afferrato subito il tuo consiglio.

[…]

nessuna ragione di scusarsi, anzi capita…!

[…]

Ciao

Luca

[…]

ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2019-07-22T19:17:42+00:00

ciao Luca,

abbiamo risolto il precedente problema ?

https://answers.microsoft.com/it-it/msoffice/forum/all/traferire-record-da-una-tabella-ad-una-altra/cd784824-3ed4-427e-b263-908cc1b5227e

La numerazione progressiva che mostri si ottiene, secondo me, almeno così:

=Format$(Nz(DMax("[progressivo]";"[tabellaProgressivo]");0)+1;"000")

nel valore predefinito del controllo che lo gestisce.

Come mostri la vedo moooolto difficile...

Facci sapere.

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

11 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-07-22T19:46:06+00:00

    ciao Luca,

    abbiamo risolto il precedente problema ?

    https://answers.microsoft.com/it-it/msoffice/forum/all/traferire-record-da-una-tabella-ad-una-altra/cd784824-3ed4-427e-b263-908cc1b5227e

    La numerazione progressiva che mostri si ottiene, secondo me, almeno così:

    =Format$(Nz(DMax("[progressivo]";"[tabellaProgressivo]");0)+1;"000")

    nel valore predefinito del controllo che lo gestisce.

    Come mostri la vedo moooolto difficile...

    Facci sapere.

    Ciao, Sandro.

    Ciao Sandro

    in merito al precedente problema, avevo già messo risolto al tuo primo suggerimento, ma ho contrassegnato anche le altre risposte come utili.

    In merito a quasto problema io la numerazione progressiva l'ho ottenuta in questo modo:

    Private Sub DATA_CERTIFICATO_BeforeUpdate(Cancel As Integer)

    N_CERT = DMax("NUM_CERTIFICATO", "CERTIFICATI")

    D_CERT = DMax("DATA_CERTIFICATO", "CERTIFICATI")

    If MsgBox("L'ultimo Certificato registrato è il n. " & Format(N_CERT, "000") & " in data " & D_CERT & "  Continuare?", vbQuestion + vbCritical + vbYesNo) = vbNo Then

        Me.Undo

        Cancel = True

        Exit Sub

    Else

        NUM_CERTIFICATO = N_CERT + 1

        MsgBox "Il Certificato verrà registrato al n. " & Format(NUM_CERTIFICATO, "000") & " in data " & Format$(Me!DATA_CERTIFICATO, ("dd/mm/yyyy")), vbInformation

    End If

    End Sub

    Quindi il tuo suggerimento lo devo inserire nella runtime

    o dove?

    Scusa, ma forse sono un pò stanco e non ho afferrato subito il tuo consiglio.

    Ciao

    Luca

    La risposta è stata utile?

    0 commenti Nessun commento