Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1412 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  anomalie de programmation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

anomalie de programmation

n°1849302
eglantine ​cent
Posté le 10-02-2009 à 09:42:22  profilanswer
 

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
 

mood
Publicité
Posté le 10-02-2009 à 09:42:22  profilanswer
 

n°1850430
SuppotDeSa​Tante
Aka dje69r
Posté le 12-02-2009 à 15:53:44  profilanswer
 

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 !
n°1850660
eglantine ​cent
Posté le 13-02-2009 à 08:07:22  profilanswer
 

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

n°1850686
SuppotDeSa​Tante
Aka dje69r
Posté le 13-02-2009 à 09:46:45  profilanswer
 

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 !
n°1850697
eglantine ​cent
Posté le 13-02-2009 à 10:09:18  profilanswer
 

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
 

n°1850709
SuppotDeSa​Tante
Aka dje69r
Posté le 13-02-2009 à 10:21:04  profilanswer
 

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 !
n°1850856
eglantine ​cent
Posté le 13-02-2009 à 14:56:30  profilanswer
 

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    

n°1850866
SuppotDeSa​Tante
Aka dje69r
Posté le 13-02-2009 à 15:14:49  profilanswer
 

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 !
n°1850892
eglantine ​cent
Posté le 13-02-2009 à 16:00:17  profilanswer
 

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

n°1850894
SuppotDeSa​Tante
Aka dje69r
Posté le 13-02-2009 à 16:03:28  profilanswer
 

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 !
mood
Publicité
Posté le 13-02-2009 à 16:03:28  profilanswer
 

n°1851413
eglantine ​cent
Posté le 15-02-2009 à 07:46:46  profilanswer
 

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

n°1851551
SuppotDeSa​Tante
Aka dje69r
Posté le 15-02-2009 à 21:40:53  profilanswer
 

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 !
n°1851910
eglantine ​cent
Posté le 16-02-2009 à 22:05:52  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  anomalie de programmation

 

Sujets relatifs
aide programmation jeu de mémoireProgrammation d'un site pro comment faire?
programmation de GnomeCallerID gtk et c (gros probleme !)Programmation VBA
programmation en caml lightProgrammation Threads en C++
Exercices programmation C++probleme de programmation en C
programmation ds Alice avec le language Xml ou SML niveau debutantProgrammation PHP
Plus de sujets relatifs à : anomalie de programmation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR