2013-08-27 2 views
0

En espérant que quelqu'un puisse vous aider. J'ai lu et n'arrive pas à trouver une solution. Problème: J'ai un formulaire (frm_input) dans lequel un utilisateur entre une plage de population. Une fois que l'utilisateur entre les min et max de la plage et clique sur le bouton 'ok', les valeurs sont entrées dans une requête (qryMasterQuery) et la requête est exécutée sur ces entrées en utilisant une instruction 'Between' référençant les champs du formulaire .OpenRecordSet trop peu de pararmeters 4/problèmes avec QueryDefs

Le bouton 'OK' ouvre également une autre forme 'frm_output'. Ce formulaire exécute une fonction 'percentile' qui calcule les centiles de données dans la requête. La fonction passe trois paramètres - le nom de la requête, le champ dans la requête sur lequel calculer le percentile et le percentile à calculer.

La fonction et le formulaire s'exécutent correctement lorsque j'omets les instructions "between" de la requête. Quand j'ai essayé de lier tout cela ensemble, j'ai reçu un 'trop peu de paramètres, 4' sur ma fonction OpenRecordset(). D'après ce que j'ai lu, je dois déclarer explicitement l'objet DAO.Querydef et fournir les paramètres via la collection de paramètres d'objets Querydef.

Numéro 1: Quand j'inclus l'instruction:

Set qdf = db.QueryDefs("qryMasterQuery") 

je reçois un moteur d'exécution 424 message d'erreur.

Much Bigger Problème 2: Je ne suis toujours pas clair sur la syntaxe pour fournir des paramètres via qdf.Paramaters. Je ne veux pas tout déclarer dans la requête, seulement ce qui est passé à la fonction, c'est-à-dire le 'fldName'.

mon code est ci-dessous:

Public Function PercentileRst(RstName As String, fldName As String, PercentileValue As Double) As Double 

    'This function will calculate the percentile of a recordset. 

    Dim PercentileTemp As Double 
    Dim dbs As DAO.database 
    Dim RstOrig As DAO.Recordset 
    Set dbs = CurrentDb 
    Dim xVal As Double 
    Dim iRec As Long 
    Dim i As Long 
    Set RstOrig = CurrentDb.OpenRecordset("qryMasterFee", dbOpenDynaset) 
    RstOrig.Sort = fldName 
    Dim RstSorted As Recordset 
    Set RstSorted = RstOrig.OpenRecordset() 

    RstSorted.MoveLast 
    RstSorted.MoveFirst 
    xVal = ((RstSorted.RecordCount - 1) * PercentileValue) + 1 
    'x now contains the record number we are looking for. 
    'Note x may not be  whole number 
    iRec = Int(xVal) 
    xVal = xVal - iRec 
    'i now contains first record to look at and 
    'x contains diff to next record 
    RstSorted.Move iRec - 1 
    PercentileTemp = RstSorted(fldName) 
    If xVal > 0 Then 
     RstSorted.MoveNext 
     PercentileTemp = ((RstSorted(fldName) - PercentileTemp) * xVal) + PercentileTemp 
    End If 
    RstSorted.Close 
    RstOrig.Close 
    Set RstSorted = Nothing 
    Set RstOrig = Nothing 
    Set dbs = Nothing 
    PercentileRst = PercentileTemp 
End Function 

Je suis éternellement reconnaissant pour toute aide que je suis à peu près fait me cogner la tête sur le mur.

Répondre

0

D'abord quelques conseils de style de couple. Cotez toutes vos variables en haut de la fonction. Et vous pouvez faire votre texte de code pour ressembler à du code en entourant par backticks like so ou en mettant 4 espaces devant chaque ligne séparée.

Like so 

Vous ne devriez pas besoin de faire un nouveau tri Recordset, en définissant la propriété Sort sera le tri. Ne pas oublier de déclarer la variable QueryDef. En outre, vous avez manqué le s dans votre variable Databasedbs. Double-vérifier qryMasterQuery est le bon nom.

Dim qdf as QueryDef 
Set qdf = dbs.QueryDefs("qryMasterQuery") 

See MSDN for more info.

Numéro 2:
Vous devez fournir les paramètres de la requête de travailler. Cela explique l'erreur "Trop peu de paramètres". La méthode est la suivante:

Dim qdf as QueryDef 
Set qdf = dbs.QueryDefs("qryMasterQuery") 
qdf.Parameters("Prmtr1") = "blah" 'You can also use qdf.Parameters!Prmtr1 = "blah" 
qdf.Parameters("Prmtr2") = 1234 

set rstOrig = qdf.OpenRecordSet() 

Une alternative à la fourniture des paramètres est de les retirer de la requête ou la création d'une nouvelle requête avec les paramètres implicites déjà fournies.

See the Parameters MSDN for more info. Notez que l'exemple est difficile à suivre et utilise différentes méthodes.

+0

merci! passer à travers et fournir les paramètres a résolu le problème. le seul autre changement que je devais faire était de déclarer explicitement les paramètres (plutôt que de les référencer à partir du formulaire). – jimmyv41

+0

Vous pouvez référencer des objets de formulaire, comme des zones de texte, en tant que paramètres si la requête est ouverte en tant que jeu d'enregistrements sur le module de ce formulaire. Aussi s'il vous plaît choisir ma réponse si elle a répondu à votre question. Merci :) – usncahill

Questions connexes