OVH Cloud OVH Cloud

Copier d'une table à une autre

5 réponses
Avatar
Luis
Bonjour,
Depuis un formulaire de saisie ou l'on rentre des=20
cordonn=E9es sur les champs t=E9l=E9phone et mobile je veux=20
alimenter une autre table, pour regrouper tous les no de=20
t=E9l=E9phone et voil=E0 ce que j'ai fait:

Private Sub TEL_LostFocus()
Id =3D [IDINCRIT]
=20
Dim Crit=E8re As String, MaBD As Database, MaTable As=20
Recordset

Set MaBD =3D DBEngine.Workspaces(0).Databases(0)
Set MaTable =3D MaBD.OpenRecordset("TELEPHONESREPORTES",=20
dbOpenDynaset)
MaTable.MoveFirst=20
Do Until MaTable.EOF=20
=20
TESTER =3D MaTable!Id
If TESTER =3D Id Then
TEL =3D MaTable!TELEPHONEREPORTE
If TELEPHONEREPORTE =3D TEL 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!Id =3D IDINCRIT =20
MaTable!TELEPHONEREPORTE =3D TEL
MaTable!DOMAINE =3D DOMAINE
MaTable.Update
MaTable.Close
Else
MaTable.Close
End If
End Sub

J'ai un probl=E8me:
=E0 chaque passage sur le champ "TEL" du formulaire il se=20
cr=E9e une nouvelle entr=E9e dans la table "TELEPHONESREPORTES"
Comment =E9viter =E7a?
Merci pour vos pr=E9cieux conseils.
Luis

5 réponses

Avatar
Gilles
Bonjour,
Depuis un formulaire de saisie ou l'on rentre des
cordonnées sur les champs téléphone et mobile je veux
alimenter une autre table, pour regrouper tous les no de
téléphone et voilà ce que j'ai fait:
...
J'ai un problème:
à chaque passage sur le champ "TEL" du formulaire il se
crée une nouvelle entrée dans la table "TELEPHONESREPORTES"
Comment éviter ça?
Merci pour vos précieux conseils.
Luis


Bonjour, Luis

Tout d'abord, il est préférable de placer ta procédure sur clic d'un bouton,
ainsi elle sera exécutée seulement quand l'utilisateur le décidera.
Par ailleurs, je me suis permis de reprendre entièrement ta procédure et de
la simplifier.
Voila ce que cela donne:

Private Sub AjoutTelephone()
Dim Critère As String, MaBD As Database, MaTable As Recordset
Set MaBD = DBEngine.Workspaces(0).Databases(0)
Set MaTable = MaBD.OpenRecordset("SELECT * FROM TELEPHONESREPORTES WHERE
ID=" & [IDINCRIT] & " AND TELEPHONEREPORTE=" & [TEL]", dbOpenDynaset)
If MaTable.EOF Then
' Le recordset est vide, donc pas d'enregistrement correspondant
MaTable.AddNew
MaTable!ID = [IDINCRIT]
MaTable!TELEPHONEREPORTE = [TEL]
MaTable!DOMAINE = [DOMAINE]
MaTable.Update
End If
End Sub

Cela te convient-il ?

Bonne continuation

Avatar
Luis
Bonjour,
Grâce à ce que tu viens de me donner j'ai trouvé:
Function AjoutTelephone()

Dim Table1 As Recordset
Dim Table2 As Recordset
Dim TELEPHONEREPORTEDEF As Integer,
InfoTELEPHONEREPORTEDEF As Integer,
IndiceTELEPHONEREPORTEDEF As Integer
Set Db = CurrentDb

Set Table1 = Db.OpenRecordset("SELECT IDINSCRIT, [TEL],
[DOMAINE] FROM INSCRITS WHERE IDINSCRIT =" & Forms![TOUS
INSCRITS].IDINSCRIT)
Set Table2 = Db.OpenRecordset("SELECT ID,
[TELEPHONEREPORTE],[DOMAINE] FROM [TELEPHONESREPORTES]
ORDER BY id;")

If Not (Table1.BOF And Table1.EOF) Then
Table2.FindFirst ("ID=" & Table1!IDINSCRIT)
If Table2.NoMatch Then
For TELEPHONEREPORTE = 1 To 1
GoSub AjouterTELEPHONEREPORTEDEF
GoSub EcrireTELEPHONEREPORTEDEF
Next TELEPHONEREPORTE
Else
For TELEPHONEREPORTE = 1 To 1
If Table2.EOF Then
GoSub AjouterTELEPHONEREPORTEDEF
Else
If Table2!Id <> Table1!IDINSCRIT Then
GoSub AjouterTELEPHONEREPORTEDEF
Else
Table2.Edit
End If
End If
GoSub EcrireTELEPHONEREPORTEDEF

If Not Table2.EOF Then Table2.MoveNext

Next TELEPHONEREPORTE
End If
End If
Table1.Close
Table2.Close
Exit Function

AjouterTELEPHONEREPORTEDEF:
Table2.AddNew
Table2!Id = Table1!IDINSCRIT
Return

EcrireTELEPHONEREPORTEDEF:
For InfoTELEPHONEREPORTEDEF = 1 To 2
IndiceTELEPHONEREPORTEDEF = 2 * (TELEPHONEREPORTE - 1) +
InfoTELEPHONEREPORTEDEF
Table2.Fields.Item(InfoTELEPHONEREPORTEDEF) =
Table1.Fields.Item(IndiceTELEPHONEREPORTEDEF)
Next InfoTELEPHONEREPORTEDEF
Table2.Update
Return
End Function

Avec ça si on repasse sur le champ [TEL], il n'y a pas de
doublons et si on change[TEL], 'TELEPHONEREPORTE' change
aussi.
C'est pas super!!!!
Luis
-----Message d'origine-----
Bonjour,
Depuis un formulaire de saisie ou l'on rentre des
cordonnées sur les champs téléphone et mobile je veux
alimenter une autre table, pour regrouper tous les no de
téléphone et voilà ce que j'ai fait:
...
J'ai un problème:
à chaque passage sur le champ "TEL" du formulaire il se
crée une nouvelle entrée dans la
table "TELEPHONESREPORTES"


Comment éviter ça?
Merci pour vos précieux conseils.
Luis


Bonjour, Luis

Tout d'abord, il est préférable de placer ta procédure
sur clic d'un bouton,

ainsi elle sera exécutée seulement quand l'utilisateur le
décidera.

Par ailleurs, je me suis permis de reprendre entièrement
ta procédure et de

la simplifier.
Voila ce que cela donne:

Private Sub AjoutTelephone()
Dim Critère As String, MaBD As Database, MaTable As
Recordset

Set MaBD = DBEngine.Workspaces(0).Databases(0)
Set MaTable = MaBD.OpenRecordset("SELECT * FROM
TELEPHONESREPORTES WHERE

ID=" & [IDINCRIT] & " AND TELEPHONEREPORTE=" & [TEL]",
dbOpenDynaset)

If MaTable.EOF Then
' Le recordset est vide, donc pas
d'enregistrement correspondant

MaTable.AddNew
MaTable!ID = [IDINCRIT]
MaTable!TELEPHONEREPORTE = [TEL]
MaTable!DOMAINE = [DOMAINE]
MaTable.Update
End If
End Sub

Cela te convient-il ?

Bonne continuation


.




Avatar
Gilles
Bonjour,
Grâce à ce que tu viens de me donner j'ai trouvé:
Function AjoutTelephone()
...
End Function

Avec ça si on repasse sur le champ [TEL], il n'y a pas de
doublons et si on change[TEL], 'TELEPHONEREPORTE' change
aussi.
C'est pas super!!!!
Luis


Re,

Il doit commencer à se faire tard parce que je n'ai pas tout compris à ta
fonction !

La variable TELEPHONEREPORTE (non déclarée ou bien est-ce une erreur de
frappe?) est systématiquement égale à 1.
Dans la sous-procédure "Ecrire", la ligne "Indice = 2 * (TELEPHONEREPORTE -
1) + Info" équivaut donc à :
"Indice = 2 * (1 - 1) + Info"
=> "Indice = 2 * (0) + Info"
=> "Indice = 0 + Info"
=> "Indice = Info"
Dans cette sous-procédure, tu recopies donc les deux premiers champs de
Table1 dans les deux premiers de Table2. Est-ce vraiment ce que tu veux ?

