Création de table à partir d'une requête sélection SQL en vb

Résolu
BiankaBo Messages postés 68 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 24 septembre 2024 - 16 juil. 2024 à 16:56
yg_be Messages postés 23329 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 novembre 2024 - 11 sept. 2024 à 21:57

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!!! :)  

12 réponses

BoBot Messages postés 4054 Date d'inscription mardi 4 juillet 2023 Statut Modérateur Dernière intervention 16 novembre 2024 262
17 juil. 2024 à 19:50
Bonjour !
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.

0
BiankaBo Messages postés 68 Date d'inscription lundi 16 avril 2018 Statut Membre Dernière intervention 24 septembre 2024
17 juil. 2024 à 21:21

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 

qdef.MoveFirst

et je ne peux pas non plus faire une Loop en utilisant

With qdef
Do Until .EOF

Je n'arrive pas à comprendre à quoi servent les paramètres non plus. Voici ce que j'ai fais en essayant d'ajouter vos recommandations:

Dim db As DAO.Database
Dim qdef As DAO.QueryDef
Dim rst As DAO.Recordset


Set db = CurrentDb
Set qdef = db.QueryDefs("06-01_AVANTGARDE_SOLDE_ANN_DEM_RECH")

qdef.MoveFirst

With qdef
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, ",", ".")

    'Assigner les valeurs des paramètres
    qdef.Parameters(0).Value = strRechRef
    qdef.Parameters(1).Value = strRechNom
    qdef.Parameters(2).Value = strRechPNom
    qdef.Parameters(3).Value = strRechAnn
    qdef.Parameters(4).Value = DecSolde

    Set rst = qdef.OpenRecordset("INSERT INTO " & strNTbl & " (SelCreance,RefSyst,NClient,PNClient,Ann,Sold)" _
    & " VALUES (0,'" & qdef.Parameters(0).Value & "','" & qdef.Parameters(1).Value & "','" & qdef.Parameters(2).Value & "'," & qdef.Parameters(3).Value & "," & qdef.Parameters(4).Value & ");")

.MoveNext
Loop

End With

Je ne sais pas si les paramètres sont bien utilisés, car je bloque tout de suite à qdef.MoveFisrt..

Merci beaucoup! :)

0