Affichage des résultats 1 à 26 sur 26

Discussion: [Windows]Condition sur une table de données?

  1. #1
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Salut à tous

    Voilà j'ai un soucis sous Access: je souhaiterai faire une boucle VB pour passer à l'enregistrement suivant. Je sais qu'il existe un truc tout prêt dans Access pour le faire (ça a marché impec jusqu'ici d'ailleurs) mais ça ne marche pas dans un cas précis car il y aura 2 fois ce système sur la même page et la commande GoToRecord Next/Previous ne fonctionne que sur l'un des 2 paramètres qu'il faudrait faire varier...

    Bref, en bidouillant un peu j'ai réussi à passer outre ce problème et à me créer ceci pour afficher la même page mais avec le code suivant:
    Code:
    Dim stDocName As String
    Dim stLinkCriteria As String
    
    stDocName = "Consultations"
     * *
    stLinkCriteria = "[Code]=" & Me![Code] + 1
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Ca marche très bien sauf que si on est sur le dernier enregistrement et qu'on appuie sur le bouton avec cette macro, on tombe sur un joli formulaire tout vide... J'ai fait la même macro pour le previous avec Code-1 et le problème se pose aussi si on se trouve sur le premier enregistrement...

    Donc, j'ai pensé à une condition pour éviter ce problème et voilà ce que je souhaiterai faire:
    Code:
    If Code courant < Dernier code de ma table Access then
     * Code+1
     * Afficher la même page mais avec Code+1
    Else Afficher "Impossible, a pu d'enregistrement dans la table"
    End if
    (ça c'est pour le bouton "Next", pour le "Previous", ça serait Code-1 et premier code de ma table bien sûr)

    C'est la partie "Dernier code de ma table Access" qui me pose problème et que je ne sais pas retranscrire en VB... Comment faut-il faire? Déclarer la table? Parvenir à initialiser une variable sur ce dernier code? (et dans ce cas là comment faire?)

    Donc voilà, c'est pour mon boulot donc je recherche activement une solution... J'ai beau avoir fait un DUT info, ça remonte déjà à 2 ans et on avait abordé le VB pendant 1 heure alors bon...

    Merci d'avance

  2. #2
    Tangar Invités
    Salut, je sais as si ça va t'aider, j'en ai pas fait non plus depuis mathusalem.

    Je me souviens qu'il existe deux trucs comme "Next" et "Previous" qui s'appellent "last" et "first" qui se déclenche lorsque tu arrives sur le premier ou le dernier enregistrement de ta table.

    Je regarderais dans mes sources (si je les ai encore, peut etre ecrase par NWN) mais sur que ca existe

  3. #3
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Si cette histoire se vérifie, je pourrais changer ma conditon en:
    If Code <> Code'Last then

    Je vais essayer de creuser ça de mon côté mais si tu parviens à retrouver des sources, c'est encore mieux

    Merci de ton aide

  4. #4
    Tangar Invités
    VICTOIRE !!!!
    J'ai retrouvé mes sources :happy:

    Par contre j'y avait pas retouché depuis...ben je sais plus en fait.
    incompréhensible de base :8:
    mais je vois qu'il y a un formulaire avec un bouton style "enregistrement suivant" relié à un script. Script que je n'arrive plus à comprendre pour l'instant... :angry: (saleté d'access)
    Je vois aussi que quand je clique sur ce bouton et que c'est le dernier enregistrement, il ne fait rien (affiche toujours le dernier enregistrement).

    Est ce que ça correspond à ce que tu cherches ?
    Si c'est le cas, est ce que ça peut attendre demain matin le temps que je re-comprenne ?

    ps : je peux avoir ta version d'access aussi svp, je suis sous 97... :notme2:

  5. #5
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Je suis sous Access 2000 au boulot donc à priori il n'y a pas de problème

    Sinon le fait de rester sur le dernier enregistrement est déjà mieux que d'aller sur une page néant... Et peut-être qu'en me plongeant dans les lignes j'arriverai à percer le (Da Vinci) code ( )

    Enfin bref, ça peut tout à fait attendre demain mais si tu n'as pas envie de te prendre la tête tu peux tout à fait m'envoyer le document Access par email pour que je me plonge dedans

    Merci en tous cas

  6. #6
    Tangar Invités
    trop tard.... buche déjà dessus.... :..: ... :happy: première étape compris... :eye: visite du patron... bonjour patron... continue à bucher.... :..: :x access is bad...

    ps : je ne suis qu'en stage, et j'ai fini mon truc, pas d'inquiétude ca m'occupe...

  7. #7
    Tangar Invités
    Résultat des courses :

    Voila comme j'ai fait :
    J'ai un formulaire qui affiche des personnes et des boutons pour avancer, reculer, ajouter, ....
    Pour le bouton qui avance de un en un, j'ai ceci :

    Set listeadh = mabase.OpenRecordset("RInfoAdherents")
    //on crée un recordset sur une requête qui donne les adhérents

    Private Sub avanceun_Click() //fonction associée au clic de bouton

    listeadh.MoveLast
    //on prend le suivant de la requête...

    If listeadh.EOF = False Then
    //EOF = end of file = plus de record
    // Si il y a un suivant, on affiche les informations
    Forms![FIAdherent]![Texte4].Value = listeadh![CodeAdherent]
    Forms![FIAdherent]![Texte6].Value = listeadh![Nom]] ....

    Else //Sinon....
    //on revient au précédent
    listeadh.MovePrevious
    End If

    End Sub



    Comprendido ???

  8. #8
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Si muy bien, yé vé essayer d'appliquer ça à ma base de dounnées et yé té tiens au courant

    Edit: J'aurais besoin de 2 précisions
    - Quand tu mets "mabase" je remplace par le nom de la base Access?
    - A quoi correspondent les FIAdherent? Le formulaire qui gère l'affichage des informations?

  9. #9
    Tangar Invités
    mabase :

    'déclaration
    Dim mabase As Database
    Dim listeadh As Recordset

    'affectation à mabase de la base courante
    Set mabase = CurrentDb

    ' ouverture de la requête r-info-adhérent (qui donne ce que tu veux parcourir, ici des types)
    Set listeadh = mabase.OpenRecordset("RInfoAdherents")



    FIAdherent c'est le nom de mon formulaire, et dedans il y a le bouton avance_un, qui permet d'avancer de un en un....



    A la place de FIAdherent il faut mettre le nom de ton formulaire, et pour mabase, ça marche sur tout, il faut juste changer le nom de la requete (RinfoAdherent ici)


    Edit : c'est a l'ouverture du formulaire qu'il faut que tu fasses les declarations, ouverture de bd+requete. Ensuite tu prends le premier avec "listeadh.MoveFirst" et charges les differents champs qu'il y aura dans listeadh dans ton formulaire...
    Je sais pas si je suis bien clair là... :..:

    Ravi qu'un dragon ai pu aidé un pourfendeur de dragons...

  10. #10
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Arg... J'ai bien peur que ma version d'Access (2000) ne reconnaisse pas la délcaration de variables de type database puisqu'il me sort un "Type défini par l'utilisateur non défini"...

  11. #11
    Tangar Invités
    Damned, c'est diablerie que tout ça !!!!

    Essaye ça pour qu'il reonnaisse
    "Dans VBA, menu Outils--Référence:
    Coche la référence Microsoft DAO 3.6 Object library et ça devrait marcher"

  12. #12
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Bon ça avance un peu maintenant, j'ai une "incompatibilité de type" à résoudre sur la ligne en gras:
    Private Sub Form_Load()
    Dim mabase As Database
    Dim ListeOrganismes As Recordset
    Set mabase = CurrentDb
    Set ListeOrganismes = mabase.OpenRecordset("RequeteConsultation1")
    End Sub

    Je planche dessus...

  13. #13
    Tangar Invités
    Essaye ça :
    Dim ListeOrganismes As DAO.Recordset
    ....
    Set ListeOrganismes = mabase.OpenRecordset("RequeteConsultation1")

    ...suspense....

  14. #14
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    J'ai essayé de bidouiller mais ça ne fonctionne toujours pas

    Avec la dernière modif, ça me sort "Variable objet ou variable de bloc With non définie" et ça me renvoie sur l'instruction "ListeMachin.MoveLast"...

    L'aventure se poursuit...

  15. #15
    Tangar Invités
    :angry: ...vais aller demander a bill gates comment fonctionne sa ?*ù%&#036;£!§ de logiciel de mes %^¨&#036;µ£§! ....

    Un autre essai :

    Dim mabase As DAO.Database
    Dim ListeOrganismes As DAO.Recordset
    ....
    Set ListeOrganismes = mabase.OpenRecordset("RequeteConsultation1")

    + vérifier que la référence "Microsoft DAO 3.6 Object Library" (dans outils/références) est coché si je te l'ai pas déjà demandé..

    Oh loth je te prie d'accepter ma misérable requête, accepte mon offrande....

    Edit : tu peux me donner les erreurs exactes et les numéros, ça peut aider au cas ou...merci

  16. #16
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Lloth ne doit pas me porter en estime tout comme toi...

    J'obtiens toujours l'erreur 91 "Variable objet ou variable de bloc With non définie"...


    Sinon j'ai pensé à une magouille qui pourrait me permettre de contourner le problème: il faudrait que je puisse compter le nombre d'éléments dans ma table et que je stocke ce nombre dans un compteur. Si je clique sur le bouton suivant, j'incrémente le compteur, si je clique sur le bouton précédent je le décrémente

    Mais là encore, comment compter le nombre d'éléments de ma table en VB? Peut-on faire appel à une requête SQL?

  17. #17
    Tangar Invités
    Oui on peut mais il faut utiliser des recordset...toujours le meme probleme...


    Dim sSQL As String
    Dim mabase As DAO.Database (????? ou As Database)

    sSQL = "Select * From CLIENTS Where Pays= 'France'"
    Set rst = db.OpenRecordset (sSQL, dbOpenForwardOnly, dbReadOnly)

    ....mais bon....

  18. #18
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Je tiens le bon bout: le code VB passe sans erreurs mais comme ma condition est basée sur la chaîne sSQL que je compare à un entier, ben la condition ne remplit pas son rôle, forcément...

    Compteur = SELECT Count([Code]) AS Compteur FROM MaTable)"
    Cette ligne ne passe pas car apparemment on ne peut placer du SQL dans VB que dans des chaines

    Ma prochaine étape est donc de trouver un moyen de convertir cete chaine en nombre

    Comme le disait le vioque: La route qui mène à la base de données est longue, sinueuse et semée d'embuches...

  19. #19
    Tangar Invités
    J'ai plus d'idée, je trouve plus rien :snif:

    Essaye de faire compteur[0] mais ça m'étonnerait beaucoup que ça marche

    Edit : j'ai trouvé quelque chose : convertir une chaine en entier : ent = cInt(char)

  20. #20
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    J'y ai cru... Mais ça ne marche pas... Toujours mon incompatibilité de type... J'ai l'impression que le VB ne m'aime pas beaucoup (et ça va commencer à être réciproque...)

  21. #21
    Morkhan Invités
    Salut,

    Voila ce que j'ai trouvé pour l'utilisation des bases de données access en VB :

    Dim oRst as DAO.Recordset
    Dim oDb as DAO.Database
    Set oDb=CurrentDb
    Set oRst=oDb.OpenRecordset("SELECT NumClient,NomClient FROM Client WHERE NumClient=2",dbOpenDynaset)
    Msgbox "Le nom du client est : " & Rst.Fields("NomClient").Value

    'Libération des objets
    oRst.Close
    oDb.Close
    Set oRst=Nothing
    Set oDb=Nothing


    Du coup si tu veux récupérer ton compteur d'après l'exemple qui est ci dessus, tu devrais consulter oRst.Fields("Compteur").value. Ce qui signifie la valeur de la colonne compteur dans le recordset oRst. Pour le mettre au bon format tu peux faire le test suivant :


    Compteur = Clng(oRst.Fields("Compteur").value)

    Pour mettre le count au format Long integer.

    Par contre je ne vois pas trop pourquoi tu veux faire un compteur pour les nombres d'enregistrements.

    Bonne journée,

    Morkhan



  22. #22
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Je voudrais arriver à contourner mon problème en créant la boucle suivante:
    Compteur initialisé au nombre d'enregistrement
    On part au 1er enregistrement
    Si numéro-courant < compteur
    Afficher suivant
    numéro-courant +1
    Sinon
    "Pas possible!"
    Fin si
    J'essayerai ta proposition demain

  23. #23
    Morkhan Invités
    Salut,

    Si je comprends bien ton problème tu cherches à afficher l'enregistrement suivant d'une base de données et rester sur le dernier enregistrement lorsque tu y es.

    Voila une proposition :

    Dim oRst as DAO.Recordset
    Dim oDb as DAO.Database
    Set oDb=CurrentDb
    Set oRst=oDb.OpenRecordset("SELECT * FROM MaTable WHERE CleTable>Clé de l'enregistrement courant ORDER BY CleTable ASC",dbOpenDynaset)

    if oRst.EOF then
    Set oRst=oDb.OpenRecordset("SELECT * FROM MaTable WHERE CleTable=Clé de l'enregistrement courant ",dbOpenDynaset)
    end if

    msgbox "Colonne 1 : " & oRst.Fields(1).Value
    msgbox "Colonne 2 : " & oRst.Fields(2).Value
    .....
    msgBox "Colonne n : " & oRst.Fields(n).Value

    'Libération des objets
    oRst.Close
    oDb.Close
    Set oRst=Nothing
    Set oDb=Nothing


    Quelques explications :

    Je considère en fait que tu as une clé unique dans ta table (composée ou non). Le but est de récupérer cette clé et de chercher tous les enregistrements dont la clé est suppérieure à la clé de l'enregistrement courant, de les trier dans l'ordre ascendant et de lire le premier. S'il n'y a pas d'enregistrements dans la sélection (EOF : End Of File) c'est qu'il n'y a pas de suivant. Du coup on refait la sélection sur la clé courante. Enfin on récupère ce qu'il y a dans les colonnes.

    Voila j'espère que cette solution fonctionne. En ce moment je ne fais pas trop de VB donc les structures if ne sont peut-être pas écrites en VB.

    Bonne chance,

    Morkhan

  24. #24
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Je vais essayer ça et je vous tiens au courant...

  25. #25
    Date d'inscription
    novembre 2002
    Localisation
    Grenoble (ou Riln ;) )
    Messages 
    2 341
    Désolé si j'ai pas répondu hier mais j'avais une autre fonction a ajouter qui était très nettement prioritaire

    Bref j'ai essayé et oh surprise ça ne marche toujours pas (à croire que j'ai réussi à faire un truc vraiment moisi...). Ca me met "Trop peu de paramètres. 1 attendu" :heu:

    Bref je crois que je vais laisser tomber cette histoire... j'ai réussi à magouiller un système pour empêcher d'avoir le problème en essayant d'afficher l'enregistrement situé avant le premier avec le système suivant:
    Code:
    If Me!&#91;Code&#93; = 1 Then
     Me!&#91;Code&#93; = 2
    End If
     * *
    stLinkCriteria = &#34;&#91;Code&#93;=&#34; & Me!&#91;Code&#93; - 1
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    Ca ne fait même pas exactement ce que je veux (c-a-d bloquer l'affichage sur le premier enregistrement) mais ça affiche un message d'erreur "Impossible de mettre à jour recordset" et ça reste bien sur le premier enregistrement, c'est toujours mieux que d'afficher un formulaire plein de vide comme auparavant

    Après la boucle du côté du bouton suivant, il y a peu de chances qu'elle serve puisqu'il y aura 150 à 200 enregistrements donc à moins d'avoir la touche entrée bloquée, ils ne devraient jamais y aller

    PS: C'est des trucs dans ce style et ma chkoumoune habituelle avec la prog qui m'ont fait quitter l'informatique et quand je vois ce qui se passe quand j'essaye d'y replonger même un peu, je me dis que j'ai pas eu tort...

  26. #26
    Tangar Invités
    Désolé de pas avoir pu aider plus que ça, mais "apudidée".
    Si jamais un éclair me foudroit et qu'une idée germe dans le fond abyssal de mon esprit je t'en fait partager les effets !!

Discussions similaires

  1. La base de données de Baldur's Gate 3
    Par Magnus dans le forum Le Comptoir d'Amn
    Réponses: 10
    Dernier message: 29/02/2008, 17h19
  2. Table ronde à la fin de SoA
    Par Nightmare dans le forum Le Comptoir d'Amn
    Réponses: 10
    Dernier message: 20/02/2008, 20h14
  3. [XP] Besoin d'aide pour récupérer des données
    Par Ombre dans le forum Informatik'
    Réponses: 8
    Dernier message: 04/07/2007, 15h47
  4. [Jeu/Windows]Les jeux Windows
    Par Ben-jXX dans le forum Informatik'
    Réponses: 49
    Dernier message: 11/04/2006, 19h49
  5. A la Main Tranchée, préparer le poison pour Rikki
    Par lyamo dans le forum Le Monastère du Corbeau Noir (Icewind Dale 2)
    Réponses: 2
    Dernier message: 06/06/2005, 12h12

Les tags pour cette discussion

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  

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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252