IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

di il
12 risposte

IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

Salve a tutti, sono di nuovo qui a chiedere aiuto a voi!!!
Ho creato una agenda per lezioni di equitazione cosi composta:
Data Lezione, Ora Inizio, Ora Fine, Nome Istruttore, Nome Allievo, Nome Cavallo.
Ora vorrei eseguire un controllo al momento dell'inserimento di un nuovo appuntamento che mi avvisasse se in quella data e quell'orario il Nome Allievo ha già una lezione prenotata o se il Nome Cavallo è già prenotato per quella lezione.
Ho provato in mille modi ma non riesco a trovare la soluzione... spero di essere stato chiaro!!!
Grazie anticipatamente per la vostro continua disponibilità!!!

12 Risposte

  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Indice Multicampo Univoco.
    Siccome hai richiesto 2 possibilità in cui il doppione non deve cadere, devi impostare 2 Indici Multicampo Univoci.
    Il primo impostato sui campi DataLezione, OraInizio, NomeAllievo.
    Il secondo su DataLezione, OraInizio, NomeCavallo.
    Se provi a digitare una di queste combinazioni a doppione, Access invierà un messaggio di errore.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Ciao Osvaldo, ho provato come mi hai suggerito ma mi impedisce di inserire qualsiasi altra lezione per quell'orario. Può essere perché il nome allievo viene preso da una query che filtra tutti i nominativi tramite casella combinata e il nome cavallo da una tabella anagrafica cavalli?
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    csretake ha scritto:


    ho provato come mi hai suggerito ma mi impedisce di inserire qualsiasi altra lezione per quell'orario
    Io ho fatto un test e funziona.
    Hai costruito per bene i due Indici Multicampo Univoci?
    Le caselle combinate non provocano alcun danno. Mi viene da pensare che tu talvolta vuoi lasciare vuoti i campi NomeAllievo e/o NomeCavallo mentre in realtà esisterebbe un valore di default che rimane lì comunque, mettendo in moto ugualmente l'Indice multicampo.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Ciao Osvaldo
    Ok non chiedermi perché ma ho riprovato e adesso funziona... Grazie mille. A questo punto vorrei chiederti se è possibile visualizzare un messaggio diverso da quello standard di Access perché chi dovrà usare questo database ha un livello di conoscenza del pc vicino allo 0 quindi volevo un messaggio più chiaro, è possibile?
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    La soluzione che ti ho proposto è la più semplice. Per fare quello che chiedi, ho provato a dare un'occhiata alla guida in linea Access all'argomento "Informazioni sulla limitazione o la convalida dei dati (MDB)", ma ne parla molto in generale. Dice che si potrebbe gestire anche con macro (campo a me potenzialmente possibile) o meglio con un codice Visual Basic (a me oscuro). In entrambi i casi la questione diventa più complessa perchè non si tratta più di percorrere la strada del Indice Multicampo Univoco in senso stretto, ma di eseguire più controlli in quello che si digita. Confesso che mi trovi impreparato e spero che un utente più esperto possa risponderti meglio.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Ciao Osvaldo,
    Grazie mille per le tue informazioni, sempre utili, apprezzabili e costruttive!!!
    Spero di riuscire a trovare una soluzione, ti terrò eventualmente informato... grazie!!!
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Una soluzione a metà strada l'avrei trovata, in ogni caso si presuppone che stiamo lavorando su maschera.
    1. Crea una macro in visualizzazione struttura
    2. Nel primo rigo Azioni, scrivi FinestraMessaggio, sotto trovi alcune proprietà dove puoi personalizzare un testo per l'invio di un messaggio.
    3. Salva la macro con nome
    4. Apri la maschera in visualizzazione struttura
    5. Vai tra le Proprietà della maschera, scheda Eventi, Su Errore, scrivi dentro il nome della macro
    6. Salva la struttura maschera

    Questa soluzione fa ancora i conti con l'impostazione di Indice Multicampo Univoco. In caso di errore, Access (attraverso la macro) apre la FinestraMessaggio con il testo personalizzato, ma, subito dopo, mostra ugualmente la sua finestra errore di default.

    La tua richiesta, per risolverla in maniera elegante, presuppone un discorso molto ampio sulla "Gestione errori". È una disciplina, a mio parere (non solo di Access ma dell'informatica in generale), molto complessa dove occorre sbatterci la testa con opportune istruzioni in Visual Basic. La gestione errori ha, secondo me, una serie di pro e contro:
    Pro: venire incontro alle digitazioni scorrette e aiutare gli utenti più sprovveduti
    Contro: Occorre organizzarli molto bene e inserire le opportune istruzioni nei punti giusti. Quando si entra in questo circolo vizioso del domandarsi "ma se ora l'utente dovesse fare così...", le domande al riguardo possono diventare moltissime e sempre più articolate, con conseguente continuo riassesto del set di istruzioni in Visual Basic. In casi esasperati ho visto database che pongono continue domande di conferma di ciò che si è digitato qua o là, rendendo l'input dati sempre meno fluido.

    Come hai potuto notare, la mia gestione di questo errore passa, in ogni caso, attraverso il controllo dell'Indice Multicampo Univoco, il quale, se violato, innesca comunque la propria finestra errore di default.
    Ripeto, occorre procedere su un'altra strada, il Visual Basic in questi casi la fa da padrone, io qui non sono più in grado di aiutarti, spero davvero che un utente più esperto possa darti una mano.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Ciao a tutti,
    Ho provato ad utilizzare il DCount per risolvere il mio problema partendo dal controllo di un solo campo e scrivendo il seguente codice e funziona:

    Private Sub Allievo_BeforeUpdate(Cancel As Integer)
    If DCount("*", "Tab Lezioni Agenda", "Allievo='" & Me!Allievo & "'") <> 0 Then
    MsgBox "L'ALLIEVO SELEZIONATO HA GIA' PRENOTATO UNA LEZIONE IN QUESTO ORARIO"
    End If

    End Sub

    Adesso vorrei aggiungere il controllo sul campo OraInizio (Casella Testo) e DataLezione (Casella Data/ora) in modo da rendere unico il record DataLezione/OraInizio/Allievo... qualche suggerimento?? Inoltre vorrei impedire di poter continuare, ho provato ad aggiungere dopo MsgBox Me!Undo ma mi da errore... dove sbaglio??
    Grazie in anticipo
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Concatena i criteri con un And logico,
    CRiterio1 And Criterio2 And Criterio3
    Valuta che i criteri potrebbero non essere tutti compilati, quindi potrebbe essere necessaria una routine di validazione.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Ciao Alex,
    grazie e scusa per il ritardo. Ho provato in mille modi ma proprio non riesco a uscirne fuori.
    Ho provato come di seguito ma non funziona:

    Private Sub Allievo_BeforeUpdate(Cancel As Integer)
    If DCount("*", "Tab Lezioni Agenda", "Allievo='" & Me!Allievo & "'") And _
    ("*", "Tab Lezioni Agenda", "DataLezione='" & Me!DataLezione & "'") And _
    ("*", "Tab Lezioni Agenda", "OraInizio='" & Me!OraInizio & "'") <> 0 Then
    MsgBox "L'ALLIEVO SELEZIONATO HA GIA' PRENOTATO UNA LEZIONE IN QUESTO ORARIO"
    End If

    Puoi aiutarmi? Grazie in anticipo
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    I criteri vanno composti rispettando la SINTASSI corretta, che come dovresti sapere è differenziata per FieldType.
    
    Campi Numerici:
       "[NomeCampo]=" & Valore
    
    Campi Stringa:
       "[NomeCampo]='" & Valore & "'"
       oppure meglio su campi come cognomi
       "[NomeCampo]='" & REPLACE(Valore,"'","''") & "'"
    
    Campi Data:
        Trattazione lunga, allego Tutorial
    http://forum.masterdrive.it/microsoft-office-access-vba-23/vba-jet-tutorial-uso-campi-data-56461/

    Tu hai rispettato correttamente questi principi...? (NO)

    Poi la concatenazione deve essere fatta sulle stringhe...
    
    Criterio1 AND Criterio2
    non è come scrivere
    
    "Criterio1" & " AND " & "Criterio2"
    la 1° ovviamente è quella che hai usato tu ed è sbagliata...

    Mi pare ci siano molte cose da approfondire.
  • Re: IMPEDIRE L'INSERIMENTO DI RECORD DOPPI

    Nonostante i vostri consigli non sono riuscito a risolvere il mio problema, evidentemente è qualcosa di troppo grande per le mie capacità!!!
    Comunque ringrazio tutti per l'aiuto... dovrò cercare un'altra strada... se esite!!!
Devi accedere o registrarti per scrivere nel forum
12 risposte