Peut-être faudrait-il me ré-expliquer tes besoins "en français" et me donner
quelques indices sur la signification de tes champs et de tes tables ?

Sur ces considérations, je te souhaite une bonne soirée.
A demain (avec des neurones neuves et montées dans le bon sens ;-))

Avatar
Luis
Bonjour Gilles

TELEPHONEREPORTE n'a pas de faute de frappe,
TELEPHONEREPORTE est un champ de la Table2

Maintenant je t'explique (comme tu dis si bien, en
français) la totalité de la solution que je veux trouver :

Il y a une table 'INCRITS', une table 'CLIENTS' et une
table 'FOURNISSEURS'.

Je veux récupérer dans une seul table les numéros de
téléphones regroupés dans un champs appelé
TELEPHONEREPORTE , depuis la Table 'INCRITS', la
table 'CLIENTS' et la table 'FOURNISSEURS' je copie les
numéros de [téléphone + IDINCRIT + DOMAINE] [téléphone +
IDCLIENT+ DOMAINE] [téléphone + IDFOURNISSEUR+ DOMAINE].

DOMAINE est un identificateur qui désigne s'il s'agit d'un
inscrit, d'un client ou d'un fournisseur.

Donc j'ai trois fois le code concerné :
1. dans le formulaire INSCRITS
2. dans le formulaire CLIENTS (adapté à la table
CLIENTS)
3. dans le formulaire FOURNISSEURS (adapté à la Table
FOURNISSEURS)

Dans le menu principal de la base de données j'ai un
Champ 'Zone de liste déroulante' avec une requête basée
sur la Table2.
Lorsque l'on m'appelle au téléphone j'ai le no qui
s'affiche sur le poste (de téléphone).
Je saisi vite le no de téléphone affichée dans le
champ 'Zone de liste déroulante' et sur clic de ce Champ,
repère le domaine et ouvre le formulaire de l'inscrit ou
du client ou du fournisseur d'après le no ID.

Voilà pour l'explication, j'espère que j'ai réussi à être
un peu plus clair je reconnais que l'on me reproche d'être
un peu brouillon dans mes explications.
Si quelque chose te chicane, dit-le moi.
Luis

-----Message d'origine-----
Bonjour,
Grâce à ce que tu viens de me donner j'ai trouvé:
Function AjoutTelephone()
...
End Function

Avec ça si on repasse sur le champ [TEL], il n'y a pas
de


doublons et si on change[TEL], 'TELEPHONEREPORTE' change
aussi.
C'est pas super!!!!
Luis


Re,

Il doit commencer à se faire tard parce que je n'ai pas
tout compris à ta

fonction !

La variable TELEPHONEREPORTE (non déclarée ou bien est-ce
une erreur de

frappe?) est systématiquement égale à 1.
Dans la sous-procédure "Ecrire", la ligne "Indice = 2 *
(TELEPHONEREPORTE -

1) + Info" équivaut donc à :
"Indice = 2 * (1 - 1) + Info"
=> "Indice = 2 * (0) + Info"
=> "Indice = 0 + Info"
=> "Indice = Info"
Dans cette sous-procédure, tu recopies donc les deux
premiers champs de

Table1 dans les deux premiers de Table2. Est-ce vraiment
ce que tu veux ?


Peut-être faudrait-il me ré-expliquer tes besoins "en
français" et me donner

quelques indices sur la signification de tes champs et de
tes tables ?


Sur ces considérations, je te souhaite une bonne soirée.
A demain (avec des neurones neuves et montées dans le bon
sens ;-))



.




Avatar
Gilles
Bonjour Gilles
...
Il y a une table 'INCRITS', une table 'CLIENTS' et une
table 'FOURNISSEURS'.
Je veux récupérer dans une seul table les numéros de
téléphones regroupés dans un champs appelé
TELEPHONEREPORTE , depuis la Table 'INCRITS', la
table 'CLIENTS' et la table 'FOURNISSEURS' je copie les
numéros de [téléphone + IDINCRIT + DOMAINE] [téléphone +
IDCLIENT+ DOMAINE] [téléphone + IDFOURNISSEUR+ DOMAINE].
DOMAINE est un identificateur qui désigne s'il s'agit d'un
inscrit, d'un client ou d'un fournisseur.
Donc j'ai trois fois le code concerné :
1. dans le formulaire INSCRITS
2. dans le formulaire CLIENTS (adapté à la table
CLIENTS)
3. dans le formulaire FOURNISSEURS (adapté à la Table
FOURNISSEURS)
Dans le menu principal de la base de données j'ai un
Champ 'Zone de liste déroulante' avec une requête basée
sur la Table2.
Lorsque l'on m'appelle au téléphone j'ai le no qui
s'affiche sur le poste (de téléphone).
Je saisi vite le no de téléphone affichée dans le
champ 'Zone de liste déroulante' et sur clic de ce Champ,
repère le domaine et ouvre le formulaire de l'inscrit ou
du client ou du fournisseur d'après le no ID.
...


Bonjour, Luis

Je commence à y voir plus clair. Maintenant, une question:
quand tu modifies le numéro d'un inscrit, client ou fournisseur sur sa
fiche, veux-tu que le numéro soit aussi modifié dans la table des téléphones
reportés ou que le nouveau numéro soit ajouté aux précédents ?
Pour l'ajouter, voici une adaptation de ma réponse initiale:

Private Sub AjoutTelephone()
Dim Critère As String, MaBD As Database, MaTable As Recordset
Set MaBD = DBEngine.Workspaces(0).Databases(0)
Set MaTable = MaBD.OpenRecordset("SELECT * FROM TELEPHONESREPORTES WHERE
ID=" & [IDINCRIT] & " AND TELEPHONEREPORTE=" & [TEL] & " AND DOMAINE=" &
[DOMAINE], dbOpenDynaset)
If MaTable.EOF Then
' Le recordset est vide, donc pas d'enregistrement correspondant
MaTable.AddNew
MaTable!ID = [IDINCRIT]
MaTable!TELEPHONEREPORTE = [TEL]
MaTable!DOMAINE = [DOMAINE]
MaTable.Update
End If
Set MaBD = Nothing
Set MaTable = Nothing
End Sub

Pour le modifier:

Private Sub MiseAJourTelephone()
Dim Critère As String, MaBD As Database, MaTable As Recordset
Set MaBD = DBEngine.Workspaces(0).Databases(0)
Set MaTable = MaBD.OpenRecordset("SELECT * FROM TELEPHONESREPORTES WHERE
ID=" & [IDINCRIT] & " AND DOMAINE=" & [DOMAINE], dbOpenDynaset)
If MaTable.EOF Then
' Le recordset est vide, donc pas d'enregistrement correspondant
MaTable.AddNew
MaTable!ID = [IDINCRIT]
MaTable!DOMAINE = [DOMAINE]
Else
MaTable.MoveFirst
MaTable.Edit
End If

MaTable!TELEPHONEREPORTE = [TEL]
MaTable.Update
Set MaBD = Nothing
Set MaTable = Nothing
End Sub

A adapter pour les trois cas.
Si je n'ai encore pas tout compris, dis-le moi mais ne crois pas que ce soit
de ta faute; quand on a "la tête dans le guidon", ce n'est pas toujours
évident de décrire son problème à une personne externe mais, au moins, cela
permet de remettre les choses à plat.

Bon courage