anomalie de programmation - VB/VBA/VBS - Programmation
Marsh Posté le 12-02-2009 à 15:53:44
Bonjour
En attendant de repondre a ton autre post, je vais tenter de t'aider sur celui la.
Tu compares une table de 5 champs à une table de 4 champs.
Tu dis que tu compares les 4 premiers de ANALYSE aux 4 de REGIONS, puis les 4 derniers de ANALYSE aux 4 de REGIONS, on est d'accord ?
Moi je passerais meme pas par vba pour cela.
Tu te créés une requete contenant tes deux tables. Sans aucune liaison, et tu mets tous les champs, histoire d'avoir toutes les possibilités en affichage.
Tu te créés deux champs :
En fait ils vont renvoyer la valeur "4" dans le premier ou le second cas. Il te suffit de filtrer ta requete sur Tot=4 OU Tot2=4 et tu auras tes combinaisons.
Apres pour mettre 1 au lieu de 4 je pense que tu sauras te débrouiller.
Cordialement
Marsh Posté le 13-02-2009 à 08:07:22
bonjour
je te remercie de ton astuce , mais ça me parait difficile de l'intégrer dans une structure de formulaire que j'ai développe . Les personnes qui vont l'utiliser n'auront qu'un écran du formulaire accessible
de plus il y a plusieurs cas de figures en nombre de champ et ça imposerai d'avoir accès aux tables par tout le monde ce qui présenterai un risque d'erreur
est ce tu ne peut pas inclure une instruction de comparaison entre la ligne " mon compteur .......et Mabase.execute ?
en ce qui concerne l'autre développement je pense que ton prog est juste. il faut seulement je pense rajouter un test après chaque nombre
ex
le départ sol1 = v1 jusqu'à fin puis fin de traitement
sol2 = v1+1 jusqu'à fin puis incrémenter v1
sol3= v2+1 jusqu'à fin puis incrémenter v2
sol4= v3+1 jusqu'à fin puis incrémenter v3
de cette manier il me semble il n'y aura plus de doublon du a l'ordre et le désordre comme au tierce
c'est facile a dire mais je ne sais pas l'écrire
Merci beaucoup de ton aide . Tu es super
Marsh Posté le 13-02-2009 à 09:46:45
Bonjour
Je ne vois pas en quoi c'est problématique pour l'integrer dans une structure de formulaire ?
Ou si vraiment tu veux du VB il n'y a qu'a faire la requete en VB a ce moment la, et extraire seulement ceux qui ont 4.
Quand je dis une requete, ca peut etre une chaine sql, source de données d'un formulaire. Ce qui fait qu'a chaque ouverture du dit formulaire, les données se recalculent, pour n'afficher que les 'doubles'.
Mais si tu fais du VB tu accedes forcement aux données, ou alors, tu ne donnes pas tous les tenants et aboutissants. Les utilisateurs finaux n'auront en gros qu'accès aux enregistrement redondants ?
Pour ta question par rapport au code que tu fournis, il manque des tests, donc je ne me suis pas basé la dessus. De plus, le code ne fait qu'une requete mise a jour a l'interieur des données. Ce qui fait qu'il faut bien aussi fournir les données pour tes formulaires. D'ou ma premiere question.
Ensuite le nombre d'enregistrement n'influe en rien sur ma méthode. Si, si tu en as 10000 ca sera plus long en traitement. Mais avec nos machines, la difference sera minime.
Marsh Posté le 13-02-2009 à 10:09:18
re
si tu penses que c'est la meilleure solution je te fais confiance , alors comment l'ecrire dans un programme en vb et quels champs creer pour mettre les valeurs
merci merci
Marsh Posté le 13-02-2009 à 10:21:04
Tu veux quoi comme champs dans le resultat ?
Les formulaires ont accès aux données ? Ce sont des formulaires Access ? En gros tu as d'un coté les données, de l'autre les programmes ?
Marsh Posté le 13-02-2009 à 14:56:30
ce qu'il est important d'éviter c'est d trop intervenir sur les données ce qui arrive quand plusieurs personnes accèdent aux tables
le champ souhaite dans la table ANALYSE qui concentre toutes les données s'appelle QUAR et qu'il ait la valeur 1 si les 4 champs sont identiques ou sinon rien (null)
c'est un formulaire access bien sur
merci
Marsh Posté le 13-02-2009 à 15:14:49
Je ne comprends pas tout. Ton formulaire affiche bien les infos des deux tables ANALYSE et REGIONS non ?
Donc que tu fasses du VBA dessus ou une requete ca ne change rien. Ca intervient pareil sur les données.
De plus un formulaire ouvert sur une table, ca intervient aussi sur les données.
Parcontre, tu mets a jour une table qui est aussi la source de données d'un formulaire ouvert par plusieurs utilisateurs ?
Donc, quand mets tu as jour cette table ? Quand on click sur un bouton du formulaire ? Si c'est le cas, comment sont actualisées les infos des autres users ?
Bref, je te demandais le cheminement du processus...
On va partir du principe que c'est toi qui gere quand ca doit se mettre a jour sinon on va pas s'en sortir.
Citation : Function Eglantine_Cent() |
Cordialement
Marsh Posté le 13-02-2009 à 16:00:17
efectivement il vaut mieux partir du principe que je mets a jour moi même.
je vais tester le prog des demain matin
est ce qu'il est possible d'incorporer un compteur pour voir où en est le traitement , du style : " Enregistrement en cours de traitement : 5421 "
sur l'une ou l'autre des tables
tu es super merci encore
Marsh Posté le 13-02-2009 à 16:03:28
Avec cette solution non. Pas possible de compter où en est le process.
Apres tu peux extrapoler, stocker le temps mis a la premiere execution, et en fonction du nb d'enregistrements, tirer une moyenne, que tu appliqueras aux prochaines executions.
Marsh Posté le 15-02-2009 à 07:46:46
bonjour dje69r
j'ai fait tourner le programme il ne se passe rien il a mouline longtemps ( 4h ) et rien
en reessayant sur une table reduite il m'affiche "une erreur 3144 syntaxe de update " et il me renvoie à la ligne " DoCmd.runSQL
tu peux voir ? merci
Marsh Posté le 15-02-2009 à 21:40:53
Bah ecoute, moi j'ai aucun souci avec ma base de tests.
Envoies ta base avec un echantillon que je zieute, car la je vois pas d'ou peut venir le souci vu que ca tourne chez moi.
Marsh Posté le 16-02-2009 à 22:05:52
en fait j'avais une erreur de recopie ok tout marche bien ..je te remercie
tu as pu voir pour l'autre procedure ? il faut bien prendre en compte que le champ suivant est superieur car les valeurs sont rentrées en ordre croissant
merci si tu y arrives
Marsh Posté le 10-02-2009 à 09:42:22
bonjour
j'ai un probleme dans un programme qu'on m'a tranmis et apres essai il est errone quelque part , je ne suis pas expert en vb
il s'agit dans une base access comprenant 2 tables de comparer les enregistrements (de 4 champs ) d'une table à l'autre et de marquer 1 (numerique) si les 4 champs sont communs
le programme en question ne marque pas les enregistrements voulus et en "saute " d'autres
voici l'ecriture
il ya 2 tables table ANALYSE avec les champs EC1 EC2 EC3 EC4 EC5
et la table REGIONS avec les champs PROMO1 PROMO2 PROMO3 PROMO4
il faut comparer EC1 EC2 EC3 EC4 à PROMO1....PROMO4 dans cet ordre strict ( EC1 avec PROMO1 , EC2 avec PROMO2 ......) et aussi EC2 ....EC5 à PROMO1.....PROMO4 ordre strict
or le programme ci dessous saute des enregistrements
y a t il un rapport avec le compteur qui incremente ?
il devait y avoir prevu un compteur pour indiquer l'enregistrement qui est en train d'etre traité mais aucun affichage hormis le message de fin
toute aide requise merci
Sub LanceTraitregions()
Dim MaBase ' Procedure trait REGIONS
Dim nbChampsPromoDansTable As Integer
Set MaBase = CurrentDb()
Set MaTablePromo = MaBase.OpenRecordset("REGIONS" )
If Not MaTablePromo.EOF Then
MaTablePromo.MoveFirst
End If
Do Until (MaTablePromo.EOF)
' on valorise les variables
promo1 = MaTablePromo("promo1" )
promo2 = MaTablePromo("promo2" )
promo3 = MaTablePromo("promo3" )
promo4 = MaTablePromo("promo4" )
' on lance la procedure qui parcourt la table ANALYSE
MonCompteur = MonCompteur + 1
Form("Deroulement" ).Value = CStr(Date) + "(" + CStr(Time) + " )" + ": " + "Compteur = " + CStr(MonCompteur) + " ; " + vbCrLf + Form("Deroulement" ).Value
SQLUPDATE = "UPDATE ANALYSE SET IMAEC4=1 WHERE ((ANALYSE.EC1 = " + CStr(promo1) + " AND ANALYSE.EC2 = " + CStr(promo2) + " AND ANALYSE.EC3 = " + CStr(promo3) + " AND ANALYSE.EC4 = " + CStr(promo4) + " ) OR (ANALYSE.EC2 = " + CStr(promo1) + " AND ANALYSE.EC3 = " + CStr(promo2) + " AND ANALYSE.EC4 = " + CStr(promo3) + " AND ANALYSE.EC5 = " + CStr(promo4) + " ))"
MaBase.Execute (SQLUPDATE)
MaTablePromo.MoveNext
Loop
MsgBox ("Traitement des REGIONS Terminé" )
End Sub