OVH Cloud OVH Cloud

Concaténer les valeurs d'un champ

8 réponses
Avatar
PatCatNats
Bonsoir,

Je cherche (mais ne trouve pas...) le moyen de concaténer les valeurs d'un
champs pour mettre dans un état avec des virgules comme séparateur.

Exemple :

J'ai un sous-formulaire en mode continue avec une liste déroulante :

[TableGenre]
[Film] [GenreFilm]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

[TableGenreConcatenner]
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée

Quelqu'un connaît la solution SVP ?

(Le contraire je sais faire si celà interesse quelqu'un...)

Merci

Patrice

8 réponses

Avatar
Ilan
Bonjour,


INSERT INTO TableGenreConcatener (Genre,Film) SELECT Film,
DFirst("Genre","TableGenre","Film=" & Film) & "," &
DLast("Genre","TableGenre","Film=" & Film &
" AND Genre<>'" DFirst("Genre","TableGenre","Film=" & Film) & "'")
FROM TableGenre GROUP BY Film;

J'obtiens au mieux
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée,

Il est peut etre preferable que tu attendes d'autres reponses.

Bonsoir,

Je cherche (mais ne trouve pas...) le moyen de concaténer les valeurs d'un
champs pour mettre dans un état avec des virgules comme séparateur.

Exemple :

J'ai un sous-formulaire en mode continue avec une liste déroulante :

[TableGenre]
[Film] [GenreFilm]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

[TableGenreConcatenner]
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée

Quelqu'un connaît la solution SVP ?

(Le contraire je sais faire si celà interesse quelqu'un...)

Merci

Patrice






Avatar
PatCatNats
Merci,

J'essaies dès demain car ce soir je suis un peu crevé...
Je tiens au courant

Bonne nuit

Patrice

"Ilan" a écrit dans le message de
news:
Bonjour,


INSERT INTO TableGenreConcatener (Genre,Film) SELECT Film,
DFirst("Genre","TableGenre","Film=" & Film) & "," &
DLast("Genre","TableGenre","Film=" & Film &
" AND Genre<>'" DFirst("Genre","TableGenre","Film=" & Film) & "'")
FROM TableGenre GROUP BY Film;

J'obtiens au mieux
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée,

Il est peut etre preferable que tu attendes d'autres reponses.

Bonsoir,

Je cherche (mais ne trouve pas...) le moyen de concaténer les valeurs
d'un


champs pour mettre dans un état avec des virgules comme séparateur.

Exemple :

J'ai un sous-formulaire en mode continue avec une liste déroulante :

[TableGenre]
[Film] [GenreFilm]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

[TableGenreConcatenner]
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée

Quelqu'un connaît la solution SVP ?

(Le contraire je sais faire si celà interesse quelqu'un...)

Merci

Patrice








Avatar
3stone
Salut,

"PatCatNats"
Je cherche (mais ne trouve pas...) le moyen de concaténer les valeurs d'un
champs pour mettre dans un état avec des virgules comme séparateur.

Exemple :

J'ai un sous-formulaire en mode continue avec une liste déroulante :

[TableGenre]
[Film] [GenreFilm]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

[TableGenreConcatenner]
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée

Quelqu'un connaît la solution SVP ?



L'idée est de faire une fonction comme ceci:


fnConcatGenreFilm(NoFilm as integer) as string

Dim dbs As DAO.Database
Dim rst As DAO.Recordset
dim MonString as String
dim sSQL as string

MonString = ""
sSQL = "Select Film, GenreFilm From TableGenre Where Film=" & [NoFilm] & ";"

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(sSql)

rst.MoveFirst

Do While Not rst.EOF
MonString = MonString & rst.GenreFilm & ", "
rst.MoveNext
Loop

rst.Close
Set rst = Nothing

'enlever la dernière ","
MonString = Left(MonString,Len(monString)-2)

fnConcatGenreFilm = MonString

end function




Pour la concaténation, tu crée une requête avec "Distinct" et tu utilise
un champ calculé et la fonction pour concaténer les noms des films.

NomDesFilms: fnConcatGenreFilm([Film])


Non testé, mais cela devrait aller (a peu près ;-)



--
A+
Pierre (3stone) Access MVP
~~~~~~~~~~~~~~~~~~~~~~~
http://users.skynet.be/mpfa
http://users.skynet.be/accesshome

Avatar
Ilan
Bonjour,

c'est une requete ou une fonction qui faut faire ?

Pour transferer d'une table a l'autre

Function fnConcatGenreFilm()

Dim dbs As DAO.Database
Dim rstSRC As DAO.Recordset
Dim rstDST As DAO.Recordset
Dim NumFilm as integer
Dim TypeFilm as string
dim sSQL as string

sSQL = "Select Film, GenreFilm From TableGenre ORDER BY Film;"
Set dbs = CurrentDb
Set rstSRC = dbs.OpenRecordset(sSql)

sSQL="Select Film, GenreFilm From TableGenreConcatenner;"
set rstDSTÛs.Openrecordset(sSQL)

rstSRC.MoveFirst
NumFilm=0
While Not rstSRC.EOF
If NumFilm<>rstSRC!Film then
If NumFilm<>0 then rstDST.update
rstDST.addnew
rstDST!Film=rstSRC!Film
TypeFilm=rstSRC!GenreFilm
NumFilm=rstSRC!Film
Else
rstDST!GenreFilm=TypeFilm &", " & rstSRC!GenreFilm
End if
rstSRC.movenext
Wend
rstDST.update
rstDST.close
rstSRC.close
dbs.close
End function
Avatar
PatCatNats
Bonsoir,

J'en suis là (2 erreurs) :
- J'ai une erreur dans la condition Where de ma 1ère requête
- D'autre part si le mot est composé en plusieurs parties comme DESSIN
ANIME, l'action ne se fait pas


Private Sub BtnConcatener_Click()
Dim StrSql As String
Dim dbs As DAO.Database
Dim rstSRC As DAO.Recordset
Dim rstDST As DAO.Recordset
Dim NumFilm As Integer
Dim TypeFilm As String
Dim sSQL As String

'Sélectionne les données GenreFilm du film affiché sur le formulaire en
cours
sSQL = "Select Film, GenreFilm From TableGenre ORDER BY Film" & _
"Where Film From TableGenre = " & Me.Film & ";"
Set dbs = CurrentDb
Set rstSRC = dbs.OpenRecordset(sSQL) 'Message d'erreur : Opérateur
absent dans Where

'Suprime la ligne du film affiché sur le formulaire en cours
StrSql = "DELETE TableGenreConcatenner.* " & _
"FROM TableGenreConcatenner " & _
"WHERE TableGenreConcatenner.Film = " & Me.Film & ";"
CurrentDb.Execute StrSql

'Copie les données concatenées avec séparateur (, ) dans
TableGenreConcatenner
sSQL = "Select Film, GenreFilm From TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)

rstSRC.MoveFirst
NumFilm = 0
While Not rstSRC.EOF
If NumFilm <> rstSRC!Film Then
If NumFilm <> 0 Then rstDST.Update
rstDST.AddNew
rstDST!Film = rstSRC!Film
TypeFilm = rstSRC!GenreFilm
NumFilm = rstSRC!Film
Else
rstDST!GenreFilm = TypeFilm & ", " & rstSRC!GenreFilm
End If
rstSRC.MoveNext
Wend
rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub


Merci de bien vouloir me corriger et d'améliorer...

Patrice



"PatCatNats" a écrit dans le message de
news:cm8itv$se7$
Bonsoir,

Je cherche (mais ne trouve pas...) le moyen de concaténer les valeurs d'un
champs pour mettre dans un état avec des virgules comme séparateur.

Exemple :

J'ai un sous-formulaire en mode continue avec une liste déroulante :

[TableGenre]
[Film] [GenreFilm]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

[TableGenreConcatenner]
[Film] [GenreFilm]
1 Dramatique, Comédie
2 Fantastique, Humour
3 Dessin animée

Quelqu'un connaît la solution SVP ?

(Le contraire je sais faire si celà interesse quelqu'un...)

Merci

Patrice





Avatar
Ilan
Bonjour,

j'ai corrige une cht'tite erreur. TypFilm le dernier champ n'etait pas pris
en compte
Quant a la condition WHERE ?? Y en a pas dans le code ?

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est vide.

Function fnConcatGenreFilm()
Dim dbs As DAO.Database
Dim rstSRC As DAO.Recordset
Dim rstDST As DAO.Recordset
Dim NumFilm As Integer
Dim sSQL As String
Dim ToBeSaved as Boolean

sSQL = "Select Film, Genre As GenreFilm From TableGenre ORDER BY Film;"
Set dbs = CurrentDb
Set rstSRC = dbs.OpenRecordset(sSQL)
sSQL = "Select Film, Genre As GenreFilm FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst
NumFilm = 0
Tobesavedúlse
While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update : Tobesavedúlse
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst("Film=" & rstSRC!Film)
if rstDST.NoMatch then
rstDST.AddNew
Else
rstDST.Edit
Endif
rstDST!Film = rstSRC!Film
rstDST!GenreFilm = rstSRC!GenreFilm
NumFilm = rstSRC!Film
tobesaved=true
Else
rstDST!GenreFilm = rstSRC!GenreFilm & ", " & rstDST!GenreFilm
End If
rstSRC.MoveNext
Wend
If Tobesaved then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close
End Function
Avatar
PatCatNats
Bonsoir,

J'ai essayé ton code, mais celà ne fonctionne pas :o(((
Sur la ligne :
Set rstSRC = dbs.OpenRecordset(sSQL)
Erreur d'exécution '3061':
Trop peu de paramètres. 1 attendu.

Quant a la condition WHERE ?? Y en a pas dans le code ?


Comme je mets le code sur un évènement (Bouton) je souhaitais que la
sélection ne se fasse que sur le film du contrôle de mon formulaire...

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est
vide.


Dans ce cas il faudrait alors que la table TableGenreConcatenner soit une
Temp et que j'ajoute une requête ajout pour une table TableGenreConcatenner
"Définitive, histoire de stocker "l'historique" ???!!!...

(Si tu veux regarder mon bidouillage, j'ai créé une base spécialement pour
étudier mon blème. Je peux te l'envoyer.)

Merci de ton aide

Patrice
!!!! ///
( @ @ )
-------oOOo--(_)--oOOo------
(Pour m'écrire directement, enlever BZH à mon adresse)

"Ilan" a écrit dans le message de
news:
Bonjour,

j'ai corrige une cht'tite erreur. TypFilm le dernier champ n'etait pas
pris

en compte
Quant a la condition WHERE ?? Y en a pas dans le code ?

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est
vide.


Function fnConcatGenreFilm()
Dim dbs As DAO.Database
Dim rstSRC As DAO.Recordset
Dim rstDST As DAO.Recordset
Dim NumFilm As Integer
Dim sSQL As String
Dim ToBeSaved as Boolean

sSQL = "Select Film, Genre As GenreFilm From TableGenre ORDER BY Film;"
Set dbs = CurrentDb
Set rstSRC = dbs.OpenRecordset(sSQL)
sSQL = "Select Film, Genre As GenreFilm FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst
NumFilm = 0
Tobesavedúlse
While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update : Tobesavedúlse
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst("Film=" & rstSRC!Film)
if rstDST.NoMatch then
rstDST.AddNew
Else
rstDST.Edit
Endif
rstDST!Film = rstSRC!Film
rstDST!GenreFilm = rstSRC!GenreFilm
NumFilm = rstSRC!Film
tobesaved=true
Else
rstDST!GenreFilm = rstSRC!GenreFilm & ", " & rstDST!GenreFilm
End If
rstSRC.MoveNext
Wend
If Tobesaved then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close
End Function




Avatar
Ilan
Bonsoir,
effectivement, j'ai modifie le nom des champs GenreFilm(=>Genre) dans les
deux requetes. Il te suffit de le remplacer par le bon nom.

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est
vide.

J'ai corrige le pb apres avoir ecris cette remarque. Le code marche meme

quand la table TableGenreConcatenner n'est pas vide.






Bonsoir,

J'ai essayé ton code, mais celà ne fonctionne pas :o(((
Sur la ligne :
Set rstSRC = dbs.OpenRecordset(sSQL)
Erreur d'exécution '3061':
Trop peu de paramètres. 1 attendu.

Quant a la condition WHERE ?? Y en a pas dans le code ?


Comme je mets le code sur un évènement (Bouton) je souhaitais que la
sélection ne se fasse que sur le film du contrôle de mon formulaire...

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est
vide.


Dans ce cas il faudrait alors que la table TableGenreConcatenner soit une
Temp et que j'ajoute une requête ajout pour une table TableGenreConcatenner
"Définitive, histoire de stocker "l'historique" ???!!!...

(Si tu veux regarder mon bidouillage, j'ai créé une base spécialement pour
étudier mon blème. Je peux te l'envoyer.)

Merci de ton aide

Patrice
!!!! ///
( @ @ )
-------oOOo--(_)--oOOo------
(Pour m'écrire directement, enlever BZH à mon adresse)

"Ilan" a écrit dans le message de
news:
Bonjour,

j'ai corrige une cht'tite erreur. TypFilm le dernier champ n'etait pas
pris

en compte
Quant a la condition WHERE ?? Y en a pas dans le code ?

En revanche ca fonctionne que lorsque la table TableGenreConcatenner est
vide.


Function fnConcatGenreFilm()
Dim dbs As DAO.Database
Dim rstSRC As DAO.Recordset
Dim rstDST As DAO.Recordset
Dim NumFilm As Integer
Dim sSQL As String
Dim ToBeSaved as Boolean

sSQL = "Select Film, Genre As GenreFilm From TableGenre ORDER BY Film;"
Set dbs = CurrentDb
Set rstSRC = dbs.OpenRecordset(sSQL)
sSQL = "Select Film, Genre As GenreFilm FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst
NumFilm = 0
Tobesavedúlse
While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update : Tobesavedúlse
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst("Film=" & rstSRC!Film)
if rstDST.NoMatch then
rstDST.AddNew
Else
rstDST.Edit
Endif
rstDST!Film = rstSRC!Film
rstDST!GenreFilm = rstSRC!GenreFilm
NumFilm = rstSRC!Film
tobesaved=true
Else
rstDST!GenreFilm = rstSRC!GenreFilm & ", " & rstDST!GenreFilm
End If
rstSRC.MoveNext
Wend
If Tobesaved then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close
End Function