Problema richiesta parametro tabella con solo sottomaschera

di il
11 risposte

Problema richiesta parametro tabella con solo sottomaschera

Ciao a tutti, dopo varie ricerche andate a vuoto chiedo aiuto. Ho un database access per la gestione degli ordini. Ho creato una maschera di ricerca prodotto con 3 combobox che servono a filtrare i dati per produttore, modello e tipologia.

Schema della maschera
Schema della maschera

Ho scritto del codice per ogni evento afterupdate delle combo, dove in funzione della scelta aggiorna tramite delle stringhe SQL le origini riga delle combo ed ovviamente il recordsource della maschera. Fino qui tutto ok, funziona benissimo. Ho creato poi una maschera per la gestione dei prodotti, mettendo nella parte in basso della maschera (come sottomaschera) la maschera di ricerca fatta in precedenza. Il problema sorge quando vado a fare una ricerca scegliendo una scelta da una qualsiasi delle combo. Mi compare la classica finestra che chiede di immettere il parametro tabella, richiedendo proprio il valore della combo selezionata. Vedendo da codice la routine si blocca quando assegna la SQL alla sottomaschera, come se il riferimento alla combo non fosse riconosciuto. Ovviamente se apro la maschera di ricerca da sola e non come sottomaschera funziona tutto. Vi copio il codice della routine che quando arriva in fondo genera la richiesta di immissione del parametro tabella:

Private Sub FiltroDatiMaschera()

    Dim strSQL_Maschera As String
    Dim intTipoFiltro As Integer
    
    intTipoFiltro = 0
    
    strSQL_Maschera = "SELECT Prodotti.Modello, Prodotti.CodiceProdotto, Prodotti.CodiceInternoProdotto, Prodotti.Descrizione, Produttore.Produttore, TipoProdotto.TipoProdotto"
    strSQL_Maschera = strSQL_Maschera & " FROM Produttore INNER JOIN (TipoProdotto INNER JOIN Prodotti ON TipoProdotto.[IDTipoProdotto] = Prodotti.[IDTipoProdotto]) ON Produttore.IDProduttore = Prodotti.IDProduttore"
    
    'Numeri identificativi per la scelta
    '*****cboProduttore=1
    '*****cboModello=2
    '*****cboTipoProdotto=4

    If Not cboProduttore.Value = "" Then intTipoFiltro = intTipoFiltro + 1
    If Not cboModello.Value = "" Then intTipoFiltro = intTipoFiltro + 2
    If Not cboTipoProdotto.Value = "" Then intTipoFiltro = intTipoFiltro + 4

    Select Case intTipoFiltro
        Case 0  'Produttore, Modello e TipoProdotto nulli
            strSQL_Maschera = strSQL_Maschera & ";"
        Case 1  'Solo Produttore selezionato
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Produttore.Produttore)=[Maschere]![subProdottiFiltrati]![cboProduttore]));"
        Case 2  'Solo Modello selezionato
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Prodotti.Modello)=[Maschere]![subProdottiFiltrati]![cboModello]));"
        Case 3  'Produttore e Modello selezionati
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Prodotti.Modello)=[Maschere]![subProdottiFiltrati]![cboModello]) AND ((Produttore.Produttore)=[Maschere]![subProdottiFiltrati]![cboProduttore]));"
        Case 4  'Solo TipoProdotto selezionato
            strSQL_Maschera = strSQL_Maschera & " WHERE (((TipoProdotto.TipoProdotto)=[Maschere]![subProdottiFiltrati]![cboTipoProdotto]));"
        Case 5  'Produttore e TipoProdotto selezionati
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Produttore.Produttore)=[Maschere]![subProdottiFiltrati]![cboProduttore]) AND ((TipoProdotto.TipoProdotto)=[Maschere]![subProdottiFiltrati]![cboTipoProdotto]));"
        Case 6  'Modello e TipoProdotto selezionati
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Prodotti.Modello)=[Maschere]![subProdottiFiltrati]![cboModello]) AND ((TipoProdotto.TipoProdotto)=[Maschere]![subProdottiFiltrati]![cboTipoProdotto]));"
        Case 7  'Tutti selezionati
            strSQL_Maschera = strSQL_Maschera & " WHERE (((Produttore.Produttore)=[Maschere]![subProdottiFiltrati]![cboProduttore]) AND ((Prodotti.Modello)=[Maschere]![subProdottiFiltrati]![cboModello]) AND ((TipoProdotto.TipoProdotto)=[Maschere]![subProdottiFiltrati]![cboTipoProdotto]));"
    End Select

    Form_subProdottiFiltrati.RecordSource = strSQL_Maschera
    Form_subProdottiFiltrati.Requery
    
End Sub
Come se in un caso il codice fosse corretto e nell'altro no.
Avete qualche idea su quale possa essere il problema? Grazie.

Emanuele.

