Ordinamento maschera sparisce dopo apertura con Where condition

di il
13 risposte

Ordinamento maschera sparisce dopo apertura con Where condition

Buonasera,

ho una maschera elenco personale la cui origine dati e' una query contenente CodFiscale, PosizioneGerarchica, Cognome e altri campi. CodFiscale e' la PK e l'ordinamento avviene per PosizioneGerarchica e Cognome.

Ho poi una form da dove eseguo una ricerca per alcuni campi. Il risultato di questa ricerca e' una query con i codici fiscali da visualizzare. A questo punto apro la maschera elenco personale con una Where Clause:
[CodFiscale] IN (SELECT query di ricerca...)
I risultati visualizzati sono corretti, solo che l'ordinamento e' in ordine alfabetico per codice fiscale anziche' per Posizione e Cognome, come mai? Dove sbaglio?
Se tolgo il filtro, la maschera elenco visualizza l'intero elenco ordinato nel modo corretto.

Grazie mille

13 Risposte

  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Scusa ma perché posti un pezzo solo della query, peraltro non utile allo scopo...?
    Dai un post utile... metti tutto il predicato SQL.
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Scusami Alex, sinceramente non pensavo che potesse essere lì il problema, ma in qualche impostazione della form. Rimedio subito, ma devo spiegare un pò la situazione.

    Ho un elenco di personale a cui sono assegnate varie qualifiche in vari settori, oltre che i corsi corrispondenti. Ho una query "madre" che racchiude l'elenco di tutti i Qualificati(IdQualificato, CodFiscale, IdTipoCorso, IdTipoQualifica, ecc).
    Devo effettuare ricerche incrociate tra chi possiede delle qualifiche di interesse (IdTipoQualifica) e chi ha affrontato determinati corsi (IdTipoCorso).
    Ho una form con una serie di list box che mi permette di selezionare corsi/qualifiche da ricercare dove l'utente può decidere se utilizzare OR o AND tra i vari parametri.
    La query che poi inserisco nella WhereClause viene originata di volta in volta a seconda dei valori selezionati.

    Di seguito un esempio di una query ottenuta selezionado due valori IdTipoQualifica da ricercare con AND
    SELECT CodFiscale FROM (SELECT CodFiscale, COUNT(CodFiscale) AS Conteggio FROM qry_QualificatiConTipoCorso WHERE IdTipoQualifica IN (2,4) GROUP BY CodFiscale) WHERE Conteggio >= (SELECT COUNT(*) FROM tbq_TipoQualifiche WHERE IdTipoQualifica IN (2,4))
    E questa è una query originata per cercare i due stessi valori con OR
    SELECT DISTINCT CodFiscale FROM qry_QualificatiConTipoCorso WHERE IdTipoQualifica IN (2,4)
    Le due query funzionano e mi danno l'elenco dei codici fiscali per visualizzare poi l'elenco del personale.

    Quando devo aprire la form, il predicato VB risultante, nel caso di ricerca con OR, è questo:
    DoCmd.OpenForm "frmRisultatiRicercaQualificati", , , "[CodFiscale] = ANY (SELECT DISTINCT CodFiscale FROM qry_QualificatiConTipoCorso WHERE IdTipoQualifica IN (2,4))"
    Ho fatto un test aprendo la form in questo modo e l'ordinamento funziona, quindi effettivamente il problema è nella query che uso nella WhereClause, ma non dovrebbe essere un semplice filtro?
    DoCmd.OpenForm "frmRisultatiRicercaQualificati", , , "[CodFiscale] IN (""BBNLSN82E09F839A"", ""BNDVLR80H07A515M"")"
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Mat88 ha scritto:


    ...il problema è nella query che uso nella WhereClause, ma non dovrebbe essere un semplice filtro?
    Certo che è contorto forte!
    Nella query origine dati della maschera c'è un "ORDER BY"? Se non c'è, mettilo. Siccome mi sembra una cosa talmente ovvia, presumo che tu l'abbia già fatto e sia arrivato a questa situazione.
    Prova a giocarti l'ordinamento con le proprietà OrderBy e OrderByOn della maschera (da interfaccia grafica è "Ordina per" e "Ordina al caricamento")
    Un paio di link d'aiuto (almeno spero, non ne ho mai avuto bisogno)

    Change the filter or sort order of a form or report
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Philcattivocarattere ha scritto:


    Mat88 ha scritto:


    ...il problema è nella query che uso nella WhereClause, ma non dovrebbe essere un semplice filtro?
    Certo che è contorto forte!
    Intendevo dire che la WhereClause dovrebbe agire come un filtro della query di origine dati. Non riesco a capire perché vada a modificarne l’ordinamento.

    Philcattivocarattere ha scritto:


    Nella query origine dati della maschera c'è un "ORDER BY"?
    Nella query di origine maschera c’è l’ORDER BY e funziona correttamente.

    Philcattivocarattere ha scritto:


    Prova a giocarti l'ordinamento con le proprietà OrderBy
    I campi su cui fare l’ordinamento non erano visualizzati nella maschera, per seguire il tuo consiglio li ho inseriti e resi invisibili, ed effettivamente funziona Grazie!

    Però continuo a chiedermi perchè la WhereClause mi mandi a quel paese l'ordinamento
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Mat88 ha scritto:


    Philcattivocarattere ha scritto:


    Certo che è contorto forte!
    Intendevo dire che la WhereClause dovrebbe agire come un filtro della query di origine dati. Non riesco a capire perché vada a modificarne l’ordinamento.
    Mea culpa. Ho quotato solo l'ultima tua frase ma quella era chiarissima. Il fatto che fosse "contorto forte" era riferito a tutto il resto, con quelle Where Conditions molto articolate.
    Però continuo a chiedermi perchè la WhereClause mi mandi a quel paese l'ordinamento
    Alla luce di tutto il resto... una risposta precisa non so dartela, se non ripetere "Certo che è contorto forte" con questa precisazione: della query di partenza era rimasto ben poco, come criteri di ordinamento, viste le "smanovrate" che deve applicare il codice con quelle Where Conditions. Se poi addirittura il controlli associati ai campi strategici (per l'ordinamento) non erano presenti nella maschera, non c'era alcun motivo perché il codice si preoccupasse anche di quello.
    Il tutto per dire che il recordset della maschera era molto lontanto da un punto di vista concettuale da quello che si otterrebbe dalla query madre, finendo per perderne ogni carattistica.
    Come vedi non è una risposta/spiegazione "tecnica" ma molto "ad intuito", però regge.
    (Sarebbe curioso vedere in azione lo showplan e controllare quante query deve elaborare e/o creare al volo per darti il risultato che chiedi)
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Sono consapevole che il codice sia un po contorto. La stessa query "qry_QualificatiConTipoCorso" è arzigogolata.

    Purtroppo per la condizione AND non sono riuscito a trovare altra soluzione che confrontare il numero delle volte in cui la condizione è verificata con il numero delle volte in cui deve essere verificata. Se il numero è uguale o superiore, vuole dire che la persona rispetta i requisiti. Sono sicuro ci sarà un'istruzione più ortodossa e sono aperto al miglioramento del codice!!
    Come vedi non è una risposta/spiegazione "tecnica" ma molto "ad intuito", però regge.
    In realtà, questa spiegazione mi fa sorgere un dubbio sul funzionamento della WhereClause.
    Mi spiego: qry_QualificatiConTipoCorso (la query "madre") non contiene alcun riferimento all'ordinamento richiesto, essa mi serve solo per trovare i codici fiscali (PK della tabella personale) da visualizzare nell'elenco dei risultati della ricerca. In pratica mi dice che il signor XXXMTT00T22A000T soddisfa i requisiti.
    Dopodichè, questo valore viene passato alla form che visualizza i risultati, la cui origine record è una semplice anagrafica, senza alcun riferimento ai criteri utilizzati nella ricerca.
    Quindi perchè l'estrazione dei codici fiscali dovrebbe, in qualche modo, andare ad interferire con la query anagrafica?
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    NOn vedo NESSUN criterio di ORDINAZIONE da nessuna parte... ed è naturale che per non lasciare alla logica di JET(le PK, oppure l'ordine di inserimento dei ampi da SX a DX) è indispensabile inserire forzatamente i criteri di Ordinamento... nella prima Query magari è meglio.
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    @Alex ha scritto:


    NOn vedo NESSUN criterio di ORDINAZIONE da nessuna parte... ed è naturale che per non lasciare alla logica di JET(le PK, oppure l'ordine di inserimento dei ampi da SX a DX) è indispensabile inserire forzatamente i criteri di Ordinamento... nella prima Query magari è meglio.
    Ma nella query di origine dati della form i criteri di ordinamento ci sono, ed infatti all'apertura della maschera, o se applico un qualsiasi filtro da interfaccia grafica, i dati vengono ordinati correttamente.

    L'ordinamento manca nella query che "filtra" i dati da visualizzare nella condizione Where all'apertura della form, semplicemente perchè i valori da utilizzare per l'ordinamento non hanno nulla a che vedere con i criteri di ricerca che utilizzo. E' normale che una condizione WHERE vada a modificare un ordinamento dato tramite istruzione "ORDER BY" alla query origine dati della form?
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Mat88 ha scritto:


    Ma nella query di origine dati della form i criteri di ordinamento ci sono
    Questo vuol dire che il RecordSource della form ha un suo criterio di ordinamento.

    Mat88 ha scritto:


    L'ordinamento manca nella query che "filtra" i dati da visualizzare nella condizione Where all'apertura della form
    Siamo sicuri che stiamo parlando dello stesso RecordSource? Se è NO, anche in questo caso bisogna imporgli un criterio di ordinamento.
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Buonasera Osvaldo e grazie per l'interessamento.
    Credo che mi stia sfuggendo qualcosa su come il VBA passi la condizione WHERE alla form tramite DoCmd.OpenForm

    Mi spiego. Ho fatto dei test aprendo la form da vba e poi modificando a mano l'origine dati. Vi mostro una query semplificata perchè quella originale ha molti più campi, ma tanto il comportamento è esattamente lo stesso.

    Questa è la query di origine dati della form.
    SELECT Count(qry_QualificatiConTipoCorso.CodFiscale) AS ConteggioDiCodFiscale, tbqPersonale.CodFiscale, tbqPersonale.Reparto
    FROM tbqGradi INNER JOIN (tbqPersonale INNER JOIN qry_QualificatiConTipoCorso ON tbqPersonale.CodFiscale = qry_QualificatiConTipoCorso.CodFiscale) ON tbqGradi.IdGrado = tbqPersonale.Grado
    GROUP BY tbqPersonale.CodFiscale, tbqPersonale.Reparto, tbqPersonale.Grado, tbqPersonale.Cognome
    ORDER BY tbqPersonale.Grado, tbqPersonale.Cognome;
    
    Questa è la condizione WHERE che applico tramite VBA. Aprendo da VBA, l'ordinamento della form risulta errato.
    tbqPersonale.[CodFiscale] = ANY (SELECT DISTINCT CodFiscale FROM qry_QualificatiConTipoCorso WHERE IdTipoQualifica IN (2,4))
    Se invece inserisco manualmente la condizione WHERE all'interno della query di origine dati, l'ordinamento è corretto!!
    SELECT Count(qry_QualificatiConTipoCorso.CodFiscale) AS ConteggioDiCodFiscale, tbqPersonale.CodFiscale, tbqPersonale.Reparto
    FROM tbqGradi INNER JOIN (tbqPersonale INNER JOIN qry_QualificatiConTipoCorso ON tbqPersonale.CodFiscale = qry_QualificatiConTipoCorso.CodFiscale) ON tbqGradi.IdGrado = tbqPersonale.Grado
    WHERE tbqPersonale.CodFiscale = ANY (
    SELECT DISTINCT CodFiscale FROM qry_QualificatiConTipoCorso WHERE IdTipoQualifica IN (2,4)
    )
    GROUP BY tbqPersonale.CodFiscale, tbqPersonale.Reparto, tbqPersonale.Grado, tbqPersonale.Cognome
    ORDER BY tbqPersonale.Grado, tbqPersonale.Cognome;
    
    Forse c'entra qualcosa la sequenza di eventi di apertura della form
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Ma scusa non si può vedere una demo per poi capire effettivamente come hai agito e eventualmente darti un consuglio?
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Mat88 ha scritto:


    Forse c'entra qualcosa la sequenza di eventi di apertura della form?
    Per me non si tratta di questo. Per come l'ho capita io, tu STAI DANDO IN PASTO ALLA FORM una STRINGA che deve andare a finire nel RecordSource (Origine riga). Tale RecordSource (evidentemente) necessita di essere "chiaro e tondo (senza equivoci)".
    Il mio sospetto è che quando vai ad aprire la form la 2a volta non è detto che la form vada a leggere esattamente "la stessa cosa di prima"...non riesco a darmi altre spiegazioni...del resto lo stai vivendo/imparando sulla tua pelle.
    In sostanza giocati più l'intera stringa SQL come RecordSource piuttosto che far leva sulla sola WHERE di OpenForm.

    Potresti fare una test in VBA. Nei codici che aprono la form, aggiungi un
    MsgBox "Il RecordSource è " & Me.RecordSource & " e il Filtro è " & Me.Filter
    per renderti conto "visivamente" di cosa ci sta dentro quelle due proprietà.
  • Re: Ordinamento maschera sparisce dopo apertura con Where condition

    Potresti fare una test in VBA.
    Ho seguito il tuo consiglio e penso mi abbia illuminato.
    La WhereCondition viene interpretata come filtro, non come condizione WHERE del predicato SQL del RecorSource. Magari per voi è ovvio, ma io ero convinto fosse questa la differenza tra i parametri FilterName e WhereCondition del metodo OpenForm.

    Quindi, l'ordinamento dato dal filtro ha priorità sull'ordinamento del RecordSource, ed ecco spiegato l'arcano.
    A questo punto tra ordinare il filtro, riscrivere il record source ed aggiungere i campi invisibili alla form, preferisco quest'ultima soluzione.

    Comunque ho caricato una demo del DB con la funzione interessata. Sicuramente, il codice può essere migliorato molto. Io ho utilizzato delle funzioni di un altro DB che avevo creato in precedenza, oltre ad alcune di Allen Browne.
    https://drive.google.com/file/d/0B1bbtzPnTPqpYjhVbVVybDFKQjlCRmRmVkY0VkxaWHhhNW93/view?usp=drivesdk
Devi accedere o registrarti per scrivere nel forum
13 risposte