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

Concaténer les valeurs d'un champ (Suite)

7 réponses
Avatar
PatCatNats
...(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les premiers
provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante pour
l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a été pris
en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice

7 réponses

Avatar
Eric
Bonjour PatCatNats,

Je vais être un peu long.

2 choses me gènent dans ton problème.
La 1ère est relative à la structure de ta base à savoir que SI un film
peut appartenir à plus d'un genre et un genre concernant plus d'un film,
alors tu es dans le cas d'une relation Plusieurs à Plusieurs et il te
faut donc une table pour gérer cette association, même si celle-ci n'est
pas porteuse d'information. C'est le cas classique de Livre et Mot-clé
(un livre peut être décrit par un ou plusieurs mots-clé, un mot-clé
concerne un(voire 0) ou plusieurs livres). Donc, là il faudrait revoir la
structure : une table Genre(NumGenre(PK), Genre), une table Film(NumFilm
(PK), TitreFilm,...) et une table de liaison qui aurait pour champs
NumFilm et NumGenre, ces 2 champs constituant la Primary Key(PK) de cette
table.

La 2ème est l'instruction :
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
Comment NumFilm qui est un entier peut-il recevoir la concaténation de 2
chaines ?
(Tu dis avoir modifié les noms des champs pour plus de clarté mais c'est
pas évident puisque dans un SQl Genre devient AS GenreFilm et dans
l'autre GenreFilm As Genre. Suis moqueur là ;-) )

Ignorant les remarques précédentes et partant du principe que tu veux
remplir la table TableGenreConcatener à partir de la table TableGenre, le
code ci-dessous devrait faire l'affaire.
Je suppose que la table TableGenreConcatener existe. Elle a 2 champs dans
cet ordre : NumFilm & GenreFilm. De même la table TableGenre a elle aussi
au moins 2 champs et les 2 premiers sont dans cet ordre : Film & Genre

Sub ConcatenationGenreFilm()
' Prévoir de vider la table TableGenreConcatener
' avant d'exécuter la procédure
Dim strSQL As String
strSQL = "Delete * from TableGenreConcatener;"
CurrentDb.Execute strSQL
Dim rst1 As DAO.Recordset, rst2 As DAO.Recordset
Dim Chaine As String, Critere As String
Set rst1 = CurrentDb.OpenRecordset("TableGenre", dbOpenDynaset)
Set rst2 = CurrentDb.OpenRecordset("TableGenreConcatener")
If rst1.BOF Then GoTo Exit_ConcatenationGenreFilm
' rst1(0) correspond au champ Film de la table TableGenre
While Not rst1.EOF
Critere = "Film=" & rst1(0)
rst1.FindFirst Critere
While Not rst1.NoMatch
' rst1(1) <-> champ Genre
Chaine = Chaine & rst1(1) & ", "
rst1.FindNext Critere
Wend
Chaine = Left(Chaine, Len(Chaine) - 2)
rst2.AddNew
' rst2(0) <-> Champ NumFilm
' rst2(1) <-> Champ GenreFilm
rst2(0) = rst1(0)
rst2(1) = Chaine
rst2.Update
Chaine = ""
rst1.MoveNext
Wend
Exit_ConcatenationGenreFilm:
Set rst1 = Nothing
Set rst2 = Nothing
End Sub


A+
Eric

PS: le code ci-dessus peut être mis sur l'évènement clic dun bouton
Avatar
Ilan
Bonjour,

N'importe quoi ?? remplace cette ligne
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre


par
rstDST!Genre=rstSRC!GenreFilm & ", " & rstDST!Genre







....(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les premiers
provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante pour
l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a été pris
en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice





Avatar
Ilan
Voici le code avec les nouveaux noms de champs

tableGenreFilm : Film,Genre
TableGenreFilmConcatenner : Numfilm, GenreFilm

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



....(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les premiers
provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante pour
l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a été pris
en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice





Avatar
PatCatNats
MERCI à tous,

Les 2 codes ci-dessus fonctionnent
(G modifié la ligne [rstDST.FindFirst ("Film=" & rstSRC!Film)] en
[rstDST.FindFirst ("NumFilm=" & rstSRC!Film)] de celui de Ilan)

Je vois le bout du tunnel.

Comme j'ai placé ce code sur un évènement bouton d'un form j'aurais souhaité
que les actions ne concerne que mon contôle [Film] de mon form. Mais je
n'arrive pas à placer la condition Where en direct sans passer par une table
supplémentaire et intermédiare temporaire et des requêtes suppression et
ajout.

Est-ce possible d'alléger ma procédure en évitant cette table temp ?

Si non, ce n'est pas grave, car ENFIN j'ai terminé ma base Cinéthèque grâce
à vos trouvailles.

Merci encore.

Patrice

"PatCatNats" a écrit dans le message de
news:cmi6nl$7p7$
...(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les premiers
provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante
pour

l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a été
pris

en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice




Avatar
Ilan
PatCatNats
si tu veux ajouter une condition WHERE regarde la ligne marquee par < et remplace Film par le nom du control qui contient la valeur.

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

MERCI à tous,

Les 2 codes ci-dessus fonctionnent
(G modifié la ligne [rstDST.FindFirst ("Film=" & rstSRC!Film)] en
[rstDST.FindFirst ("NumFilm=" & rstSRC!Film)] de celui de Ilan)

Je vois le bout du tunnel.

Comme j'ai placé ce code sur un évènement bouton d'un form j'aurais souhaité
que les actions ne concerne que mon contôle [Film] de mon form. Mais je
n'arrive pas à placer la condition Where en direct sans passer par une table
supplémentaire et intermédiare temporaire et des requêtes suppression et
ajout.

Est-ce possible d'alléger ma procédure en évitant cette table temp ?

Si non, ce n'est pas grave, car ENFIN j'ai terminé ma base Cinéthèque grâce
à vos trouvailles.

Merci encore.

Patrice

"PatCatNats" a écrit dans le message de
news:cmi6nl$7p7$
...(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les premiers
provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante
pour

l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a été
pris

en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM TableGenreConcatenner;"
Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice









Avatar
PatCatNats
Tout bonnement GENIAL
Dès que je mets le code en appli je vous soumet à tous ma base cinémathèque
pour exploitation et critiques...

MERCI A TOUS

Patrice

"Ilan" a écrit dans le message de
news:
PatCatNats
si tu veux ajouter une condition WHERE regarde la ligne marquee par < > et remplace Film par le nom du control qui contient la valeur.

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

MERCI à tous,

Les 2 codes ci-dessus fonctionnent
(G modifié la ligne [rstDST.FindFirst ("Film=" & rstSRC!Film)] en
[rstDST.FindFirst ("NumFilm=" & rstSRC!Film)] de celui de Ilan)

Je vois le bout du tunnel.

Comme j'ai placé ce code sur un évènement bouton d'un form j'aurais
souhaité


que les actions ne concerne que mon contôle [Film] de mon form. Mais je
n'arrive pas à placer la condition Where en direct sans passer par une
table


supplémentaire et intermédiare temporaire et des requêtes suppression et
ajout.

Est-ce possible d'alléger ma procédure en évitant cette table temp ?

Si non, ce n'est pas grave, car ENFIN j'ai terminé ma base Cinéthèque
grâce


à vos trouvailles.

Merci encore.

Patrice

"PatCatNats" a écrit dans le message de
news:cmi6nl$7p7$
...(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les
premiers



provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà plante
pour

l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a
été



pris
en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM
TableGenreConcatenner;"



Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice











Avatar
PatCatNats
Le premier module Cinémathèque de ma base Médiathèque est terminé (sf.
petits truc esthétique...)
En vous remerciant tous, ceux qui veulent la télécharger (5040Ko a extraire
dans C:) :

http:95560.patrice.morel.free.frInformatiqueAppliAccesMediatheque.zip

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

"PatCatNats" a écrit dans le message de
news:cmji1t$cc1$
Tout bonnement GENIAL
Dès que je mets le code en appli je vous soumet à tous ma base
cinémathèque

pour exploitation et critiques...

MERCI A TOUS

Patrice

"Ilan" a écrit dans le message de
news:
PatCatNats
si tu veux ajouter une condition WHERE regarde la ligne marquee par < > > et remplace Film par le nom du control qui contient la valeur.

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

MERCI à tous,

Les 2 codes ci-dessus fonctionnent
(G modifié la ligne [rstDST.FindFirst ("Film=" & rstSRC!Film)] en
[rstDST.FindFirst ("NumFilm=" & rstSRC!Film)] de celui de Ilan)

Je vois le bout du tunnel.

Comme j'ai placé ce code sur un évènement bouton d'un form j'aurais
souhaité


que les actions ne concerne que mon contôle [Film] de mon form. Mais
je



n'arrive pas à placer la condition Where en direct sans passer par une
table


supplémentaire et intermédiare temporaire et des requêtes suppression
et



ajout.

Est-ce possible d'alléger ma procédure en évitant cette table temp ?

Si non, ce n'est pas grave, car ENFIN j'ai terminé ma base Cinéthèque
grâce


à vos trouvailles.

Merci encore.

Patrice

"PatCatNats" a écrit dans le message de
news:cmi6nl$7p7$
...(Suite de discussion entammée le 2/11/2004...)

Bonjour à tous,

Je ne m'en sort pas :o((( déjà presque une semaine...

Je reformule mon problème avec de nouveau noms de champs (car les
premiers



provoquaient des références circulaires dans le code...) :


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] [Genre]
1 Dramatique
1 Comédie
2 Fantastique
2 Humour
3 Dessin animée

Je voudrais celà donne dans une nouvelle table :

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

J'ai avancé avec du code construit à l'aide du groupe mais celà
plante




pour
l'instant sur la ligne :

Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre

l-----------------------------------l
l Erreur d'exécution 3021: l
l Aucun enregistrement en cours l
l-----------------------------------l
Après avoir arrêté le débogueur, je m'aperçois que le 2ème champs a
été



pris
en compte mais pas le premier du film 1... soit :

[TableGenreConcatenner]
[NumFilm] [GenreFilm]
1 Comédie

Et si j'insiste :

l-----------------------------------l
l Erreur d'exécution 3421: l
l Erreur de conversion de type l
l-----------------------------------l

Voilà le code :

Private Sub BtnConcatenerNews_Click()
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 NumFilm, GenreFilm As Genre FROM
TableGenreConcatenner;"



Set rstDST = dbs.OpenRecordset(sSQL)
rstSRC.MoveFirst

NumFilm = 0
ToBeSaved = False

While Not rstSRC.EOF
If NumFilm <> 0 Then rstDST.Update: ToBeSaved = False
If NumFilm <> rstSRC!Film Then
rstDST.FindFirst ("NumFilm=" & rstSRC!Film)
If rstDST.NoMatch Then
rstDST.AddNew
Else
rstDST.Edit
End If
rstDST!NumFilm = rstSRC!Film
rstDST!Genre = rstSRC!GenreFilm
NumFilm = rstSRC!Film
ToBeSaved = True
Else
rstDST!NumFilm = rstSRC!GenreFilm & ", " & rstDST!Genre
End If
rstSRC.MoveNext
Wend
If ToBeSaved Then rstDST.Update
rstDST.Close
rstSRC.Close
dbs.Close

End Sub

Merci de m'aider.

Patrice