Concaténation n à n enregistrements

gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011 - 27 sept. 2009 à 19:47
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 - 29 sept. 2009 à 14:56
Bonjour à tous,

Légèrement newbie en vba. J'ai deux tables dont les structures sont identiques :

Table1
(Pk)pkValeurTerme
nomTerme

Table2
(Pk)pkValeurTerme
nomTerme

Je souhaiterais créer n enregistrements dans une Table 3 en concaténant chaque nomTerme de table 1 avec chaque nomTerme de table2, et que le pkValeurTerme de Table3 soit l'addition des deux pkValeur de Table1 et Table2
Pas de problème pour créer la nouvelle table : c'est le plus simple. Par contre pour faire les n enregistrements

Exemple :
table 1
pkValeurTerme | nomTerme
1 | terme1
2 | terme2

table 2
201 | terme201
211 | terme202

Et je voudrais avoir
table3
202 | terme1 terme201
212 | terme1 terme202
203 | terme2 terme201
213 | terme2 terme202

Par avance merci mille fois pour le temps passé à lire ce post et à y répondre

12 réponses

cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
27 sept. 2009 à 22:13
Bonjour,

Il t'es vrament indispensable de créer une nouvelle table avec de nouvelles valeurs de clées ?

Parce que une requête comme "SELECT Table1.Label, Table2.Label FROM Table1, Table2" fera très bien le travail.
0
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
27 sept. 2009 à 22:17
Oups, désolé j'avais mal lu ce que tu disais pour pkValeurTerme de la table 3. La requête deviendrait :

SELECT
Table1.pkValeurTerme + Table2.pkValeurTerme AS pkValeurTerme,
Table1.Label,
Table2.Label
FROM Table1, Table2;
0
gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011
27 sept. 2009 à 23:51
Merci beaucoup pour ta réponse je l'essaie de suite et ai aussi cette solution qui fonctionne pour ceux que ça intéresse

INSERT INTO Table3 (pkValeurTerme,NomTerme)
SELECT T1.pkValeurTerme + T2.pkValeurTerme, T1.NomTerme & " " & T2.NomTerme
FROM Table1 AS T1, Table2 AS T2
0
cs_Ayr Messages postés 221 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 13 décembre 2009 2
27 sept. 2009 à 23:58
Heu... dans mon exemple il fallait remplacer Label par NomTerme... Je fais des tests et je ne fais pas attention à ce que je poste...

En effet tu peux créer une table et y ajouter les éléments de cette manière. Je te parlais de requête simplement parce que ça t'évite d'avoir des données en double (donc base de données qui enfle) et aussi de devoir recréer la table chaque fois que de nouvelles données sont insérées dans les table 1 et 2.
Pour toi c'est transparent car chaque fois que tu ouvre la requête c'est comme si tu avais ta table3 mais toujours automatiquement à jour.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011
28 sept. 2009 à 02:04
En réalité ça marche presque parfaitement comme ça mais j'ai un problème avec l'insertion d'espaces ou d'un signe plus entre T1.NomTerme et T2.NomTerme

Voici mon code :

Option Compare Database

Private Sub Commande2_Click()

'Définition de Var
Dim rstResultats  As DAO.Recordset
Dim rstCount As Integer
Dim nouvTable As String
Dim ancTable As String
Dim mySqlCreate As String
Dim myCounter As Integer
Dim mySqlReqSupp As String
Dim mySpc As String

'Setup variables
Set rstResultats = CurrentDb.OpenRecordset("TableTermes0")
rstCount = rstResultats.RecordCount
mySpc = "+"
'Création des tables supplémentaires
For myCounter = 1 To rstCount
    nouvTable = "TableTermes" & myCounter
