Apertura Maschera lenta con BE su LAN

di il
12 risposte

Apertura Maschera lenta con BE su LAN

Buongiorno.

Ho un DB diviso FE-BE. Il BE è su un percorso di rete e i FE sono 5 su altrettanti PC in azienda.

Il problema  è che alcune maschere, all'apertura, impiegano anche 2 o 3 secondi.

In particolare sono problematiche le maschere nelle quali ci sono Combobox che utilizzo per filtrare i dati della maschera che dall'alto della mia ignoranza ho usato come segue

L'esempio più problematico è la Maschera “LottiDiProduzione” (quasi 3 secondi all'apertura) che ha 4 Combo per filtrare i dati e come origine record ha la seguente SELECT piuttosto complicata per la presenza delle combo

Da notare che le tabelle di origine, Lotti e Prodotti hanno al più qualche centinaio di record e singolarmente si aprono istantaneamente il che mi ha fatto pensare a dover riprogettare le maschere

SELECT LottiProduzione.ID, LottiProduzione.Data, LottiProduzione.ID_Prodotto, LottiProduzione.DataScadenza, LottiProduzione.Conservazione, LottiProduzione.Note, LottiProduzione.EAN, LottiProduzione.DataChiusura, Prodotti.DESCRIZIONE, Prodotti.DESCRIZIONE2, Prodotti.REPARTO, Prodotti.FAMIGLIA, Prodotti.GRUPPO, Prodotti.UM, Prodotti.PESO 
FROM Prodotti RIGHT JOIN LottiProduzione ON Prodotti.ID = LottiProduzione.ID_Prodotto 
WHERE (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo])) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null)) OR 
      (((LottiProduzione.ID_Prodotto)=[Maschere]![Lotti di Produzione]![CmbProdotto]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null)) OR 
      (((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND ((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.GRUPPO)=[Maschere]![Lotti di Produzione]![CmbGruppo]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND ((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.REPARTO)=[Maschere]![Lotti di Produzione]![CmbRep]) AND (([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      (((Prodotti.FAMIGLIA)=[Maschere]![Lotti di Produzione]![CmbFamiglia]) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) OR 
      ((([Maschere]![Lotti di Produzione]![CmbFamiglia]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbRep]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbGruppo]) Is Null) AND (([Maschere]![Lotti di Produzione]![CmbProdotto]) Is Null)) 
ORDER BY LottiProduzione.ID DESC;

Si accettano suggerimenti di ogni tipo

12 Risposte

  • Re: Apertura Maschera lenta con BE su LAN

    Non si posson vedere query scritte in quel modo…

    Il criterio migliore è quello scritto se serve.

    Tu hai riempito la query di criteri includendo Is NULL nelncaso non fosse inserito il criterio…

    Scrivi una query intelligente, valida i criteri ed integrali solo se serve Vedrai che la query sarà veloce.

    Mi pare sia stato suggerito recentemente un link che spiegava come comporre correttamente il criterio… poi rigeneri la query SQL in modo intelligente.

  • Re: Apertura Maschera lenta con BE su LAN

    Ricorda anche che meglio privilegiare query usando i PARAMATERS… per motivi di sicurezza ovviamente, se la usi solo tu puoi anche ometterlo.

  • Re: Apertura Maschera lenta con BE su LAN

    Ciao. Una curiosità. 

    Parli di fonte dati, ma quella che hai postato fa riferimento ad elementi della maschera, quindi non può essere una query di fonte dati al caricamento, ma una query che usi per fare una ricerca, quindi in teoria dopo il caricamento della maschera. A nasi, non dovrebbe influire sull apertura, ma sulla successiva ricerca.

  • Re: Apertura Maschera lenta con BE su LAN

    Secondo me sbagli… avendo messo in Or la condizione e di non valorizzazione del criterio é proprio quello il problema carica tutto ma l'elaborazion  del predicato risulta complessa dovendo confrontale in OR ogni singoko criterii…

  • Re: Apertura Maschera lenta con BE su LAN

    05/03/2023 - @Alex ha scritto:


    Secondo me sbagli… avendo messo in Or la condizione e di non valorizzazione del criterio é proprio quello il problema carica tutto ma l'elaborazion  del predicato risulta complessa dovendo confrontale in OR ogni singoko criterii…

    Dici che si trova sull' open form o come fonte dati della maschera?

    Non avendo mai usato sistemi del genere, mi chiedo come fa a valorizzare lecombo se ancora non esistono. Oppure al caricamento access analizza tutto il codice presente nella form e quindi si intoppa nella validazione della query?  

  • Re: Apertura Maschera lenta con BE su LAN

    05/03/2023 - @Alex ha scritto:


    Non si posson vedere query scritte in quel modo…

    Il criterio migliore è quello scritto se serve.

    Tu hai riempito la query di criteri includendo Is NULL nelncaso non fosse inserito il criterio…

    Scrivi una query intelligente, valida i criteri ed integrali solo se serve Vedrai che la query sarà veloce.

    Mi pare sia stato suggerito recentemente un link che spiegava come comporre correttamente il criterio… poi rigeneri la query SQL in modo intelligente.

    Grazie, proprio come sospettavo… avendo trovato da autodidatta una soluzione funzionante non mi sono posto problemi di velocità, pulizia ecc..

    Scrivo una funzione che componga il criterio sull'after update delle varie combo e lo applico  quando serve.

    A tal proposito, una volta composto il  criterio,  meglio settare la proprietà filter o RecordSource?

    05/03/2023 - fratac ha scritto:


    Ciao. Una curiosità. 

    Parli di fonte dati, ma quella che hai postato fa riferimento ad elementi della maschera, quindi non può essere una query di fonte dati al caricamento, ma una query che usi per fare una ricerca, quindi in teoria dopo il caricamento della maschera. A nasi, non dovrebbe influire sull apertura, ma sulla successiva ricerca.

    La SELECT postata è proprio sull'origine record della maschera. Avrei potuto salvarla su una query e richiamare la query nella proprietà Record Source e il risultato sarebbe lo stesso. Ti assicuro che funziona.. male.. ma funziona. Evidentemente Access valuta i criteri sui dati dopo aver caricato la maschera con le sue combo. Magari qualcuno potrà essere più preciso sull'ordine degli eventi 

  • Re: Apertura Maschera lenta con BE su LAN

    05/03/2023 - VBAndre ha scritto:


    Ti assicuro che funziona.. male.. ma funziona

    Come detto mai provato, quindi ci credo che funziona. 

    Però sinceramente non riesco a capire il motivo di tutto ciò. 

    Solitamente tutto quello che hai scritto si gestisce in maniera separata.

    Cioè, ho una lista di lotti, scelgo quello che mi serve, apro un altra mascheracon il quale si vanno a fare le operazioni desiderate e cos via.

    Pero mi sorgono due dubbi.

    Il primo e che funziona perche gestisci tutte le casistiche e quindi a rigor di logica ti visualizza i record partendo dal primo ed ordinandoli in decresente, cioè lo stesso risultato che avresti con una normale queryrrlazionale.

    Il secondo dubbio e sulle combo. 

    Nelle combo hai delle query proprietarie, oppure se ne aggiorni una ti filtra il risultato direttamente usando la fonte dati?

  • Re: Apertura Maschera lenta con BE su LAN

    05/03/2023 - VBAndre ha scritto:

    Grazie, proprio come sospettavo… avendo trovato da autodidatta una soluzione funzionante non mi sono posto problemi di velocità, pulizia ecc..

    Scrivo una funzione che componga il criterio sull'after update delle varie combo e lo applico  quando serve.

    A tal proposito, una volta composto il  criterio,  meglio settare la proprietà filter o RecordSource?

    Io userei la proprietà FILTER… 

    05/03/2023 - fratac ha scritto:


    Ciao. Una curiosità. 

    Parli di fonte dati, ma quella che hai postato fa riferimento ad elementi della maschera, quindi non può essere una query di fonte dati al caricamento, ma una query che usi per fare una ricerca, quindi in teoria dopo il caricamento della maschera. A nasi, non dovrebbe influire sull apertura, ma sulla successiva ricerca.

    La SELECT postata è proprio sull'origine record della maschera. Avrei potuto salvarla su una query e richiamare la query nella proprietà Record Source e il risultato sarebbe lo stesso. Ti assicuro che funziona.. male.. ma funziona. Evidentemente Access valuta i criteri sui dati dopo aver caricato la maschera con le sue combo. Magari qualcuno potrà essere più preciso sull'ordine degli eventi 

    L'origine viene gestita dopo l'apertura, quindi gli oggetti sono tutti istanziati, non è come dice Fratac, che invece avviene se apri la Query da QBE… con le Form, ovviamente la sequenza di apertura non può gestire l'esecuzione della Query prima che sia istanziata la Maschera ed i suoi oggetti…!

  • Re: Apertura Maschera lenta con BE su LAN

    06/03/2023 - fratac ha scritto:


    Nelle combo hai delle query proprietarie, oppure se ne aggiorni una ti filtra il risultato direttamente usando la fonte dati?

    Se valorizzo una combo le altre vengono filtrate in cascata  (nell'origine dati delle combo ho delle SELECT fatte come quella incriminata) così come viene filtrato direttamente il record source della maschera

    06/03/2023 - @Alex ha scritto:


    Io userei la proprietà FILTER… 

    Ottimo, procedo.

  • Re: Apertura Maschera lenta con BE su LAN

    06/03/2023 - fratac ha scritto:


    Però sinceramente non riesco a capire il motivo di tutto ciò. 

    Solitamente tutto quello che hai scritto si gestisce in maniera separata.

    Cioè, ho una lista di lotti, scelgo quello che mi serve, apro un altra mascheracon il quale si vanno a fare le operazioni desiderate e cos via.

    Questa è proprio la lista lotti di cui parli, una volta selezionato un lotto, con il pulsante “Matita” si apre la maschera che mi consente di editarlo e fare altre operazioni.

    Il fatto è che per trovare un lotto nella lista mi è conveniente poterla filtrare e visivamente vedere quali lotti sono chiusi(in rosso - sono i lotti completamente riutilizzati in altri lotti o venduti) e quali aperti(verde). Ad esempio se preparo una crema dovrò identificarla con un numero di lotto per la tracciabilità e a sua volta verrà utilizzata come ingrediente per comporre altri prodotti e quindi altri lotti

  • Re: Apertura Maschera lenta con BE su LAN

    Ho fatto le modifiche eliminando la SELECT “Inguardabile” sul Record Source e i tempi di apertura si sonno più che dimezzati!!!

  • Re: Apertura Maschera lenta con BE su LAN

    C.V.D. diceva la mia prof.ssa di Analisi.

Devi accedere o registrarti per scrivere nel forum
12 risposte