Query di accodamento e record doppi

di il
11 risposte

Query di accodamento e record doppi

Ciao a tutti!!
Sono nuovissimo del forum e da poco tempo ho cominciato a dedicarmi alla creazione di database su Access (uso il 2013).

Mi ritrovo con questo problema: ho una maschera che registra dei componenti impiantistici (immaginate una semplice caldaietta di casa con i suoi dati tecnici) e da quella maschera premo un pulsante per fare creare nella tabella "registro di manutenzione" tutte le attività da eseguire su quella caldaia (immaginate il controllo dei fumi, la pulizia, etc...) attraverso una query di accodamento.
Quello che vorrei fare è evitare che ri-premendo il pulsante venga ricreato un record doppio.
Dal momento che i campi da verificare sono 4 per controllare l'eventuale duplicato, cercando su internet ho trovato il suggerimento di utilizzare IF DCount e i 4 AND che mi servono.
Quello che non riesco proprio a capire è dove inserire il controllo.
Se qualcuno mi potesse aiutare anche magari con soluzioni alternative, ne sarei molto grato.

Grazie a tutti e buona giornata

11 Risposte

  • Re: Query di accodamento e record doppi

    Direi che devi individuare l'elemento che ti consente di capire se è già stato inserito...!
    A mio avviso è composto da 2 dati:
    1) Anno(DataEsecuzione)
    2) Componente(se casualmente non hai solo la caldaietta di casa)

    Se questi 2 Criteri in AND non danno risultati puoi inserire
    
    IF DCOUNT("*","NomeTabella","Year(Data)=Year(Now()) AND CodiceCOmponente=.....")=0 Then
       ' Esegui la Query INSERT
    Else
       MsgBox "GIA' PRESENTE"
    End If
  • Re: Query di accodamento e record doppi

    Ti ringrazio della risposta @Alex, ma non sono sicuro di aver compreso e forse ho anche spiegato male.
    Allora, quando lancio la query di accodamento, la stessa prende i dati da 2 tabelle diverse e li inserisce in una terza.
    Nel dettaglio: dalle tabelle censimento pesca il dato tipo di impianto (elettrico, meccanico, etc..) e dalla tabella delle attività di manutenzione quelle da eseguire sull'impianto scelto; oltre a questo aggiunge la data entro cui bisogna fare la manutenzione.
    Vorrei evitare che la query mi replicasse i record, per cui deve controllare che l'ID dell'impianto selezionato e la data di scadenza non siano uguali.
    Ho compreso la funzione IF Dcount e immagino che funzioni perfettamente, ma quello che non riesco a capire è dove inserirla.
    La query viene attivata da un pulsante su una maschera, sull'evento click: aggiungo il codice sempre all'evento click?

    Grazie.
  • Re: Query di accodamento e record doppi

    @Alex ti ha risposto in maniera logico-sintetica. Certamente all'evento Su clic del pulsante devi associare quel codice. Sotto dove ti ha scritto:
    ' Esegui la Query INSERT
    ci scrivi esattamente DoCmd.OpenQuery col nome della query INSERT ecc...
  • Re: Query di accodamento e record doppi

    Per il momento vi ringrazio.
    Stasera provo e vi faccio sapere!
  • Re: Query di accodamento e record doppi

    Niente.
    E' da ieri sera che ci provo ma non riesco a farla funzionare. Se potete darmi una mano.
    Se la tabella è vuota la query di accodamento funziona, ma se c'è dentro un valore mi restituisce sempre 'già presente'.
    Ecco il codice:
    Me.Refresh
    If DCount("*", "REGISTROManutenzione", "IMPIANTO AND 'ID_Impianto' AND 'Attività_Manutentiva' AND 'Da_effettuare_il'") = 0 Then
    DoCmd.OpenQuery "creaREGMANFM", acViewNormal, acEdit
    Else
    MsgBox "GIA' PRESENTE"
    End If
    Il refresh l'ho inserito perché attivando da una maschera voglio essere sicuro che il valore sia stato registrato in tabella.
    Qui il codice della query:
    INSERT INTO REGISTROManutenzione ( Cliente, Immobile, [ID Impianto], [TIPO DI ATTIVITÀ], [Attività Manutentiva], FREQUENZA, IMPIANTO, [Data di creazione], FrequenzaGG, [Da Effettuare il] )
    SELECT CENSIMENTOForzaMotrice.Cliente, CENSIMENTOForzaMotrice.Immobile, CENSIMENTOForzaMotrice.ID, [Attività MANUTENTIVE].[TIPO DI ATTIVITÀ], [Attività MANUTENTIVE].ATTIVITÀ, [Attività MANUTENTIVE].FREQUENZA, CENSIMENTOForzaMotrice.IMPIANTO, Now() AS Expr1, Frequenze.FrequenzaGG, DateAdd("d",[Frequenze]![FrequenzaGG],Date()) AS Expr2
    FROM Frequenze INNER JOIN (CENSIMENTOForzaMotrice INNER JOIN [Attività MANUTENTIVE] ON CENSIMENTOForzaMotrice.IMPIANTO = [Attività MANUTENTIVE].IMPIANTO) ON Frequenze.FREQUENZA = [Attività MANUTENTIVE].FREQUENZA
    WHERE (((CENSIMENTOForzaMotrice.ID)=[Forms]![CENSIMENTO FORZA MOTRICE]![ID]));
    
    Il database è strutturato in questo modo:
    Nelle Tabelle di CENSIMENTO (una tabella per ogni tipo di impianto) vengono registrati tutti i parametri degli impianti, mentre nella tabella attività manutentore vengono inserite le manutenzioni da eseguire che sono differenziate in base alla tipologia di impianto (Quadri elettrici, Illuminazione, etc.. Le manutenzione sono cicliche e da eseguire a scadenze regolari, tipo mensile, semestrale, etc..).
    La query crea il REGISTRO DI MANUTENZIONE dove ci sono attività da eseguire e attività già eseguite.
    Per evitare il record venga duplicato ho bisogno di verificare 4 campi..
  • Re: Query di accodamento e record doppi

    cridema ha scritto:


    Se la tabella è vuota la query di accodamento funziona, ma se c'è dentro un valore mi restituisce sempre 'già presente'
    A me sembra che era esattamente quello che avevi chiesto all'inizio.
    Se così non è, almeno per me, potresti dare una descrizione molto più chiara di:
    - tutti i nomi propri delle tabelle
    - tutti i nomi propri campo, indicando la chiave primaria
    - le relazioni
    - spiega in termini più tecnico-Access (meno secondo il tuo linguaggio professionale che io non conosco) quali sono i vincoli della tua query

    (io non so leggere le query in SQL).

    cridema ha scritto:


    Tabelle di CENSIMENTO (una tabella per ogni tipo di impianto)
    Per me c'è qualcosa di NON NORMALIZZATO.
  • Re: Query di accodamento e record doppi

    Ok, chiedo scusa, ma sono nuovo sia del forum che della programmazione..
    Le tabelle e i campi in causa:
    [CENSIMENTOForzaMotrice] 'ID' (autonumber chiave primaria), 'IMPIANTO' (testo)

    [Attività MANUTENTIVE] ( pian piano sto eliminando gli spazi dai nomi..) 'ID' (autonumber chiave primaria), 'IMPIANTO' (testo), 'ATTIVITà' (testo lungo), 'FREQUENZA' (testo), 'FREQUENZAGG' (numero)

    [REGISTROManutenzione] 'ID' (autonumber chiave primaria), 'IMPIANTO' (testo), 'ID Impianto' (numero), 'Attività Manutentiva' (testo lungo), 'FREQUENZAGG' (numero), 'Effettuata il' (data), 'da effettuare il' (data)

    Nella query di acccodamento ho messo in relazione:

    [CENSIMENTOForzaMotrice]'IMPIANTO' con [Attività MANUTENTIVE]'IMPIANTO' e la query inserisce questi dati nella tabella [REGISTROManutenzione]:

    'ID impianto' da [CENSIMENTOForzaMotrice]'ID' con la condizione WHERE di selezionare il valore dell'ID visualizzato nella maschera associata a [CENSIMENTOForzaMotrice];

    'IMPIANTO' da [CENSIMENTOForzaMotrice]'IMPIANTO';

    'ATTIVITà' da [Attività MANUTENTIVE]'Attività';

    'FREQUENZAGG' da [Attività MANUTENTIVE]'FREQUENZAGG';

    'Da effettuare il' lo calcola la query sommando il valore del campo 'FREQUENZAGG' alla data odierna (Date())

    Quello che vorrei ottenere è che se per sbaglio rilancio la query vengano creati duplicati di record già immessi. Non posso filtrare utilizzando solo il campo 'ID impianto' perché le tabelle [CENSIMENTOxxxx] sono più di una.

    Grazie per il supporto!!
  • Re: Query di accodamento e record doppi

    1. Non conosco affatto il tuo campo professionale. Occorrerebbe una descrizione ad ampio respiro. Di cosa parla il tuo database?
    2. Vedo il campo Impianto un po' ovunque
    3. Il campo chiave primaria è sempre meglio nominarlo IDNomeTabella e non sempre e solo ID, altrimenti si possono creare ambiguità in futuro.
    4. Hai dato dei nomi di tabella alquanto complessi (CensimentoForzaMotrice) e sospetto anche inappropriati...non vorrei tu stia confondendo le tabelle con le query.
    5. Se hai una lista di Impianti è giusto chiamare la tabella Impianti. Poi...boh!!!???
    6. AttivitàManutentive e RegistroManutenzione: che significano? A me sembra che parlino lo stesso linguaggio.
    7. Quando si parla di relazioni, queste devono essere già state progettate nella finestra Relazioni, non soltanto nelle query.
  • Re: Query di accodamento e record doppi

    Ben venga qualsiasi tipo di consiglio!
    Allora lavoro nel campo delle manutenzioni degli impianti e questo database vorrebbe, per il momento, ottenere due obiettivi principali: raccogliere le informazioni sui componenti da manutenere e tenere traccia delle manutenzioni eseguite e da eseguire.
    Immaginate di essere un elettricista e di avere diversi contratti di manutenzione: ho diversi clienti, diversi immobili/siti su cui intervenire, diversi impianti da manutenere. Dico diversi, perché all'interno degli impianti elettrici ci sono diversi componenti come cabine di media tensione, quadri elettrici, gruppi elettrogeni, illuminazione, prese (detta anche forza motrice) e ogni componente ha necessità e manutenzioni diverse, proprio come la nostra auto, dove il cambio olio si fa ogni tot km, le gomme ogni tot, la cinghia di distribuzione e via dicendo.
    Nel mio DB le tabelle sono le seguenti:
    Clienti, con NomeCliente come testo e chiave primaria
    Immobili con la sua denominazioneImmobili come chiave primaria
    Attività Manutentive ID come chiave. Qui vengono inserite le manutenzioni che devono essere eseguite e la loro frequenza (mensile, semestrale, annuale, etc..)
    Le varie tabelle CENSIMENTOxxxx con l'ID come chiave primaria (al momento sono 4, ma devono aumentare, quadri elettrici, forza motrice, illuminazione e illuminazione di emergenza)
    La tabella REGISTROmanutenzione con il suo ID chiave. Qui vengono inserite le attività eseguite e quelle da eseguire.
    Relazioni:
    [Clienti]NomeCliente é relazionata con [Immobili] e con tutte le tabelle Censimento e [RegistroManutenzione]
    [Immobili]DenomImmobili é relazionata con i Censimenti e [RegistroManutenzione].
    I due componenti principali del database sono 2: il componente e la sua attività.
    Il componente non può essere identificato in modo univoco con un nome, perché, per esempio, i quadri elettrici si chiamano sempre QGBT (quadro generale di bassa tensione, QEP1, quadro elettrico piano primo, etc). Per questo motivo le tabelle censimenti contengono sempre il Cliente, l'immobile e il campo Impianto che mi definisce la tipologia. Lo stesso dicasi per la tabella [REGISTROManutenzione].
    Spero di essere riuscito a dare un'idea più generale del tutto e qualsiasi suggerimento di modifica anche sull'architettura é graditissimo!
  • Re: Query di accodamento e record doppi

    Sei stato relativamente chiaro nell'esporre il tuo campo professionale.
    Osservo un caos a livello di organizzazione tabelle che, secondo me, occorre rifare tutto da capo.
    Chi ha voglia di sbrogliarti la MATASSA che a me appare TROPPO INGARBUGLIATA?
    Il problema è diventato completamente diverso dal titolo iniziale. Ti suggerisco di aprire una nuova discussione nella sezione "Progettazione database". Riesponi (come hai fatto qui) tutto lo scenario dell'ultimo tuo post.
  • Re: Query di accodamento e record doppi

    Ammazza quanto me fai scrive!!!
    Appena riesco faccio!
    Grazie mille!!
Devi accedere o registrarti per scrivere nel forum
11 risposte