Chiave primaria, chiave combinata, chiave composta

di il
5 risposte

Chiave primaria, chiave combinata, chiave composta

Buongiorno,
è possibile creare una chiave primaria formata da, una prima parte data e l'ultima parte contatore?
Ho create una tabella per la gestione delle pratiche e visto che ho un campo ID contatore (1,2,3,...,2345) mentre nel'oggetto delle email inserisco un valore creato da me (20170301.01, 20170301.02), vorrei poter unire le due cose...
Questa concatenazione sarebbe sempre disponibile e rimarrebbe sempre un campo univoco.
In aggiunta avrebbe la funzione (con l'inserimento di nuovi record) di indicare, fino a quel momento, il numero di pratiche svolte nella giornata odierna.
Spero di aver chiarito bene la mia situazione.
Grazie per l'aiuto ragazzi.

5 Risposte

  • Re: Chiave primaria, chiave combinata, chiave composta

    Si è possibile... ma non capisco una cosa... tu non vuoi che l'ultima parte della tua chiave personalizzata sia corrispondente al Contatore vero...?
    Altra cosa, sarebbe bene tu tenessi distinta la funzione di PK, esercitata dal campo Counter, dalla funzione di quel campo Personalizzato, che non ha senso renderlo PK se hai già l'altra, mentre per l'UNIVOCITA' è altrettanto non sensata dal momento che la dovrai generare tu e ti assicurerai di generarla in modo Progressivo o per Concatenazione di Data/Counter.
    Può avere un senso come Indice eventualmente...

    Fai poi attenzione che essendo un campo TESTO se non la studi bene, rischi che in caso di ORDINAMENTO possa darti dei problemi..., valuterei ad esempio che la parte Numerica finale, quella legata alla progressione, avesse un Formato FISSO Definito, ad esempio 3 o 4 Caratteri in base alle quantità che tu ipotizzi movimentabili nella giornata.

    Sicchè verrebbe
    20170301.0001
    20170301.0002
    20170301.0003

    Questo lo ottieni concatenando data e NumeroMassimo+1...

    Per la Data puoi usare da VBA:
    Format(Date(),"yyyymmdd") , mentre da Generatore di Espressioni Format(Date();"aaaammgg")
    Per recuperare il NumeroMassimo devi usare un DMAX concriterio data, quindi da VBA:
    
    Format(Nz(Dmax("NomeCampo","NomeTabella","Right(NomeCampo,6)=Format(Date(),'yyyymmdd'))+1,"0000")
    Quindi concateni le 2 parti...

    Ragiona bene sulla questione PK.
  • Re: Chiave primaria, chiave combinata, chiave composta

    Grazie per l'aiuto @Alex, quando mi chiedi se non voglio che l'ultima parte della chiave personalizzata sia corrispondente al Contatore non è proprio così.... la cosa che vorrei è creare un PK con dimensioni carattere/cella fisso e identificativo, spiego meglio.
    Il numero elevato di pratiche farà si che per la prima pratica (PK: 1) la dimensione sarà ridotta a un solo carattere, mentre (PK: 4309) avrà una dimensione di 4 caratteri, e così via.
    Pensavo allora come dici tu, di definire un PK direttamente di 4 caratteri, che tra le altre cose non so come e dove inserirlo nella tabella, così da avere (PK: 0001) uguale a (PK: 4309) ma, una volta che invio il PK a un cliente via email, nel momento in cui dopo mesi leggo un email di risposta, devo capire fin da subito (attraverso il PK di risposta) di che periodo stiamo parlando e di quale pratica della giornata stiamo parlando (la 1° la 15° ecc).

    Posso chiederti perchè pensi che dovrei tenerle distinti il PK e l'ID da inviare via email? E' comunque un risparmio di campi e valori che riempiono questo database: il campo PK, il campo Data inserimento, il campo Contatore che ogni giorno dovrebbe ripartire da 1 (non so come farlo e azzerarlo alle 24:00), ed il campo ID da inserire nell'oggetto dell'email come spiegavo all'inizio.

    Riguardo l'ordinamento dei PK sono pienamente d'accordo che se non venga studiato bene può portare a delle sicure complicazioni, questa funzione (l'ordinamento) l'ho lasciata comunque a un campo specifico all'interno del DB perchè dell'ordinamento serve solo che mi faccia vedere quali pratiche sono in scadenza.

    Riguardo il suggerimento delle pratiche di oggi:
    20170301.0001
    20170301.0002
    20170301.0003
    Quelle di domani non ho capito bene, ma inizierebbero con 20170302.0004 oppure 20170302.0001?
  • Re: Chiave primaria, chiave combinata, chiave composta

    Migiwa ha scritto:


    Grazie per l'aiuto @Alex, quando mi chiedi se non voglio che l'ultima parte della chiave personalizzata sia corrispondente al Contatore non è proprio così.... la cosa che vorrei è creare un PK con dimensioni carattere/cella fisso e identificativo, spiego meglio.
    Il numero elevato di pratiche farà si che per la prima pratica (PK: 1) la dimensione sarà ridotta a un solo carattere, mentre (PK: 4309) avrà una dimensione di 4 caratteri, e così via.
    Pensavo allora come dici tu, di definire un PK direttamente di 4 caratteri, che tra le altre cose non so come e dove inserirlo nella tabella, così da avere (PK: 0001) uguale a (PK: 4309) ma, una volta che invio il PK a un cliente via email, nel momento in cui dopo mesi leggo un email di risposta, devo capire fin da subito (attraverso il PK di risposta) di che periodo stiamo parlando e di quale pratica della giornata stiamo parlando (la 1° la 15° ecc).

    Posso chiederti perchè pensi che dovrei tenerle distinti il PK e l'ID da inviare via email? E' comunque un risparmio di campi e valori che riempiono questo database: il campo PK, il campo Data inserimento, il campo Contatore che ogni giorno dovrebbe ripartire da 1 (non so come farlo e azzerarlo alle 24:00), ed il campo ID da inserire nell'oggetto dell'email come spiegavo all'inizio.
    Una PK ha un ruolo fondamentale nella gestione relazionale... un campo CODICE invece può avere una Importanza elevata, ma essere distinto dal campo PK.
    Siccome le chiavi Primarie vanno gestite in modo molto accurato, fossi in te valuterei di lasciare come PK il campo Counter, e di gestire il campo Codice come hai descritto alla stregua di un CAMPO OBBLIGATORIO ma non PK...!
    E continuerai ad usare il tuo campo CODICE come riferimento nelle Mail o dove vuoi... senza togliere nulla al resto.

    Migiwa ha scritto:


    Riguardo l'ordinamento dei PK sono pienamente d'accordo che se non venga studiato bene può portare a delle sicure complicazioni, questa funzione (l'ordinamento) l'ho lasciata comunque a un campo specifico all'interno del DB perchè dell'ordinamento serve solo che mi faccia vedere quali pratiche sono in scadenza.

    Riguardo il suggerimento delle pratiche di oggi:
    20170301.0001
    20170301.0002
    20170301.0003
    Quelle di domani non ho capito bene, ma inizierebbero con 20170302.0004 oppure 20170302.0001?
    Si quello che ti ho suggerito fa esattamente l'azzeramento e ripartenza da 1 ogni giorno.
  • Re: Chiave primaria, chiave combinata, chiave composta

    Ho provato ad inserire in diversi punti il codice, ma non ho capito dove @Alex
    Copiando il codice in visualizzazione struttura del nuovo campo Codice nella tbella tblPratiche niente.
    Copiando il codice in visualizzazione struttura del nuovo campo Codice nella query StatoPratiche niente.
    Format(Nz(Dmax("NomeCampo","NomeTabella","Right(NomeCampo,6)=Format(Date(),'yyyymmdd'))+1,"0000")
    Format(Nz(Dmax(Codice,tblPratiche,"Right(Codice,6)=Format(Date(),'yyyymmdd'))+1,"0000")
    Dovè che sbaglio? Su alcune cose sono un po di legno scusa.
  • Re: Chiave primaria, chiave combinata, chiave composta

    La funzione non va copiao-incollato ma capita...
    In ogni caso devi assegnare alla proprietà VallrediDefault.... attenzione alla sintassi... ti ho spiegato sopra la differenza tra virgola/punto virgola ed il formato inglese...
Devi accedere o registrarti per scrivere nel forum
5 risposte