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

Macros et VBA Excel Discussion :

Double boucle sur objet recordset


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Double boucle sur objet recordset
    Bonsoir tout le monde,

    Je viens vous demander de l'aide car je bloque totalement sur un petit projet pour lequel j'ai été mandaté.

    Dans mon projet, j'ai une base de donnée contenant une liste de serveur ainsi que des dates de production de ces serveurs par journée (01.01.2014 - 02.01.2014 - 03.01.2014 - etc.). Tous les serveurs ne fonctionnent pas forcément tous les jours.

    Avec une macro excel je dois effectuer des requêtes SQL sur ma base de donnée. Pour celà c'est bon j'arrive à me connecter à ma base de donné et à faire des requêtes sur celle-ci comme par exemple récupérer ma liste de serveur suivant des dates ou encore récupérer ma liste de serveur tout simplement.

    J'utilise l'objet recordset.

    Maintenant le problème c'est que je dois pouvoir récupérer une liste de serveurs qui ont fonctionné en production entre deux dates (ex : 01.01.2014 et 31.01.2014) et sur cette liste de serveurs je devrai mettre en couleur les serveurs qui n'ont pas fonctionné pendant ou moins 1 jour etc.. Je me dis qu'il faut que je vérifie une date après l'autre pour chacun de ces serveurs donc effectuer une double boucle (une boucle sur les serveurs et une boucle sur les dates). Toutefois je ne vois pas du tout comment faire avec un objet comme recordset. J'ai cherché sur google mon ami si je pouvais trouver un début de solution à mon problème mais sans succès.

    Est-ce que l'un d'entre vous à t-il déjà effectuer une double boucle de la sorte avec un object recordset ?

    Voici mon code pour plus de précision :

    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
    Option Explicit
     
    Sub DataExtract()
     
    ' 1) et 2) Create a connection object.
    ' 3) Provide the connection string.
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    Dim strConn As String
    ' Create a recordset object.
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    Dim Rowcnt, Fieldcnt As Integer
    Rowcnt = 2
     
     
    'Connect to the Pubs database on the local server. A METTRE EN VARIABLE PUBLIC
    strConn = "PROVIDER=SQLOLEDB;" & _
              "Server=SQLEXPRESS;" & _
              "Database=Server;" & _
              "UserID=id; Password=*****; Trusted_Connection=yes"
     
    'Now open the connection.
    cn.Open strConn
    rs.CursorLocation = adUseClient
    rs.CursorType = adOpenStatic
     
        With rs
            .ActiveConnection = cn
            .Open "SELECT DISTINCT Serveur FROM test WHERE date BETWEEN '01/01/2014' AND '31/01/2014'"
        End With
     
    While Not rs.EOF
        For Fieldcnt = 0 To rs.Fields.Count - 1
            Cells(Rowcnt, Fieldcnt + 1).Value = _
            rs.Fields(Fieldcnt).Value
        Next Fieldcnt
        rs.MoveNext
        Rowcnt = Rowcnt + 1
    Wend
    ' Tidy up
    rs.Close
    Set rs = Nothing
     
    cn.Close
     
    Set cn = Nothing
     
    End Sub

  2. #2
    Invité
    Invité(e)
    Par défaut Bonjour, test ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sql = "SELECT DISTINCT Serveur FROM test WHERE  DateDiff('d', [ChampDate], Now) > 0;"
    Rs.Open Sql, con
    If Rs.EOF = False Then Cells(Rowcnt, 1).CopyFromRecordset Rs

  3. #3
    Membre actif
    Homme Profil pro
    Pompier de service
    Inscrit en
    Février 2014
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Pompier de service

    Informations forums :
    Inscription : Février 2014
    Messages : 144
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Peut-être une idée : si tu es sûr que chaque serveur qui fait son test ne s'inscrit qu'une seule fois par jour dans ta table, il parait logique que le total du nombre de tests pour chaque serveur soit être égal à (DateDiff("d",DateDebut,DateFin) + 1)
    Donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT Serveur, Count(date) AS NbTests FROM test WHERE date BETWEEN '01/01/2014' AND '31/01/2014' GROUP BY Serveur"
    devrait te renvoyer la liste des serveurs, dans laquelle il suffira de rechercher ceux pour lesquels NbTests < 31

    (la seule faille dans les propositions de Rdurupt et la mienne : si un serveur est en panne durant toute la période choisie, il n'apparaitra pas dans la liste...)

    EDIT : il doit même y avoir la possibilité de ne ressortir de la requête, que les serveurs concernés avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT Serveur, Count(date) AS NbTests FROM test WHERE date BETWEEN '01/01/2014' AND '31/01/2014' GROUP BY Serveur HAVING count(date) < 31"
    mais je ne suis pas sûr de la syntaxe du "HAVING"...

    PS attention toutefois à 2 choses : le 1er, c'est que le "date" dans la requête risque de coincer (car c'est une fonction SQL) ; le 2nd, c'est pour la notation des dates, qui doivent souvent être passées au format "yyyy/mm/dd" et entre des "#"
    "Rien ne sert de dire ce qu'on fait, si on ne fait pas ce qu'on dit" (Moi)

  4. #4
    Futur Membre du Club
    Homme Profil pro
    université
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : université

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Tout d'abord j'aimerais vous remercier pour votre réponse rapide, c'est vraiment top .

    Pour ta réponse rdurupt, celà m'affiche un message d'erreur (Expression de type non booléen spécifié dans un contexte où une condition est attendue, près de Datediff).

    Pour ta réponse Phil'oche, j'ai testé mais ça ne différencie pas les serveurs qui ont une journée au moins d'inactivité des serveurs qui ont été actifs pendant toute la période que l'on aurait donnée au préalable. J'ai testé sur 3 serveurs (1 actifs tous le temps et deux autres serveurs qui avaient 1 journée d'inactivité pour le premier ou deux journées d'inactivités pour le deuxième) et la requête me ressortait le nom des serveurs avec comme réponse 1 à chacun des serveurs .

    J'ai pris en compte vos remarques (pour compter le nombre de date) et je l'ai intégré dans une portion de code ci-dessous. Toutefois j'ai un soucis avec celui-ci, je n'arrive pas à faire changer le curseur du recordset sur le 2ème champ (=field(1)) de ma requête. Est-ce que l'un d'entre vous à déjà effectuer une telle opération ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT Serveur, date FROM test"

    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
    Dim intervaldate As Long
    intervaldate = DateDiff("d", cDatact, cDatact2)
    Dim Rowcnt, Fieldcnt, Yopla As Integer
    Rowcnt = 2
     
    While Not rsPubs.EOF
       For Fieldcnt = 0 To (rs.Fields.Count - rs.Fields.Count)
            Cells(Rowcnt, Fieldcnt + 1).Value = _
            rs.Fields(0).Value
             For Yopla = 0 To intervaldate - 1
                Cells(Rowcnt, 2).Value = _
                rs.Fields(1).Value
            Next
        Next Fieldcnt
        rsPubs.MoveNext
        Rowcnt = Rowcnt + 1
    Wend
    En effectuant ce bout de code je me suis posé la question si il n'était pas plutôt préférable de stocker la requête recordset dans un tableau et de traiter avec une double boucle les informations que j'ai besoin (c'est-à-dire d'afficher une liste de serveurs qui ont été actifs pendant toute une période de temps ex: 01/01/2014 au 31/01/2014 ainsi que dans cette même liste de serveurs mettre en couleur les serveurs qui ont été inactifs pendant 1 jours ou +) dans ce tableau ?

    Quels sont vos avis ?

Discussions similaires

  1. Double binding sur objet complex
    Par babass77 dans le forum Flex
    Réponses: 5
    Dernier message: 29/04/2011, 10h08
  2. [Toutes versions] Problème de boucle sur un Recordset
    Par Roums dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/10/2009, 11h41
  3. Boucle sur objet activeX
    Par daniel_a1 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/06/2008, 09h38
  4. Boucle sur recordset
    Par Daniel MOREAU dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/02/2007, 12h40
  5. Réponses: 12
    Dernier message: 14/06/2006, 09h50

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