Condividi tramite

Query con parametri in sottomaschera

Anonimo
2010-11-23T18:53:43+00:00

Ho una query con parametri che vorrei mettere come origine record di una sottomaschera; inoltre dalla maschera principale vorrei poter cambiare i parametri (che saranno dei campi) e ricaricare la sottomaschera. Come posso fare ??

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2011-03-25T09:21:14+00:00

Ciao Matteo,

finalmente sono riuscito a testare tutta la procedura.

Il problema della tua combo è legato all'uso di rowsource al posto di recordset. Mi spiego: se tu volessi assegnare un'origine dati alla tua combo impostando il codice sql della combo dovresti scrivere:

me!combobox1.rowsource = "select * from ..."

In questo caso invece stiamo assegnando alla combo un oggetto recordset, quindi, similmente a quello che è stato fatto per la subform occorre utilizzare l'istruzione

set me!combobox1.recordset = rst.

Di seguito ti riporto la procedura completa che ho simulato utilizzando una maschera in cui ho inserito una casella di testo "parametri", una sottomaschera e 2 combo, una popolata con "additem" e l'altra con il "recordset".


    If Len(Me!txt_Parametri1 & "") = 0 Then      'la casella parametro è vuota

        Exit Sub

    End If

    Dim db As DAO.Database

    Dim rst As DAO.Recordset

    Dim qryPT As DAO.QueryDef

    Dim strSQL As String

    Set db = CurrentDb

    Set qryPT = db.CreateQueryDef("")

    strSQL = "EXEC dbo.Sp_Test " & Me!txt_Parametri1

    With qryPT

         'imposto la connessione al DB MySql

         .Connect = "......."

         .ReturnsRecords = True

         .SQL = strSQL

    End With

    Set rst = qryPT.OpenRecordset(dbOpenSnapshot)

    'Qui associo il recordset aperto alla sottomaschera

    Set Me!Sottomaschera1.Form.Recordset = rst   

    'Me!Sottomaschera1.Requery

    'Qui riempio la combobox 1 con AddItem

    Me!CasellaCombinata1.RowSourceType = "Elenco Valori"

    Me!CasellaCombinata1.ColumnCount = 1

    Me!CasellaCombinata1.RowSource = ""

    With rst

        While Not .EOF

            Me!CasellaCombinata1.AddItem !CustSupp

            .MoveNext

        Wend

    End With

    'Qui riempio la combobox 2 assegnandole un oggetto recordset

    Me!CasellaCombinata2.RowSourceType = "Tabella/Query"

    Me!CasellaCombinata2.ColumnCount = 1

    Me!CasellaCombinata2.RowSource = ""

    Set Me!CasellaCombinata2.Recordset = rst   

    Set db = Nothing

    Set qryPT = Nothing

    End Sub

Private Sub Form_Unload(Cancel As Integer)

'Chiudo il recordset nel momento dello scaricamento della della maschera:

        Set rst = Nothing

End Sub


Volendo semplificare il tutto:

http://support.microsoft.com/kb/304252/en-us

Me!cboCompany.RowSource = "EXEC MyProcedure '" & Me!txtParam.Value & "'"Me!cboCompany.Requery

L'attribuzione alla seconda combobox di un recordset di 7000 records è stato istantanea. Per quanto riguarda la proprietà AddItem della combo, oltre alla lentezza di esecuzione, esiste anche un limite dimensionale:

http://support.microsoft.com/kb/638605/it

David

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2010-11-25T10:48:02+00:00

Ok,

Premetto che non posso provare quello che ti sto per dire in quanto non ho un db MySql sotto mano.

Quello che dovrai fare è crearti una query pass-through al volo passandogli i parametri presenti sulla maschera

qui trovi un esempio: http://support.microsoft.com/kb/232493/EN-US/

Ho provato ad adattare l'esempio al tuo caso in questo modo: a fronte dell'evento click del pulsante di comando sulla maschera dovrai inserire

if len (me!txt_Parametri1 & "") = 0 Then     'la casella parametro è vuota

    exit sub

end if

Dim db As Dao.Database

Dim rst as Dao.Recordset

Dim qryPT As Dao.QueryDef

Dim strSQL As String

set db = Currentdb

Set qryPT = db.CreateQueryDef("")

strSQL = "EXEC NomeStoredProcedure " & me!txt_Parametro1

With qryPT

     'imposto la connessione al DB MySql

     .Connect = qui devi inserire la stringa di connessione al db sql

     .ReturnsRecords = True

     .SQL = strSQL

End With

Set rs = qryPT.OpenRecordset(dbOpenSnapshot)

Set Me.Sottomaschera.Fom.Recordset = rs

me.Sottomaschera.Requery

Set db = Nothing

Set qryPT = Nothing

End Sub

Chiuderai il recordset nel momento dello scaricamento della della maschera:

Private Sub Form_Unload(Cancel As Integer)

    Set rs = nothing

End Sub

David

La risposta è stata utile?

0 commenti Nessun commento

13 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2010-11-27T11:05:44+00:00

    Con qualche piccola modifica sono riuscito a farlo funzionare.

    Grande. Non so come ringraziarti..!!!!

    Mi sei stato di grande aiuto.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2010-11-24T17:51:40+00:00

    La cosa è un pò più complicata: la mia query con parametri è in realtà una stored procedure di un db MySQL...

    Scusa se non sono stato chiaro fin da subito...

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2010-11-24T14:42:14+00:00

    Ciao net-level:

    se la maschera principale si chiama mskPrincipale e il campo non associato sulla maschera principale si chiama txt_Parametro1 allora nella query origine record della sottomaschera dovrai impostare nel relativo campo il criterio

    [forms]![mskPrincipale]![txt_Parametro1]

    Ovviamente dovrai impostare un requery della sottomaschera o con apposito pulsante di comando oppure sull'evento dopo aggiornamento del campo parametro

    David

    La risposta è stata utile?

    0 commenti Nessun commento