11 Risposte

  • Re: Problema richiesta parametro tabella con solo sottomaschera

    I filtri multipli si gestiscono in modo estremamente più semplice e flessibile di come hai fatto...
    Dim strWH As String
    If Len(Me!gocodice.Value & vbNullString) > 0 Then strWH = strWH & "codice='" & Me!gocodice.Value & " And """
    If Len(Me!goripiano.Value & vbNullString) > 0 Then strWH = strWH & "ripiano='" & Me!goripiano.Value & " And """
    .... altri 47 filtri...
    If Len(strWH) > 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
    Me.Filter = strWH
    Me.FilterOn = True
    
    Ti suggerisco di provare questo metodo.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Cavolo, così è molto più semplice. Provo e ti faccio sapere.
    Domanda sicuramente banale, ma perché dopo il "me" c'è il punto esclamativo e non ad esempio me.gocodice.value? Grazie.

    Emanuele
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Il punto espone metodi/eventi/proprietà wd oggetti appartenenti all'oggetto prima del punto...
    Il puntoesclamativo punta direttamente agli oggetti sottoinsieme Controls, quindi le scritture funzionalmente si equivalgono, ii per avere il colpo d'occhio si tratti di un controllo e non di altro preferisco usare li PUNTOESCLAMATIVO.
    Questa differenziazione è poco rilevante se scrivi solo codice in maschera... ma se scrivi codice orientato ad oggetti, classi ad esempio, queste differenze aiutano alla immediata comprensione.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Ok grazie della spiegazione.

    Nell'esempio che mi hai fatto per l'utilizzo del filtro ci sta che manchi l'apice alla fine? C'è il primo dopo l'uguale però non vedo l'altro.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    @Alex ha scritto:


    I filtri multipli si gestiscono in modo estremamente più semplice e flessibile di come hai fatto...
    Dim strWH As String
    If Len(Me!gocodice.Value & vbNullString) > 0 Then strWH = strWH & "codice='" & Me!gocodice.Value & " And """
    If Len(Me!goripiano.Value & vbNullString) > 0 Then strWH = strWH & "ripiano='" & Me!goripiano.Value & " And """
    .... altri 47 filtri...
    If Len(strWH) > 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
    Me.Filter = strWH
    Me.FilterOn = True
    
    Ti suggerisco di provare questo metodo.
    Ciao Alex,
    ho risolto come mi avevi suggerito, ed in effetti è molto semplice e lineare e soprattutto funziona sia nella maschera che quando è utilizzata come sottomaschera. Grazie.
    Qui di sotto com'è venuto il codice:
    Dim strFiltro As String
    
    If Len(Me.cboProduttore.Value & vbNullString) > 0 Then strFiltro = strFiltro & "Produttore='" & Me.cboProduttore.Value & "'" & " AND "
    If Len(Me.cboModello.Value & vbNullString) > 0 Then strFiltro = strFiltro & "Modello='" & Me.cboModello.Value & "'" & " AND "
    If Len(Me.cboTipoProdotto.Value & vbNullString) > 0 Then strFiltro = strFiltro & "TipoProdotto='" & Me.cboTipoProdotto.Value & "'" & " AND "
    
    If Len(strFiltro) > 0 Then strFiltro = Mid$(strFiltro, 1, Len(strFiltro) - 5)
    
    Me.Filter = strFiltro
    Me.FilterOn = True
    
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Molto bene.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Alex, con la tua dritta ho risolto in maniera ottimale il problema, però volevo capire come mai non funzionava la mia istruzione SQL e per questo mi chiedeva sempre l'immissione del parametro. Alla fine ho trovato che sostituendo
    [Maschere]![subProdottiFiltrati]![cboModello]
    con
    "'" & SubProdottiFiltrati.cboModello & "'"
    non mi chiede più niente, sia se lancio la maschera in maniera indipendente sia come sottomaschera. Diciamo che ho trovato dov'era il problema, però non capisco il motivo. Te hai qualche idea sul perché di questo comportamento? Ciao.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Sinceramente dovrei fare debug della costruzione del predicato e provare il risultato perché non trovo a colpo d'occhio il problema vista anche la contorsione del codice...
    Puoi provare tu mettendo un debug.print strSQL_Maschera prima di assegnare, lo vedi stampato nella finestra immediata e potrai analizzarlo meglio e provare ad incollarlo in una query per testarlo.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Ho fatto il debug e questo è quello che mi tira fuori:
    
    SELECT Prodotti.Modello, Prodotti.CodiceProdotto, Prodotti.CodiceInternoProdotto, Prodotti.Descrizione, Produttore.Produttore, TipoProdotto.TipoProdotto FROM Produttore INNER JOIN (TipoProdotto INNER JOIN Prodotti ON TipoProdotto.[IDTipoProdotto] = Prodotti.[IDTipoProdotto]) ON Produttore.IDProduttore = Prodotti.IDProduttore WHERE (((Produttore.Produttore)=[Maschere]![subProdottiFiltrati]![cboProduttore]));
    come vedi è la condizione WHERE che crea problemi (vedi alla fine dove rimane scritto [Maschere]![subProdottiFiltrati]![cboProduttore]).

    Non mi restituisce il nome del produttore, ma rimane così. Diciamo che mi torna che venga interpretato come parametro, però lo dovrebbe interpretare sempre come parametro, invece come scritto nel mio primo post quando è eseguito sulla maschera direttamente non da errore e riesce a risolvere il nome del produttore.
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Se vuoi che venga risolto in modo esplicito devi metterlo fuori dalla stringa...
    "Select...... WHERE IdProduttore=" & Me!cboProduttore
    Se, al posto di Maschera utilizzassi FORMS!nomeform!nomecbo funzuonerebbe
  • Re: Problema richiesta parametro tabella con solo sottomaschera

    Ok, grazie.
Devi accedere o registrarti per scrivere nel forum
11 risposte