{Access} Appeler une requête SQL en VBA

Résolu
RoZyk Messages postés 84 Statut Membre -  
RoZyk Messages postés 84 Statut Membre -
Bonjour tout le monde,

J'essaye de créer un logiciel de gestion pour mon entreprise,

J'ai un petit soucis de syntaxe sous VBA, j'ai déjà 2 fonctions en requète SQL:
- NouveauSolde (DateDuJour, Banque), elle me renvoie en fonction d'une date et d'une banque sélectionnée, le solde du jour.
- JourSuivant (DateDuJour, Banque), elle me renvoie la date suivante ou une action s'est produite

Maintenant, imaginons que je veuille rentrer une nouvelle opération: Par exemple:

Un client nous fait un versement le 13/02/2009 de 1000, il faudra donc recalculer tous les soldes des jours suivants!!

En Algo ça donne un truc comme ça:

Début

Date = DateSaisie
Banque = BanqueSaisie

Fonction CalculSolde (Date, Banque)

- NouveauSolde = Fonction NouveauSolde (Date, Banque)
- Date = JourSuivant (Date, Banque)

Tant que Date != de NULL Faire
- NouveauSolde = Fonction NouveauSolde (Date, Banque)
- Date = JourSuivant (Date, Banque)

FTQ

Fin

Ça ne me semble pas trop compliqué, mais j'ai des problèmes avec la syntaxe VBA...
Notamment pour appelé les requètes SQL dans mon code VBA

Merci de vos futures réponses!
Configuration: Windows XP / Safari 532.5

