Mettre jour des champs de table via un recordset!possible? - VB/VBA/VBS - Programmation
Marsh Posté le 12-09-2007 à 14:32:14
bjr,
une requête du style
Code :
|
ne suffit-elle pas ?
Marsh Posté le 12-09-2007 à 14:37:57
Ca m'interesse bien ca.
quand tu mets DATE c'est une variable?
Dans mon code ca correspondrait à
Update Tablecible Set dat=replace(dat,".","/" )
Sachant que Tablecible est une variable et que dat aussi.
Je me sens un peu à cote de la plaque là! Fichtre!
Marsh Posté le 12-09-2007 à 14:49:24
Et là tu me proposes de mettre à jour tous le champs d'un coup?
L'idée c'est que chaque table est différente donc je ne sais jamais quel est le nom du champ et que contient il.
La dans l'idée je teste chaque valeur de la valeur dans chaque champs et si il a un format qui est jj.mm.AAAA alors je fais une modif!
L'idée pourrait etre de se ballader dans la première ligne et si une valeur correspond à ce que je cherche alors je mémorise le champs et je mets toute la colonne à jour.
Qu'en penses tu?
Marsh Posté le 12-09-2007 à 14:51:51
ben d'un auter coté, je pense qu'a part le champs du type jj.mm.AAAA il n'y a pas de champs avec un . donc tu peux mettre une clause where date like "*.*" ou une manip comme ca, si ca te gene de mettre a jour tous les champs...
Marsh Posté le 12-09-2007 à 14:58:07
Ben si j'ai des champs ou ceux sont des chiffres à décimal donc avec un point dans les valeurs du style 153535.76.
La j'arrvie bien à trouver les valeurs et dans le code et dat = Replace((dat), ".", "/" ) me donne bien la date modufier il faut que je dise
TABLEDATE(Fields(i)) = dat
J'ai du faire trop de code et là je vois pas plus loin que le bout de mon neez!
Si j'arrive ca c'est fini j'ai reussi!
fichtre!
Marsh Posté le 12-09-2007 à 15:05:02
jpcheck: finalement j'ai ecrit cela:
SQL1 = "UPDATE Tablecible SET TABLEDATE.Fields(i) = dat"
DoCmd.RunSQL SQL1
CA foire. Je pense que je foire au niveau de la déclaration de la table!
le nom de la table est une variable contenur dans Tablecible. dat est la variable qui contient la nouvelle vleur à mettre dans la table et TABLEDATE est le recorset qui ouvre la table Tablecible!
Je n'ai rien en dur! ca doit etre la c.......dans le pate! NON
Marsh Posté le 12-09-2007 à 15:08:49
le recordset je suis pas sur qu'il le comprennent comme ca, il faut tout réécrire pour qu'il prenne bien en compte, surtout si tu n'as rien en dur...
Marsh Posté le 12-09-2007 à 15:14:56
Quand tu dis tout reecrire tu veux que je reecrive toute la partie de recherhce des informations qui correpondent à des dates?
Marsh Posté le 12-09-2007 à 15:15:55
non mais au lieu d'écrire ton tabledate tu mets where date in (select blablabla from etc.)
Marsh Posté le 12-09-2007 à 15:25:30
là je suis paumé mais paumé
SQL1= select update tablecible.Fields(i) where Fields(i) = dat
Non là je vois plus trop en fait!
Marsh Posté le 12-09-2007 à 15:33:13
c koi ton tablecible.fields(i), quand tu update c'est set champs = nelle valeur...
Marsh Posté le 12-09-2007 à 15:40:17
je seche à mort là:
dat = Replace((dat), ".", "/" )
SQL1 = "Update Tablecible set Fields(i)= [dat]"
DoCmd.RunSQL SQL1
Marsh Posté le 12-09-2007 à 15:41:00
le nom de mon champs je le connais pas .
Et d'ailleurs je vois meme plus comment le recuperer!
Marsh Posté le 12-09-2007 à 15:56:27
C'est un SQL très compliqué puisque rien n'est connu tout est variable donc quand tu mets Set champs et bien pour moi monchamps il est égal à fields(i). Tu penses que je me trompe?
Il ya le code quelques postes au dessus.
En tout ca smerci du coup de main! Ca sent le sapin ce SQL!
Marsh Posté le 12-09-2007 à 16:17:14
si ton fields(i) comporte le nom de ton champs tu dois mettre
dat = Replace((dat), ".", "/" )
SQL1 = "Update Tablecible set "[" & Fields(i) & "]='" & dat &"';"
docmd.runsql sql1
Marsh Posté le 12-09-2007 à 16:35:00
« Ca foire vers le update mais ... »
Le verbe foirer ne me donnant que peu d'indication, je lui préfère un numéro et un libellé d'erreur, voire la ligne précise où ça plante (si c'est pas sur le .Update). C'est possible ?
Sinon, tu n'as pas besoin de ta variable h, puisque ton recordset TABLEDATE a aussi une collection .Fields avec une propriété .Count.
De plus si tu as un objet TableDef ouvert sur la même table, je crois que ça explique ton problème potentiel de màj du recordset.
L'ouverture par défaut d'un recordset est en mode feuille dynamique (dbOpenDynaset) donc il ne devrait pas y avoir de problème de màj dans ton contexte.
J'espère que tu as déclaré tes variables TEST de type boolean (pas bien sinon !).
Tu peux te passer d'écrire « = True » : « If TEST Then » fonctionne très bien dans ce cas.
Marsh Posté le 12-09-2007 à 16:57:57
Petit à petit l'oiseau fait son nid!
Je crois que je vais réussir!
J'avance encore et je vous tiens au courant de ma soluce!
Marsh Posté le 12-09-2007 à 17:11:05
Deja le update marche! MAis ca update toute la colonne ce pourrait. Ce que je vais faire c'est que je vais mener le test sur la premièreligne du recorset et si ca correspond à un type de donnée que je cherche je mets à jour toute la colonne! Cependant il faut que j'utilise le replacedirectement dans le SQL mais il n'en veut pas voici:
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= Replace((Tablo(i)), ".", "/" );"
DoCmd.RunSQL SQL1
Cependant ca tique sur le "." ca me met erreur de fin d'instruction!
Pourquoi? le savez vous?
Marsh Posté le 12-09-2007 à 17:19:22
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= Replace((" & Tablo(i) & " ), ".", "/" );"
Marsh Posté le 12-09-2007 à 17:26:08
Je vous jure ca bloque sur le point encore avec le message
fin d'instruction attendue!
Marsh Posté le 12-09-2007 à 17:30:57
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= Replace([" & tablo(i) & "], [" & "." & "], [" & "/" & "];"
Ceci ne marche pas non plus!
Marsh Posté le 12-09-2007 à 17:33:54
Le Replace ne devrait pas être dans l'instruction SQL1 ; là elle l'est si mes yeux ont bien lu les guillemets.
Le champ qui va contenir la date est-il de type chaîne ou date ?
Il faut soit des #, soit des quotes pour encadrer sa valeur à mon avis.
Genre :
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= '" & Replace(tablo(i) , ".", "/" ) & "';"
Enfin vite fait parce que j'ai pas bcp de temps là
Marsh Posté le 12-09-2007 à 17:37:52
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]='" & dat & "';"
En debug.print cela donne
Update [BSEG_Blocked_Invoices_Paid] set [AUGCP ]='25.03.2004';
Je n'arrive pas à faire du debug.print avec
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= Replace((" & Tablo(i) & " ), ".", "/" );"
puisque elle ne passe pas!
Marsh Posté le 12-09-2007 à 17:47:00
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]= '" & Replace(tablo(i) , ".", "/" ) & "';"
Ton code Tegu fonctionne mais recopie le nom du champ dans toute la colonne! Fichtre on s'approche!
je vais essayer avec des # et des quotes.
Marsh Posté le 12-09-2007 à 17:48:07
Voici le debu print du sql du precedent post:
Update [BSEG_Blocked_Invoices_Paid] set [ZFBDT ]= 'ZFBDT ';
Marsh Posté le 12-09-2007 à 18:00:40
voici la version de ta reqûete avec des # tegu mais ca ne marche pas!
Je vais essyer de ne ttoyer mon code pour y voir plus clair et je pourrai vous montrer toute la page de code à l'exception des fonctions si ca vous interesse de lire et de résoudre ce problème. Mais c'est dejà sympa le coup de main!
Merci
Marsh Posté le 13-09-2007 à 09:26:44
Heu, bien sûr que ça met à jour toute la colonne puisqu'il n'y a pas de clause WHERE dans ta requête SQL, pour limiter l'action de la mise à jour.
Là, pour chaque enregistrement tu lances un remplacement des points par des / sur tout le fichier.
Je ne sais pas quel est la clé primaire de ta table mais il faudrait l'utiliser comme suit :
SQL1 = "... WHERE [ChampClePrimaire] = " & TABLEDATE.Fields(indexChampClePrimaire).value ...
en rajoutant des quotes si ta clé primaire est une chaine.
Après relecture, je m'aperçois qu'il y a eu un glissement de syntaxe au fil des posts.
Que contient tablo(i) en l'état actuel de ton code ? Le nom du champ ou sa valeur ?
Selon le dernier exemple de code que tu donnes on devrait plutôt avoir :
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]='" & Replace(dat , ".", "/" ) & "' WHERE [ChampClePrimaire] = " & TABLEDATE.Fields(indexChampClePrimaire).value & ";" |
avec dat = TABLEDATE.Fields(i).value
Marsh Posté le 13-09-2007 à 09:40:31
Code :
|
Voici mon code complet à l'exception des fonctions appelées cependant j'ai marqué l'utililité des fonctions au moment de leur appel.
Tegu pour répondre à ta question et bien Tablo(i) contient le nom du champs.
Pour la clé primaire je suis un peu embeté parce que je peux pas vraiment dire que j'en ai une puisque je n'en défini pas via access (numéro unique attribué achacun) et comme chaque fichier est différent je ne sais pas quel est le champ qui identifie de manière unique chaque ligne!
Merci de l'aide en tout cas!
Marsh Posté le 13-09-2007 à 09:49:37
Tegu ta requete SQL est pal mal du tout. Voila comment je l'ai adapté et voila debug.print car elle a plante mais a mon avis t'as raison:
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]='" & Replace(dat, ".", "/" ) & "' WHERE [" & tablo(i) & "] = " & TABLEDATE.Fields(i).Value & ";"
Debug.print
Update [BSEG_Blocked_Invoices_Paid] set [AUGDT ]='25/03/2004' WHERE [AUGDT ] = 25.03.2004;
Sachant que mes données sont toutes des données texte.
Marsh Posté le 13-09-2007 à 10:08:21
Cette requête fonctionne donc je vous dit un grand merci à tous les deux!
SQL1 = "Update [" & Tablecible & "] set [" & tablo(i) & "]='" & Replace(dat, ".", "/" ) & "' WHERE [" & tablo(i) & "] = '" & TABLEDATE.Fields(i).Value & "';"
Il ne me reste plus qu'à chercher comment enlever le message qui dit "X lignes vont être mises à jour voulez vous vraiment le faire?" car sinon ca va être long de cliquer à chaque fois.
Merci Merci!
Marsh Posté le 13-09-2007 à 13:18:51
Question technique!
Encore merci pour le code!
Tout fonctionne tres bien! Parcontre ma base fraichement créé avec le code et formulaire pèse 300ko. Par contre au fur et à mesure que j'importe des tables et même si ensuite je les supprime alors elle grossit considérablement. J'intègre des gros fichiers style 25 mega. Là elle est arrive à 1.02 giga alors que j'ai tout supprimé dedans. Je me dis que je dois mal vider des recorser ou que sais je encore :
Avez vous deja eu ce genre de problème?
Marsh Posté le 12-09-2007 à 14:26:06
Bonjour,
J'intègre des données sous format texte via une macro sous Access dont des dates.
J'ai fait un code pour me ballader dans toute la table et chercher les données ressemblant à une date comme ca jj.MM.AAAA pour les modifier en JJ/MM/AAAA.
J'arrive à les choper et à les transformer mais pas à mettre à jour la valeur dans la table. Je ne souhaite pas utiliser le format date au moment de l'import donc ce n'est pas une soluce pour moi.
mon code est le suivant:
Dim h As TableDef
Dim TABLEDATE As DAO.Recordset
Dim Db3 As DAO.Database
Set Db3 = CurrentDb()
Set TABLEDATE = Db3.OpenRecordset(Tablecible)
Set h = Db3.TableDefs(Tablecible)
n = h.Fields.Count
TABLEDATE.MoveFirst
While Not TABLEDATE.EOF
For i = 0 To n - 1
dat = TABLEDATE.Fields(i)
Debug.Print dat
TEST1 = IsNumeric(Left(dat, 2))
TEST2 = (Right((Left((dat), 3)), 1) = "." )
TEST3 = IsNumeric(Right((Left((dat), 5)), 2))
TEST4 = (Right((Left((dat), 6)), 1) = "." )
TEST5 = IsNumeric(Right(dat, 4))
If TEST1 = True And TEST2 = True And TEST3 = True And TEST4 = True And TEST5 = True Then
dat = Replace((dat), ".", "/" )
TABLEDATE.Edit
TABLEDATE(Fields(i)) = dat
TABLEDATE.Update
End If
Next i
Wend
Ca foire vers le update mais a mon avis je gere ca tres mal!
Merci du coup de main!