Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete sur 2 tables

10 réponses
Avatar
Jean Claude
Bonjour

Je voudrais copier les enbregistrements d'une table 1 dans une table 2 sans
qu'il y ait de doublons. il faut faire une boucle sur la table 1, mais je ne
vois pas comment faire,

Je fait ma premiere requete sur la table 1
DbCommand=New OleDbDataAdapter(..........................
DbCommand.Fill(DsPageData,("VoirEnr")

Ensuite je ne sais pas comment construire la boucle

Merci pour vos réponses
Cordialement
J Claude

10 réponses

Avatar
Fred
Dans : news:47677908$0$886$,
Jean Claude disait :
Bonjour



Bonjour,

Je voudrais copier les enbregistrements d'une table 1 dans une table
2 sans qu'il y ait de doublons. il faut faire une boucle sur la table
1, mais je ne vois pas comment faire,



C'est du travail pour le moteur de la base de données.

INSERT T2
SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.id = T2.id
WHERE T2.id IS NULL

Je suppose ici que [id] est la colonne contenant la valeur à ne pas
dupliquer et que T1 et T2 ont la même structure.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Jean Claude
Bonjour Fred

Je ne comprends pas ton code, j'écris

DbCommand=New OleDbDataAdapter("select * from Table1", DBconn)
DbCommand.Fill(DsPageData,("VoirEnr")
Dim LeChamps as string=""
DbCommand2=New OleDbDataAdapter("select * from Table2 where ID='"
& LeChamps & "'", DBconn)
si il n'y a pas d'enregistrement :
je veux faire un Insert de tous les champs de l'enregistrement de la table 1
si il y en a un je fais un Update

Donc je veux faire une boucle sur la table 1 du genre Do until/Loop
mais je ne vois pas comment écrire la boucle Do Until ?????????????.EOF

Comprends-tu mon problème ?
Merci
Jean Claude



"Fred" a écrit dans le message de news:

Dans : news:47677908$0$886$,
Jean Claude disait :
Bonjour



Bonjour,

Je voudrais copier les enbregistrements d'une table 1 dans une table
2 sans qu'il y ait de doublons. il faut faire une boucle sur la table
1, mais je ne vois pas comment faire,



C'est du travail pour le moteur de la base de données.

INSERT T2
SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.id = T2.id
WHERE T2.id IS NULL

Je suppose ici que [id] est la colonne contenant la valeur à ne pas
dupliquer et que T1 et T2 ont la même structure.

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)


Avatar
Fred
Dans : news:4767a282$0$833$,
Jean Claude disait :
Bonjour Fred



Je ne comprends pas ton code, j'écris



C'est du code SQL à faire exécuter par le moteur de la base de donnée à
l'aide d'une command OleDbCommand et de sa méthode ExecuteNonQuery.


DbCommand=New OleDbDataAdapter("select * from Table1", DBconn)
DbCommand.Fill(DsPageData,("VoirEnr")
Dim LeChamps as string=""
DbCommand2=New OleDbDataAdapter("select * from Table2 where
ID='" & LeChamps & "'", DBconn)
si il n'y a pas d'enregistrement :
je veux faire un Insert de tous les champs de l'enregistrement de la
table 1 si il y en a un je fais un Update

Donc je veux faire une boucle sur la table 1 du genre Do until/Loop
mais je ne vois pas comment écrire la boucle Do Until
?????????????.EOF
Comprends-tu mon problème ?



Oui, je comprends. Mais je ne suis pas partisan de faire des mises à
jour dans une base à partir de données récupérées dans un DataSet
déconnecté. Je préfère laisser la base faire le travail, c'est plus
simple à programmer et plus sûr.

J'ai completé le code SQL proposé pour tenir compte de ta remarque sur
les updates des lignes existant déjà dans la table 2 :

UPDATE T2
SET champ1 = T1.champ1,
champ2 = T1.champ2
FROM T1 INNER JOIN T2 ON T1.id = T2.id;
INSERT T2
SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.id = T2.id
WHERE T2.id IS NULL

À adapter.
Il suffit ensuite de créer un objet OleDbCommand avec le texte de la
commande ci-dessus.
Si besoin, ajouter des paramètres sous forme de points d'interrogation
dans le texte
(par ex : ... WHERE T2.Id = ? AND ...)
Using cn as New OleDbConnection("chaîne de connexion")
Dim cmd as New OleDbCommand(laCommande, cn)
cmd.CommandType = CommandType.Text
'Ajout de paramètres éventuels, dans l'ordre d'apparition
cmd.Parameters.AddWithValue("p1", valeurParam1)
'etc ...
cn.Open
cmd.ExecuteNonQuery
cn.Close
End Using

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Jean Claude
Merci Fred

Je vais testé

Cordialement
J Claude
"Fred" a écrit dans le message de news:
e%
Dans : news:4767a282$0$833$,
Jean Claude disait :
Bonjour Fred



Je ne comprends pas ton code, j'écris



C'est du code SQL à faire exécuter par le moteur de la base de donnée à
l'aide d'une command OleDbCommand et de sa méthode ExecuteNonQuery.


DbCommand=New OleDbDataAdapter("select * from Table1", DBconn)
DbCommand.Fill(DsPageData,("VoirEnr")
Dim LeChamps as string=""
DbCommand2=New OleDbDataAdapter("select * from Table2 where
ID='" & LeChamps & "'", DBconn)
si il n'y a pas d'enregistrement :
je veux faire un Insert de tous les champs de l'enregistrement de la
table 1 si il y en a un je fais un Update

Donc je veux faire une boucle sur la table 1 du genre Do until/Loop
mais je ne vois pas comment écrire la boucle Do Until
?????????????.EOF
Comprends-tu mon problème ?



Oui, je comprends. Mais je ne suis pas partisan de faire des mises à jour
dans une base à partir de données récupérées dans un DataSet déconnecté.
Je préfère laisser la base faire le travail, c'est plus simple à
programmer et plus sûr.

J'ai completé le code SQL proposé pour tenir compte de ta remarque sur les
updates des lignes existant déjà dans la table 2 :

UPDATE T2
SET champ1 = T1.champ1,
champ2 = T1.champ2
FROM T1 INNER JOIN T2 ON T1.id = T2.id;
INSERT T2
SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.id = T2.id
WHERE T2.id IS NULL

À adapter.
Il suffit ensuite de créer un objet OleDbCommand avec le texte de la
commande ci-dessus.
Si besoin, ajouter des paramètres sous forme de points d'interrogation
dans le texte
(par ex : ... WHERE T2.Id = ? AND ...)
Using cn as New OleDbConnection("chaîne de connexion")
Dim cmd as New OleDbCommand(laCommande, cn)
cmd.CommandType = CommandType.Text
'Ajout de paramètres éventuels, dans l'ordre d'apparition
cmd.Parameters.AddWithValue("p1", valeurParam1)
'etc ...
cn.Open
cmd.ExecuteNonQuery
cn.Close
End Using

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)


Avatar
Vincent Poyo
Salut,

Perso je ferais une procédure stockée avec dedans un curseur (regarde la doc
du mot clé CURSOR).
ensuite dans la boucle de ton curseur s'il existe tu fais un update sinon un
insert. et côté code il y a juste à appeler
la procédure stockée. De plus tout est côté base de donnée, donc plus
rapide, tu ramènes aucune données au niveau de l'appli. et c'est plus facile
à maintenir, car si tu veux retoucher un truc tu n'es pas obligé de
recompiler ton appli

"Jean Claude" a écrit dans le message de
news:4767cef0$0$904$
Merci Fred

Je vais testé

Cordialement
J Claude
"Fred" a écrit dans le message de news:
e%
Dans : news:4767a282$0$833$,
Jean Claude disait :
Bonjour Fred



Je ne comprends pas ton code, j'écris



C'est du code SQL à faire exécuter par le moteur de la base de donnée à
l'aide d'une command OleDbCommand et de sa méthode ExecuteNonQuery.


DbCommand=New OleDbDataAdapter("select * from Table1", DBconn)
DbCommand.Fill(DsPageData,("VoirEnr")
Dim LeChamps as string=""
DbCommand2=New OleDbDataAdapter("select * from Table2 where
ID='" & LeChamps & "'", DBconn)
si il n'y a pas d'enregistrement :
je veux faire un Insert de tous les champs de l'enregistrement de la
table 1 si il y en a un je fais un Update

Donc je veux faire une boucle sur la table 1 du genre Do until/Loop
mais je ne vois pas comment écrire la boucle Do Until
?????????????.EOF
Comprends-tu mon problème ?



Oui, je comprends. Mais je ne suis pas partisan de faire des mises à jour
dans une base à partir de données récupérées dans un DataSet déconnecté.
Je préfère laisser la base faire le travail, c'est plus simple à
programmer et plus sûr.

J'ai completé le code SQL proposé pour tenir compte de ta remarque sur
les updates des lignes existant déjà dans la table 2 :

UPDATE T2
SET champ1 = T1.champ1,
champ2 = T1.champ2
FROM T1 INNER JOIN T2 ON T1.id = T2.id;
INSERT T2
SELECT T1.*
FROM T1 LEFT JOIN T2 ON T1.id = T2.id
WHERE T2.id IS NULL

À adapter.
Il suffit ensuite de créer un objet OleDbCommand avec le texte de la
commande ci-dessus.
Si besoin, ajouter des paramètres sous forme de points d'interrogation
dans le texte
(par ex : ... WHERE T2.Id = ? AND ...)
Using cn as New OleDbConnection("chaîne de connexion")
Dim cmd as New OleDbCommand(laCommande, cn)
cmd.CommandType = CommandType.Text
'Ajout de paramètres éventuels, dans l'ordre d'apparition
cmd.Parameters.AddWithValue("p1", valeurParam1)
'etc ...
cn.Open
cmd.ExecuteNonQuery
cn.Close
End Using

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)






Avatar
Fred
Dans : news:,
Vincent Poyo disait :
Salut,



Bonjour,

Perso je ferais une procédure stockée avec dedans un curseur (regarde
la doc du mot clé CURSOR).



Pourquoi faire un curseur dans ce cas ? D'autant que Jean-Claude ne
nous a pas dit quelle base il utilise !

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Jean Claude
Bonour Fred

J'utilise une base Access

Ce qui complique c'est quand je prend l'enregistrement de la table1 j'ai
besoin d'extraire certains champs pour créer un code client avant
d'enregistrer les donées de table1 à table2 + ce code client

Cordialement
Jean Claude
"Fred" a écrit dans le message de news:
%233f$
Dans : news:,
Vincent Poyo disait :
Salut,



Bonjour,

Perso je ferais une procédure stockée avec dedans un curseur (regarde
la doc du mot clé CURSOR).



Pourquoi faire un curseur dans ce cas ? D'autant que Jean-Claude ne nous
a pas dit quelle base il utilise !

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)


Avatar
Fred
Dans : news:4768dbda$0$871$,
Jean Claude disait :
Bonour Fred



Bonsoir,

J'utilise une base Access



La syntaxe n'est pas la même et je ne sais pas si tu peux faire les deux
opérations en même temps (Update et Insert)
Voilà ce que cela donnerait sur deux tables avec un champ clé ID et un
champ TXT
Pour l'update :

UPDATE T1
INNER JOIN T2 ON T1.Id = T2.Id
SET T2.Txt = [T1].[Txt]

Pour l'insert

INSERT INTO T2 (Id, Txt) SELECT T1.Id, T1.Txt
FROM T1 LEFT JOIN T2 ON T1.Id = T2.Id
WHERE (((T2.Id) Is Null));

Sur le principe, il n'y a pas grand changement sinon que tu devras
peut-être créer et exécuter les deux commandes successivement.

Ce qui complique c'est quand je prend l'enregistrement de la table1
j'ai besoin d'extraire certains champs pour créer un code client avant
d'enregistrer les donées de table1 à table2 + ce code client



Ce champ ne peut-il être calculé par Access ?

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)
Avatar
Jean Claude
Bonjour Fred

Merci pour ta réponse.
Non c'est pas possible, il me faut boucler sur la table1, extraire le
premier enregistrement,
détermerniner l'ID
et ensuite créer un nouvel enregistrement avec le transfert des données et
l'ID dans table 2

Cordialement
JC
"Fred" a écrit dans le message de news:

Dans : news:4768dbda$0$871$,
Jean Claude disait :
Bonour Fred



Bonsoir,

J'utilise une base Access



La syntaxe n'est pas la même et je ne sais pas si tu peux faire les deux
opérations en même temps (Update et Insert)
Voilà ce que cela donnerait sur deux tables avec un champ clé ID et un
champ TXT
Pour l'update :

UPDATE T1
INNER JOIN T2 ON T1.Id = T2.Id
SET T2.Txt = [T1].[Txt]

Pour l'insert

INSERT INTO T2 (Id, Txt) SELECT T1.Id, T1.Txt
FROM T1 LEFT JOIN T2 ON T1.Id = T2.Id
WHERE (((T2.Id) Is Null));

Sur le principe, il n'y a pas grand changement sinon que tu devras
peut-être créer et exécuter les deux commandes successivement.

Ce qui complique c'est quand je prend l'enregistrement de la table1
j'ai besoin d'extraire certains champs pour créer un code client avant
d'enregistrer les donées de table1 à table2 + ce code client



Ce champ ne peut-il être calculé par Access ?

--
Fred
http://www.cerber mail.com/?3kA6ftaCvT (enlever l'espace)


Avatar
Gilles TOURREAU
Le Thu, 20 Dec 2007 08:54:12 +0100, Jean Claude
a écrit:

Bonjour Fred

Merci pour ta réponse.
Non c'est pas possible, il me faut boucler sur la table1, extraire le
premier enregistrement,
détermerniner l'ID
et ensuite créer un nouvel enregistrement avec le transfert des données
et
l'ID dans table 2

Cordialement



Bonjour JC,

Qu'appelles-tu par déterminer l'ID ?
Sais-tu que le INSERT INTO permet de copier une table (ou partiellement)
en introduisant une requête SELECT ?

Par exemple :
On dispose d'une table Client (Id, Nom, Prénom, CA)
On souhaite ajouter dans la table ClientHisto (Id, NomPrénom,
CA_moyen_par_Mois) les clients qui commencent par les lettres "DUP" :

INSERT INTO ClientHisto (Id, NomPrénom, CA_moyen_par_Mois)
VALUES (SELECT Id, Nom + Prénom, CA/12 FROM Client WHERE Nom LIKE 'DUP%')

Tout simplement...
Peux tu nous dire d'où viennent précisement les données que tu souhaites
insérer dans la table2 ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr