OVH Cloud OVH Cloud

Copie d'une table à l'autre

23 réponses
Avatar
Luis
Bonjour,
Dans une table j'ai des champs correspondants =E0 des=20
contacts, group=E9s dans un formulaire comme suit:
Contact1:
DEPARTEMENT1
POLITESSE1
RESPONSABLE1
FONCTION1
TELDIRECT1
MOBILE1
FAX1
e-mail1
Contact2
DEPARTEMENT2
POLITESSE2

etc et ainsi de suite pour tous les groupes de contacts
J'ai cr=E9=E9 une autre table pour regrouper tous les=20
contacts, mais j'ai deux probl=E8mes.
1: le regroupement se fait pour chaque contact sur 8 lignes
2: lorsque je delete un champ le renseignement reste dans=20
la deuxi=E8me table.
L'=E9criture d'une table sur l'autre je la fait comme =E7a:

Private Sub RESPONSABLE_LostFocus()

Dim Crit=E8re As String, MaBD As Database, MaTable As=20
Recordset
SendKeys "+{ENTER}"

NUMCLIENT =3D [NClient]
CAT1 =3D RESPONSABLE
Set MaBD =3D DBEngine.Workspaces(0).Databases(0)
Set MaTable =3D MaBD.OpenRecordset("CONTACTS_CLIENTS",=20
DB_OPEN_DYNASET) ' Cr=E9e la feuille de r=E9ponses dynamique.
MaTable.MoveFirst ' Recherche la premi=E8re occurence.
Do Until MaTable.EOF ' Boucle jusqu'=E0 ce qu'il n'y ait=20
plus d'enregistrement correspondant.
=20
TESTER =3D MaTable!NClient
If TESTER =3D NUMCLIENT Then
CONTACT =3D MaTable!CONTACT
If CONTACT =3D CAT1 Then
trouve =3D 1
Exit Do
Else
trouve =3D 0
End If
MaTable.MoveNext
Else
MaTable.MoveNext
End If

Loop =20


If trouve =3D 0 Then
MaTable.AddNew
MaTable!NClient =3D NClient
MaTable!CONTACT =3D RESPONSABLE
MaTable.Update
MaTable.Close
Else
'matable.Close
End If

End Sub

Private Sub POLITESSE_LostFocus()
Dim Crit=E8re As String, MaBD As Database, MaTable As=20
Recordset
SendKeys "+{ENTER}"

NUMCLIENT =3D [NClient]
CAT2 =3D POLITESSE

Set MaBD =3D DBEngine.Workspaces(0).Databases(0)
Set MaTable =3D MaBD.OpenRecordset("CONTACTS_CLIENTS",=20
DB_OPEN_DYNASET) ' Cr=E9e la feuille de r=E9ponses dynamique.
MaTable.MoveFirst ' Recherche la premi=E8re occurence.
Do Until MaTable.EOF ' Boucle jusqu'=E0 ce qu'il n'y ait=20
plus d'enregistrement correspondant.
=20
TESTER =3D MaTable!NClient
If TESTER =3D NUMCLIENT Then
Mme_Mlle_M =3D MaTable!Mme_Mlle_M
If Mme_Mlle_M =3D CAT2 Then
trouve =3D 1
Exit Do
Else
trouve =3D 0
End If
MaTable.MoveNext
Else
MaTable.MoveNext
End If

Loop ' Fin de la boucle.


If trouve =3D 0 Then
MaTable.AddNew
MaTable!NClient =3D NClient
MaTable!Mme_Mlle_M =3D POLITESSE
MaTable.Update
MaTable.Close
Else
'matable.Close
End If

End Sub

et comme =E7a avec chaque champ

N=B0Contact
NCLIENT / NOM /POLITESSE
/FONCTION /DEPARTEMENT
/TELDIRECT
/ Mail/MOBILE1/FAX
13 / 3298 / Pierre Gros =09
=09
15 / 3298 / Monsieur =09
=09
28 / 3298 / Comptable =09
=09
29 / 3298 / Direction Financi=E8re =09
=09
37 / 3298 /0408197719 =09
=09
39 / 3298 /jg@namr.com =09
=09
44 / 3298 / 0696755432=09
=09
49 / 3298 / 0225678889=09
=09
D=E9sol=E9 pour la mise en page, mais il est dificile d'=E9crire=20
une table, j'esp=E8re que je me fais tout de m=EAme comprendre.

Que dois-je modifier pour que tous les renseignements=20
concernant un contact s'=E9crivent sur la m=EAme liqne et que=20
lorsque je delete l'information sur le formulaire l'info=20
s'efface dans la table?

J'ep=E8re avoir des infos, merci.
Luis

3 réponses

1 2 3
Avatar
Luis
Bonjour Ilan,
J'ai fais tel que tu me l'indiques mais j'ais une erreur:
Erreur d'exécution '3061'
Trop peu de paramètres. 25 attendu.
Voici mon code complet:
Dim Db As Database
Dim TABLE1, TABLE2 As Recordset
Dim CONTACT, INFOCONTACT, INDICEINFO As Integer

Function SetContact()
Set Db = CurrentDb
Chaîne = "SELECT NClient, RESPONSABLE, POLITESSE,
FONCTION, TELDIRECT1, NATEL, [e-mail1], FAX1,
DEPARTEMENT1, RESPONSABLE2, POLITESSE2, FONCTION2,
TELDIRECT2, NATEL2, [e-mail2], FAX2, DEPARTEMENT2,
RESPONSABLE3, POLITESSE3, FONCTION3, TELEDIRECT3, NATEL3,
[e-mail3], FAX3, DEPARTEMENT3"
Set TABLE1 = Db.OpenRecordset(Chaîne)
Set TABLE2 = Db.OpenRecordset("SELECT * FROM
CONTACTS_CLIENTS;")
If Not (TABLE1.BOF Or TABLE1.EOF) Then
TABLE2
TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
If TABLE2.NoMatch Then
For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
For CONTACT = 1 To 3
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!NClient) Then
GoSub AjouterContact
Else
TABLE2.Edit
End If
GoSub EcrireInfo
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For Info = 1 To 8
INDICEINFO = 8 * (CONTACT - 1) + INFOCONTACT
TABLE2.Fields.Item(INFOCONTACT + 1) =
TABLE1.Fields.Item(INDICEINFO)
Next Info
TABLE2.Update
Return
End Function
-----Message d'origine-----
Bonsoir Luis,
Je n'ai pas mis de commentaires dans le code pour que le
post soit plus

lisisble.

1) l'instruction SELECT * renvoie tous les champs de la
table. Puisque tu

n'as besoin que des champs relatifs aux contacts,
remplace le signe *

par le nom des champs desires en separant chaque champ
d'une virgule.


Ex: SELECT NCLIENT, RESPONSABLE, POLITESSE
dans cette exemple il n' y a qu'un champ devant
RESPONSABLE donc X=0

il faut donc remplacer la ligne : IndiceInfo=8*(CONTACT-
1) + InfoConctat +

X par
IndiceInfo=8*(CONTACT-1) + InfoContact

Pour information:
CONTACT : correspond au numero du contact a ajouter ou a
modifier.Il y a 3

contacts d'ou les boucles de traitement For CONTACT=1 to 3
INFOCONTACT : correspond au numero de cette information.
Il y a 8 valeurs d'ou

les boucles de traitements For InfoContact=1 to 8 )
INDICEINFO: correspond au numero du champ de TABLE1 dont
on souhaite copier

la valeur dans TABLE2.


2)Concernant l'instruction WHERE:
Comment s'appelle ton formulaire ?
Comment s'appelle le controle dans lequel tu choisis
le client ?

Quelle valeur est contenue dans ce controle (Le nom
du client, son

numero) ?

3) Commentaires du code :

'TABLE1 est-elle vide ?
If Not (TABLE1.BOF Or TABLE1.EOF) Then
'Non TABLE1 n'est pas vide alors Rechercher le client
dans TABLE2

TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
'Le client a-t-il ete trouve dans TABLE2?
If TABLE2.NoMatch Then
'Non le client n'a pas ete trouve alors ajouter tous
les contacts

For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
'Oui Le client a ete trouve alors du Contact1 au
Contact3

For CONTACT = 1 To 3
'Le contact est-il manquant dans TABLE2 ?
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!NClient)
Then

'Oui le Contact est manquant alors Ajouter le contact
GoSub AjouterContact
Else
'Non le contact existe alors copier les 8 infos de
TABLE1 dans TABLE2

TABLE2.Edit
End If
'Boucle d'ecriture des 8 valeurs
Contact,Politesse,....,Email

GoSub EcrireInfo
'Aller au contact suivant dans TABLE2
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For InfoContact = 1 To 8
IndiceInfo = 8 * (CONTACT - 1) + InfoContact + X
TABLE2.Fields.Item(InfoContact + 1) =
TABLE1.Fields.Item(IndiceInfo)

Next Info
TABLE2.Update
Return
End Function

.



Avatar
Ilan
tu as oublie FROM Clients ORDER BY NClient; dans la variable chaine
remplace Set TABLE2="SELECT * FROM Contacts_Clients;"
par Set TABLE2="SELECT * FROM Contacts_Clients ORDER BY NClient;"
remplace egalement
For info=1 to 8 par For INFOCONTACT=1 to 8
et
Next Info par Next INFOCONTACT





Bonjour Ilan,
J'ai fais tel que tu me l'indiques mais j'ais une erreur:
Erreur d'exécution '3061'
Trop peu de paramètres. 25 attendu.
Voici mon code complet:
Dim Db As Database
Dim TABLE1, TABLE2 As Recordset
Dim CONTACT, INFOCONTACT, INDICEINFO As Integer

Function SetContact()
Set Db = CurrentDb
Chaîne = "SELECT NClient, RESPONSABLE, POLITESSE,
FONCTION, TELDIRECT1, NATEL, [e-mail1], FAX1,
DEPARTEMENT1, RESPONSABLE2, POLITESSE2, FONCTION2,
TELDIRECT2, NATEL2, [e-mail2], FAX2, DEPARTEMENT2,
RESPONSABLE3, POLITESSE3, FONCTION3, TELEDIRECT3, NATEL3,
[e-mail3], FAX3, DEPARTEMENT3"
Set TABLE1 = Db.OpenRecordset(Chaîne)
Set TABLE2 = Db.OpenRecordset("SELECT * FROM
CONTACTS_CLIENTS;")
If Not (TABLE1.BOF Or TABLE1.EOF) Then
TABLE2
TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
If TABLE2.NoMatch Then
For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
For CONTACT = 1 To 3
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!NClient) Then
GoSub AjouterContact
Else
TABLE2.Edit
End If
GoSub EcrireInfo
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For Info = 1 To 8
INDICEINFO = 8 * (CONTACT - 1) + INFOCONTACT
TABLE2.Fields.Item(INFOCONTACT + 1) =
TABLE1.Fields.Item(INDICEINFO)
Next Info
TABLE2.Update
Return
End Function
-----Message d'origine-----
Bonsoir Luis,
Je n'ai pas mis de commentaires dans le code pour que le
post soit plus

lisisble.

1) l'instruction SELECT * renvoie tous les champs de la
table. Puisque tu

n'as besoin que des champs relatifs aux contacts,
remplace le signe *

par le nom des champs desires en separant chaque champ
d'une virgule.


Ex: SELECT NCLIENT, RESPONSABLE, POLITESSE
dans cette exemple il n' y a qu'un champ devant
RESPONSABLE donc X=0

il faut donc remplacer la ligne : IndiceInfo=8*(CONTACT-
1) + InfoConctat +

X par
IndiceInfo=8*(CONTACT-1) + InfoContact

Pour information:
CONTACT : correspond au numero du contact a ajouter ou a
modifier.Il y a 3

contacts d'ou les boucles de traitement For CONTACT=1 to 3
INFOCONTACT : correspond au numero de cette information.
Il y a 8 valeurs d'ou

les boucles de traitements For InfoContact=1 to 8 )
INDICEINFO: correspond au numero du champ de TABLE1 dont
on souhaite copier

la valeur dans TABLE2.


2)Concernant l'instruction WHERE:
Comment s'appelle ton formulaire ?
Comment s'appelle le controle dans lequel tu choisis
le client ?

Quelle valeur est contenue dans ce controle (Le nom
du client, son

numero) ?

3) Commentaires du code :

'TABLE1 est-elle vide ?
If Not (TABLE1.BOF Or TABLE1.EOF) Then
'Non TABLE1 n'est pas vide alors Rechercher le client
dans TABLE2

TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
'Le client a-t-il ete trouve dans TABLE2?
If TABLE2.NoMatch Then
'Non le client n'a pas ete trouve alors ajouter tous
les contacts

For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
'Oui Le client a ete trouve alors du Contact1 au
Contact3

For CONTACT = 1 To 3
'Le contact est-il manquant dans TABLE2 ?
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!NClient)
Then

'Oui le Contact est manquant alors Ajouter le contact
GoSub AjouterContact
Else
'Non le contact existe alors copier les 8 infos de
TABLE1 dans TABLE2

TABLE2.Edit
End If
'Boucle d'ecriture des 8 valeurs
Contact,Politesse,....,Email

GoSub EcrireInfo
'Aller au contact suivant dans TABLE2
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For InfoContact = 1 To 8
IndiceInfo = 8 * (CONTACT - 1) + InfoContact + X
TABLE2.Fields.Item(InfoContact + 1) =
TABLE1.Fields.Item(IndiceInfo)

Next Info
TABLE2.Update
Return
End Function

.






Avatar
Luis
Re-bonjour,
Ca ne marche toujours pas.
Maintenant j'ai erreur d'exécution '3078'
Le moteur de base de données Microsoft Jet ne peut pas
trouver la table ou la requête source 'From CLIENTS ORDER
BY NClient; NClient, Responsable, ......'

Et en surbrillance il y a:
Chaine = "FROM CLIENTS ORDER BY NClient; NClient,
RESPONSABLE, RESPONSABLE2, RESPONSABLE3, NATEL, fonction,
POLITESSE, POLITESSE2, POLITESSE3, FONCTION2, FONCTION3,
TELDIRECT1, TELDIRECT2, TELEDIRECT3, e-mail1, e-mail2, e-
mail3, NATEL2, NATEL3, FAX1, FAX2, FAX3, DEPARTEMENT1,
DEPARTEMENT2, DEPARTEMENT3"
Set TABLE1 = Db.OpenRecordset(Chaine)
Pourtant lorsque je compile il n'y a pas de problèmes.
Luis
-----Message d'origine-----
tu as oublie FROM Clients ORDER BY NClient; dans la
variable chaine

remplace Set TABLE2="SELECT * FROM Contacts_Clients;"
par Set TABLE2="SELECT * FROM
Contacts_Clients ORDER BY NClient;"

remplace egalement
For info=1 to 8 par For INFOCONTACT=1 to 8
et
Next Info par Next INFOCONTACT





Bonjour Ilan,
J'ai fais tel que tu me l'indiques mais j'ais une
erreur:


Erreur d'exécution '3061'
Trop peu de paramètres. 25 attendu.
Voici mon code complet:
Dim Db As Database
Dim TABLE1, TABLE2 As Recordset
Dim CONTACT, INFOCONTACT, INDICEINFO As Integer

Function SetContact()
Set Db = CurrentDb
Chaîne = "SELECT NClient, RESPONSABLE, POLITESSE,
FONCTION, TELDIRECT1, NATEL, [e-mail1], FAX1,
DEPARTEMENT1, RESPONSABLE2, POLITESSE2, FONCTION2,
TELDIRECT2, NATEL2, [e-mail2], FAX2, DEPARTEMENT2,
RESPONSABLE3, POLITESSE3, FONCTION3, TELEDIRECT3,
NATEL3,


[e-mail3], FAX3, DEPARTEMENT3"
Set TABLE1 = Db.OpenRecordset(Chaîne)
Set TABLE2 = Db.OpenRecordset("SELECT * FROM
CONTACTS_CLIENTS;")
If Not (TABLE1.BOF Or TABLE1.EOF) Then
TABLE2
TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
If TABLE2.NoMatch Then
For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
For CONTACT = 1 To 3
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!NClient)
Then


GoSub AjouterContact
Else
TABLE2.Edit
End If
GoSub EcrireInfo
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For Info = 1 To 8
INDICEINFO = 8 * (CONTACT - 1) + INFOCONTACT
TABLE2.Fields.Item(INFOCONTACT + 1) =
TABLE1.Fields.Item(INDICEINFO)
Next Info
TABLE2.Update
Return
End Function
-----Message d'origine-----
Bonsoir Luis,
Je n'ai pas mis de commentaires dans le code pour que
le



post soit plus
lisisble.

1) l'instruction SELECT * renvoie tous les champs de
la



table. Puisque tu
n'as besoin que des champs relatifs aux contacts,
remplace le signe *

par le nom des champs desires en separant chaque champ
d'une virgule.


Ex: SELECT NCLIENT, RESPONSABLE, POLITESSE
dans cette exemple il n' y a qu'un champ devant
RESPONSABLE donc X=0

il faut donc remplacer la ligne : IndiceInfo=8*
(CONTACT-



1) + InfoConctat +
X par
IndiceInfo=8*(CONTACT-1) + InfoContact

Pour information:
CONTACT : correspond au numero du contact a ajouter ou
a



modifier.Il y a 3
contacts d'ou les boucles de traitement For CONTACT=1
to 3



INFOCONTACT : correspond au numero de cette
information.



Il y a 8 valeurs d'ou
les boucles de traitements For InfoContact=1 to 8 )
INDICEINFO: correspond au numero du champ de TABLE1
dont



on souhaite copier
la valeur dans TABLE2.


2)Concernant l'instruction WHERE:
Comment s'appelle ton formulaire ?
Comment s'appelle le controle dans lequel tu
choisis



le client ?
Quelle valeur est contenue dans ce controle (Le
nom



du client, son
numero) ?

3) Commentaires du code :

'TABLE1 est-elle vide ?
If Not (TABLE1.BOF Or TABLE1.EOF) Then
'Non TABLE1 n'est pas vide alors Rechercher le client
dans TABLE2

TABLE2.FindFirst ("NClient=" & TABLE1!NClient)
'Le client a-t-il ete trouve dans TABLE2?
If TABLE2.NoMatch Then
'Non le client n'a pas ete trouve alors ajouter
tous



les contacts
For CONTACT = 1 To 3
GoSub AjouterContact
GoSub EcrireInfo
Next CONTACT
Else
'Oui Le client a ete trouve alors du Contact1 au
Contact3

For CONTACT = 1 To 3
'Le contact est-il manquant dans TABLE2 ?
If (TABLE2.EOF Or TABLE2!NClient <> TABLE1!
NClient)



Then
'Oui le Contact est manquant alors Ajouter le
contact



GoSub AjouterContact
Else
'Non le contact existe alors copier les 8 infos
de



TABLE1 dans TABLE2
TABLE2.Edit
End If
'Boucle d'ecriture des 8 valeurs
Contact,Politesse,....,Email

GoSub EcrireInfo
'Aller au contact suivant dans TABLE2
TABLE2.MoveNext
Next CONTACT
End If
End If
TABLE1.Close
TABLE2.Close
Exit Function

AjouterContact:
TABLE2.AddNew
TABLE2!NClient = TABLE1!NClient
Return

EcrireInfo:
For InfoContact = 1 To 8
IndiceInfo = 8 * (CONTACT - 1) + InfoContact + X
TABLE2.Fields.Item(InfoContact + 1) =
TABLE1.Fields.Item(IndiceInfo)

Next Info
TABLE2.Update
Return
End Function

.



.






1 2 3