+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 23

Discussione: Gestione errore integrita' referenziale

  1. #1
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67

    Gestione errore integrita' referenziale

    Buongiorno a tutti,
    ho il seguente problema in un database Access: dopo aver applicato l'integrita' referenziale nella relazione fra due tabelle, quando inserisco un valore in una maschera che non trova corrispondenza nella tabella correlata, Access fa uscire l'errore di integrita'. Chiedo se e' possibile intercettare e gestire quell'errore: cioe', se si verifica la condizione di errore, riportare il focus sul campo per poter cambiare il valore. Attualmente dopo il msgbox di Access il focus si sposta sul campo successivo.
    Grazie in anticipo

  2. #2
    L'avatar di @Alex
    @Alex non è in linea Very Important Person
    Post
    16,383
    Si è possibile su Form_Error, ma quello che stai facendo ha poco senso tecnicamente parlando...!

    In una Relazione 1-M, definita anche MASTER-DETAIL in logica interfaccia utente, si opera con Maschera e Sottomaschera perchè sono nativamente il metodo di inserimento dati.
    La Form, associata alla Tabella lato 1, e la Subform in visualizzazione maschere contunue associata alla Tabella lato M, con la configuarazione dei Controlli Master e Child tra Form e SubForm.
    Questo, che si fa tutto con l'autocomposizione aiuta proprio alla fase di inserimento dati nella SUbForm, quindi lato M, ovvero che autocompila il campo ForeignKey della Tabella al fine di mantenere la relazione...
    Quindi di solito NESSUNO compila la FK nella tabella(M)/maschera(Detail) perchè se usi correttamente Access lo fa da solo.

    Ora se invece operi con Maschere disgiunte, quindi Form Singole, devi preoccuparti tu di Valorizzare il campo FK della MAschera Detail... ed anche quì si usano tecniche semplici ma Automatiche... mai da operare a mano per l'utilizzatore.

    Questo preambolo era per dirti che la tua domanda, forse mal interpretata potrebbe avere poco senso.
    A prescindere ciò che richiede una tua riflessione sulla reale comprensione di come usare Access, rimane che NON PUOI inserire nulla lato M se non esiste un Record lato 1 con cui relazionare.
    @Alex
    Il CROSSPOST è VIETATO
    Mirror al vecchio sito WEB(salvare i Demo riassegnando l'estensione (.Zip/.Rar/.Exe in base all'icona...):
    http://mirror.masterdrive.it/alessandrobaraldi/
    Leggi il
    Regolamento del Forum e nel comprenderne la filosofia rispettalo.

  3. #3
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67
    Grazie Alex,
    faro' tesoro dell'insegnamento e tutti i suggerimenti proposti.
    Il database e' un po' datato e frutto dei miei primi rudimenti di Access molto basici; inizialmente avevo lasciato la possibilita' di poter inserire dati sul lato M senza corrispondenza sul lato 1 (questo perche' non avevo ben chiaro di come avrei potuto utilizzarli...).
    Siccome sto correggendo molti errori di inesperienza, sto gradualmente cercando di eliminarli sistemando il database in modo piu' coerente.
    Ad ogni modo, visto che ho due Form disgiunte penso che risolvero', per il momento, trasformando il campo FK in una casella di riepilogo associata al Campo collegato della tabella lato 1.
    Pero' faro' sicuramente qualche prova utilizzando Form+ Subform come da te suggerito per vedere se mi trovo meglio con l'inserimento dati.
    Grazie ancora

  4. #4
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67
    Riprendo il post perche' nel frattempo ho fatto qualche prova con casella di riepilogo ed in alternativa con combobox ma non mi sono trovato. Spiego per migliore chiarezza: ho una maschera associata ad una tabella in cui inserisco l'anagrafica della commessa. Il mio campo "Commessa" e' numerico con Duplicati non ammessi; attualmente la tabella con circa 5000 records (numerati da 1 a N in modo progressivo). Poi ho un'altra maschera associata ad altra tabella in cui vado ad inserire le ore del personale per commessa. La seconda maschera ha i seguenti campi: "Commessa_2", "Data", "Operatore", "Ore". Le due tabelle sono relazionate come indicato nel mio primo post. Spiego perche' non mi sono trovato con il campo "Commessa_2" trasformato in combobox ed associato ad una query di riepilogo del campo "Commessa" della prima tabella: quando faccio gli inserimenti delle ore parto da un modulo cartaceo compilato dagli operatori per cui, per rapidita' di inserimento, il campo "Commessa_2" lo devo per forza digitare per intero (4 numeri) perche' sceglierlo da un menu a discesa e' dispersivo e con l'autocompilazione devo comunque sempre digitarlo.. Stessa cosa per il suggerimento di @Alex che, se ho capito bene, mi suggeriva di creare una subform nella maschera di inserimento dell'anagrafica commessa, ma cosi' sarei costretto a muovermi fra i vari records delle commesse per inserire le ore degli operatori.
    Il tutto per dire che, ritornando al post iniziale, vorrei semplicemente gestire l'errore di integrita' dalla maschera dell'inserimento ore. Ho provato ad inserire nell'evento Form_error il codice
    codice:
    Commessa_2.Setfocus
    , ma non funziona: all'inserimento di una commessa non presente in anagrafica, escono 2 errori in sequenza (..perche' due non lo so...) con lo stesso messaggio di violazione integrita' ed il focus si sposta comunque nel campo successivo. Dove sbaglio?

  5. #5
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Luogo
    Conversano
    Post
    2,979
    Per me non è limpida la descrizione. Ridescrivi:
    - nomi propri delle tabelle che entrano in gioco
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni
    - nomi propri delle maschere
    - rispiega tutto con i corrispondenti nomi propri
    Ditemi i campi di tutte le vostre tabelle.

  6. #6
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67
    Quote Originariamente inviato da OsvaldoLaviosa Visualizza il messaggio
    Per me non è limpida la descrizione. Ridescrivi:
    - nomi propri delle tabelle che entrano in gioco
    - nomi propri di tutti i loro campi con indicazione della chiave primaria
    - le relazioni
    - nomi propri delle maschere
    - rispiega tutto con i corrispondenti nomi propri
    Database diviso in FE e BE; in BE due Tabelle: 'Tabella_principale' e 'Ore_lavorate'.
    Nella 'Tabella_principale' ho il campo "ID" (contatore), il campo "Commessa" (chiave primaria, numerico, intero lungo) e ulteriori 22 campi (che non sto ad elencare perche' non entrano nel problema in esame).
    Nella tabella 'Ore_lavorate' ho il campo "ID" (contatore e chiave primaria), il campo "Commessa_2" (numerico, intero lungo), il campo "Ore" (numerico, precisione doppia), il campo "Data" (data/ora, data breve), il campo "Attrezzista_1" (numerico, intero lungo).
    Le due tabelle sono in relazione con Join 1-M tramite i due campi "Commessa" e "Commessa_2" a cui ho applicato l'integrita' referenziale.
    In FE ho 2 maschere: "Tabella_principale" e "Ore_lavorate" con i vari controlli e pulsanti per l'inserimento dei dati nelle tabelle.
    Quando inserisco le ore dei dipendenti dal loro rapportino cartaceo e digito nel campo "Commessa_2" una commessa non presente nella 'Tabella_principale', l'integrita' referenziale fa giustamente uscire l'errore con MsgBox VbOkonly; io vorrei che, dopo aver dato ok al messaggio, il focus ritornasse sul campo "Commessa_2" per correggere il valore sbagliato. Adesso invece sposta il focus sul campo successivo.

  7. #7
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Luogo
    Conversano
    Post
    2,979
    Mi sento di darti alcuni suggerimenti fuori tema, ma utili per essere più comprensibili con gli altri utenti del forum.

    1. La Tabella_Principale potrebbe essere comodamente essere rinominata in Commesse.
    2. Usa i campi ID come chiave primaria e nominali in maniera esplicita, quindi IDCommessa, IDOraLavorata.
    3. Le FK possono avere lo stesso nome della corrispondente PK madre. Quindi IDCommessa per entrambe le tabelle e opportuna relazione uno-a-molti con la spunta su "Applica integrità referenziale".

    Non mi è chiaro se tu hai una situazione di:
    - maschera/sottomaschera Commesse/OreLavorate
    oppure
    - lavori tutto dentro la maschera OreLavorate
    Ditemi i campi di tutte le vostre tabelle.

  8. #8
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67
    Quote Originariamente inviato da OsvaldoLaviosa Visualizza il messaggio
    Mi sento di darti alcuni suggerimenti fuori tema, ma utili per essere più comprensibili con gli altri utenti del forum.

    1. La Tabella_Principale potrebbe essere comodamente essere rinominata in Commesse.
    2. Usa i campi ID come chiave primaria e nominali in maniera esplicita, quindi IDCommessa, IDOraLavorata.
    3. Le FK possono avere lo stesso nome della corrispondente PK madre. Quindi IDCommessa per entrambe le tabelle e opportuna relazione uno-a-molti con la spunta su "Applica integrità referenziale".

    Non mi è chiaro se tu hai una situazione di:
    - maschera/sottomaschera Commesse/OreLavorate
    oppure
    - lavori tutto dentro la maschera OreLavorate
    Grazie per i consigli, questo database e' stato uno delle mie prime "creature" per cui con tanti errori di inesperienza. Sto piano piano sistemandolo, sopratutto per quanto riguarda la compilazione corretta e standardizzata di tabelle, campi e controlli. Ma c'e' tanto codice dentro e rinominare qualcosa comporta poi tanto lavoro dietro per sistemare gli automatismi.
    Nello specifico, il database lavora con due maschere separate e l'inserimento delle ore avviene nella maschera 'OreLavorate' utilizzando pulsanti di inserimento nuovo record o duplica record. Spero sia tutto chiaro

  9. #9
    OsvaldoLaviosa non è in linea Topo di biblioteca
    Luogo
    Conversano
    Post
    2,979
    Nel campo FK di OreLavorate (credo sia Commessa_2) imposta
    Valore predefinito: [Maschere]![Commesse]![Commessa]
    Ditemi i campi di tutte le vostre tabelle.

  10. #10
    mailman_1969 non è in linea Scolaretto
    Luogo
    Forli'
    Post
    67
    Quote Originariamente inviato da OsvaldoLaviosa Visualizza il messaggio
    Nel campo FK di OreLavorate (credo sia Commessa_2) imposta
    Valore predefinito: [Maschere]![Commesse]![Commessa]
    Se faccio come dici, ogni volta che inserisco un nuovo record mi prende il valore che e' nella maschera Commesse (se e' aperta) e se la maschera e' chiusa? Inoltre potrebbe essere una valore sbagliato che dovrei andare a correggere e quindi potrei commettere un errore di battitura ritornando al problema di cui sopra...
    Esplicito ulteriormente il modus operandi: ad ogni nuovo lavoro che entra in officina assegno un numero di commessa che e' progressivo. Gli operatori hanno un calendario mensile in cui, giorno per giorno, segnano le ore lavorate ed il numero di commessa (ogni operatore puo' lavorare giornalmente anche su 8-10 commesse diverse). Due volte a settimana prelevo i rapportini degli operatori e vado a registrarli nel database. Per ogni operatore e per ogni giorno lavorativo carico le ore che ha lavorato nelle varie commesse. Spero di aver chiarito ulteriormente.

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi