[]
Nombre de membres 1 membre
Connectés : ( personne )
 

La Charte du Forum - La Charte du Forum

Forum - Forum
Problèmes Access des débutants - Problèmes Access des débutants


clos par 3Stone le 04/06/2013 : 23:33  Sujet n° 680  Recherche de valeur maximum et comparaison dans une table

le 30/05/2013 : 12:31
par maxmusix

Anonyme

visiteur

Bonjour, je cherche trouver un moyen de détecter des doublons dans une table entre 2 champs:
Champ1 |Champ2  
A        |  1          ---> A    |      1A         | 1          ---> A   |       3A          | 2          ---> A  |        2B         | 1          ---> B  |        1

A l'heure actuelle j'arrive a detecter les doublons en fontion de mon premier champs, le problème vient de ma modification: je dois trouver la plus grande valeur de mon champs 2 en fonction de mon premier champ pour pouvoir la stocker dans une variable et l'incrémenter par la suite.

Or j'ai essayer plusieurs fonction(DLOOKUP,DMAX) mais aucun résultat.

voici ma procédure de recherche de doublons si ça peut aider: 

Set rst = CurrentDb.OpenRecordset( _  "SELECT * FROM [SOLODATA]", _  dbOpenDynaset, dbInconsistent)

  champsActuel = rst("TAG3")  champsActuel2 = rst("TAG2")

     With rst
            Do While Not .NoMatch
                   Do While Not .NoMatch
                   'comparaison des tuples avec le tuple selectionné
                           .FindNext "[Tag3]= '" & champsActuel & "' and [Tag2]= '" & champsActuel2 & "'"
                            'Cherche le premiers doublon dans la table
                            If .NoMatch = False Then
                              'Si il y a un resultat alors on entre dans la procedure de modification

''''''''''''''''''''''''''''''''''''''''''''''' ICI ma procedure de modification'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Je cherche la plus grandes valeur de TAG3 pour TAG2= champsActuel2'''''''''''''''''''''''''''' 
                 '.FindFirst "MAX([Tag3]) and [Tag2]= '" & champsActuel2 & "'"
                   'test = DMax("Tag3", "SOLODATA", [Tag2] = " & champsActuel2 & ") 
                     .Edit
                    valeurModifie = test + 1
                        'Le doublon est remplacé par une valeur alternative
                    .Update
                   ' valeurModifie = valeurModifie + 1
                      'Modification de la valeur alternative pour eviter les doublons
                 End If
           Loop
            .FindFirst "[Tag3]= '" & champsActuel & "' and [Tag2]= '" & champsActuel2 & "'"
            'Retour à l'enregistrement de depart
            .FindNext "([Tag3]<> '" & champsActuel & "' and [Tag2]= '" & champsActuel2 & "') or ([Tag3]= '" & champsActuel & "' and [Tag2]<> '" & champsActuel2 & "')"
               'Passage à l'enregistrement suivant
              .Edit
            champsActuel = ![Tag3]
              'Affectation de l'enregistrement à controler à une variable 
          champsActuel2 =

Ecrire à maxmusix  sujet clos  Haut

[]   

DébutPrécédent [ 1 2 ] SuivantFin
Réponse n° 9
--------
le 31/05/2013 : 17:43
par 3Stone

3Stone

Administrateur

Bonjour,
 
Citation :

apparemment le champ TAG3 doit être impérativement en format texte après la modification.

 
Heu... le TAG3 est le premier dans le Find ci-dessus et il est bien traité comme texte (dans mon exemple).
 
Citation :

Serait t'il possible de modifier le format du champs à l'ouverture de mon programme et à le remettre en format texte à la fermeture?

 
Comment ? quoi ?  d
On ne change jamais le type d'un champ...
Il faudrait donner la liste des champs et leur type pour voir ce qu'il en est.

Cordialement,
Pierre(3stone)
  clos par 3Stone le 04/06/2013 : 23:33  Haut
Réponse n° 10
--------
le 01/06/2013 : 18:55
par maxmusix

Anonyme

visiteur
Effectivement j'ai trouvé une alternative pour effectuer ma commande Dmax() je suis passé par une fonction Cint() tout en laissant la table à son format d'origine avec le TAG3 en format texte.

Cependant j'ai noté un problème, les enregistrement de ce champs doivent suivre un format spécifique (exemple: 0000) or pendant la modification les zeros devant le nombre disparaissent. Je ne sais pas si c'est la bonne méthode ou la plus simple mais j'effectue un  "switch" pour determiner selon le format le nombre de 0 à remettre devant après mon traitement. J'ai un petit soucis avec ma fonction len() pour calculer le nombre de caractère. elle ne renvoie pas une valeur exact.

