Création de table à partir d'une requête sélection SQL en vb
Résoluyg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à vous! :)
J'ai essayé beaucoup de choses pour y parvenir, mais sans succès.
Ma base de données comprend des tables attachées. Pour arriver à avoir toutes les informations qu'il me faut (notamment le solde à payer du client par année), j'ai créé une requête qui joint plusieurs tables attachées ensemble et qui fait des sommes sur les soldes annuels. Les informations que je récupère à partir des 3 tables attachées sont les suivantes: Numéro de référence du client (Fiche), nom du client, prénom du client, année de la créance, solde annuel et un numéro de l'établissement que je garde caché, car il sert seulement à filtrer mes données.
Donc à partir d'un formulaire, je choisis l'année et l'établissement et je permets aussi des recherches avec le numéro de référence, le nom et le prénom du client. J'appuie sur "Appliquer" et la requête s'exécute avec les critères de recherche. Jusqu'ici tout va bien.
J'ai un besoin particulier qui est le suivant : Je dois pouvoir cocher les clients désirés dans ma requête. Et comme ce n'est pas possible d'ajouter une case à cocher indépendante dans une requête, je dois créer une table temporaire à partir de ma requête. (Si vous avez une autre solution, je suis toute ouïe).
C'est donc ici que ça se complique. Par étape, je crée une nouvelle table temporaire en vba avec dbs.Execute "CREATE TABLE [...]" qui contient toutes les infos nécessaires, sauf le numéro d'établissement que je n'ai plus besoin à ce stade. Et là je dois pouvoir ajouter le résultat de ma requête à cette nouvelle table. Je suis barrée ici. J'ai essayé avec un OpenRecorset sur ma requête puis dbs.Execute "INSERT INTO" et j'ai toujours une erreur d'exécution 3061 "Trop peu de paramètres. 5 attendus". Est-ce que ça se pourrait qu'on ne puisse pas faire un OpenRecordset avec une requête ? Là j'essaie avec QueryDefs, mais j'ai l'impression de faire n'importe quoi et je ne me comprends plus. Je vous mets ci-dessous mon code vba avec l'OpenRecordset:
'Récupérer les données et remplir la table temporaire Dim strRechRef As String 'Valeur du numéro de fiche Dim strRechNom As String 'Valeur du nom Dim strRechPNom As String 'Valeur du prénom Dim strRechAnn As String 'Valeur de l'année Dim MonSolde As String 'Valeur du solde Dim DecSolde As String 'Valeur du solde avec la virgule replace par un point Dim strSQL As String 'On Error Resume Next Dim db As DAO.Database, qdef As DAO.QueryDef, IngRecAff As Long Dim base As DAO.Database Dim enr As DAO.Recordset Set base = CurrentDb Set enr = base.OpenRecordset("06-01_AVANTGARDE_SOLDE_ANN_DEM_RECH") enr.MoveFirst With enr Do Until .EOF 'Récupérer les valeurs de l'enregistrement strRechRef = .Fields("FICHE") strRechNom = .Fields("NOM") strRechPNom = .Fields("PNOM") strRechAnn = .Fields("ANNEE") MonSolde = .Fields("SommeDeSOLDE") DecSolde = Replace(MonSolde, ",", ".") MsgBox strRechRef & strRechNom & strRechPNom & strRechAnn & DecSolde Exit Sub 'Ajouter l'enregistrement à la table temporaire Dim dbs2 As Database Set dbs2 = CurrentDb dbs2.Execute "INSERT INTO " & strNTbl & " (SelCreance,RefSyst,NClient,PNClient,Ann,Sold)" _ & " VALUES (0,'" & strRechRef & "','" & strRechNom & "','" & strRechPNom & "'," & strRechAnn & "," & DecSolde & ");" dbs2.Close Set dbs2 = Nothing Exit Sub .MoveNext Loop End With enr.Close base.Close Set enr = Nothing Set base = Nothing
J'ai mis un "Exit Sub" dans ma Loop, car il y a beaucoup de données et comme ça ne marche pas, ma Loop s'exécute sans arrêt.
Je ne peux pas faire une requête Ajout manuellement, car mes données sont variables. Mais si je le fais manuellement avec ma requête "06-01_AVANTGARDE_SOLDE_ANN_DEM_RECH", ça fonctionne très bien. Comment faire pour que le résultat soit le même en vba?.. Peut-on faire une requête Ajout en vba faisant en sorte que la création et le remplissage de la table se fasse dans la même étape comme lorsqu'on le fait manuellement?
Merci beaucoup de votre aide, je suis désespérée et j'ai vraiment besoin que ça fonctionne!!! :)
- L'indice n'appartient pas à la sélection access
- L'indice n'appartient pas à la sélection vba - Forum VB / VBA
- Erreur d'execution 9, l'indice n'appartient pas à la sélection ✓ - Forum Programmation
- Erreur '9' l'indice n'appartient pas à la sélection - Forum VB / VBA
- L'indice n'appartient pas à la sélection ✓ - Forum VB / VBA
- Indice téléphonique - Guide
12 réponses
C'est moi, Bobot, votre IA préférée !
D'après ce que je comprends de votre code, il semble que la requête que vous exécutez requiert 5 paramètres, comme indiqué par l'erreur. Ces paramètres doivent être inclus lorsque vous exécutez la requête. Pour résoudre le problème, vous pouvez ajouter des paramètres à votre requête. Voici un exemple de la façon dont vous pouvez le faire :
'Créez un objet QueryDef pour votre requête
Set qdef = db.QueryDefs("nom_de_votre_requete")
'Assignez des valeurs à vos paramètres
qdef.Parameters(0).Value = valeur_param1
qdef.Parameters(1).Value = valeur_param2
qdef.Parameters(2).Value = valeur_param3
qdef.Parameters(3).Value = valeur_param4
qdef.Parameters(4).Value = valeur_param5
'Exécutez la requête
Set rst = qdef.OpenRecordset()
Cela devrait vous permettre d'exécuter votre requête sans générer d'erreur. Assurez-vous que les valeurs que vous passez à la requête sont correctes et qu'elles sont dans le bon ordre.
Bonjour BoBot,
Merci beaucoup pour votre réponse.
Je suis tout de même un peu perdue malheureusement. Je dois faire une boucle pour parcourir tous les enregistrements de ma requête un à un pour les ajouter graduellement à ma table de données, mais je ne peux pas atteindre le premier enregistrement avec
et je ne peux pas non plus faire une Loop en utilisant
Je n'arrive pas à comprendre à quoi servent les paramètres non plus. Voici ce que j'ai fais en essayant d'ajouter vos recommandations:
Je ne sais pas si les paramètres sont bien utilisés, car je bloque tout de suite à qdef.MoveFisrt..
Merci beaucoup! :)