Si ligne de colonne existe alors [...] si n'existe pas alors [...]
cedrigoler
Messages postés35Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention 6 mai 2005
-
28 juin 2004 à 20:39
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 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 :)
A voir également:
Si ligne de colonne existe alors [...] si n'existe pas alors [...]
cs_dragon
Messages postés2336Date d'inscriptionsamedi 14 juillet 2001StatutMembreDernière intervention 5 mai 20096 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
cedrigoler
Messages postés35Date d'inscriptionmercredi 17 juillet 2002StatutMembreDerniè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 :)
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 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
cedrigoler
Messages postés35Date d'inscriptionmercredi 17 juillet 2002StatutMembreDerniè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)
Vous n’avez pas trouvé la réponse que vous recherchez ?
cedrigoler
Messages postés35Date d'inscriptionmercredi 17 juillet 2002StatutMembreDerniè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
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200620 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.