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

Un problème sur votre ordinateur, votre système d'exploitation ou sur Internet ? Des conseils à demander ou à proposer concernant les derniers logiciels disponibles ? Des astuces ou des guides à proposer sur comment nettoyer / optimiser son ordinateur ? Ce forum est le lieu idéal pour parler de nos machines et des programmes autres que les jeux. Débats, sondages, astuces... sans oublier l'annuaire regroupant des liens de sites par thèmes.
Répondre
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne

.

Message par Elgaern »

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 : Tout sélectionner

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 : Tout sélectionner

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 ;)
Tangar
Statut : Hors ligne
.

Message par Tangar »

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
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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
Tangar
Statut : Hors ligne
.

Message par Tangar »

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:
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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
Tangar
Statut : Hors ligne
.

Message par Tangar »

trop tard.... buche déjà dessus.... :..: ... :happy: première étape compris... :eye: visite du patron... :mad: 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 :p ca m'occupe...
Tangar
Statut : Hors ligne
.

Message par Tangar »

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 :mad:
// 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 ???
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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?
Tangar
Statut : Hors ligne
.

Message par Tangar »

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... :mad:
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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"...
Tangar
Statut : Hors ligne
.

Message par Tangar »

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"
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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...
Tangar
Statut : Hors ligne
.

Message par Tangar »

Essaye ça :
Dim ListeOrganismes As DAO.Recordset
....
Set ListeOrganismes = mabase.OpenRecordset("RequeteConsultation1")

...suspense....
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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...
Tangar
Statut : Hors ligne
.

Message par Tangar »

:angry: ...vais aller demander a bill gates comment fonctionne sa ?*ù%$£!§ de logiciel de mes %^¨$µ£§! ....

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
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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?
Tangar
Statut : Hors ligne
.

Message par Tangar »

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....
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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 : Tout sélectionner

) 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...
Tangar
Statut : Hors ligne
.

Message par Tangar »

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)
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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...)
Morkhan
Statut : Hors ligne
.

Message par Morkhan »

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
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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
Morkhan
Statut : Hors ligne
.

Message par Morkhan »

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
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

Je vais essayer ça et je vous tiens au courant...
Avatar du membre
Elgaern
Élémentaire de feu
Messages : 2344
Enregistré le : mar. 05 nov. 2002, 16:47
Localisation : Grenoble (ou Riln ;) )
Contact :
Statut : Hors ligne
.

Message par Elgaern »

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 : Tout sélectionner

If Me![Code] = 1 Then
 Me![Code] = 2
End If
    
stLinkCriteria = "[Code]=" & Me![Code] - 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...
Tangar
Statut : Hors ligne
.

Message par Tangar »

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 !!
Répondre

Retourner vers « Informatik' »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité