anomalie de programmation

anomalie de programmation - VB/VBA/VBS - Programmation

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
 

Reply

Marsh Posté le 10-02-2009 à 09:42:22   

Reply

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 :
 

  • Tot1 : VraiFaux([EC1]=[PROMO1] Ou [EC1]=[PROMO2] Ou [EC1]=[PROMO3] Ou [EC1]=[PROMO4];1;0)+VraiFaux([EC2]=[PROMO1] Ou [EC2]=[PROMO2] Ou [EC2]=[PROMO3] Ou [EC2]=[PROMO4];1;0)+VraiFaux([EC3]=[PROMO1] Ou [EC3]=[PROMO2] Ou [EC3]=[PROMO3] Ou [EC3]=[PROMO4];1;0)+VraiFaux([EC4]=[PROMO1] Ou [EC4]=[PROMO2] Ou [EC4]=[PROMO3] Ou [EC4]=[PROMO4];1;0)
  • Tot2 : VraiFaux([EC2]=[PROMO1] Ou [EC2]=[PROMO2] Ou [EC2]=[PROMO3] Ou [EC2]=[PROMO4];1;0)+VraiFaux([EC3]=[PROMO1] Ou [EC3]=[PROMO2] Ou [EC3]=[PROMO3] Ou [EC3]=[PROMO4];1;0)+VraiFaux([EC4]=[PROMO1] Ou [EC4]=[PROMO2] Ou [EC4]=[PROMO3] Ou [EC4]=[PROMO4];1;0)+VraiFaux([EC5]=[PROMO1] Ou [EC5]=[PROMO2] Ou [EC5]=[PROMO3] Ou [EC5]=[PROMO4];1;0)


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


---------------
Soyez malin, louez entre voisins !
Reply

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

Reply

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.
 


Message édité par SuppotDeSaTante le 13-02-2009 à 09:53:23

---------------
Soyez malin, louez entre voisins !
Reply

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
 

Reply

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 ?


Message édité par SuppotDeSaTante le 13-02-2009 à 10:25:28

---------------
Soyez malin, louez entre voisins !
Reply

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    

Reply

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()
 
    DoCmd.SetWarnings False
 
    R = "UPDATE REGIONS, Analyse SET Analyse.QUAR = 1 " & _
        "WHERE (((IIf([EC1]=[PROMO1] Or [EC1]=[PROMO2] Or " & _
        "[EC1]=[PROMO3] Or [EC1]=[PROMO4],1,0)+IIf([EC2]=[PROMO1] Or " & _
        "[EC2]=[PROMO2] Or [EC2]=[PROMO3] Or [EC2]=[PROMO4],1,0)+IIf([EC3]=[PROMO1] Or " & _
        "[EC3]=[PROMO2] Or [EC3]=[PROMO3] Or [EC3]=[PROMO4],1,0)+IIf([EC4]=[PROMO1] Or " & _
        "[EC4]=[PROMO2] Or [EC4]=[PROMO3] Or [EC4]=[PROMO4],1,0))=4)) OR (((IIf([EC2]=[PROMO1] Or " & _
        "[EC2]=[PROMO2] Or [EC2]=[PROMO3] Or [EC2]=[PROMO4],1,0)+IIf([EC3]=[PROMO1] " & _
        "Or [EC3]=[PROMO2] Or [EC3]=[PROMO3] Or [EC3]=[PROMO4],1,0)+IIf([EC4]=[PROMO1] " & _
        "Or [EC4]=[PROMO2] Or [EC4]=[PROMO3] Or [EC4]=[PROMO4],1,0)+IIf([EC5]=[PROMO1] Or " & _
        "[EC5]=[PROMO2] Or [EC5]=[PROMO3] Or [EC5]=[PROMO4],1,0))=4));"
 
    DoCmd.RunSQL (R)
 
End Function


 
Cordialement


Message édité par SuppotDeSaTante le 13-02-2009 à 15:15:24

---------------
Soyez malin, louez entre voisins !
Reply

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

Reply

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.


---------------
Soyez malin, louez entre voisins !
Reply

Marsh Posté le 13-02-2009 à 16:03:28   

Reply

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

Reply

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.


---------------
Soyez malin, louez entre voisins !
Reply

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed