Evitare copie su campi e record

di
Anonimizzato10802
il
17 risposte

Evitare copie su campi e record

Un saluto a tutti sono nuovo e non sono molto pratico di access
avrei un problema che sarà facilissimo per voi ma per me...
vengo al dunque ho creato una tabella con oltre 100 campi e una maschera dove ci sono queste 100 "celle" che vengono riempite con dei numeri inseriti con un barcode, questi numeri non devono essere uguali, quindi se sparo col barcode piu volte sullo stesso numero non deve essere memorizzato magari con una finestra di dialogo, spero di essermi spiegato grazie

17 Risposte

  • Re: Evitare copie su campi e record

    Puoi spiegarci un minimo la struttura del sistema...?
    Perchè ci sono 100 Campi ad esempio...?

    La domanda sorge spontanea in quanto se devi fare un controllo di DUPLICAZIONE su 100 Campi, verrebbe da immaginare un'errore di progetto...!
    La duplicazione di norma, si controlla sui RECORDS relativamente allo stesso CAMPO, e risulta decisamente fuori standard per un DB RELAZIONALE concepire un'esigenza come l'hai descritta.

    Ne consegue che, per non fraintendere o darti indicazioni sbagliate ci serve capire il contesto.
  • Re: Evitare copie su campi e record

    Grazie per la risposta,
    sicuramente data la mia inesperienza sarò partito male come struttura,
    allora l'idea di lavoro era avere una maschera dove si visualizza costantemente i dati inseriti,
    data turno e 140 caselle dove vengono riempite tramite un barcode dei numeri, e magari avere un contatore dove aggiorna ogni volta che "spara" col barcode

    la tabella struttura
    nome campo tipo dati
    ID contatore
    data numerico
    turno numerico
    1 numerico
    2 numerico
    3 numerico
    4 numerico
    ecc. ecc. fino a 140
    qui ho provato nella voce indicizzato Si ( duplicati non ammessi) funzionerebbe ma ho scoperto che non accetta oltre i 32 indici, ho creato una query di ricerca per data e turno e un report nulla di complicato, funziona tutto ma mi piacerebbe che, se involontariamente si "spara" due o tre volte sul documento non deve inserire nulla e con una notifica che esite già, e magari avere come già detto un bel contatore ben visibile aggiornato al numero arrivato della giornata.
    posto uno screen per esser più chiaro, eventualmente potrei caricare il file su qualche host.



    In attesa di risposte, ringrazio e saluto.
  • Re: Evitare copie su campi e record

    Purtroppo non hai risposto alla domanda...!

    Cerco di sbilanciarmi sperando di aver compreso ugualmente la struttura e l'esigenza...
    Se come hai intuito il problema sono quei 140Campi sui quali è impossibile la gestione di INDICI, il problema per noi è capire se quei 140 Campi possono essere riportati ad una forma NORMALE magari con una Tabella aggiuntiva relazionata 1-Molti con la Tabella principale...!

    Se un Record della Tabella principale può avere 140Documenti è semplice ipotizzare la struttura che ti ho esposto...

    1Record(TabellaPrincipale)----MOLTI DOCUMENTI(TabellaDocumenti)

    In quel caso non avresti 140 INDICI da inserire, ma solo 1 Campo [Documento] che avrà per ogni Record della Tabella principale la possibilità di inserire MOLTI Records Figli.
    Sul campo [Documento] che risulta solo 1 puoi inserire l'indicizzazione se UNIVOCO.
  • Re: Evitare copie su campi e record

    Ciao.
    Inutile dire che concordo appieno con Alex, sul fatto di esporre bene un concetto, un'esigenza e in base a quello cercare di strutturare il D.B. in una forma corretta, normalizzata.
    Vedrai che se seguirai i suoi consigli arriverai a quello che desideri…
    Aggiungendo delle considerazioni dietro la scia di Alex, dimmi se non erro se dico che la coppia ‘Data + Turno’ presenti in un record/riga NON si ripetono mai nella Tabella…?! (sono univoci all'interno della Tabella).
    Se così fosse, la relazione tra la Tabella 1
    IdRec
    Data
    Turno

    E la Tabella 2 (dei numeri, quei 140 per intenderci), potrebbe essere formata dai campi:
    IdRec
    Data
    Turno
    Numero

    Potresti usarli come campi ‘chiave univoca’ [Data] & [Turno] per realizzare la relazione 1 (lato Tabella 1) a molti (lato Tabella 2), che ti diceva Alex, realizzando una struttura del D.B. più normalizzata…
    In quel modo, potresti anche formare un campo indicizzato/univoco per la tabella 2- 'Molti', formato dalla somma: [Data] & [Turno] & [Numero], in modo tale che le regole del DB non permetteranno che tu inserisca doppioni...
    Poi dovrai rivedere le tue Query e Maschere, ma ti assicuriamo che alla fine varrà la pena, perchè non solo potrai controllare di NON inserire + volte lo stesso valore nel solito record, ma avrai anche dato al DB una struttura più corretta.
    Saluti dalla MAremma.
  • Re: Evitare copie su campi e record

    luky1964 ha scritto:


    Ciao.
    ...la coppia ‘Data + Turno’ presenti in un record/riga NON si ripetono mai nella Tabella…?! (sono univoci all'interno della Tabella).
    Se così fosse, la relazione tra la Tabella 1
    IdRec
    Data
    Turno

    E la Tabella 2 (dei numeri, quei 140 per intenderci), potrebbe essere formata dai campi:
    IdRec
    Data
    Turno
    Numero

    Potresti usarli come campi ‘chiave univoca’ [Data] & [Turno] per realizzare la relazione 1 (lato Tabella 1) a molti (lato Tabella 2), che ti diceva Alex, realizzando una struttura del D.B. più normalizzata…
    In quel modo, potresti anche formare un campo indicizzato/univoco per la tabella 2- 'Molti', formato dalla somma: [Data] & [Turno] & [Numero], in modo tale che le regole del DB non permetteranno che tu inserisca doppioni...
    Saluti dalla MAremma.
    Ero consapevole di essere partito male ma purtroppo le mie conoscenze sono molto limitate solo un piccolo corso di ECDL base base, e purtoppo già le due parti i rosso sono in difficoltà ,
    mi seguite passo passo, dai da quando ho capito voi ci mettereste 2 minuti, io cerco di impegnarmi poi il tempo maggiore ci si perde per le maschere.
    Nel modo suggerito è possibile vilsualizzare tutti i campi come nello screen postato oppure ad ogni record pulisce lo schermo, se fosse così andrebbe bene ma avrei bisogno di un contatore ben visibile sulla situazione numerica della giornata, comunque andiamo per gradi adesso ho fatto queste 2 tabelle,

    chiave univoca’ [Data] & [Turno] come le inserisco?
    la data e turno la devo inserire solo a inizio turno lavorativo.
    Nb: poi a fine magari scappa una birra

    EDIT: se non è possibile visualizzare tutti i campi della giornata in una schermata potrebbe andar bene anche una cosa del genere, è solo un es. per dare l'idea.
  • Re: Evitare copie su campi e record

    Ciao.
    Senti, purtroppo posso darti indicazioni teoriche ed iniziali, non uso molto Access.
    Comunque, pensavo intanto che forse te l'ho fatta un po più complicata, ma devo 'tirarti' le orecchie per il fatto che davvero NON rispondi alle domande che ti si fanno.
    Inoltre, potevi spiegarci fin da subito di cosa si trattava.
    Ti ripeto, nella Tabella1, NON si trovano mai più di 1 riga/record con la stessa coppia 'data' + 'turno' ??!!
    Se così fosse, potresti dire ad Access che l'accoppiata dei 2 campi, formano la chiave univoca della Tabella, ciò, eviterebbe che accidentalmente si mettesse la stessa 'data e turno' in 2 righe diverse...? è così...?! E poi, il tuo fine o uno dei tuoi fini, è sapere quante 'Matricole' ci sono in una 'data + turno' ??!!.
    Sempre se tutto quanto detto, risulta vero, vorrebbe dire anche che nella Tabella1, il campo 'contatore' ID... è univoco per ogni accoppiata 'Data - Turno' e quindi potresti usare anche quest'ultimo per la relazione 1 a molti nella Tabella2...
    Per far si che 2 o più campi di una Tabella, diventino la chiave univoca della stessa, li selezioni in vis. struttura e poi premi la chiavina nella barra dei pulsanti.
    Tipo come nell'allegato, a proposito, si vede ?!
    Immagine.jpg
    Immagine.jpg

  • Re: Evitare copie su campi e record

    Ciao, ti ringrazio della risposta e chiedo scusa se non capisco bene le domande:
    "Ti ripeto, nella Tabella1, NON si trovano mai più di 1 riga/record con la stessa coppia 'data' + 'turno' ??!!"...
    "ciò, eviterebbe che accidentalmente si mettesse la stessa 'data e turno' in 2 righe diverse...? è così...?!"
    SI
    "E poi, il tuo fine o uno dei tuoi fini, è sapere quante 'Matricole' ci sono in una 'data + turno' ??!!"
    SI anche, il mio fine in breve è quello di trovarmi davanti a una maschera dove a inizio turno l'operatore metta solo la data e turno e poi tramite un barcode inizia a "sparare" le matricole prodotte, non deve più toccare il Pc, queste matricole devono essere perlomeno sempre visibili come avevo fatto nella primo post o almeno tramite una finestra e la cosa importante e avere il numero aggiornato di matricole costantemente ogni qual volta spara con il barcode, poi successivamente tramite una query darmi la possibilità di interrogare il db quante 'Matricole' ci sono in una data + turno.
    Per adesso ho fatto quello che hai detto o perlomeno spero data l'ora domani si va avanti...


    Grazie.
  • Re: Evitare copie su campi e record

    Niente non riesco propio a fare queste relazioni, non è che me la potresti uppare su qualche host quella che hai fatto, cosi lo studio un pò e poi vedo di andare avanti sul mio misero... progetto,
    grazie a chiunque e comunque mi possa aiutare.
  • Re: Evitare copie su campi e record

    Io ricostruirei tutto così. Parto dal presupposto che sono allergico all'idea di una chiave primaria multicampo, quindi aggiusterei tutto come di seguito.

    Chiamo Tabella1 = Turni
    IDTurno: Contatore, Chiave primaria
    Data: Data
    Turno: Testo (o Numerico visto che li si chiama con 1 o 2)
    su questa tabella si può applicare un indice multicampo univoco basato sui campi Data e Turno

    Chiamo Tabella2 = Matricole
    IDMatricola: Contatore, Chiave primaria
    Matricola: Testo (non capisco perchè Numerico visto che si tratta di una sequenza di caratteri numerici e non di numeri)
    IDTurno: Numerico, chiave esterna
    su questa tabella si può applicare, al campo Matricola, la proprietà Univoco Sì Duplicati non ammessi

    Relazione Turni.IDTurno uno-a-molti con Matricole.IDTurno

    Si può creare maschera Turni con sottomaschera Matricole. Dopo aver digitato i dati sulla maschera principale Turni si può sparare il codice Matricola quante volte si vuole (circa 140 mi pare di capire).

    Credo che così giri tutto per bene.
  • Re: Evitare copie su campi e record

    OsvaldoLaviosa ha scritto:


    Chiamo Tabella1 = Turni
    IDTurno: Contatore, Chiave primaria
    Data: Data
    Turno: Testo (o Numerico visto che li si chiama con 1 o 2)
    FATTO
    su questa tabella si può applicare un indice multicampo univoco basato sui campi Data e Turno
    Mi puoi spiegare questo passaggio.

    Chiamo Tabella2 = Matricole
    IDMatricola: Contatore, Chiave primaria
    Matricola: Testo (non capisco perchè Numerico visto che si tratta di una sequenza di caratteri numerici e non di numeri)
    FATTO
    IDTurno: Numerico, chiave esterna
    come si fà?
    su questa tabella si può applicare, al campo Matricola, la proprietà Univoco Sì Duplicati non ammessi FATTO

    Relazione Turni.IDTurno uno-a-molti con Matricole.IDTurno
    Anche quì come passaggi?
    ...
    Per adesso sono solo quì


    grazie spero che hai del tempo per spiegarmi e andare avanti anche passo passo giorno per giorno, lo sò forse per Voi è elementare, ma termini e passaggi mi sfuggono... siate "terra terra" io ci provo... grazie ancora...
  • Re: Evitare copie su campi e record

    Le tabelle in figura vanno bene, ora dobbiamo puntualizzare alcune proprietà.

    1) Indice multicampo univoco basato sui campi Data e Turno.
    Un indice multicampo univoco funziona come la proprietà "Indicizzato Sì Duplicati non ammessi", solo che quest'ultima si applica ad un campo solo, mentre tu dovrai costruire qualcosa di analogo su più campi (nel nostro caso due).
    lucky1964 aveva già notato questa caratteristica (Data+Turno non devono avere mai duplicati), suggerendo di creare una chiave primaria su 2 campi (ottenendo lo stesso effetto di univocità).
    Come si fa:
    1. Apri la tabella Turni in visualizzazione struttura
    2. Clicca sul tasto Indici (ha una icona con il fulmine giallo)
    3. Nella finestra Indici: Turni clicca dentro il primo rigo disponibile, scrivi in corrispondenza di
    Nome indice: Data+Turno
    Nome campo: Data
    Criterio ordinamento: Crescente
    scendi nel rigo immediatamente successivo e scrivi
    Nome indice: (lascia vuoto)
    Nome campo: Turno
    Criterio ordinamento: Crescente
    adesso ritorna sul rigo Data+Turno e imposta le proprietà in basso
    Primario: No
    Univoco: Sì
    Ignora Null: No
    quindi sarà proprio la proprietà Univoco Sì a generare l'indice univoco basato sui due campi Data+Turno, e se per sbaglio dovessi digitare una coppia Data+Turno uguale Access ti invierà un messaggio di Errore.
    4. Salva tutto.

    2) Chiave esterna.
    Un campo chiave esterna serve di richiamo da un'altra tabella (superiore) avente lo stesso nome di campo ma chiave primaria. Un campo chiave esterna non deve avere l'impostazione con l'icona della chiave vicino perchè non sarà MAI UNIVOCA. Di solito va messa alla fine della lista campi e, se la chiave primaria di origine era Contatore, nel caso della chiave esterna deve essere Numerico (con le stesse proprietà), ma NON Indicizzato Sì Duplicati non ammessi.
    Quindi sta bene come in figura.

    3) Creare relazione uno-a-molti.
    Nell'ultima tua figura noterai che esistono due campi con lo stesso nome (IDTurno). Per distinguerli tecnicamente li si nomina, nel nostro caso Turni.IDTurno e Matricole.IDTurno. Questi due campi devono essere relazionati uno-a-molti.
    Le relazioni sono l'anima di Access.

    4) Dopo aver creato la relazione uno-a-molti, ti consiglio di creare una maschera/sottomaschera, nel nostro caso Turni/Matricole. Esiste una procedura guidata apposita che ti consiglio di seguire.

    I punti 3) e 4) puoi trovare una descrizione accurata su qualsiasi manuale, anche di base, oppure sulla guida in linea.
  • Re: Evitare copie su campi e record

    Ti ringrazio della pazienza
    Allora 1° e 2° penso di aver fatto bene come da figura



    "Nell'ultima tua figura noterai che esistono due campi con lo stesso nome (IDTurno). Per distinguerli tecnicamente li si nomina, nel nostro caso Turni.IDTurno e Matricole.IDTurno...."
    Devo rinominare quello nella tabella turni e quello nella tabella Matricole ?
    Edit: no non posso farlo è sbagliato non accetta punto parentesi ecc.
  • Re: Evitare copie su campi e record

    Saby ha scritto:


    "Nell'ultima tua figura noterai che esistono due campi con lo stesso nome (IDTurno). Per distinguerli tecnicamente li si nomina, nel nostro caso Turni.IDTurno e Matricole.IDTurno...."
    Devo rinominare quello nella tabella turni e quello nella tabella Matricole ?
    Edit: no non posso farlo è sbagliato non accetta punto parentesi ecc.
    No, non devi rinominare i campi, vanno bene come stanno.
    "Turni.IDTurno" è soltanto un modo sintetico per dire "il campo IDTurno della tabella Turni". E' una sintassi comoda che ritroverai in futuro se vorrai comprendere codici e composizioni sintattiche che fanno riferimento a questo o quel campo.....ecc.....

    Tutto il resto va bene, ricorda di impostare al campo Matricole.Matricola la proprietà "Indicizzato Sì Duplicati non ammessi".
  • Re: Evitare copie su campi e record

    "ricorda di impostare al campo Matricole.Matricola la proprietà "Indicizzato Sì Duplicati non ammessi".
    Fatto
    Ho provato a leggere un po la guida in linea ho fatto una relazione
    IDTurno con IDMatricole è giusto ?

Devi accedere o registrarti per scrivere nel forum
17 risposte