[RISOLTO..] Problema di sintassi su query paramentrica

di il
9 risposte

[RISOLTO..] Problema di sintassi su query paramentrica

Buongiorno a tutti
Su una query voglio selezionare i record relativi a tutti i giorni di un anno specifico (ad esempio, il 2021) da una cboSceltaAnno presente su una determinata maschera (non collegata alla query in questione!)

La query mi restituisce il risultato corretto, accettando una delle seguenti condizioni:

WHERE (((lkpData.Data)<=Date()) AND ((Year([lkpData.Data]))=2021))				oppure:
WHERE (((lkpData.Data)<=Date()) AND ((Year([lkpData.Data]))=Year(Date())-2))

ma NON MI ACCETTA la condizione (riconoscendomela come espressione non valida) se la genero nel criterio come selezione da cbo:

WHERE (((lkpData.Data)<=Date()) AND (((Year([lkpData.Data]))=[Forms]![Mensile]![cboSceltaAnno])))

dove la cbo ha origine riga:     SELECT Year([Data]) AS Anno FROM lkpData GROUP BY Year([Data]) HAVING (((Year([Data]))<=Year(Date())));

Ovviamente...a maschera aperta e selezione operata sulla cbo

Non riesco a trovare la soluzione.

9 Risposte

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    Io credo si possa migliorare la logica…!

    Tu metti 2 Condizioni in AND sulla Query principale, in cui metti che la data deve essere UGUALE INFERIORE Anno attuale in AND con l'anno selezionato dalla Combo.

    La combo ha solo gli anni presenti in tabella, è possibile ci siano date maggiori di Oggi…? Se non è possibile quella condizione di aggiungere =Year(Date()) non serve affatto, se invece hai questa possibilità non conviene eventualmente inserire il filtro nella Combo…? 

    Questo ottimizza la Query principale.

    Esempio RowSource della combo:

    SELECT Year([Data]) AS Anno FROM lkpData WHERE Year(Data)<=Year(Date()) GROUP BY Year([Data]) HAVING (((Year([Data]))<=Year(Date())));

    la WhereCond della Query principale:

    WHERE Year([lkpData.Data])=[Forms]![Mensile]![cboSceltaAnno]

    La combo invece di usare GROUP BY non è meglio usare DISTINCROW…? 

    SELECT DISCTINCTROW Year([Data]) AS Anno FROM lkpData ORDER BY Year([Data]);

    Se poi è applicabile di spostare la limitazione della selezione alle date=Oggi allora:

    SELECT DISCTINCTROW Year([Data]) AS Anno FROM lkpData WHERE Year([Data])<=Year(Date()) ORDER BY Year([Data]);

    Detto questo per capire perchè non funziona, serve capire se la Maschera [Mensile] sia aperta o meno… ma soprattutto come gestisci da codice il tutto, perchè potrebbe mancare il REQUERY…

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    17/03/2023 - @Alex ha scritto:


    Io credo si possa migliorare la logica…!

    Tu metti 2 Condizioni in AND sulla Query principale, in cui metti che la data deve essere UGUALE INFERIORE di OGGI ed in più l'anno selezionato dalla Combo.

    La combo ha solo gli anni presenti in tabella, è possibile ci siano date maggiori di Oggi…?

    Ciao Alex. Si, la tab lkpData (PK/Data) elenca date dal 1/1/2017 al 31/12/2029, per quello nella query in questione (qryCRX) uso un campo dalla tab lkpData con criterio <=Date()  e un campo calcolato  Year([lkpData.Data]) AS Anno come filtro.

    Quanto alla Combo, Il predicato DISTINCROW non l'ho mai usato (nemmeno lo conoscevo). I dati della combo li origino direttamente dai tre puntini, selezionando la tab lkpData e mettendo Raggruppamento in formula e <=Year(Date()) in criterio. Sempre fatto così.

    La combo invece di usare GROUP BY non è meglio usare DISTINCROW…? 

    SELECT DISCTINCTROW Year([Data]) AS Anno FROM lkpData ORDER BY Year([Data]);

    Se poi è applicabile di spostare la limitazione della selezione alle date=Oggi allora:

    SELECT DISCTINCTROW Year([Data]) AS Anno FROM lkpData WHERE Year([Data])<=Year(Date()) ORDER BY Year([Data]);

    Scritte così, nell'origine riga della combo entrambe mi danno  ..operatore mancante nell'espressione della query 'DISTINCTROW Year([Data])'. (… dopo approfondisco l'argomento, e scopro perchè..)

    Detto questo per capire perchè non funziona, serve capire se la Maschera [Mensile] sia aperta o meno… ma soprattutto come gestisci da codice il tutto, perchè potrebbe mancare il REQUERY…

    Si, La maschera [Mensile] l'ho aperta e selezionato la cbo. Tant'é che nello stesso Generatore di espressioni la trovo su maschere caricate, e non devo cercarla su tutte le maschere. Ma, prima della  gestione del codice, la query non dovrei poterla visualizzare in foglio dati senza errore di nome di campo o espressione valida? … magari “in bianco”, cioè senza che mi restituisca alcun record? 

    In realtà, tutto il problema si pone in questi termini. Ho alcune query piuttosto complesse (con funzioni, campi calcolati,  vari JOIN, anche su query a campi incrociati) che non uso direttamente in access (infatti non hanno maschere di riferimento), ma esporto in una cartella “annuale” excel (dove le elaboro ulteriormente).

    Ogni anno, se non faccio l'esportazione al 31/12, o se devo aggiungere dati successivamente, mi tocca modificare quelle query aggiungendo il -1 nei campi che richiamano Year(Date(() e modificando nome alle cartelle excel di destinazione. Per questo volevo filtrarle da una maschera su cui ho una cboSceltaAnno e in cui ho aggiunto un pulsante col comando esporta le query in 

    strPercorso = CurrentProject.Path & "\" & "NomeCartella_" & [Forms]![Mensile]![cboSceltaAnno].Value & ".xlsm"
    
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
    "NomeQuery1_qry", strPercorso, True                   ' già filtrata sull'anno della cbo
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
    "NomeQuery2_qry", strPercorso, True                   ' già filtrata sull'anno della cbo
    eccc...  

    …e qui non vado oltre, perchè ancora uso  Call shell  e non l'automazione OLE  (come a suo tempo mi rimproverasti !!)

    Ma a questo punto, viste le mie conoscenze mooolto limitate, per “farla facile” (..scusa la bruttissima espressione su un forum di programmatori professionisti) credo mi convenga scegliere due vie:

    -creare varie sottomaschere per le query da filtrare (ultima spiaggia!!!)

    - portare le varie Sql direttamente in codice e ragionare su come esportarle filtrate 

    Intanto… Grazie Alex. Aggiorno appena riesco a combinare qualcosa.

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    Mi scuso per il ritardo nell'aggiornamento!!

    Ho "rigirato" la qryCRX in tutti i modi. Eliminato la doppia condizione sulla data; eliminata la PK sulla tbl lkpData; sostituita con una qrylkpData con campi data nuovi espressi in vari formati; provato anche in cbo con un elenco valori... e altro che neanche più ricordo. 
    Il problema è sempre lo stesso! Qualsiasi campo della qryCRX non mi accetta il richiamo ad una cbo (come se Access mi accettasse solo un criterio costante e non una variabile), nemmeno creando una maschera sulla query e inserendo una cbo vuota e non associata.
    Credo dipenda proprio dalle varie JOIN sue altre qry che contengono funzioni, campi calcolati ecc.

    Ho quindi provato a creare una maschera msc_qryCRX sulla query, su cui ho inserito la cboScAnno, e sono riuscito a filtrare correttamente in maschera:

    
    Private Sub cboScAnno_AfterUpdate()
      Dim strWH As String
        
       If Len(Me!cboScAnno.Value & vbNullString) > 0 Then strWH = strWH & "[qryCRX]![Anno] = " & _
           Me!cboScAnno.Value & " AND "
      If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
      Me.Filter = strWH
      Me.FilterOn = True
    End Sub
    
  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    23/03/2023 - surfgarden ha scritto:


    …il  sito continua a bloccarmi , malgrado abbia attivato il 2FA..  

    ..segue:

    Tuttavia non riesco a esportare il risultato
    doCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, _
       Me.RecordSource , strPercorso, True
    apprendendo che il Recordset così esportato è sempre quello su cui ha origine la maschera. Devo necessariamente creare un nuovo oggetto. 
    Così facendo tuttavia,  mi rimarrebbe nel db un elemento inutile (la nuova maschera).

    Prima di creare il nuovo recordset, ho provato la via del VBA, cercando di adeguare il codice ad un esempio che mi sembrava analogo:
    https://answers.microsoft.com/it-it/msoffice/forum/all/export-maschera-filtrata/926b4c87-94ec-4618-8081-f38d09cc7b7a

    Questa la bozza del codice:

    Ogni volta che provo a postare il codice mi esce:

    Attenzione! I nostri sistemi di sicurezza ti stanno bloccando...

    ma cmq risulta subito l'analogo errore:

    Errore di run-time '3070'
    Il modulo di gestione di database di Microsoft Office Access
    non riconosce '[qryCRX]![Anno]' come nome di campo o espressione valida.

    Credo che l'unica possibilità che possa provare dall'abisso delle mie lacune e ignoranza informatica, è appunto la via del nuovo recordset da creare sulla maschera.
    Spero di riuscire a fare almeno quello, perche dopo 5 giorni di ricerche su centinaia di pagine web, ancora non ho individuato un codice che, adattato, riesca a far funzionare

    Scusate se mi sono dilungato troppo...e ancora per il ritardo.

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    Se usi Filter, non ha effetto sul RecordSource ma sul Recordset e quello non lo esporti…!

    Ovviamente tu non hai detto da subito che devi esportare… ;-)

    Ora la soluzione che puoi usare a mio avviso è creare una Query Tmp [qryExport] nella quale inserirai SELECT *; salvi e chiudi, poi la si gestisce da codice così:

    Dim sSQLExport as String
    sSQLExport="SELECT * FROM (" & me.RecordSource & ") WHERE " & Me.Filter
    DbEngine(0)(0).Querydefs("qryExport").SQL=sSQLExport
    doCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12,"qryExport", strPercorso, True

    Questa tecnica la usavo per un codice flessibile di esportazione… adesso non ricordo bene se le parentesi servono o meno… fai una prova.

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    23/03/2023 - surfgarden ha scritto:


     Qualsiasi campo della qryCRX non mi accetta il richiamo ad una cbo (come se Access mi accettasse solo un criterio costante e non una variabile), ..

    Ed infatti

    evidenzianomi Me.Filter in blu…

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    23/03/2023 - @Alex ha scritto:


    Se usi Filter, non ha effetto sul RecordSource ma sul Recordset e quello non lo esporti…!

    Ovviamente tu non hai detto da subito che devi esportare… ;-)

    Ora la soluzione che puoi usare a mio avviso è creare una Query Tmp [qryExport] nella quale inserirai SELECT *; salvi e chiudi, poi la si gestisce da codice così:

    Dim sSQLExport as String
    sSQLExport="SELECT * FROM (" & me.RecordSource & ") WHERE " & Me.Filter
    DbEngine(0)(0).Querydefs("qryExport").SQL=sSQLExport
    doCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12,"qryExport", strPercorso, True

    Questa tecnica la usavo per un codice flessibile di esportazione… adesso non ricordo bene se le parentesi servono o meno… fai una prova.

    Grazie Alex…  che codice compatto!!

    Però sto facendo confusione.

    Per creare una query temporanea devo anche settarla, no?

    Prima del tuo post stavo provando così:

      Const strSql As String = "SELECT * " & vbCrLf & _
       "FROM ((lkpData LEFT JOIN qryEntrateCash ON lkpData.Data=qryEntrateCash.Data) " & vbCrLf & _
       "LEFT JOIN qryEntratePos ON lkpData.Data=qryEntratePos.Data) " & vbCrLf & _
       "LEFT JOIN qryDettagli_Incassi ON lkpData.Data=qryDettagli_Incassi.Data) " & vbCrLf & _
       "INNER JOIN qrylkpData ON lkpData.Data=qrylkpData.Data " & vbCrLf & _
       "WHERE ((lkpData.Data)<=Date()) "                ' & vbCrLf & Me.Filter (condizione non ammessa)
    
    Dim qdf As DAO.QueryDef
    Set qdf = DBEngine(0)(0).QueryDefs("qryExport")
    qdf.SQL = strSql & me.filter                        ' che non può funzionare
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12,"qryExport", strPercorso, True
    													
    qdf.Close   					'chiudo e annullo il setting
    Set qdf = Nothing


    Da quel che comprendo, sSQLExport="SELECT * FROM (" & me.RecordSource & ") WHERE " _ 'sostituisce tutto il predicato dell' SQL filtrato in maschera (il Recoedsource, appunto)  assegnandogli poi il  & Me.Filter, che diventa condizione ammessa come in maschera.

    ma se prima tentavo di creare la query temporanea  settandola:   qdf = DBENGINE(0)(0)…  per poi chiuderla e annullarla dopo l'esportazione, ora, senza il set, perdo il ragionamento..

    Ci studio sopra…

    Grazie, grazie e grazie ancora intanto.

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    Si fatto considera il RecordSource una SubSelect alla quale applica una WHERECONDITION, in termini di efficienza non è fantastica… ma è pur vero che trattandosi di Export non ti accorgerai di nulla.

    La query creala da QBE la salvi e la vuoti come ti ho detto… quella rimane e la usi, questo evita di usare un CreateQueryDef che in questo caso non serve…, se fai come ti ho detto i tuoi dubbi non hanno ragione di esistere, perchè la query salvata verrà modificata prima dell'export… basta ci sia, poi se la apri a mano vedi che rimane valorizzata…!

  • Re: [RISOLTO..] Problema di sintassi su query paramentrica

    GRANDE !!!

    Grazie Alex… mi salvi sempre!!!

Devi accedere o registrarti per scrivere nel forum
9 risposte