12 réponses

  1. garion28 Messages postés 1545 Date d'inscription   Statut Membre Dernière intervention   408
     
    pour les select (cette méthode nécessite d'avoir activé la référence "microsoft DAO x.xx object library" ou "microsoft dao 2.5/3.5 compatibility library", enfin une référence DAO):
    dim db as DAO.database
    dim rst as DAO.recordset
    dim req as string
    req="ta requete qui commence par select"
    set db = currentdb
    set rst=db.openrecordset(req)

    champ1=rst.fields(0)

    pour toutes les autres requètes ne renvoyant pas de résultat:
    docmd.runsql "tarequete"
    0
  2. RoZyk Messages postés 84 Statut Membre 3
     
    Merci pour ta réponse ultra rapide, mais je n'y arrive pas, peux tu jeter un coup d'oeil a mon code?NouveauSolde et JourSuivant sont des requètes SQL, avec Jour et Banque les paramètres

    Sub CalculSolde()
    
    'Declaration de mes variables
        
        Dim db As DAO.Database
        Dim rst As DAO.Recordset
        Dim Solde As String
        Dim Jour As Date
        
    'Programme
    
        Solde = NouveauSolde(Jour, Banque)
        Jour = JourSuivant(Jour, Banque)
        
        While (Jour Is Not Null)
         
            Solde = NouveauSolde(Jour, Banque)
            Jour = JourSuivant(Jour, Banque)
            
        Wend
        
    End Sub


    Encore merci!
    0
  3. RoZyk Messages postés 84 Statut Membre 3
     
    Arf!! Après quelques modifications mon code donne ça :
    Sub Main()
    
    'Declaration de mes variables
    
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim NouveauSolde As Variant
    Dim JourSuivant As Variant
    Dim idSolde As Variant
    Dim Solde As Variant
    Dim Jour As Variant
    Dim Banque As Integer
    
    NouveauSolde = "SELECT TOP 1 VersementTempo.Credit-VersementTempo.Debit+SoldePrecedent.SoldePrecedent AS NouveauSolde, VersementTempo.Date AS [Date], VersementTempo.idBanque AS idBanque FROM SoldePrecedent, VersementTempo WHERE (((VersementTempo.Date)=[DateDuJour]));"
    JourSuivant = "SELECT TOP 1 VersementTempo.Date, VersementTempo.idBanque FROM VersementTempo WHERE (((VersementTempo.Date) > [DateDuJour]) And ((VersementTempo.idBanque) = [N°Banque])) ORDER BY VersementTempo.Date;"
    
    Set db = CurrentDb
    
    'Initialisation des variables
    
        Solde = 0
        Jour = Now()
        Banque = 1
        idSolde = 5
        
    'Programme
    
        Solde = NouveauSolde(Jour, Banque)
        
        Jour = JourSuivant(Jour, Banque)
        
        While (idSolde Is Not Null)
                  
            Solde = NouveauSolde(Jour, Banque)
            Jour = JourSuivant(Jour, Banque)
            idSolde = idSolde - 1
            
        Wend
       
    Set rst = db.OpenRecordset(Solde, Jour)
    champ1 = rst.Fields(0)
    
    End Sub
    


    Mais mtn j'ai une erreur d'execution 13 : Incompatibilité de type, sur la ligne
     Solde = NouveauSolde(Jour, Banque) 


    Un peu d'aide SVP?
    0
  4. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Salut,

    que fait ta fonction NouveauSolde ?

    De plus, il me semble que le test d'une valeur null ne se fait pas avec is not null, mais qu'il existe une fonction nommée isnull(valeur_à_tester), dans ton cas, ce serait while not isnull(idsolde)...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. RoZyk Messages postés 84 Statut Membre 3
     
    Ma fonction NouveauSolde me calcul le solde pour un jour et une banque donnée, c'est une requète SQL en fait que je veux appeler dans mon VBA, je ne sais pas si je l'ai fait correctement....

    Donc pour simplifier NouveauSolde avec en paramètre une date et une banque me renvoie un Solde
    0
    1. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Et les variables utilisées dans cette fonction, comment sont-elles décrites ? Peux-tu coller le texte de la fonction ?
      0
  7. RoZyk Messages postés 84 Statut Membre 3
     
    Ce ne sont pas des fonctions, ce sont des requêtes SQL que j'ai créé, elle fonctionne très bien quand je les appelle sous Access, pour une date donnée j'ai le solde du jour, maintenant je voudrais l'automatiser afin que tous les soldes soient calculer.

    Donc ma requête NouveauSolde c'est:
    SELECT TOP 1 VersementTempo.Credit-VersementTempo.Debit+SoldePrecedent.SoldePrecedent AS NouveauSolde, VersementTempo.Date AS [Date], VersementTempo.idBanque AS idBanque FROM SoldePrecedent, VersementTempo WHERE (((VersementTempo.Date)=[DateDuJour]));


    DateDuJour est mon paramètre ou ma variable (je n'ai pas mis la banque pour simplifier...)

    Je ne sais pas si je suis claire...

    Merci pour ton aide en tout cas
    0
    1. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      Une requête ne s'appelle pas comme une fonction...

      Si j'ai bien compris tu souhaites lancer une requête et en récupérer le résultat en VBA ?
      0
  8. RoZyk Messages postés 84 Statut Membre 3
     
    Ben en fait je souhaites utilisé mes requêtes SQL dans mon code VBA afin d'automatiser mon calcul:

    Imaginons:
    Solde initial a 5000
    J'ai une commande pour le 01/03/2010 de 1000
    NouveauSolde du 01/03/2010 = 6000
    Je dépense 2000 le 04/03/2010
    NouveauSolde du 04/03/2010 = 4000

    Maintenant imaginons que j'ai une commande pour le 02/03/2010, il faut que je calcule le solde du 02/03/2010, puis le solde du 04/03/2010 et tous les soldes des jours suivants, et faire NouveauSolde pour chaque jour serait trop fastidieux, c'est pourquoi je voudrais faire un programme VBA qui le fait de lui même.

    Pour se faire j'ai ma requête NouveauSolde, et j'ai créé une requête JourSuivant qui me renvoie le jour suivant ou il y a eu une transaction afin de la passé en paramètre pour calculer le NouveauSolde du JourSuivant...

    C'est peut être plus clair comme ça? J'avoues que mes explications n'étaient pas géniales...
    0
  9. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Donc, pour une requête de ce type, il faudra créer un recordset, la requête préenregistrée ne servira à rien.
    0
  10. RoZyk Messages postés 84 Statut Membre 3
     
    J'ai déjà créé un Recordset, mais ma syntaxe ne doit pas être correcte?? Peux tu me donnais un exemple de Recordset avec quelques explications?
    0
  11. RoZyk Messages postés 84 Statut Membre 3
     
    J'ai trouvé une solution avec une simple requête SQL en fait!! Mais je veux bien qu'on me montre comment me servir du RecordSet quand même!!!

    Merci beaucoup pour votre aide!
    0
  12. blux Messages postés 5036 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    Pour lire le champ couleur d'une table nommée t_couleur avec une condition where :

    Dim Rs As DAO.Recordset
    Dim StrSql As String
    Dim Toto As String
    Toto = "a"
    StrSql = "SELECT TOP 1 Couleur FROM T_couleurs WHERE "
    StrSql = StrSql & "cle = '" & Toto & "';"
    Set Rs = CurrentDb.OpenRecordset(StrSql)
    Rs.MoveFirst
    While Not Rs.EOF
        MsgBox Rs!couleur
        Rs.MoveNext
    Wend

    A adapter à ton cas...
    0
  13. RoZyk Messages postés 84 Statut Membre 3
     
    OK Merci beaucoup, pour toutes ces informations, c'était donc l'appel de ma requête SQL qui n'était pas correct apparement!!
    Encore merci pour ta patience!
    0