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 :

Pouvoir effectuer un test sur deux enregistrements qui se suivent ? [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut Pouvoir effectuer un test sur deux enregistrements qui se suivent ?
    Bonjour,

    Ma demande risque d'être pharaonique, je ne sais même pas si c'est possible, mais l'idée que j'ai dans la tête est comme ça:

    Je souhaite, après avoir fait des requêtes dans tous les sens, pouvoir faire un test concernant 2 enregistrements qui se suivent (en gros faire ce test 2 enregistrements par 2), mais je ne sais pas comment mettre en oeuvre mon idée.

    Pour l'instant, mon code est le suivant:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    Function Equation_CD_Z2N()
     
    DoCmd.SetWarnings False
    Dim Date_Now As Date
    Dim temps_ref As Date
    Dim temps_next As Date
    Dim rame As String
    Dim Date_ As Date
     
    Date_Now = Format(Now(), "dd/mm/yy")
    date_maj = Forms!analyse!Z2N_date
    date_dernière = Format(DateAdd("d", 1, date_maj), "dd/mm/yyyy")
     
    SQL_Def = "SELECT [Parc Z2N].Rame_Complète"
    SQL_Def = SQL_Def & " FROM defauts_NAT INNER JOIN [Parc Z2N] ON defauts_NAT.Véhicule = [Parc Z2N].véhicule"
    SQL_Def = SQL_Def & " WHERE ((defauts_NAT.[date] < #" & Date_Now & "#) AND (defauts_NAT.[date] >= #" & date_dernière & "#) AND ((defauts_NAT.code_defaut = '" & "AC-109" & "') OR (defauts_NAT.code_defaut = '" & "AC-102" & "'))) "
    SQL_Def = SQL_Def & " GROUP BY [Parc Z2N].Rame_Complète"
    SQL_Def = SQL_Def & " ORDER BY defauts_NAT.[Date] DESC,[Parc Z2N].Rame_complète DESC;"
    Set rs_SQL_Def = CurrentDb.OpenRecordset(SQL_Def)
     
    If Not rs_SQL_Def.EOF Then
        rs_SQL_Def.MoveLast
        Z = rs_SQL_Def.RecordCount
     
        rs_SQL_Def.MoveFirst
     
        Do While Not rs_SQL_Def.EOF
     
            rame = rs_SQL_Def("Rame_complète").Value
     
            SQL_Def2 = "SELECT defauts_NAT.[Date]"
            SQL_Def2 = SQL_Def2 & " FROM defauts_NAT INNER JOIN [Parc Z2N] ON defauts_NAT.Véhicule = [Parc Z2N].véhicule"
            SQL_Def2 = SQL_Def2 & " WHERE ((defauts_NAT.[date] < #" & Date_Now & "#) AND (defauts_NAT.[date] >= #" & date_dernière & "#) AND ((defauts_NAT.code_defaut = '" & "AC-109" & "') OR (defauts_NAT.code_defaut = '" & "AC-102" & "'))) AND [Parc Z2N].Rame_Complète = '" & rame & "' "
            SQL_Def2 = SQL_Def2 & " GROUP BY defauts_NAT.[Date]"
            SQL_Def2 = SQL_Def2 & " ORDER BY defauts_NAT.[Date] DESC;"
            Set rs_SQL_Def2 = CurrentDb.OpenRecordset(SQL_Def2)
     
            If Not rs_SQL_Def2.EOF Then
            rs_SQL_Def2.MoveLast
            y = rs_SQL_Def2.RecordCount
     
            rs_SQL_Def2.MoveFirst
            Do While Not rs_SQL_Def2.EOF
     
                Date_ = rs_SQL_Def2("Date").Value
     
                SQL_Def3 = "SELECT [Parc Z2N].Rame_Complète, defauts_NAT.code_defaut, defauts_NAT.Date, defauts_NAT.Première"
                SQL_Def3 = SQL_Def3 & " FROM defauts_NAT INNER JOIN [Parc Z2N] ON defauts_NAT.Véhicule = [Parc Z2N].véhicule"
                SQL_Def3 = SQL_Def3 & " GROUP BY [Parc Z2N].Rame_Complète, defauts_NAT.code_defaut, defauts_NAT.Date, defauts_NAT.Première"
                SQL_Def3 = SQL_Def3 & " HAVING ((((defauts_NAT.code_defaut)= '" & AC - 109 & "' ) OR ((defauts_NAT.code_defaut)= '" & AC - 102 & "' )) AND (defauts_NAT.[Date] = #" & Date_ & "#)) "
                SQL_Def3 = SQL_Def3 & " ORDER BY [Parc Z2N].Rame_Complète DESC , defauts_NAT.Date DESC , defauts_NAT.Première DESC;"
                Set rs_SQL_Def3 = CurrentDb.OpenRecordset(SQL_Def3)
     
                If Not rs_SQL_Def3.EOF Then
                    rs_SQL_Def3.MoveLast
                    x = rs_SQL_Def3.RecordCount
     
                    rs_SQL_Def3.MoveFirst
     
                    '--- GROS TROU POUR TESTER 2 PAR 2 ---
     
                Else
                End If
            rs_SQL_Def2.MoveNext
            Loop
     
            Else
            End If
     
        rs_SQL_Def.MoveNext
        Loop
     
    Else
    End If
     
     
    End Function

    Je ne vous demande pas de comprendre le choix des différents noms, sachez que grosso modo, à chaque itération de rs_SQL_Def3, j'aurais ça:

    http://uprapide.com/image/1039607-captureequacd


    Mais sans la colonne "Rame_Complète" et "Date" (ça fera tout comme ceci dit).

    Bref, suivant cette capture, c'est là que mon soucis se crée: Je souhaite faire un test sur deux enregistrements: un enregistrement AC-102, et un enregistrement AC-109 en fait ...

    Et de ça, je dois tester si la différence de l'heure "Première" est égale à 0 ou un laps de temps que j'aurais défini.

    Si ça concorde, je dois par la suite supprimer l'enregistrement AC-109 pour ne garder que l'enregistrement AC-102.

    Mais, dans certains cas, un AC-109 peut se retrouver "tout seul" j'entends par là que la différence avec l'enregistrement AC-102 avec lequel il est testé n'est pas bonne.

    (vous me suivez ? :-( )

    Bref, pour être sûr aussi que je test bien un AC-102 avec un AC-109, comment pourrais je organiser le champ "code_défaut" pour qu'il alterne bien ?
    Ou finalement vaut il mieux que je passe par 2 requêtes distinctes, une qui ne me sortirais que du AC-102, et une autre qui me sortirais que du AC-109, pour ensuite faire le test entre l'une et l'autre ?


    J'espère avoir été le plus clair possible, pour ceux qui auront le courage de lire, et de m'apporter leur aide, merci d'avance !

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour, je pense que mon problème est résolu avec ce code:

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    DoCmd.RunSQL "DELETE * FROM Test_alerte_Z2N_2_Temp"
     
    SQL_Def = "SELECT Test_Alerte_Z2N_2.[Date Défaut]"
    SQL_Def = SQL_Def & " FROM Test_Alerte_Z2N_2"
    SQL_Def = SQL_Def & " GROUP BY Test_Alerte_Z2N_2.[Date Défaut]"
    SQL_Def = SQL_Def & " ORDER BY Test_Alerte_Z2N_2.[Date Défaut] DESC"
    Set rs_SQL_Def = CurrentDb.OpenRecordset(SQL_Def)
     
    If Not rs_SQL_Def.EOF Then
        rs_SQL_Def.MoveLast
        Z = rs_SQL_Def.RecordCount
     
        rs_SQL_Def.MoveFirst
     
        Do While Not rs_SQL_Def.EOF
     
            Date_ = rs_SQL_Def("Date Défaut").Value
     
            SQL_Def2 = "SELECT Test_alerte_Z2N_2.[Code Défaut], Test_alerte_Z2N_2.[Première heure défaut]"
            SQL_Def2 = SQL_Def2 & " FROM Test_Alerte_Z2N_2"
            SQL_Def2 = SQL_Def2 & " WHERE ((Test_alerte_Z2N_2.[Code Défaut] = '" & "AC-109" & "') OR (Test_alerte_Z2N_2.[Code Défaut] = '" & "AC-102" & "')) AND Test_Alerte_Z2N_2.[Date Défaut] = #" & Date_ & "# "
            SQL_Def2 = SQL_Def2 & " GROUP BY Test_alerte_Z2N_2.[Code Défaut], Test_alerte_Z2N_2.[Première heure défaut], Test_Alerte_Z2N_2.[Date Défaut]"
            SQL_Def2 = SQL_Def2 & " ORDER BY Test_alerte_Z2N_2.[Première heure défaut] DESC;"
            Set rs_SQL_Def2 = CurrentDb.OpenRecordset(SQL_Def2)
     
            If Not rs_SQL_Def2.EOF Then
            rs_SQL_Def2.MoveLast
            y = rs_SQL_Def2.RecordCount
     
            If y >= 2 Then
     
            rs_SQL_Def2.MoveFirst
            Do While Not rs_SQL_Def2.EOF
     
                Code1 = rs_SQL_Def2("Code Défaut").Value
                Heure1 = rs_SQL_Def2("Première heure Défaut").Value
     
     
                DoCmd.RunSQL "INSERT INTO Test_Alerte_Z2N_2_Temp ([Code défaut],[Première Heure Défaut]) Values ('" & rs_SQL_Def2("Code Défaut").Value & "',#" & rs_SQL_Def2("Première heure Défaut").Value & "#)"
     
     
                rs_SQL_Def2.MoveNext
     
                Code2 = rs_SQL_Def2("Code Défaut").Value
                Heure2 = rs_SQL_Def2("Première heure Défaut").Value
     
     
     
                DoCmd.RunSQL "INSERT INTO Test_Alerte_Z2N_2_Temp ([Code défaut],[Première Heure Défaut]) Values ('" & rs_SQL_Def2("Code Défaut").Value & "',#" & rs_SQL_Def2("Première heure Défaut").Value & "#)"
     
     
                    If Code1 <> Code2 Then
     
                        HeureDiff = DateDiff("s", Heure1, Heure2)
     
                        If HeureDiff < 5 Then 'Durée à déterminer en secondes
     
                            DoCmd.RunSQL "DELETE FROM Test_Alerte_Z2N_2 INNER JOIN Test_Alerte_Z2N_2_Temp ON Test_Alerte_Z2N_2.[Code Défaut] = Test_Alerte_Z2N_2_Temp.[Code Défaut] WHERE ((Test_Alerte_Z2N_2_Temp.[Code Défaut] = Test_Alerte_Z2N_2.[Code Défaut]) AND (Test_Alerte_Z2N_2_Temp.[Première heure Défaut] = Test_Alerte_Z2N_2.[Première heure Défaut]))"
     
                        Else: DoCmd.RunSQL "DELETE FROM Test_Alerte_Z2N_2 INNER JOIN Test_Alerte_Z2N_2_Temp ON Test_Alerte_Z2N_2.[Code Défaut] = Test_Alerte_Z2N_2_Temp.[Code Défaut] WHERE ((Test_Alerte_Z2N_2_Temp.[Code Défaut] = Test_Alerte_Z2N_2.[Code Défaut]) AND (Test_Alerte_Z2N_2_Temp.[Code Défaut] = '" & AC - 102 & "') AND (Test_Alerte_Z2N_2_Temp.[Première heure Défaut] = Test_Alerte_Z2N_2.[Première heure Défaut]))"
                        End If
     
                    ElseIf Code1 = "AC-102" And Code2 = "AC-102" Then
                        DoCmd.RunSQL "DELETE FROM Test_Alerte_Z2N_2 INNER JOIN Test_Alerte_Z2N_2_Temp ON Test_Alerte_Z2N_2.[Code Défaut] = Test_Alerte_Z2N_2_Temp.[Code Défaut] WHERE ((Test_Alerte_Z2N_2_Temp.[Code Défaut] = Test_Alerte_Z2N_2.[Code Défaut]) AND (Test_Alerte_Z2N_2_Temp.[Première heure Défaut] = Test_Alerte_Z2N_2.[Première heure Défaut]))"
                        Else
                        End If
     
                DoCmd.RunSQL "DELETE * FROM Test_Alerte_Z2N_2_Temp"
     
                rs_SQL_Def2.MoveNext
                Loop
     
                Else
                End If
            Else
            End If
     
        rs_SQL_Def.MoveNext
        Loop
     
    Else
    End If
    Pas exactement ce à quoi je pensais au départ, mais ça me semble être bon.

    ATTENTION tout de même, les requêtes suppressions ne sont pas bonnes, je suis en train de demander de l'aide ici.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/09/2012, 18h33
  2. effectuer un test sur deux champ
    Par patmar83 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/04/2009, 22h45
  3. Réponses: 4
    Dernier message: 11/01/2008, 12h18
  4. [SQL] opération sur l'enregistrement qui suit
    Par namstou3 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/08/2007, 15h43
  5. [FORMULE] NB.SI et test sur deux colonnes
    Par Speranza dans le forum Excel
    Réponses: 3
    Dernier message: 14/04/2007, 17h48

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