Problemi con Query con Access 2010

di il
9 risposte

Problemi con Query con Access 2010

Salve a tutti,

sono un appassionato autodidatta che si diletta a costruire database con Access. Fino ad oggi, bene o male, sono riuscito a risolvere tutti i problemi che ho incontrato ma ultimamente sto sbattendo il capo in un problema che non riesco proprio a risolvere.
Ho creato un database (estensione del file .mdb) a un po' di tempo fa con Access 2000 e poi l'ho fatto girare con successo su Access 2003 e poi su Access 2007, facendo le opportune modifiche del caso. Preciso che il database ha tabelle collegate sia di Access sia di SQL Server e con Access 2007 funzionava bene.

Da qualche giorno sono passato, per cause di forza maggiore, ad Access 2010 ed ho avuto una brutta sorpresa. Alcune Query, che non davano problemi con il 2007, ora vanno più ed esce il messaggio "Query troppo complessa". Queste Query, in effetti sono abbastanza elaborate (magari pure un po' incasinate dato che non sono proprio un esperto) ed includono sia Tabelle che Query ed hanno anche alcuni JOIN.

Io non riesco a capire perché se con Access 2007 andavano bene con Access 2010 non vanno? Eppure entrambe le versioni hanno le stesse specifiche. Qualcosa di sicuro cambierà ma non riesco a capire cosa. Sto cercando anche di riprogettare queste Query ma comunque sto incontrando lo stesso problema.

Ringrazio chiunque vorrà darmi indicazioni.

9 Risposte

  • Re: Problemi con Query con Access 2010

    Potresti descrivere in dettaglio le tue tabelle con le relazioni e quali sono le query che danno problemi?
    Se le query sono troppo complesse, non solo per il sistema, ma soprattutto da chi le ha progettate, potrebbe essere opportuno spezzettarle in più query più semplici da compendere e gestire...indipendentemente dalla versione di Access.
  • Re: Problemi con Query con Access 2010

    OsvaldoLaviosa ha scritto:


    Potresti descrivere in dettaglio le tue tabelle con le relazioni e quali sono le query che danno problemi?
    Se le query sono troppo complesse, non solo per il sistema, ma soprattutto da chi le ha progettate, potrebbe essere opportuno spezzettarle in più query più semplici da compendere e gestire...indipendentemente dalla versione di Access.
    Ciao Osvaldo,

    la Query in questione è una Query di selezione che prende i dati da altre due Query, Anagrafica e Incarichi. La Query Anagrafica è una Query di Unione che prende i dati da 3 Tabelle collegate che risiedono su di un Server SQL. Non sono legate da relazioni, tutte hanno gli stessi campi in quanto archiviano i dati di tre tipologie di persone ed hanno una chiave primaria testuale che è un codice alfanumerico univoco per persona. Il Codice SQL della Query è il seguente:
    "SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica1
    UNION ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica2
    UNION ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica3
    ORDER BY [CampoTesto1], [CampoTesto2];"
    La Query incarichi è un'altra Query di Unione che prende i dati da due Tabelle collegate che risiedono sempre su di un Server SQL. Non sono legate da relazioni, entrambe hanno gli stessi campi in quanto archiviano i dati di due tipologie diverse di incarichi ed entrambe hanno un campo ID che è contatore e chiave primaria. Il codice SQL della Query è il seguente :
    "SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], [CampoTesto4], [CampoTesto5], [CampoBooleano1], [CampoBooleano2]
    FROM Incarichi1
    WHERE [CampoTesto2] IS NOT NULL AND [CampoBooleano1]=False AND [CampoBooleano2]=False
    UNION ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], [CampoTesto4], [CampoTesto5], [CampoBooleano1], [CampoBooleano2]
    FROM Incarichi2
    WHERE [CampoBooleano1]=False AND [CampoBooleano2]=False
    ORDER BY [CampoTesto1];"
    La Query incriminata prende i dati anagrafici e li associa agli incarichi per mezzo di un LEFTJOIN su di un campo comune, il codice alfanumerico univoco, e non ha criteri di selezione. Non credo che sia una Query molto complessa.
  • Re: Problemi con Query con Access 2010

    Non ho mai usato le query di unione. Non sono in grado di aiutarti. Prova a leggere qui
  • Re: Problemi con Query con Access 2010

    mikelemm ha scritto:


    ... Il Codice SQL della Query è il seguente:

    "SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica1
    UNION ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica2
    UNINON ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], ..., [CampoTesto20]
    FROM Anagrafica1
    ORDER BY [CampoTesto1], [CampoTesto2];"

    La Query incarichi è un'altra Query di Unione ... Il codice SQL della Query è il seguente :

    "SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], [CampoTesto4], [CampoTesto5], [CampoBooleano1], [CampoBooleano2]
    FROM Incarichi1
    WHERE [CampoTesto2] IS NOT NULL AND [CampoBooleano1]=False AND [CampoBooleano2]=False
    UNION ALL SELECT [CampoTesto1], [CampoTesto2], [CampoTesto3], [CampoTesto4], [CampoTesto5], [CampoBooleano1], [CampoBooleano2]
    FROM Incarichi2
    WHERE [CampoBooleano1]=False AND [CampoBooleano2]=False
    ORDER BY [CampoTesto1];"

    La Query incriminata prende i dati anagrafici e li associa agli incarichi per mezzo di un LEFTJOIN su di un campo comune, il codice alfanumerico univoco, e non ha criteri di selezione. Non credo che sia una Query molto complessa.
    Do per scontato che
    UNINON ALL SELECT
    anziché UNION ALL e
    ...
    FROM Anagrafica1
    ...
    FROM Anagrafica2
    ...
    FROM Anagrafica1
    con la ripetizione di Anagrafica 1, siano refusi da copia-incolla+modifiche manuali.

    Domanda numero 1: le due query di unione, eseguite singolarmente, non hanno problemi, vero?

    Domanda numero 2: chi ha fatto 2 SQL può far 3. A questo punto è fondamentale vedere anche in SQL anche la query incriminata, visto che è quella che crea problemi, stando ovviamente attento a trasporre le giuste descrizioni dei campi e la relativa query di provenienza, visto che in entrambi usi (credo solo per riportare il codice nel forum) gli stessi nomi: [CampoTesto1], [CampoTesto2].

    Qual è il campo chiave primaria di ogni tabella d'origine?

    Non ho la minima idea del perché su A2000, A2003 e A2007 funzionasse. Sto andando a tentativi.

    Hai provato a ricreare da zero le 3 query, direttamente su un db A2010?
  • Re: Problemi con Query con Access 2010

    OsvaldoLaviosa ha scritto:


    Non ho mai usato le query di unione. Non sono in grado di aiutarti. Prova a leggere qui https://support.office.com/it-IT/Artic ... 0a75541c6e
    Ti ringrazio per il suggerimento ma non riesco a visualizzare la pagina. Mi da errore e pagina non trovata.

    Philcattivocarattere ha scritto:


    Do per scontato che
    UNINON ALL SELECT
    anziché UNION ALL e
    ...
    FROM Anagrafica1
    ...
    FROM Anagrafica2
    ...
    FROM Anagrafica1
    con la ripetizione di Anagrafica 1, siano refusi da copia-incolla+modifiche manuali.
    Gli errori che mi hai evidenziato sono dovuti al copia/incolla e all'ora tarda. Il codice scritto nelle Query è corretto.

    Philcattivocarattere ha scritto:


    Domanda numero 1: le due query di unione, eseguite singolarmente, non hanno problemi, vero?
    Le due Query eseguite singolarmente non danno problemi.

    Philcattivocarattere ha scritto:


    Domanda numero 2: chi ha fatto 2 SQL può far 3. A questo punto è fondamentale vedere anche in SQL anche la query incriminata, visto che è quella che crea problemi, stando ovviamente attento a trasporre le giuste descrizioni dei campi e la relativa query di provenienza, visto che in entrambi usi (credo solo per riportare il codice nel forum) gli stessi nomi: [CampoTesto1], [CampoTesto2].
    Come avevo detto, la Query incriminata è di selezione e prende i dati da due Query di Unione, Anagrafica e Incarichi. Questo è il codice SQL:
    "SELECT Anagrafica.Codice, Anagrafica.Cognome, Anagrafica.Nome, Incarichi.Incarico, Incarichi.Dal FROM (Anagrafica LEFT JOIN Incarichi ON Anagrafica.Codice=Incarichi.Codice) ORDER BY Anagrafica.Cognome, Anagrafica.Nome"
    Sono tutti campi testo tranne "Dal" che è una data.

    Philcattivocarattere ha scritto:


    Qual è il campo chiave primaria di ogni tabella d'origine?
    Tutte e tre le tabelle Anagrafica hanno come campo chiave primaria "Codice", che è un codice alfanumerico univoco che identifica la persona. Le due tabelle incarichi hanno come campo chiave primaria un campo ID numerico che è un contatore.

    Philcattivocarattere ha scritto:


    Hai provato a ricreare da zero le 3 query, direttamente su un db A2010?
    Ho provato ma non ho avuto risultati e anche io sto facendo un po' di tentativi per vedere se riesco a trovare il bandolo della matassa.
  • Re: Problemi con Query con Access 2010

    mikelemm ha scritto:


    OsvaldoLaviosa ha scritto:


    Non ho mai usato le query di unione. Non sono in grado di aiutarti. Prova a leggere qui https://support.office.com/it-IT/Artic ... 0a75541c6e
    Ti ringrazio per il suggerimento ma non riesco a visualizzare la pagina. Mi da errore e pagina non trovata.
    Non so quanto possa esser utile però il link funziona (nella tua risposta è "mozzato")

    mikelemm ha scritto:


    Come avevo detto, la Query incriminata è di selezione e prende i dati da due Query di Unione, Anagrafica e Incarichi. Questo è il codice SQL:
    "SELECT Anagrafica.Codice, Anagrafica.Cognome, Anagrafica.Nome, Incarichi.Incarico, Incarichi.Dal FROM (Anagrafica LEFT JOIN Incarichi ON Anagrafica.Codice=Incarichi.Codice) ORDER BY Anagrafica.Cognome, Anagrafica.Nome"
    Sono tutti campi testo tranne "Dal" che è una data.
    Solo come "tentativo", prova ad escludere il campo "Dal" di tipo data.

    Si ha a che fare con tabelle collegate pure da Sql Server che non conosco quindi la soluzione potrebbe essere oltre le mie conoscenze. Per dare maggiori informazioni a chi è più ferrato di me e che magari a colpo d'occhio riconosce "il problema", quali sono le tabelle / query che risiedono su Sql Server, quali quelle su un altro db Access e quali quelle nel db dove esegui la query che si blocca? Tutte e 3 le query sono costruite sul db "locale", sono presenti sul SQL Server o l'altro db Access collegato? (ammesso che abbia capito quello che intedevi con)

    mikelemm ha scritto:


    Preciso che il database ha tabelle collegate sia di Access sia di SQL Server e con Access 2007 funzionava bene.
    Ancora: con che sistema ti colleghi a Sql Server? ODBC? (Ripeto: questo forse può essere d'aiuto a chi è più esperto di db collegati in rete)

    Quindi provo ancora a tentativi cercando di riflettere sulla struttura della/e query, ignorando il fatto che in passato funzionasse e che le tabelle non siano tutte in locale.

    Osservazione numero 1: perché usi "UNION ALL" e non solo "UNION". Hai bisogno di mantenere duplicati presenti in più tabelle? Questo sia per le tabelle anagrafiche (che sono 3) sia per le tabelle incarichi (che sono 2).

    Osservazione numero 2: lo stesso soggetto può essere presente in più tabelle anagrafiche? in particolare con lo stesso codice - chiave primaria?

    Osservazione numero 3: la stessa cosa dell'osservazione 2 ma fatta su "incarichi".

    Osservazione numero 4: perché usi Left join? C'è l'esigenza particolare di avere tutte le anagrafiche anche in assenza di incarichi?

    Cercavi risposte / soluzioni e ti tempesto di domande / osservazioni ma ti sto solo affiancando nell'analisi.
  • Re: Problemi con Query con Access 2010

    Philcattivocarattere ha scritto:


    Cercavi risposte / soluzioni e ti tempesto di domande / osservazioni ma ti sto solo affiancando nell'analisi.
    Ti ringrazio per questo, perché a volte, visto che sono l'ideatore, il solo produttore ed il principale consumatore di questo Database, fa piacere avere uno scambio di vedute e di idee con qualcuno che è ferrato sull'argomento.

    Philcattivocarattere ha scritto:


    Si ha a che fare con tabelle collegate pure da Sql Server che non conosco quindi la soluzione potrebbe essere oltre le mie conoscenze. Per dare maggiori informazioni a chi è più ferrato di me e che magari a colpo d'occhio riconosce "il problema", quali sono le tabelle / query che risiedono su Sql Server, quali quelle su un altro db Access e quali quelle nel db dove esegui la query che si blocca? Tutte e 3 le query sono costruite sul db "locale", sono presenti sul SQL Server o l'altro db Access collegato? (ammesso che abbia capito quello che intedevi con)

    mikelemm ha scritto:


    Preciso che il database ha tabelle collegate sia di Access sia di SQL Server e con Access 2007 funzionava bene.
    Ancora: con che sistema ti colleghi a Sql Server? ODBC? (Ripeto: questo forse può essere d'aiuto a chi è più esperto di db collegati in rete)
    Sul Server risiedono Anagrafica1, Anagrafica2, incarichi1 e Incarichi2 mentre Anagrafica3 risiede in un file mdb di Access. Invece, tutte e 3 la Query sono sul Database locale. Le Tabelle SQL le ho collegate sul Database locale con ODBC.

    Philcattivocarattere ha scritto:


    Osservazione numero 1: perché usi "UNION ALL" e non solo "UNION". Hai bisogno di mantenere duplicati presenti in più tabelle? Questo sia per le tabelle anagrafiche (che sono 3) sia per le tabelle incarichi (che sono 2).
    Ammetto la mia ignoranza e sinceramente ti dico che non ho mai approfondito la differenza tra "UNION ALL" e "UNION". Nelle tabelle anagrafiche non ci sono duplicati mentre nelle tabelle degli incarichi ho dei duplicati.

    Philcattivocarattere ha scritto:


    Osservazione numero 2: lo stesso soggetto può essere presente in più tabelle anagrafiche? in particolare con lo stesso codice - chiave primaria?
    Osservazione numero 3: la stessa cosa dell'osservazione 2 ma fatta su "incarichi".
    Come ho detto prima, nelle tabelle anagrafiche un soggetto può appartenere ad una sola tabella ed il codice è unico per ogni persona. Invece, lo stesso soggetto può avere più incarichi anche di differente tipologia (lo stesso soggetto può essere presente più volte nella stessa tabella o essere presente nelle due tabelle degli incarichi)

    Philcattivocarattere ha scritto:


    Osservazione numero 4: perché usi Left join? C'è l'esigenza particolare di avere tutte le anagrafiche anche in assenza di incarichi?
    Si, mi serve avere tutte le persone anche se non hanno incarico.

    Dopo aver risposto alle tue osservazioni, ti dico che dopo diversi tentativi e svariate prove sono riuscito a trovare una soluzione.
    Per prima cosa, sono riuscito ad avere sul computer sia A2010 che A2007 così da poter aprire il Database locale con le due versioni a seconda che le Query funzionavano o meno su A2010.
    Mi sono accorto che su A2010, togliendo le condizioni "WHERE" ad Incarichi1 e ad Incarichi2 nella Query di unione Incarichi
    ... WHERE [CampoTesto2] IS NOT NULL AND [CampoBooleano1]=False AND [CampoBooleano2]=False ...
    ... WHERE [CampoBooleano1]=False AND [CampoBooleano2]=False ...
    riuscivo ad aprire la Query ma, naturalmente, non restituiva i risultati che mi servivano.
    A questo punto ho creato una nuova Query di selezione, che ho chiamato IncarichiFiltro. Questa Query prende i dati da Incarichi e qui ho messo i criteri di selezione corrispondenti alle condizioni "WHERE" precedentemente tolte da Incarichi. Ho sostituito questa nuova Query nella Query incriminata e finalmente è si è aperta.
    Alla fine, forse, mi sono fatto un idea di quale fosse il problema. Sperando di non dire eresie, presumo che il problema stia nella conversione fatta da A2010 sui tipi di dati di SQL Server perché i campi che in Access sono testo sul Server sono "varchar" mentre i si/no sono "bit".
    Non so se ho fatto cose corrette o meno dal punto di vista informatico ma finalmente il mio Database è tornato a funzionare!
  • Re: Problemi con Query con Access 2010

    mikelemm ha scritto:


    Philcattivocarattere ha scritto:


    Cercavi risposte / soluzioni e ti tempesto di domande / osservazioni ma ti sto solo affiancando nell'analisi.
    Ti ringrazio per questo, perché a volte, visto che sono l'ideatore, il solo produttore ed il principale consumatore di questo Database, fa piacere avere uno scambio di vedute e di idee con qualcuno che è ferrato sull'argomento.
    Beh... ferrato in materia di Sql Server proprio. Infatti la soluzione l'hai "trovata da solo"

    mikelemm ha scritto:


    ...

    Philcattivocarattere ha scritto:


    Osservazione numero 1: perché usi "UNION ALL" e non solo "UNION". Hai bisogno di mantenere duplicati presenti in più tabelle? Questo sia per le tabelle anagrafiche (che sono 3) sia per le tabelle incarichi (che sono 2).
    Ammetto la mia ignoranza e sinceramente ti dico che non ho mai approfondito la differenza tra "UNION ALL" e "UNION". Nelle tabelle anagrafiche non ci sono duplicati mentre nelle tabelle degli incarichi ho dei duplicati.
    Il problema non era in ALL ma, per come hai descritto la situazione, almeno nella query Anagrafiche penso che si possa togliere. Quanto alla differenza, una banalissima ricerca nella guida in linea e/o sul web ti spiega tutto (c'era un esempio ovviamente anche nel link segnalato da Osvaldo)

    mikelemm ha scritto:


    Dopo aver risposto alle tue osservazioni, ti dico che dopo diversi tentativi e svariate prove sono riuscito a trovare una soluzione.
    ...
    Alla fine, forse, mi sono fatto un idea di quale fosse il problema. Sperando di non dire eresie, presumo che il problema stia nella conversione fatta da A2010 sui tipi di dati di SQL Server perché i campi che in Access sono testo sul Server sono "varchar" mentre i si/no sono "bit".
    Non so se ho fatto cose corrette o meno dal punto di vista informatico ma finalmente il mio Database è tornato a funzionare!
    Bon. Vista la mia ignoranza in Sql Server non posso né confermare né smentire, però alla fine ne sei uscito.

    mikelemm ha scritto:


    Per prima cosa, sono riuscito ad avere sul computer sia A2010 che A2007 così da poter aprire il Database locale con le due versioni a seconda che le Query funzionavano o meno su A2010.
    Anche se da alcune parti si legge che possono convivere, in particolare se prima si installa la versione 2007 e poi la 2010, il suggerimento "universale" è quello di tenerle separate, eseguendo i test con le diverse versioni installate singolarmente su macchine virtuali. E sottolineo test, nel senso che poi il db deve funzionare con la versione di Access che si usa normalmente.
  • Re: Problemi con Query con Access 2010

    Philcattivocarattere ha scritto:


    Il problema non era in ALL ma, per come hai descritto la situazione, almeno nella query Anagrafiche penso che si possa togliere. Quanto alla differenza, una banalissima ricerca nella guida in linea e/o sul web ti spiega tutto (c'era un esempio ovviamente anche nel link segnalato da Osvaldo)
    Grazie per il suggerimento. Rivedrò il codice della Query di unione delle Tabelle Anagrafiche.

    Philcattivocarattere ha scritto:


    Anche se da alcune parti si legge che possono convivere, in particolare se prima si installa la versione 2007 e poi la 2010, il suggerimento "universale" è quello di tenerle separate, eseguendo i test con le diverse versioni installate singolarmente su macchine virtuali. E sottolineo test, nel senso che poi il db deve funzionare con la versione di Access che si usa normalmente.
    Sul pc è stato installato prima A2010 poi A2007 e sono riusciti a convivere senza problemi apparenti. Solo che Access faceva la procedura di avvio quando cambiavo versione. Li ho usati solo il tempo necessario a fare i test e poi, quando sono riuscito a far funzionare di nuovo tutto, A2007 è stato disinstallato.
Devi accedere o registrarti per scrivere nel forum
9 risposte