IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

Appel de fonction déclarée dans un module dans du SQL [AC-2013]


Sujet :

Requêtes et SQL.

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut Appel de fonction déclarée dans un module dans du SQL
    Bonjour à tous,

    J'ai une requête qui appelle la fonction suivante déclarée dans un module :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Function fGetFirstNbr(ByVal pCode As String) As String
     
        Dim recSet As DAO.Recordset
        Dim sSQL As String
     
        fGetFirstNbr= ""
     
        sSQL = "SELECT * FROM QRef WHERE Code = '" & pCode & "'"
        Set recSet = CurrentDb.OpenRecordset(sSQL)
        Do While Not recSet.EOF
                fGetFirstNbr= recSet!Nbr
            Exit Do
        Loop
     
        recSet.Close
        Set recSet = Nothing
     
    End Function
    Ce n'est pas que ça plante mais lorsque je fais défiler la résultat de la requête horizontalement ou verticalement, l'affichage est extrêmement ralenti voire bloqué ou mal affiché (Voir copie d'écran pour 20 enregistrements) . Et il est évident que cela est dû à l'appel à cette fonction

    Quelqu'un aurait-il une explication?

    Merci par avance pour toute aide
    Images attachées Images attachées  

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    J'en rajoute une couche... Si je charge cette requête dans une table physique ayant la même structure, ça prend un temps vraiment long !

    Merci par avance pour toute explication!

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 443
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 443
    Par défaut
    Bonjour.

    deja on peut simplifier l'ecriture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Function fGetFirstNbr(ByVal pCode As String) As String
     
        Dim recSet As DAO.Recordset
        Dim sSQL As String
     
        fGetFirstNbr= ""
     
        sSQL = "SELECT * FROM QRef WHERE Code = '" & pCode & "'"
        Set recSet = CurrentDb.OpenRecordset(sSQL)
     
        if Not recSet.EOF
                fGetFirstNbr= recSet!Nbr
        end if
     
        recSet.Close
        Set recSet = Nothing
     
    End Function
    Et surtout tu peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DFirst("Nbr"; "QRef"; "[Code]='" & [TonChampCode]  & "'")
    qui fait exactement cela et qui est une fonction integree de Access.

    Et la lenteur est probablement du au fait que pour chaque enregistrement tu executes QRef.

    Si possible, remplace l'appel a ta fonction par une jointure sur QRef.
    Access va executer une seule fois QRef et mettre ensuite les resultats en relation avec tes donnees.
    C'est generalement significativemnet plus rapide.

    Et plus largement, quand on a un probleme de performance avec une requete, il est recommande de ne prendre que les champs dont on a vraiment besoin.

    Dans ton cas cela serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT [QRef].[Nbr] FROM QRef WHERE [QRef].Code = '" & pCode & "'"
    Car tu n'utilises que ce champ la.

    Et il faut aussi savoir qu'appeler une function VBA empeche Access d'optimiser ta requete pour une execution plus rapide.
    Habituellement ce n'est pas vraiment un probleme mais parfois cela te ratrape au tournant.

    Enfin ton probleme de lenteur est sans doute perceptible seulement a l'affichage. Si tu te servais de cette requette pour remplir une table par exemple, tu constaterais que ton traitement est tout a fait acceptable.

    J'ai fait une fois des requettes de stat avec une tonne de DFirst(), en execution "non affichee" elles prenaient quelques secondes.
    Si j'avais le malheur de les demander "a l'ecran" on etait plutot dans l'heure.
    Comme j'avais vraiment besoin d'elles telles qu'elles etaient je m'en servais commme sources de requettes de creation de table.
    Et j'allais voir mes resultats dans la tables creee.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 031
    Billets dans le blog
    45
    Par défaut
    Bonjour marot_r,

    Merci pour tes précieuses information et l’info sur DFirst qui va à coup sûr grandement m’aider car ça m’a rappelé le jeu de fonction Dxxx (DLast, DMax,DMin...)

    Quand aux conséquences d’appel à une fonction vba utilisateur, j’imaginais bien le truc.

    J’avais fait ça pour contourner le problème expliqué dans mon post ici :traitement #error dans une requête

    J’ai donc abandonné cette solution pour celle expliquée toujours dans le post ici :traitement #error dans une requête

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction agrégat SUM dans calcul SQL
    Par othke dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/02/2010, 10h05
  2. [Joomla!] Appel d'un module dans un composant
    Par metwa dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/12/2009, 09h57
  3. [1.x] symfony 1.2 [propel] appel d'un module dans un autre module
    Par sonja dans le forum Symfony
    Réponses: 1
    Dernier message: 26/03/2009, 00h02
  4. [JAVA] Appeller fonction qui est dans un autre fichier
    Par Aspic dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 15/05/2007, 21h12
  5. fonction équivalente à la fonction MOD (oracle) dans ms-sql
    Par rodrigue50 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/07/2005, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo