Generare ID casuale da utilizzare come chiave primaria

di il
9 risposte

Generare ID casuale da utilizzare come chiave primaria

Ciao a tutti,
nel database che sto creando, nella maschera principale, è presente un pulsante che mi genera un nuovo record in una tabella. Questa tabella ha come chiave primaria il classico campo numerico autoincrementante che vorrei sostituire con un numero casuale autogenerato alla pressione del tasto con il seguente formato: AA-XXXXX-XXXXX dove (AA = dato fisso non modificabile, XXXXX numero casuale)
In più, per correttezza, vorrei che alla pressione del pulsante oltre alla generazione del nuovo ID avvenisse un controllo per verificare che questo non esista già.

Grazie mille

9 Risposte

  • Re: Generare ID casuale da utilizzare come chiave primaria

    Vai in visualizzazione struttura tabella.
    Seleziona il campo Contatore.
    In basso, proprietà Nuovi valori: Casuale.
    Un campo Contatore, anche se Casuale, non produrrà mai valori duplicati sul numero. Quindi non è necessario controllare questo aspetto.
    Il formato che tu vorresti creare, credo si possa realizzare, non conosco la corretta sintassi, ma pare che quella che hai suggerito, dovrebbe funzionare.
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Grazie Osvaldo per la risposta, però come mi hai consigliato tu, non riuscendo a trovare la sintassi esatta, non ci son riuscito. Mi sono scritto allora una piccola macro per generare il mio numero casuale; però quando clicco il pulsante nella maschera non appare il dato generato.
    Sub Prova_Click()
    
    Dim Primo As Long
    Dim Secondo As Long
    
    Dim PrimoStr As String
    Dim SecondoStr As String
    
    Dim IDc As String
    
    Dim Prefix
    Prefix = "AC-"
    
    Randomize
    Primo = Int((99999 + 1) * Rnd)
    PrimoStr = CStr(Primo)
    
    Randomize
    Secondo = Int((99999 + 1) * Rnd)
    SecondoStr = CStr(Secondo)
    
    IDc = Prefix & PrimoStr & "-" & SecondoStr
    
    [Forms]![Prova_Numero_Casuale]![Campo] = IDc
    
    End Sub
    Potete aiutarmi?
    Grazie mille
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Ho risolto!
    Grazie mille
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Mi permetto di DISSENTIRE nel modo più assoluto con questa tecnica...!

    Se l'intento è GENERARE un codice CASUALE, va bene...

    Se l'intento è GENERARE una PK questo approccio è assolutamente ERRATO.

    I motivi sono principalmente 3:
    1) La PK deve avere vincolo di UNIVOCITA'
    2) Il generatore di numeri CASUALI di VBA ha una CASUALITA' di forte discutibilità, su un range così ristretto poi...
    3) Non fai minimamente un CONTROLLO di UNIVOCITA'.

    Mi chiedo che senso abbia quello che hai fatto nello specifico caso che hai esposto.

    L'opzione di generare una PK UNIVOCA è ben più complessa ed importante.

    Ovviamente ho espresso un parere TECNICO, ognuno poi tecnicamente può fare quanto ritiene meglio.
  • Re: Generare ID casuale da utilizzare come chiave primaria

    @Alex ha scritto:


    Mi permetto di DISSENTIRE nel modo più assoluto con questa tecnica...!

    Se l'intento è GENERARE un codice CASUALE, va bene...

    Se l'intento è GENERARE una PK questo approccio è assolutamente ERRATO.

    I motivi sono principalmente 3:
    1) La PK deve avere vincolo di UNIVOCITA'
    2) Il generatore di numeri CASUALI di VBA ha una CASUALITA' di forte discutibilità, su un range così ristretto poi...
    3) Non fai minimamente un CONTROLLO di UNIVOCITA'.

    Mi chiedo che senso abbia quello che hai fatto nello specifico caso che hai esposto.

    L'opzione di generare una PK UNIVOCA è ben più complessa ed importante.

    Ovviamente ho espresso un parere TECNICO, ognuno poi tecnicamente può fare quanto ritiene meglio.
    Sul fatto che la casualità sia discutibile son d'accordissimo, visto che genera numeri basati sul timer di sistema! Effettivamente non ho nessun controllo di unicità: potrei implementare un
    do until...loop
    per verificare se il codice generato esiste già e, in caso affermativo scartarlo e ricrearne uno nuovo.
    Qualche metodo migliore? I consigli sono sempre molto ben accetti! Grazie mille!!
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Io userei il COUNTER... di sistema che è UNIVOCO e non capisco perchè non ti piace...!
    Se l'intento poi è di avere un Codice ALFANUMERICO PARLANTE non duplicato è un'altra esigenza dalla ChiavePrimaria...!!!!

    Lascia perdere il LOOP, non hai un'array da ciclare ma una Tabella sulla quale puoi fare un'interrogazione SQL parametrica.
  • Re: Generare ID casuale da utilizzare come chiave primaria

    @Alex ha scritto:


    Io userei il COUNTER... di sistema che è UNIVOCO e non capisco perchè non ti piace...!
    Se l'intento poi è di avere un Codice ALFANUMERICO PARLANTE non duplicato è un'altra esigenza dalla ChiavePrimaria...!!!!

    Lascia perdere il LOOP, non hai un'array da ciclare ma una Tabella sulla quale puoi fare un'interrogazione SQL parametrica.
    Ok, ho risolto definendo
    "AC"&
    all'interno del campo "Formato" di una cella a numerazione automatica. In questo modo mi viene genretata una chiave primaria alfanumerica ad incremento con prefisso letterale costante!

    Grazie mille!
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Buongiorno,
    dovevo risolvere un problema simile a quello che avete discusso nel forum ed utilizzando la soluzione che era stata trovata Climbjack, ovvero definendo "AC"& a livello di formato della numerazione automatica, mi sono accorto che a livello di tabella mi appare giustamente quanto richiesto, ma se poi creo una maschera con campo ID legata alla tabella, qui mi appare solo il numero progressivo ed automatico ma non il prefisso.
    Curioso? Non capisco perché!
  • Re: Generare ID casuale da utilizzare come chiave primaria

    Hai riesumato un 3d troppo datato... non è pratica ammessa.
    Aprine uno nuovo e fai riferimento a questo se può aiutare la comprensione inserendo il Link.
Devi accedere o registrarti per scrivere nel forum
9 risposte