RISOLTO: Interrogazione tabella Postgre da Access

di il
15 risposte

RISOLTO: Interrogazione tabella Postgre da Access

Buongiorno,

ho il seguente problema: in un db FE Access ho creato un collegamento ODBC ad una tabella di un db Postgre. Questa tabella contiene il monitoraggio delle macchine CNC della ditta. Ci sono circa (ad oggi) 900.000 records con 13 campi per ogni record; ultimamente quando  la interrogo da Access attraverso una query mi da errore "3146 ODBC: chiamata non riuscita". Ho controllato e la stringa di collegamento funziona.

Potrebbe essere legato al numero molto elevato di records da processare?

Che tipo di approccio devo utilizzare in questo caso?

15 Risposte

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - Mailman ha scritto:


    ultimamente quando  la interrogo da Access

    Quindi fino a poco tempo fa funzionava tutto? Quanti erano prima i record? cambiato driver ODBC, versione di Postgresql? (il nome giusto è quello lì, anche se non lo dice nessuno completo, credo).

    Hai provato con tabelle con meno record? utente e pwd sono memorizzati a livello di connessione ODBC?

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Chiedo scusa perche' non ho specificato correttamente il problema.

    La tabella collegata (public_events) la interrogo con alcune query da Access: in un caso filtro i dati in modo da ottenere un risultato che ha pochi records (max 15-20) e non ho errori. Questo il predicato SQL della query:

    SELECT public_events.order, tblIMidmacchine.DEStabIMdescrizione, tblSMstatomacchine.DEStabSMst, Sum(public_events.duration) AS SommaDiduration
    FROM (tblIMidmacchine RIGHT JOIN public_events ON tblIMidmacchine.DEStabIMmacchina = public_events.machine_id) LEFT JOIN tblSMstatomacchine ON public_events.value = tblSMstatomacchine.DEStabSMsm
    GROUP BY public_events.order, tblIMidmacchine.DEStabIMdescrizione, tblSMstatomacchine.DEStabSMst, public_events.machine_id, public_events.value
    HAVING (((public_events.order)=[Maschere]![frmPRcommessaprincipale]![NUMtabPRcommessa]))
    ORDER BY tblIMidmacchine.DEStabIMdescrizione, tblSMstatomacchine.DEStabSMst;
    

    Quando invece utilizzo una query che mi deve restituire un numero di records piu' elevato (anche 300-400.000 righe) ottengo l'errore di cui sopra. Questo il predicato SQL della query:

    SELECT DISTINCTROW TblIMidmacchine.DEStabIMdescrizione, public_events.order, TblSMstatomacchine.DEStabSMst, Format$([public_events].[start_time],'Short Date') AS Inizio_programma, Sum(public_events.duration) AS SommaDiduration, public_events.program
    FROM (public_events LEFT JOIN TblSMstatomacchine ON public_events.value = TblSMstatomacchine.DEStabSMsm) LEFT JOIN TblIMidmacchine ON public_events.machine_id = TblIMidmacchine.DEStabIMmacchina
    GROUP BY TblIMidmacchine.DEStabIMdescrizione, public_events.order, TblSMstatomacchine.DEStabSMst, Format$([public_events].[start_time],'Short Date'), public_events.program
    ORDER BY TblIMidmacchine.DEStabIMdescrizione, public_events.order, Format$([public_events].[start_time],'Short Date') DESC;

    Ogni mese vengono aggiunti circa 20.000 records alla tabella.

    La versione di PostgreSQL e' la 15. Di seguito la stringa di connessione alla tabella che utilizzo ad ogni avvio del FE Access perche' cancello il collegamento e lo rigenero ad ogni avvio:

    ...
    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;DSN=PostgreSQL30;SERVER=192.168.0.99;PORT=5432;UID=***;PWD=***;LANGUAGE=us_english;" & _
        "DATABASE=costamp_prod", acTable, "public.events", "public_events"

    Ho sostituito UID e psw  con gli * per ovvi motivi di privacy…

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Nessuna risposta prêt-à-porter, con PostgreSQL ho litigato tempo fa e l'ho lasciato vincere, per quel poco che mi serviva.

    Si potrebbe provare a vedere se quella query è “semplificabile” a step successivi. Per prima cosa suggerirei di racchiudere tra [] il campo ORDER, magari SQL si infastidisce a vederlo libero, come se fosse un criterio di ordinamento monco.

    Prova a semplificare, sempre a titolo di test, togliendo il DISTINCTROW e i criteri di ordinamento. Lascia il campo Start_time così com'è, senza applicare il format. Sono tutti tentativi, eh.

    Andando invece nell'altro ordine, dalla situazione più semplice alla più complicata, una query terra terra tipo questa

    SELECT 
    	TblIMidmacchine.DEStabIMdescrizione,
    	public_events.[ORDER],
    	TblSMstatomacchine.DEStabSMst,
    	[public_events].[start_time] AS Inizio_programma,
    	public_events.duration,
    	public_events.program
    FROM (
    	public_events LEFT JOIN TblSMstatomacchine ON public_events.value = TblSMstatomacchine.DEStabSMsm
    	)
    LEFT JOIN TblIMidmacchine ON public_events.machine_id = TblIMidmacchine.DEStabIMmacchina

    dà grane subito? Se va dritta aggiungi il DISTINCTROW, poi ancora la formattazione su Start_time e via di seguito con raggruppamenti ed ordinamenti.

    Però… più la guardo meno mi piace, a naso: il DISTINCTROW in una query con raggruppamenti/somma… non lo so. Non ho un motivo particolare per dirlo, è solo una sensazione (con la quale si fa molta strada in informatica)

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Ho testato il Tuo suggerimento semplificando la query togliendo il DISTINCTROW, togliendo la formattazione data e l'ordinamento ed ha funzionato:

    SELECT TblIMidmacchine.DEStabIMdescrizione, public_events.order, TblSMstatomacchine.DEStabSMst, public_events.start_time, Sum(public_events.duration) AS SommaDiduration, public_events.program
    FROM (public_events LEFT JOIN TblSMstatomacchine ON public_events.value = TblSMstatomacchine.DEStabSMsm) LEFT JOIN TblIMidmacchine ON public_events.machine_id = TblIMidmacchine.DEStabIMmacchina
    GROUP BY TblIMidmacchine.DEStabIMdescrizione, public_events.order, TblSMstatomacchine.DEStabSMst, public_events.start_time, public_events.program

    Poi ho ripristinato gradualmente la query ed ha ripreso a funzionare. Di fatto non ho cambiato nulla… non so se sia collegato ad un problema di memoria di elaborazione quando deve formattare ogni singola data di ogni record.

    Da questa mattina ad oggi pomeriggio ho solo chiuso e riaperto il db FE. Comunque proseguo nei test, voglio vedere se riesco a capire quando mi da' l'errore.

    Stavo pensando di richiedere a chi ci ha fornito il programma di monitoraggio, di creare nel suo db le tabelle gia' con i records, raggruppati, filtrati e formattati come servono a me, in modo che, quando le collego, non devo adattare i dati ma solo, eventualmente, filtrarli.

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - Mailman ha scritto:


    ed ha ripreso a funzionare. Di fatto non ho cambiato nulla

    Queste sì che sono soddisfazioni, eh? non capirci assolutamente nulla del “prima” e del “dopo”.

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Ci risiamo, lanciando la query e' venuto fuori un nuovo errore (ma credo sia collegato a quello di prima).

    Ho chiuso e riaperto il db e la query ha ripreso a funzionare mostrando gli 870.000 records. 

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Forse ho trovato la quadra del problema: nelle impostazioni delle query c'e' un valore per il Timeout ODBC impostato di default a 60 secondi.

    Probabilmente l'elaborazione della query supera questo tempo e va in errore. Ho provato ad impostare a 120 secondi e sto testando.

    Il problema e' che, non generando l'errore sempre, non so se sia la strada giusta…

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Tentativo per tentativo prova questo

    https://stackoverflow.com/questions/22532149/vba-and-postgresql-connection

    oppure, semplicemente, (credo che sia la stessa cosa) abilita l'apposita casella dell'origine dati ODBC

    (queste sono impostazioni di default, non ho cambiato nulla, quindi è probabile che anche per te non ci sia il segno di spunta)

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - Mailman ha scritto:


    Forse ho trovato la quadra del problema: nelle impostazioni delle query c'e' un valore per il Timeout ODBC impostato di default a 60 secondi.

    Probabilmente l'elaborazione della query supera questo tempo e va in errore. Ho provato ad impostare a 120 secondi e sto testando.

    Il problema e' che, non generando l'errore sempre, non so se sia la strada giusta…

    Toglimi una curiosita', ma una query che dura oltre un minuto e restituisce 900K righe, come la utilizzi poi?

    Se vengono aggiunti 20K righe/mese vuol dire che stai leggendo 4 anni e mezzo di movimenti

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - Philcattivocarattere ha scritto:


    Tentativo per tentativo prova questo

    https://stackoverflow.com/questions/22532149/vba-and-postgresql-connection

    oppure, semplicemente, (credo che sia la stessa cosa) abilita l'apposita casella dell'origine dati ODBC

    (queste sono impostazioni di default, non ho cambiato nulla, quindi è probabile che anche per te non ci sia il segno di spunta)

    Grazie Phil per lil suggerimento. Anche il mio driver non aveva la spunta (io uso PostgreSQL30).

    Faccio qualche test fra oggi e domani per verificare se si ripresenta l'errore.

    30/08/2023 - amorosik ha scritto:


    Toglimi una curiosita', ma una query che dura oltre un minuto e restituisce 900K righe, come la utilizzi poi?

    Se vengono aggiunti 20K righe/mese vuol dire che stai leggendo 4 anni e mezzo di movimenti

    Le query non restituiscono tutti i records ma solo quelli filtrati in base ai criteri. E' la tabella collegata che presenta tutti i records. Ovviamente quando cerco di simulare un errore che accade “random” provo a mettere sotto stress il programma con il maggior numero di records per valutare le possibili cause…

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Stai usando una query passt trough…?

    Il criterio having del predicato SQL non viene minimamente riconosciuto scritto così… è il classico modo sbagliato di usare un RDBMS via odbc.

    La risoluzione del riferimento all'oggetto di maschera non può essere fatto Server Side, il motore non sa cosa sia Maschere!….

    Devi Ttiare la risoluzione esplicita costruendo il predicato sql con il valore diretto già convertito… oppure usando una query parametrica oppure usando una Stored Procedure parametrica…

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - @Alex ha scritto:


    Stai usando una query passt trough…?

    Buongiorno Alex, non e' una query pass-through, si appoggia alla tabella “public_events” nel FE collegata via ODBC al server PostgreSQL.

    Pero', seguendo il Tuo spunto, voglio provare a creare l'interrogazione direttamente lato server per ridurre il traffico dati, senza dover quindi collegare prima la tabella e poi creare la query di selezione.

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    Fermo fermo… hai detto cose non corrette.

    La tabella va collegata non è un problema, il problema esiste quando si creano query sbagiate come nel tuo caso.

    Se il predicato SQL è risolvibile SERVERSIDE il driver ottimizza sempre ed il traffico dati di conseguenza.

    Ovviamente se la costruisci come l'hai scritta tu e è sostanzialmente una enorme cavolata tecnica in quanto è ovvio non possa essere risolta dal server… 

    Quindi distinguiamo sempre le cose.l

  • Re: RISOLTO: Interrogazione tabella Postgre da Access

    30/08/2023 - Philcattivocarattere ha scritto:


    entativo per tentativo prova questo

    https://stackoverflow.com/questions/22532149/vba-and-postgresql-connection

    oppure, semplicemente, (credo che sia la stessa cosa) abilita l'apposita casella dell'origine dati ODBC

    Dopo 2 settimane senza piu' intoppi nell'esecuzione della query, credo di avere risolto il problema sulla base del consiglio di Phil che ringrazio.

    Per Alex: ho troppa stima per il supporto che dai al forum, per cui non commento ulteriormente il tuo ultimo post che forse e' stato scritto “un po' frettolosamente” senza avere letto bene i post sopra.

    P.S.: Se le query funzionano e danno i risultati richiesti, non vedo perche' debbano essere sbagliate…

Devi accedere o registrarti per scrivere nel forum
15 risposte