Rinumerare campo testo

di il
10 risposte

Rinumerare campo testo

Ho una tabella Titoli e un campo NTesto dove i valori sono così elencati: 001, 002, 003... sono di tipo Testo e vengono digitati manualmente (non si prevede di raggiungere le "migliaia"). Ciò e dovuto al fatto che in base a tutti gli altri campi, risulta impossibile stabilire un ordinamento anche composito, quindi in taluni casi devo imporre io tale ordinamento. Accade quindi che, siccome attingo ogni tanto nuovi dati (ma prima o poi termineranno), può accadere che per esempio 3 record li devo inserire logicamente tra 080 e 081. Sul momento digito 080.1, 080.2, 080.3, poi riordino la tabella. Tuttavia non mi piace che appaiano quei punti e vorrei rinumerare integralmente il tutto.

Ho creato questi due codici, ma entrambi non funzionano.

Qui ho creato una query NTestoOrdinato modificabile

Private Sub AggiornaNTesto_Click()
Dim PT As DAO.Database
Dim NTO As DAO.Recordset, T As DAO.Recordset
Dim I As Integer
Set PT = CurrentDb
Set NTO = PT.OpenRecordset("NTestoOrdinato", dbOpenDynaset)
NTO.MoveFirst
Do Until NTO.EOF
     I = I + 1
     NTO!NTesto.Edit 'qui si ferma il codice
     NTO!NTesto = Format(I, "000")
     NTO!NTesto.Update
     NTO.MoveNext
Loop
I = 0
NTO.Close
PT.Close
End Sub

 dove indicato mi dà Errore run-time 438: Proprietà o Metodo non supportati dall'oggetto.

In questo caso vorrei agire direttamente sulla tabella Titoli, ma non sono mai sicuro che sia ordinata su NTesto

Private Sub Comando1_Click()
Dim PT As DAO.Database
Dim T As DAO.Recordset
Dim I As Integer
Set PT = CurrentDb
Set T = PT.OpenRecordset("Titoli", dbOpenDynaset, "NTesto ASC") 'qui vorrei ordinare la tabella su NTesto...me lo sono inventato...non ci ho capito nulla
T.MoveFirst
Do Until T.EOF
     I = I + 1
     T!NTesto.Edit
     T!NTesto = Format(I, "000")
     T!NTesto.Update
     T.MoveNext
Loop
I = 0
T.Close
PT.Close
End Sub

 quel terzo argomento su OpenRecordset me lo sono totalmente inventato: boh!

Dove sbaglio? Come devo ottimizzare?

10 Risposte

  • Re: Rinumerare campo testo

    Edit e Update si applicanto al Recodset (NTO.Edit   NTO.Update) 

    Il recordset deve essere ordinato (con una SELECT ... ORDER BY)

    https://learn.microsoft.com/en-us/office/vba/access/concepts/data-access-objects/sort-data-in-a-dao-recordset

  • Re: Rinumerare campo testo

    09/01/2025 - OsvaldoLaviosa ha scritto:

    NTO!NTesto.Edit 'qui si ferma il codice

    Devi iniziare l'edit sul recodset e non sul campo quindi :

    NTO.Edit
    NTO("NTesto") = Format(I, "000")
    NTO.Update

    Il recordset lo apri già ordinato ma non come fai tu :

    Set T = PT.OpenRecordset("Select * From Titoli Order By NTesto ASC", dbOpenDynaset)

    grossomodo, salvo errori di sintassi da parte mia ...

  • Re: Rinumerare campo testo

    Grazie max.riservo. Ho applicato la prima soluzione. Funziona.

  • Re: Rinumerare campo testo

    09/01/2025 - OsvaldoLaviosa ha scritto:

    Ho applicato la prima soluzione

    Grazie max.riservo ....

    ... e Oregon che l'ha fornita 2 minuti prima ;-)

  • Re: Rinumerare campo testo

    La Premessa è che ora devi rinumerare ovviamente da codice, sistemato il quale dovrebbe fare quello che hai chiesto.

    Ti suggerirei però di prevedere una procedura che ti consenta di aggiungere un NUOVO e poi inserirlo dove ritieni vada, rinumerando così solo i record da scalare in avanti... è molto semplice il codice è praticamente lo stesso che hai abbozzato solo che, prima rinumeri temporaneamente il muovo, poi devi selezionare dal primo record da spostare leggi il numero e cicli in avanti incrementando dal valore letto inizialmente, alla fine ti sposti al NUOVO, di cui hai il numero temporaneo e lo sostituisci con il primo valore da cui sei partito.

    Questo ti evita di dover fare manualmente quella numerazione temporanea.

  • Re: Rinumerare campo testo

    09/01/2025 - OsvaldoLaviosa ha scritto:

    Tuttavia non mi piace che appaiano quei punti e vorrei rinumerare integralmente il tutto.

    Quindi quel codice serve solo per ordinare i record?

    Non è una chiave primaria?

    Prima di inserire il record x

    Update tabella set campo=campo+1 where campo>x-1

    Poi

    Insert bla bla (il record che stai inserendo).

    Ovviamente formatti il valore da inserire come ti hanno spiegato ( Format(I, "000") )

  • Re: Rinumerare campo testo

    Sihandrea... la update  con campo=campo+1 se campo fosse numerico, ma non lo è...

    La solita fretta?

  • Re: Rinumerare campo testo

    UPDATE tabella
    SET campo = FORMAT(CInt(campo) + 1, '000')
    WHERE CInt(campo) > [parametronumerico];

    non ricordavo le funzioni di conversione

    10/01/2025 - sihsandrea ha scritto:

    Ovviamente formatti il valore da inserire come ti hanno spiegato ( Format(I, "000") )

    da testare e adattare.

    aggiungo a scanso di equivoci: da usare solo dopo che hai aggiustato i codici come ti hanno mostrato e, in futuro,  prima di inserire un nuovo record. 

    usa un pulsante insert per inserire tra x e x+1 (evitandoti il codice col punto in modo da fare spostare al db i codici) e un pulsante append per inserire il record recordcount+1 (accodare)

  • Re: Rinumerare campo testo

    P.s. sperando che il programma sia monoutenza....

    I codici servono per le relazioni non come campi di ricerca e spesso andrebbero nascosti all'utente.

    Esiste la possibilità di aggiungere un contatore alla vista se non ricordo male.

    Riscrivere codici dovrebbe essere un'operazione da manutenzione non da utilizzo ordinario del programma

  • Re: Rinumerare campo testo

    Grazie a tutti per i successivi commenti, non vi sprecate per un minimal-database-monotabella che prevede meno di 300 record e non di più. Assemblata la numerazione (che non mi è costata molto digitare manualmente), il database non verrà mai più aggiornato...anzi credo di aver già finito.

Devi accedere o registrarti per scrivere nel forum
10 risposte