'    myCounterBack = myCounter - 1
    ancTable = "TableTermes" & myCounter - 1
    mySqlCreate = "CREATE TABLE " & nouvTable & " ([NumTermReq] Integer, [RequeteCombinee] text (255))"
    DoCmd.RunSQL mySqlCreate
    
    mySqlReqSupp = "INSERT INTO " & nouvTable & "(NumTermReq,RequeteCombinee) "
    mySqlReqSupp = mySqlReqSupp & " SELECT T1.NumTermReq + T2.NumTermReq, T1.RequeteCombinee & " & mySpc & " & T2.RequeteCombinee FROM "
    mySqlReqSupp = mySqlReqSupp & ancTable
    mySqlReqSupp = mySqlReqSupp & " AS T1, "
    mySqlReqSupp = mySqlReqSupp & ancTable
    mySqlReqSupp = mySqlReqSupp & " AS T2"
    
    DoCmd.SetWarnings False
    DoCmd.RunSQL mySqlReqSupp
    DoCmd.SetWarnings True

Next
End Sub 


Que j'attribue la valeur + ou " " c.à.d un nbsp à mySpc ça me renvoie une erreur de syntaxe : je m'en remets à vos neurones et votre savoir-faire car visiblement les miens ne sont pas suffisants sur ce coup. Désolé de poser des questions aussi rudimentaires mais naviguant entre les langages je confonds tout. Encore une fois par avance mille mercis.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
28 sept. 2009 à 11:17
bonjour,
il manque des guillemets autour de ton mySpc.

thip
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
28 sept. 2009 à 17:41
je ne suis pas certain d'avoir été clair.
Je voulais dire qu'au lieu de

SELECT T1.pkValeurTerme + T2.pkValeurTerme, T1.NomTerme & " " & T2.NomTerme

tu vas avoir

SELECT T1.pkValeurTerme + T2.pkValeurTerme, T1.NomTerme & & T2.NomTerme

dans ton SQL.
Il faut donc ajouter des guillemets dans la construction de la requête.

thip
0
gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011
28 sept. 2009 à 22:55
Merci de ta réponse. je teste la requête SQL en SELECT ce soir. Pour ceux que ça intéresse voici la traduction SQL du message de tpoinsot :

T1.RequeteCombinee & '" & mySpc & "' & T2.RequeteCombinee FROM "
0
gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011
29 sept. 2009 à 04:03
Rebonsoir,

Je reviens vers vous car j'ai un autre souci: je cherche à repérer et à supprimer dans chaque table créée si les enregistrements contiennent deux fois les termes de la table d'origine: ainsi si on a un nouvel enregistrement qui contient :
dans TableTermes1
Terme1+Terme1
ou Terme2+Terme2
et dans TableTermes2
Terme1+Terme1+Terme2
ou Terme1+Terme2+Terme1
je souhaiterais les supprimer

Pour info, voici la totalité de mon code :
Option Compare Database

Private Sub Commande2_Click()

'Définition de Var
Dim rstResultats  As DAO.Recordset
Dim rstTemp  As DAO.Recordset

Dim rstCount As Integer
Dim myCounter As Integer

Dim nouvTable As String
Dim ancTable As String
'Dim ancTable2 As String
Dim origTable As String

Dim mySqlCreate As String
Dim mySqlReqSupp As String
Dim mySpc As String

'Setup variables
Set rstResultats = CurrentDb.OpenRecordset("TableTermes0")
rstCount = rstResultats.RecordCount
mySpc = "+"

'Création des tables supplémentaires
For myCounter = 1 To rstCount
    nouvTable = "TableTermes" & myCounter
    ancTable = "TableTermes" & myCounter - 1
    'ancTable2 = "TableTermes" & myCounter - 2
    origTable = "TableTermes0"
    mySqlCreate = "CREATE TABLE " & nouvTable & " ([NumTermReq] Integer, [RequeteCombinee] text (255))"
    DoCmd.RunSQL mySqlCreate
    
    mySqlReqSupp = "INSERT INTO " & nouvTable & " (NumTermReq,RequeteCombinee) "
    mySqlReqSupp = mySqlReqSupp & " SELECT T1.NumTermReq + T2.NumTermReq, T1.RequeteCombinee & '" & mySpc & "' & T2.RequeteCombinee FROM "

    If myCounter = 1 Then
    mySqlReqSupp = mySqlReqSupp & ancTable & " AS T1, "
    mySqlReqSupp = mySqlReqSupp & ancTable & " AS T2"
    Else
    mySqlReqSupp = mySqlReqSupp & ancTable & " AS T1, "
    mySqlReqSupp = mySqlReqSupp & origTable & " AS T2"
    End If
    
    DoCmd.SetWarnings False
    DoCmd.RunSQL mySqlReqSupp
    DoCmd.SetWarnings True

