Pulsante per parametri query

di il
23 risposte

23 Risposte - Pagina 2

  • Re: Pulsante per parametri query

    Sgrubak ha scritto:


    Probabilmente non sta sfruttando la visualizzazione SQL, e ha provato ad inserire quanto da te suggerito direttamente nei "Criteri" della visualizzazione Struttura? Li anche a me da errore di sintassi...
    Io ho fatto un test molto elementare:
    1. In "visualizzazione struttura" query ho scritto i 3 criteri uno sotto l'altro, sfruttando i righi Oppure così:
    19
    22
    45
    2. Eseguo la query e funziona
    3. Chiudo la query
    4. Rieseguo la query e funziona
    5. Vado a rivedere la visualizzazione struttura query e leggo su un solo rigo Criterio:
    19 Or 22 Or 45
    6. Vado a vedere la visualizzazione SQL della WHERE e trovo:
    WHERE (((NomeTabella.IDCampo)=3 Or (NomeTabella.IDCampo)=6 Or (NomeTabella.IDCampo)=10));
    Detto questo...io non so altro. Traete voi le conclusioni.
    Secondo me Rivenmyst deve fornire una descrizione a più ampio respiro su cosa vuole fare veramente. A mio avviso mancano pezzi logico/pratici.
  • Re: Pulsante per parametri query

    OsvaldoLaviosa ha scritto:


    ...Io ho fatto un test molto elementare:...
    Ho provato ed ho ottenuto lo stesso tuo risultato.

    Convengo con te che manchino dei dettagli... Anche solo capire a questo punto se si sta parlando di visualizzazione struttura o SQL. In ogni caso, tra te e Alex sono state fornite le soluzioni per entrambi i casi.
  • Re: Pulsante per parametri query

    Non ne vorrei fare questione di "filosofia".
    Il criterio [19 Or 22 Or 45] in qualsiasi modo lo vuoi interpretare è sbagliato, pur consentendo l'esecuzione della query o di qualsiasi altra considerazione didattica, non si scrive così quindi è errato.
    Vorrei anche evitare di fare considerazioni su quanto indicato dall'interprete QBE... parliamo di sintassi SQL.
  • Re: Pulsante per parametri query

    Da quello che ho capito da una maschera che funge da cruscotto vorresti inserire un nome di città e qualche numero di ufficio in modo da ottenere un query che filtra dei nominativi da una tabella con la città in AND sugli uffici in OR tra di loro.
    Allo scopo ti suggerisco come esempio il seguente codice.
    Private Sub Comando10_Click()
    Dim VarCittà As String
    Dim VarUfficio1 As Integer
    Dim VarUfficio2 As Integer
    Dim VarUfficio3 As Integer
    Dim VarSQL As String
    Dim db As DAO.Database
    Dim qry As DAO.QueryDef
    Set db = CurrentDb
    VarCittà = Me.CITTA.Value
    VarUfficio1 = Me.UFFICIO1.Value
    VarUfficio2 = Me.UFFICIO2.Value
    VarUfficio3 = Me.UFFICIO3.Value
    VarSQL = "SELECT tabella.* "
    VarSQL = VarSQL & "FROM tabella "
    VarSQL = VarSQL & "WHERE (((tabella.città)=""" & VarCittà & """) AND ((tabella.ufficio)= " & VarUfficio1 & " Or (tabella.ufficio)= " & VarUfficio2 & " Or (tabella.ufficio)=" & VarUfficio3 & "));"
    For Each qry In db.QueryDefs
        If qry.Name = "QryFiltro" Then
            DoCmd.Close acQuery, "QryFiltro", acSaveNo
            DoCmd.DeleteObject acQuery, "QryFiltro"
        End If
    Next
    Set qry = db.CreateQueryDef("QryFiltro", VarSQL)
    DoCmd.OpenQuery "QryFiltro"
    qry.Close
    db.Close
    End Sub
    Su Click di un pulsante comando su Maschera1, preleva i valori CITTA, UFFICIO1, UFFICIO2, UFFICIO3 da controlli sempre su Maschera1. Non importa che la maschera abbia una origine record. Il codice poi compone una stringa VarSQL in linguaggio SQL, cancella se esiste la query QryFiltro, crea una nuova QryFiltro sulla base dei dati inseriti e la apre.
    Come dicevo il codice è essenziale e dovrebbe essere arricchito da una serie di controlli di inserimento (per esempio se un dato non fosse inserito ti darebbe errore) e logiche di composizione della stringa, ma credo che possa essere sufficiente come spunto.
  • Re: Pulsante per parametri query

    harry61 ha scritto:


    Da quello che ho capito da una maschera che funge da cruscotto vorresti inserire un nome di città e qualche numero di ufficio in modo da ottenere un query che filtra dei nominativi da una tabella con la città in AND sugli uffici in OR tra di loro.
    Relativamente vero fino a quanto si è capito finora. A me non convince l'idea di limitare a un massimo di 3 OR scelte UFFICIO.
  • Re: Pulsante per parametri query

    harry61 ha scritto:


    Da quello che ho capito da una maschera che funge da cruscotto vorresti inserire un nome di città e qualche numero di ufficio in modo da ottenere un query che filtra dei nominativi da una tabella con la città in AND sugli uffici in OR tra di loro.
    Allo scopo ti suggerisco come esempio il seguente codice.
    Private Sub Comando10_Click()
    Dim VarCittà As String
    Dim VarUfficio1 As Integer
    Dim VarUfficio2 As Integer
    Dim VarUfficio3 As Integer
    Dim VarSQL As String
    Dim db As DAO.Database
    Dim qry As DAO.QueryDef
    Set db = CurrentDb
    VarCittà = Me.CITTA.Value
    VarUfficio1 = Me.UFFICIO1.Value
    VarUfficio2 = Me.UFFICIO2.Value
    VarUfficio3 = Me.UFFICIO3.Value
    VarSQL = "SELECT tabella.* "
    VarSQL = VarSQL & "FROM tabella "
    VarSQL = VarSQL & "WHERE (((tabella.città)=""" & VarCittà & """) AND ((tabella.ufficio)= " & VarUfficio1 & " Or (tabella.ufficio)= " & VarUfficio2 & " Or (tabella.ufficio)=" & VarUfficio3 & "));"
    For Each qry In db.QueryDefs
        If qry.Name = "QryFiltro" Then
            DoCmd.Close acQuery, "QryFiltro", acSaveNo
            DoCmd.DeleteObject acQuery, "QryFiltro"
        End If
    Next
    Set qry = db.CreateQueryDef("QryFiltro", VarSQL)
    DoCmd.OpenQuery "QryFiltro"
    qry.Close
    db.Close
    End Sub
    Su Click di un pulsante comando su Maschera1, preleva i valori CITTA, UFFICIO1, UFFICIO2, UFFICIO3 da controlli sempre su Maschera1. Non importa che la maschera abbia una origine record. Il codice poi compone una stringa VarSQL in linguaggio SQL, cancella se esiste la query QryFiltro, crea una nuova QryFiltro sulla base dei dati inseriti e la apre.
    Come dicevo il codice è essenziale e dovrebbe essere arricchito da una serie di controlli di inserimento (per esempio se un dato non fosse inserito ti darebbe errore) e logiche di composizione della stringa, ma credo che possa essere sufficiente come spunto.
    Questo codice suggerito è molto maldestro, mi riferisco alla inutile necessità di CICLARE le query per cancellarne 1 per poi ricrearla:
    
    For Each qry In db.QueryDefs
        If qry.Name = "QryFiltro" Then
            DoCmd.Close acQuery, "QryFiltro", acSaveNo
            DoCmd.DeleteObject acQuery, "QryFiltro"
        End If
    Next
    Contiene almeno 2 ERRORI di sonstanza concettuale:
    1)basta puntare alla Query specifica e cancellarla...
    
    db.QueryDefs("QryFiltro").Delete
    2)che senso ha cancellarla per poi ricrearla...? Barsa modificarla
    
    db.QueryDefs("QryFiltro").SQL=VarSQL
    Detto questo, meglio usare la propriatà FILTER di maschera
    
    Me.Filter=VarSQL
    Me.FilterOn=True
    Saluti
  • Re: Pulsante per parametri query

    @Alex ha scritto:


    ...2)che senso ha cancellarla per poi ricrearla...? Barsa modificarla...
    Parametrizzarla e modificare poi solo i valori dei parametri potrebbe essere una soluzione valida?
  • Re: Pulsante per parametri query

    Se il numero di Parametri fosse fisso basterebbe usare i Parameters... ma se i criteri sono variabili... ripeto che è meglio usare FILTER.
  • Re: Pulsante per parametri query

    Ti ringrazio dei commenti @Alex, che mi danno utili spunti per apprendere nuove istruzioni e approcci.
Devi accedere o registrarti per scrivere nel forum
23 risposte