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

Access Discussion :

Atteindre un champ dans recordset


Sujet :

Access

  1. #1
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 93
    Points : 90
    Points
    90
    Par défaut Atteindre un champ dans recordset
    Bonjour !

    J'ai une jolie table de 32 champs. Le 1er champ est Désignation, les autres sont jour1 .... jour31. Vous aurez compris que c'est un calendrier.

    Je voudrais pour chaque enregistrement tester la valeur de chaque jour grace à une boucle je dois donc lire de jour1 à jour31.
    Le problème c'est que je n'arrive pas à écrire que je veux lire la valeur du champ jour(i) grace à une boucle et ainsi changer la couleur de la case de mon formulaire calendrier...

    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
     
    Dim dbBaseDonnées As Database, dtNomsTab1 As Recordset
    Dim i As Integer
    Set dbBaseDonnées = DBEngine.Workspaces(0).Databases(0)
    Set dtNomsTab1 = dbBaseDonnées.OpenRecordset("Travaux par jours", DB_OPEN_TABLE)
     
    For i = 1 To 31
       dtNomsTab1.MoveFirst
           Do While Not dtNomsTab1.EOF
              Select Case dtNomsTab1![("Jour" & i)]
                  Case 0
                  Forms!Calendrier("Texte" & i).BackColor = RGB(0, 255, 255)
                  Case 1
                  Forms!Calendrier("Texte" & i).BackColor = RGB(191, 144, 80)
              End Select
              dtNomsTab1.MoveNext
           Loop
           dtNomsTab1.Close
           Set dtNomsTab1 = Nothing
    Next i
    Voyez vous une solution à ce petit problème ?
    Il n'y a pas forcement necessité d'écrire que l'on veut lire jour(i) mais peut être le i+1 eme champ sachant qu'il y a un décalage de 1 à cause du premier champ "Désignation" que je peux d'ailleur mettre en dernière place pour éviter le décalage de 1.
    Est-ce qu'il est possible de faire cette boucle grace à field ?
    Je sèche...

    J'espère que quelqu'un aura une bonne idée...

    D'avance merci !

  2. #2
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <objetrecordset>.Fields(<index>)
    sachant que ça commence à 0 ...


  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 93
    Points : 90
    Points
    90
    Par défaut L'arbre qui cachait la forêt...
    Merci Cafeine !
    Je pense que grace à tes indications mon code est capable de lire jour(i) et d'itérer comme je le souhaite cependant...

    A l'execution j'obtiens:
    Erreur d'exécution 91:
    Variable objet ou variable de bloc with non définie

    Et le debuggeur m'envoie sur la ligne:
    If (dtNomsTab3.EOF And dtNomsTab3.BOF) <> True Then

    L'erreur vient probablement d'ailleurs c'est pour celà que je poste mon code en intégral (j'avais quelque peu expurgé le code dans mon post précédent).
    J'ai renomé mon recordset afin qu'il n'interfère pas avec d'autres recordset ayant le même nom (je prends pourtant la peine de les vider à chaque fois).

    Qu' est ce que c'est que cette erreur 91 ?
    Pourquoi me dit il que dtNomsTab3 n'est pas défini alors que je l'ai déclaré comme il faut en début de procédure ?

    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
    83
    84
    85
    86
    87
    88
    89
    90
     
    Private Sub Report_Activate()
    Dim dbBaseDonnées As Database, dtNomsTab3 As Recordset
    Set dbBaseDonnées = DBEngine.Workspaces(0).Databases(0)
    Set dtNomsTab3 = dbBaseDonnées.OpenRecordset("Travaux par jours", DB_OPEN_TABLE)
    Dim i As Integer
    Dim j As Integer
    Dim nbjours As Integer
    Dim Férié(11) As Date
    Dim Calculée As Date
     
    Période = Format(Month(Forms!Calendrier.DateEnCours), "00") & "/" & Year(Forms!Calendrier.DateEnCours)
     
    Select Case left(Période, 2)
       Case "02"
         If Day(DateSerial(right(Période, 4), 2, 28) + 1) = 29 Then
            JourSem29.Visible = True
            nbjours = 29
            Else
            JourSem29.Visible = False
            Jour29.Visible = False
            nbjours = 28
         End If
         JourSem30.Visible = False
         Jour30.Visible = False
         JourSem31.Visible = False
         Jour31.Visible = False
       Case "04", "06", "09", "11"
         JourSem31.Visible = False
         Jour31.Visible = False
         nbjours = 30
       Case Else
         nbjours = 31
    End Select
     
    'Détermination des jours fériés
    Férié(1) = "01/01/" & right(Période, 2)
    Férié(2) = "01/05/" & right(Période, 2)
    Férié(3) = "08/05/" & right(Période, 2)
    Férié(4) = "14/07/" & right(Période, 2)
    Férié(5) = "15/08/" & right(Période, 2)
    Férié(6) = "01/11/" & right(Période, 2)
    Férié(7) = "11/11/" & right(Période, 2)
    Férié(8) = "25/12/" & right(Période, 2)
    Calculée = Pâques(right(Période, 2))
    'lundi de pâques = pâques + 1
    Férié(9) = DateAdd("d", 1, Calculée)
    'jeudi de l'ascension = pâques + 39
    Férié(10) = DateAdd("d", 39, Calculée)
    'lundi de pentecote = pâques + 50
    Férié(11) = DateAdd("d", 50, Calculée)
     
    For i = 1 To nbjours
        Select Case Weekday((i & "/" & Période), 2)
        Case 2, 3, 6, 7
        Reports!Planning("JourSem" & i).FontSize = 8
        Case Else
        Reports!Planning("JourSem" & i).FontSize = 9
        End Select
        Reports!Planning("JourSem" & i) = left((Format((i & "/" & Période), "ddd")), 3) & i
        For j = 1 To 11
            'If (i & "/" & Month(Calendrier.DateEnCours)) = Férié(j) Then
            If (i & "/" & left(Période, 2) = Férié(j)) Then
               Reports!Planning("JourSem" & i).BackColor = 5279935
               Reports!Planning("Jour" & i).BackColor = 5279935
            End If
        Next j
     
        If (dtNomsTab3.EOF And dtNomsTab3.BOF) <> True Then
           dtNomsTab3.MoveFirst
           Do While Not dtNomsTab3.EOF
             Select Case dtNomsTab3.Fields(i)
               Case 0
               Forms!Calendrier("Texte" & i).BackColor = RGB(0, 255, 255)
               Case 1
               Forms!Calendrier("Texte" & i).BackColor = RGB(191, 144, 80)
             End Select
             dtNomsTab3.MoveNext
           Loop
           dtNomsTab3.Close
           Set dtNomsTab3 = Nothing
        End If
     
        If Weekday((i & "/" & Période), 2) >= 6 Then
           Reports!Planning("JourSem" & i).BackColor = 8421504
           Reports!Planning("Jour" & i).BackColor = 8421504
        End If
     
    Next i
    End Sub
    PS: la fonction Paques non postée calcule le jour de pâques.

    Si quelqu'un a déjà eu la peau d'une erreur 91 je suis preneur ...

  4. #4
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Est-ce que ton code a déjà marché un jour ?

    Pardonne moi cette question, mais mettre ce code sur l'événement activate d'un Report qui plus est ... j'ai du mal à imaginer que ça puisse marcher ...

    En général on place du code sur les événements formatage des sections d'un état ...

    D'autre part, je m'interroge sur la conception de tes données avec un champ par jour du mois ...

  5. #5
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Après deux minutes de recherche, je tombe là :
    http://www.developpez.net/forums/showthread.php?t=11878

    Bonne lecture : )

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 93
    Points : 90
    Points
    90
    Par défaut Pourquoi faire simple quand on peux faire compliqué !
    Merci pour ton aide !
    Je conviens que mon code n'est certainement pas le meilleur mais il marche !
    Enfin, la version qui ne contient pas la modif sur laquelle je travaille actuellement.

    Pour ce qui est du principe, ma table "travaux par jour" est un extrait mensuel d'une table annuelle et son but est de permettre l'impression d'un planning sous forme de tableau.
    Dans ce tableau qui comporte un ligne par travail, la premiere colonne est la désignation du travail et chaque colonne suivante représente le jour du mois où ce travail peut être (ou non) réalisé. La valeur que chaque colonne contient représente la nature du travail réalisé (entier -> code couleur fct du travail).
    Ce que je cherche à faire (qui marche pour les fériés et les week end) c'est que toute les colonnes qui représentent un jour non ouvré soient affichées avec une couleur disctincte et ce pour toute les lignes du tableau.
    Pour les week end et les fériés je peux déterminer par calcul que le jour est un jour non ouvré, pour un jour de fermeture, j'ai besoin d'aller chercher l'information dans une table qui contient les jours de fermeture...

    Je vais encore essayer de travailler un peu sur mon code, à défaut j'essaierai d'affecter directement la valeur "jour de fermeture" pour les jours concernés à tous les enregistrements lorsque je fais l'extraction du mois a partir de la table annuelle.

    J'espère avoir été clair...

  7. #7
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    ça marche sur l'événement Activate de ton report ?

  8. #8
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 93
    Points : 90
    Points
    90
    Par défaut Ben oui ça marche, Pourquoi ?
    Ca marche, je n'ai pas de souci avec le reste du code...
    En fait quand le report est appelé a partir de mon formulaire calendrier le report récupère le mois en cours (sur le formulaire calendrier) et a partir de cette information il affiche le tableau...
    L'information mois en cours lui permet de déterminer sur l'entête du formulaire:
    - combien de colonnes à afficher (29,30,31 ou 32 nb de jours+1);
    - si pour jour(i) il doit écrire Lun Mar Mer ....
    - si pour jour(i) la colonne doit être grisée (samedi, dimanche ou férié)

    Après quand le report affiche les jours (partie détail) il y a également un code pour attribuer une couleur de fond à chaque case du tableau selon qu'il y a une valeur ou pas et le cas écheant la couleur associée à cette valeur.

    Et tout celà marche correctement

    Et maintenant ce que je cherche à faire c'est de griser également les colonnes correspondant à des jours de fermeture.
    Je ne veux pas une ligne "jours de fermeture" avec les cases correspondantes de cette ligne grisées mais que la colonne entière soit grisée car un jour de fermeture doit impacter également les autres travaux...

    Est-ce que je suis plus clair ?

  9. #9
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 910
    Points : 4 808
    Points
    4 808
    Par défaut
    peut-être peux-tu puiser des idées dans la contribution :
    http://www.developpez.net/forums/sho...d.php?t=281969

    Je mets un fond rouge au jour férié, par exemple.

    Salut

  10. #10
    Membre régulier
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Octobre 2005
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2005
    Messages : 93
    Points : 90
    Points
    90
    Par défaut Changement de stratégie
    Bonjour !
    Je n'ai pas réussi a venir à bout de l'erreur 91...
    Cependant pour ce qui était de la lecture du recordset par itération, le code donné par cafeine marche parfaitement.
    J'ai modifié ma procédure de génération de table mensuelle pour "flaguer" dès la recopie dans l'extrait de table tous les jours "non ouvrés" hors fériés et "week end". Je suis parvenu au résultat que je souhaitais et c'est tout ce qui compte.
    Merci à tous pour votre aide.

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

Discussions similaires

  1. atteindre un champs dans un sous formulaire
    Par beta007 dans le forum IHM
    Réponses: 2
    Dernier message: 22/01/2012, 09h19
  2. [AC-2003] Atteindre un champ dans un sous formulaire Access en vba
    Par Wall-e38 dans le forum Access
    Réponses: 4
    Dernier message: 31/07/2009, 13h51
  3. Réponses: 11
    Dernier message: 04/02/2008, 10h32
  4. Réponses: 4
    Dernier message: 12/04/2007, 10h28
  5. Réponses: 3
    Dernier message: 31/07/2006, 18h25

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