Cette fonction determine le nombre de caractère dans une chaine de caractère ou alors le nombre d'octets necessaire pour stocker une  variable. Le problème est peut être une confusion ici.

 
Code :
valMax = valMax + 1                                                             'On initialise la valeur de l'enregistrement à remplacer en fontion de la plus grande valeur contenue dans le champ
''''''''''ICI la procédure avec les Zero''''''''''''
'NbCar=Calcul du nombre de caractère dans la valeur a modifié
      NbCar = Len(valMax)
      Zero = format - NbCar
      Select Case Zero
      Case Is = 0
       ![Tag3] = valMax
      Case Is = 1
       ![Tag3] = "0" + CStr(valMax)
      Case Is = 2
       ![Tag3] = "00" + CStr(valMax)
      Case Is = 3
       ![Tag3] = "000" + CStr(valMax)
      Case Is = 4
       ![Tag3] = "0000" + CStr(valMax)
      Case Is = 5
       ![Tag3] = "00000" + CStr(valMax)
      End Select
 

cordialement
Ecrire à maxmusix   clos par 3Stone le 04/06/2013 : 23:33  Haut
Réponse n° 11
--------
le 01/06/2013 : 21:54
par 3Stone

3Stone

Administrateur

Bonjour,
 
Citation :

Cependant j'ai noté un problème, les enregistrement de ce champs doivent suivre un format spécifique (exemple: 0000) or pendant la modification les zeros devant le nombre disparaissent. Je ne sais pas si c'est la bonne méthode ou la plus simple mais j'effectue un "switch" pour determiner selon le format le nombre de 0 à remettre devant après mon traitement. J'ai un petit soucis avec ma fonction len() pour calculer le nombre de caractère. elle ne renvoie pas une valeur exact.

 
Je m'arrete à cela, sans tenir compte du code plus bas...

Il y a un mauvais choix dans ta table !
La règle veut que :
  • soit un champ est texte lorsque l'on ne fait aucun "calcul" sur sa valeur (nom, localité, description, code postal, etc.)
  • soit le champ est numérique, parce qu'il contient des valeurs numérique qui seront manipulées.
Dire que le format numérique doit avoir des zéros devant est une hérésie, et ne justifie absolument pas le choix du champ texte pour palier à cela d

Il ne faudrait pas confondre format du champ (numérique) et son affichage (complété par des 0 non significatifs).
Pour l'affichage, il suffit d'aller configurer le format de la zone de texte, pour que les zéros s'affichent, mais sans venir perturber le fait que ce champ soit bel et bien numérique.

Note, si tu souhaites qu'un champ numérique ait une longueur de 6 caractères (complété par des zéros), malgré qu'il ne contienne que 3 chiffres significatifs, il suffit de mettre comme format 000000 (six zéros).

Cordialement,
Pierre(3stone)
  clos par 3Stone le 04/06/2013 : 23:33  Haut
Réponse n° 12
--------
le 02/06/2013 : 19:17
par maxmusix

Anonyme

visiteur
Je comprends très bien, moi même je n'aurais pas fais ce choix de format alors qu'on souhaite faire des opérations sur les enregistrement: 

- ça m'oblige à convertir l'enregistrement en integer

Le problème c'est que je suis en stage, et cette base de données etait déjà conçue, je dois seulement effectué quelques modifications de ce style. 

J'ai déja pensé à modifier le format de depart, le problème c'est que ce format depend d'une valeur dans une autre table et donc peut varier, or je dois le respecter car c'est le client qui le definit.

Serait possible de le modifier en VBA ou doit on passer par le mode création? 
En effet cela simplifierai les choses.
cordialement.
Ecrire à maxmusix   clos par 3Stone le 04/06/2013 : 23:33  Haut
Réponse n° 13
--------
le 03/06/2013 : 16:04
par 3Stone

3Stone

Administrateur

Bonjour,
 
Citation :

moi même je n'aurais pas fais ce choix de format

 
Alors on est d'accord wink

Pour adapter les valeur pour tes tests et comparaisons, tu peux/dois donc les présenter à chaque fois sous le bon format...

Comme tu as renarqué, Cint converti un string vers le format interger.
Pour faire l'inverse, Format( x, "0000") convertir un integer en chaine complétée par des zéros. Bien sûr, tu peux adapter ce format "0000" à tes besoins.

Cordialement,
Pierre(3stone)
  clos par 3Stone le 04/06/2013 : 23:33  Haut
Réponse n° 14
--------
le 04/06/2013 : 12:06
par maxmusix

Anonyme

visiteur
Bonjour, je viens de valider mon projet il fonctionne je vous remercie encore pour l'aide que vous m'avez apporté.

Je n'ai pas vu votre dernier message avant la validation, mais avec la fonction Format() j'aurais également due effectué un select case, pour moduler la chaine "0000" selon les cas. 

merci encore bonne continuation, 

Ce problème est résolue.
Ecrire à maxmusix   clos par 3Stone le 04/06/2013 : 23:33  Haut
DébutPrécédent [ 1 2 ] SuivantFin
actif sujet actif   clos sujet clos   Important! Important!   Nouveau Nouveau message   -   Rectifier Rectifier message   Clôturer Clôturer sujet   Remonter Remonter
[]
Catégories de discussion  Forum 



Haut