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 :

Requête SQL contre recordset


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut Requête SQL contre recordset
    Bonjour,

    J'ai une fonction de calcul que j'ai réalisée en parcourant un recordset. Pas de problème, cela fonctionne.
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Public Function Calcul()
        Dim oDb As DAO.Database, oRst As DAO.Recordset, sSQL As String
        Set oDb = CurrentDb
        sSQL = "SELECT tAUT.*, tFOR.* FROM tFOR INNER JOIN tAUT ON tFOR.forid = tAUT.autforid;"
        Set oRst = oDb.OpenRecordset(sSQL, dbOpenDynaset)
        If oRst.BOF Then
            MsgBox "Il n'y a pas d'enregistrement à recalculer", vbExclamation + vbOKOnly, "Exécution impossible"
        Else
            While Not oRst.EOF
                oRst.Edit
                If IsNull(oRst.Fields("autfor").Value) Then
                    oRst.Fields("autala").Value = Null
                    oRst.Fields("autlim").Value = Null
                ElseIf Not IsNull(oRst.Fields("autsus").Value) Then
                    oRst.Fields("autala").Value = Null
                    oRst.Fields("autlim").Value = Null
                ElseIf (oRst.Fields("foratt").Value = True And IsNull(oRst.Fields("autaut").Value)) Then
                    oRst.Fields("autala").Value = Null
                    oRst.Fields("autlim").Value = Null
                ElseIf (oRst.Fields("fordur").Value > 0 And Date > DateSerial(Year(oRst.Fields("autfor").Value), Month(oRst.Fields("autfor").Value) + oRst.Fields("fordur").Value, Day(oRst.Fields("autfor").Value))) Then
                    oRst.Fields("autala").Value = Null
                    oRst.Fields("autlim").Value = Null
                ElseIf oRst.Fields("fordur").Value = 0 Then
                    oRst.Fields("autala").Value = #12/31/2099#
                    oRst.Fields("autlim").Value = #12/31/2099#
                Else
                    oRst.Fields("autala").Value = DateSerial(Year(oRst.Fields("autfor").Value), Month(oRst.Fields("autfor").Value) + oRst.Fields("fordur").Value - 6, Day(oRst.Fields("autfor").Value))
                    oRst.Fields("autlim").Value = DateSerial(Year(oRst.Fields("autfor").Value), Month(oRst.Fields("autfor").Value) + oRst.Fields("fordur").Value, Day(oRst.Fields("autfor").Value))
                End If
                oRst.Update
                oRst.MoveNext
            Wend
        End If
        MsgBox Combien(sSQL) & " enregistrements ont été recalculés", vbExclamation + vbOKOnly, "Recalcul"
        oRst.Close: oDb.Close: Set oRst = Nothing: Set oDb = Nothing
        If CurrentProject.AllForms("fAGEsfAUT").IsLoaded Then Forms!fAGEsfAUT.Requery
    End Function
    Ayant lu que les requêtes SQL sont plus rapides, j'essaie de créer une requête de mise à jour
    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 Calcul_bis()
        Dim sAlarme As String, sLimite As String, sSQL As String
        sAlarme = "IIf(IsNull(tAUT.autfor) = True, Null, " & _
            "IIf(IsNull(tAUT.autsus) = False, Null, " & _
            "IIf(tFOR.foratt = True And IsNull(tAUT.autaut) = True, Null, " & _
            "IIf(tFOR.fordur > 0 And Date() > DateSerial(Year(tAUT.autfor), Month(tAUT.autfor) + tFOR.fordur, Day(tAUT.autfor)), " & _
            "IIf(tFOR.fordur = 0, #12/31/2099#, DateSerial(Year(tAUT.autfor), Month(tAUT.autfor) + tFOR.fordur - 6, Day(tAUT.autfor)))))))"
        sLimite = "IIf(IsNull(tAUT.autfor) = True, Null, " & _
            "IIf(IsNull(tAUT.autsus) = False, Null, " & _
            "IIf(tFOR.foratt = True And IsNull(tAUT.autaut) = True, Null, " & _
            "IIf(tFOR.fordur > 0 And Date() > DateSerial(Year(tAUT.autfor), Month(tAUT.autfor) + tFOR.fordur, Day(tAUT.autfor)), " & _
            "IIf(tFOR.fordur = 0, #12/31/2099#, DateSerial(Year(tAUT.autfor), Month(tAUT.autfor) + tFOR.fordur, Day(tAUT.autfor)))))))"
        sSQL = "UPDATE tFOR INNER JOIN tAUT ON tFOR.forid = tAUT.autforid SET tAUT.autala = " & sAlarme & ", tAUT.autlim = " & sLimite & ";"
        DoCmd.SetWarnings True
        DoCmd.RunSQL sSQL
        DoCmd.SetWarnings True
        If CurrentProject.AllForms("fAGEsfAUT").IsLoaded Then Forms!fAGEsfAUT.Requery
    End Function
    Vous avez deviné ? La requête semble s'exécuter plus lentement, qui plus est les calculs sont erronés. Je l'ai pourtant déduite de la première fonction.

    Avez-vous une idée ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Par défaut
    Peut-être un peu de lecture

    http://loufab.developpez.com/optimisation
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  3. #3
    Membre Expert
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut
    Bonsoir,

    Merci de ta réponse. Je suppose que tu fais référence à
    La fonction Vraifaux() -Iif()- n'est pas optimisable, utilisez si possible cette fonction dans un formulaire ou un état.
    S'il n'est pas sposssible d'utiliser la fonction IIf, comment puis-je faire ? As-tu un conseil ?

  4. #4
    Rédacteur/Modérateur

    Avatar de Heureux-oli
    Homme Profil pro
    Contrôleur d'industrie
    Inscrit en
    Février 2006
    Messages
    21 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Contrôleur d'industrie
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 21 086
    Par défaut
    Perso, j'utilise du DAO.
    J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
    Débutez en VBA

    Mes articles


    Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !

  5. #5
    Membre Expert
    Homme Profil pro
    Utilisateur autodidacte
    Inscrit en
    Mai 2006
    Messages
    1 406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Utilisateur autodidacte

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 406
    Par défaut
    Bonjour,

    Bon, merci,

    A+

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

Discussions similaires

  1. [AC-2003] Comment utiliser une variable issue d'un recordset dans une requète SQL
    Par alainwilly dans le forum Access
    Réponses: 1
    Dernier message: 23/03/2012, 20h12
  2. [AC-2007] Requête SQL ne donnant pas de recordset
    Par seba_stien dans le forum VBA Access
    Réponses: 14
    Dernier message: 16/09/2009, 14h43
  3. Réponses: 4
    Dernier message: 13/11/2007, 22h23
  4. Réponses: 8
    Dernier message: 19/07/2007, 11h44
  5. [VBA - ACCESS 2002] Problème RecordSet/Requête SQL
    Par SamLeChiseuji dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 16/06/2006, 10h01

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