Si ligne de colonne existe alors [...] si n'existe pas alors [...]

cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005 - 28 juin 2004 à 20:39
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 - 30 juin 2004 à 20:04
Bonjour !

J'ai une base de donnée, deux colone ("mots" et "suiv") en actualisant la base de donnée il y a deux cas :

• soit le mots existe ds la colone "mots" et alors la colone "suiv" est actualisée à cette ligne avec de nouvelles données.
Un code du type :
sql = "SELECT * FROM Dico WHERE Nom=mp(nb)
rs.AddNew
rs.Fields("suiv") = rs.Fields("suiv") + "$" + mp(nb+1)
rs.Update
rs.Close

• soit il n'existe pas et un nouvelle ligne est créé.
Un code du type :
sql = "SELECT * FROM Dico"
Set rs = db.OpenRecordset(sql, dbOpenDynaset)
rs.AddNew
rs.Fields("suiv") = mp(nb+1)
rs.Update
rs.Close

--> mp(nb) est un tableau contenant plusieurs données, qui sont, vous l'avez compris, présente ou non dans la base access. Il me faudrait au moins un moyen pour tester la présence ou non de ce mot pour ensuite faire le choix entre les deux fonction (ci dessu)
Merci de votre aide :)

7 réponses

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
28 juin 2004 à 20:50
au lieu d'une =
replace le par un "in"
et au lieu d'une tableau il va vouloir les items comme ceci (item1,item2,item3,item4,item5,...)
donc fait une boucle qui fabrique une string sous ce format
0
cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005
28 juin 2004 à 21:09
Je suis désolé mais je n'ai compris ta réponse. Où faut-il remplacé le signe = par in ? Où dis-tu que les donnée seront a donné sous le format (item1,item2,item3,item4,item5,...) ? Et est-ce que simplement cela resoudra mon problème ? car je dirigeais mes recherches sur le moyen de faire un test de présence dans la base de donnée (mais peut être ne suis-je pas dans la bonne direction)
En tt cas merci de l'attention :)
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
28 juin 2004 à 23:12
Bonsoir,

Si g bien compris, tu as une table de base données qui possède 2 champs (mots et suiv) et tu veux les mettre à jour ou ajouter un enreg ?.

Si c ça alors voilà une solution :

Au départ,

sql = "SELECT * FROM Dico"
Set rs = db.OpenRecordset(sql, dbOpenDynaset)

ensuite,

rs.movefirst "mots = '" & mp(nb) & "'"
if rs.notmatch then ' si pas trouvé
rs.AddNew ' on ajoute l'enreg
rs.Fields("mots") = mp(nb)
rs.Fields("suiv") = mp(nb+1)
rs.Update
else ' si trouvé
rs.edit on met à jour l'enreg
rs.Fields("suiv") = rs.Fields("suiv") + "$" + mp(nb+1)
rs.Update
endif

Si ça répond ou non à ta question, dis-le, merci.

Cordialement

CanisLupus
0
cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005
29 juin 2004 à 15:59
Merci pour ta réponse CanisLupus !
Elle comportait cependant plusieurs erreurs, comme pour rs.movefirst qui n'accepte pas d'arguement comme ici "mots = '" & mp(nb) & "'" De plus attention c'est rs.NoMatch (et non "notmatch") Mais ta réponse ma permis de diriger mes recherches vers les techniques rs.move et rs.edit. Donc voila le code refait qui fonctionne très bien maintenant !!

For nb = 0 To UBound(mp)

rs.MoveFirst 'on se place sur la 1ere ligne QUI DOIT EXISTER

Do
If rs.Fields("mot") = mp(nb) Then
rs.Edit
rs.Fields("suiv") = rs.Fields("suiv") + "$" + mp(nb+1)
rs.Update
GoTo suite 'sortir du test
End If

rs.MoveNext 'ligne suivante

Loop Until rs.EOF 'jusqu'a ce qu'on arrive à la derniere ligne

rs.AddNew
rs.Fields("mot") = mp(nb)
If nb < UBound(mp) Then rs.Fields("suiv") = mp(nb + 1)
rs.Update

suite:
Next nb

Peut être est-ce encore lourd car il y a une boucle do loop ds une boulce for next, pr pouvoir balayer tte les lignes pour chaque valeur du tableau mp(nb)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
29 juin 2004 à 19:57
Mille excuses, c pas movefirst c findfirst qu'il faut écrire. Je devais être fatigué hier ;-).

Cordialement

CanisLupus
0
cedrigoler Messages postés 35 Date d'inscription mercredi 17 juillet 2002 Statut Membre Dernière intervention 6 mai 2005
29 juin 2004 à 22:51
effectivement, en remplaçant movefirst par findfirst et notmatch pas nomatch avec ton code CanisLupus on obtient la meme chose que celui que je viens de proposer. Je suppose que ton code est le plus optimal (il utilise une fonction de recherche integré au sql et evite de passé par un boucle vb). Je me trompe ?
Merci encore :-p
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 18
30 juin 2004 à 20:04
Pardonnes moi encore pour mes petites erreurs, j'avais tapé ce code vite fait.

Est ce que c moins lourd et + rapide sans doute, en tous cas, ça évite de boucler pour balayer tous les enregs 1 par 1. Et c plus raoide à coder.

Ce n'est pas une fonction intégrée dans sql mais une fonction intégrée dans la manipulation des recordset par vb6.

Note : si tu as +sieurs enregs qui correspondent au critère que tu mets ds le findfirst, tu peux aussi utiliser findnext (même critère) pour aller en avant ou findprevious pour revenir vers le début. Tu peux même commencer par la fin avec findlast. Mais je suppose que si tu as fait un tit tour ds l'aide de vb6 tu as du t'en rendre compte.

Bonne prog

Cordialement

CanisLupus
0