'Et là ce qui me pose problème !!!

'rstTemp = CurrentDb.OpenRecordset(nouvTable)
'With rstTemp
'Do While Not .EOF
    
    'Un truc du type If TablesTermes0.RequeteCombinee is in nouvelenregestriment >1 then delete
    
    'mySqlreqDoubTerm = " SELECT T3.NumTermReq, T3.RequeteCombinee FROM " & nouvTable & " WHERE (((TablesTermes0.RequeteCombinee) "
    'mySqlreqDoubTerm = mySqlreqDoubTerm & " In (SELECT [RequeteCombinee] FROM [" & nouvTable & "] As T3 GROUP BY [NumTermReq] HAVING Count(*)>1 ))) "
    'mySqlreqDoubTerm = mySqlreqDoubTerm & " ORDER BY TableTermes1.NumTermReq "
    
    'DoCmd.SetWarnings False
    'DoCmd.RunSQL mySqlreqDoubTerm
    'DoCmd.SetWarnings True

'.MoveNext
'Loop
'End With

Next

End Sub



Bien sûr je vous remercie encore une fois (même dix mille), j'en deviens peut-être ridicule, mais sans vous je crois que j'atteindrai la retraite avant de trouver les solutions.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
29 sept. 2009 à 09:30
Salut,
j'ai peut-être lu trop vite, mais il me semble qu'il suffit de mettre un index unique sur le champ et gérer les erreurs d'insertion quand elles se présentent.


thip
0
gilbertpepere Messages postés 7 Date d'inscription lundi 15 novembre 2004 Statut Membre Dernière intervention 8 avril 2011
29 sept. 2009 à 10:47
Salut à toi tpoinsot et merci pour ta réponse.

Non ce n'est pas tout à fait une histoire de doublons :

dans TableTermes1
Terme1+Terme1
ou Terme2+Terme2

et dans TableTermes2
Terme1+Terme1+Terme2
ou Terme1+Terme2+Terme1

Je souhaite pouvoir rechercher Terme1 dans enregistrements générés à volée par t1.requetecombinee dans
mysqlcreate = "create table " & nouvtable & " ([numtermreq] integer, [requetecombinee] text (255))"
    docmd.runsql mysqlcreate
    
    mysqlreqsupp = "insert into " & nouvtable & " (numtermreq,requetecombinee) "
    mysqlreqsupp = mysqlreqsupp & " select t1.numtermreq + t2.numtermreq, t1.requetecombinee & '" & myspc & "' & t2.requetecombinee from "

Et supprimer les enregistrements où il est deux fois préesnt dans la chaîne.
Eventuellement cela peut aussi se faire par concaténation du champ numtermreq, en le transformant en txt en séparant les valeurs par un "_" par ex et avec attribution valeur unique aux termes originaux rechercher si cette valeur est répétée deux fois dans les nouveaux enregistrements des nouvelles tables et supprimer par exemple :

Terme1+Terme1+Terme2
ou Terme1+Terme2+Terme1

ou avec valeur
01_01_02
01_02_01

Merci par avance de me lirer, et éventuellement de me répondre.
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
29 sept. 2009 à 14:56
Oui mais ça peut durer longtemps, et après il y aura une table t4, ...
Je ne suis même pas certain d'avoir compris ton objectif.

Tu ne voudrais pas créer des tables intermédiaires ?
imagine tdetail(id, terme)
avec index unique (j'insiste) sur les 2 champs.
id = futur identifiant (l'addition des anciens id);
si ton terme apparait plusieurs fois pour le même id, l'insertion ne se fera pas (attention à gérer les erreurs).

Quand la table est remplie, tu n'as plus qu'à créer la table finale avec le même id et la concaténation des termes séparés avec ce que tu veux (+ ou espace).

L'avantage, c'est la dimension variable.

thip
0
Rejoignez-nous