MASCHERA DI RICERCA

di il
4 risposte

MASCHERA DI RICERCA

Salve a tutti, è la mia prima richiesta, non sono molto esperto ma sto cercando di imparare, vado subito al punto. Ho creato una tabella di prenotazioni turistiche con nomi clienti, nazione di provenienza, data di arrivo, data di partenza, vari dati di contatto, ecc. ora il mio problema è fare una maschera (l'ho già fatta in realtà ma non è completa) che mi faccia volta per volta una selezione basata su tutti questi dati, vorrei poter selezionare in particolare in base ad un determinato periodo di tempo, tutti i clienti di una determinata nazione in base anche alle diverse agenzie turistiche dalle quali è pervenuta tale prenotazione. Ma vorrei anche deselezionare tali opzioni quando necessario. La tabella principale si chiama appunto prenotazioni, la maschera che ho creato si connette ad essa tramite una query di selezione che mi elenca tutte le prenotazioni in base all'agenzia e alla nazione ma non riesco appunto a fare diverse selezioni come per esempio in base alla data di inizio e la data di fine (per esempio mi piacerebbe poter creare un elenco in base a un anno) oppure selezionando solo l'agenzia o solo la nazione...come posso fare per creare questa maschera? Bastano le macro o devo per forza usare l'sql o è preferibile il vba? Grazie a chiunque voglia rispondere

4 Risposte

  • Re: MASCHERA DI RICERCA

    Non so se ho capito bene, ma mi pare che ti occorra usare una stringa SQL che va 'costruita da codice VBA' che deve analizzare tutte le condizioni impostate, o meno, dall'utente sui vari campi che hai previsto.
    In sostanza, dichiarata una variabile stringa, vi accodi solo le condizioni impostate tralasciando le altre.
    La maschera dovrebbe essere slegata dalla tabella, in quanto lo scopo è quello di impostare parametri, esempio:
    - se tu vuoi impostare un intevallo di date DAL... AL... è chiaro che devi usare due controlli in cui l'utente inserisca le date
    - se vuoi fare una ricerca su un campo testo devi poter selezionare anche valori parziali utilizzando i caratteri jolly (* e ?)

    Come dicevo sopra, la stringa SQL dovrà contenere solo le condizioni valorizzate.
    Avrai una stringa SQL base:
    
    Dim sql As String
    sql = "SELECT <elenco_campi_da_mostrare> FROM tabella "
    sql = sql & " WHERE <campo_PK> LIKE '*' "
    
    a cui dovrai aggiungere le condizioni via via impostate
    
    If Not ISNull(DataDal) then ' solo se è indicata la DataDal
        sql = sql & " AND DataArrivo BETWEEN <DataDal> AND <DataAl> "
    End If
    
    If Nazione > "" then ' solo se è indicata la nazione
        sql = sql & " AND Nazione = <nazione_selezionata> "
    End If
    
    ...
    
    e via così.
  • Re: MASCHERA DI RICERCA

    Grazie del suggerimento, però non sono sicuro di aver implementato nel modo giusto la stringa, purtroppo mi dà errore, questo è il codice che ho scritto e che dovrebbe creare la giusta stringa sql e invece non solo mi dà come errore "tipo non corrispondente in corrispondenza con la variabile datadal ma quando cambio il tipo di variabile mi dà comunque una stringa sql sbagliata:

    PPrivate Sub stringaSQL()

    Dim datadal As Variant
    Dim Agenzia, Nazione, SQLst As String
    Dim msg, msg2 As String
    Agenzia = CmbAgenzia.Value
    Nazione = CmbNazione.Value
    datadal = CmbDal.Value
    SQLst = "SELECT * FROM BOOKINGS"

    If (Agenzia = "" And Nazione = "" And datadal = "") Then
    SQLst = SQLst
    ElseIf (Agenzia = "" And Nazione = "" And datadal <> "") Then
    SQLst = SQLst & " WHERE DATA_ARR >= cmbDal.text"
    ElseIf (Agenzia = "" And Nazione <> "" And datadal <> "") Then
    SQLst = SQLst & " WHERE DATA_ARR >= cmbDal.text AND NAZIONE_PROV=cmbNazione.text"
    ElseIf (Agenzia <> "" And Nazione <> "" And datadal <> "") Then
    SQLst = SQLst & " WHERE DATA_ARR >= cmbDal.text AND NAZIONE_PROV=cmbNazione.text AND NOME_AG=cmbAgenzia.txt"
    ElseIf (Agenzia = "" And Nazione <> "" And datadal = "") Then
    SQLst = SQLst & " WHERE NAZIONE_PROV=cmbNazione.text"
    ElseIf (Agenzia <> "" And Nazione <> "" And datadal = "") Then
    SQLst = SQLst & " WHERE NOME_AG=cmbAgenzia.text AND NAZIONE_PROV=cmbNazione.text"
    ElseIf (Agenzia <> "" And Nazione = "" And datadal = "") Then
    SQLst = SQLst & " WHERE NOME_AG=cmbAgenzia.text"
    ElseIf (Agenzia <> "" And Nazione = "" And datadal <> "") Then
    SQLst = SQLst & " WHERE NOME_AG=cmbAgenzia.text AND DATA_ARR >= cmbDal.text"

    End If
    msg = MsgBox("la stringa SQL è: " & SQLst, vbOKOnly)
    msg2 = MsgBox("l'agenzia è " & Agenzia & " la nazione è " & Nazione & " la data è " & datadal, vbOKOnly)
    End Sub
  • Re: MASCHERA DI RICERCA

    Infatti, hai sbagliato:
    Dim datadal As Variant 
    si dichiara As String
    Dim Agenzia, Nazione, SQLst As String
    il Tipo va dichiarato per ogni singola variabile, altrimenti diventa un Variant.

    Poi se tu codifichi così:
    If (Agenzia = "" And Nazione = "" And datadal = "") Then
    SQLst = SQLst
    ti ritrovi in un groviglio inesplicabile.

    Le condizioni deve essere valutata singolarmente sul singolo campo.
    Tu invece la fai su tre campi contemporaneamente, e ti costringi a scrivere un sacco di codice inutile, con il solo risultato di compliarti la vita.
  • Re: MASCHERA DI RICERCA

    Secondo me non hai colto la logica di Gibra ed hai complicato in moto assurdo la costruzione del Predicato SQL... ma li vedrai tu.
    Per il resto, in Access la proprietà di Default dei controlli TextBox/Combo non è [Text] ma [Value], ed accedere alla proprietà TEXT è possibile SOLO ed ESCLUSIVAMENTE se il controllo ha il focus, altrimenti si ottiene ERRORE.
Devi accedere o registrarti per scrivere nel forum
4 risposte