OVH Cloud OVH Cloud

Séparateur (bis)

6 réponses
Avatar
PatCatNat's
Bonjour à tous,

Grâce à l'aide de tous j'ai réussi à obtenir le résultat que j'attendais et
en suis satisfait. Merci.
(Rappel : A partir d'un champ mémo comportant une série de noms -Acteurs-
séparés par une virgule et un espace, remplir une table avec 1 acteur par
enregistrement et par numéro de fiche film).

Question : J'ai mis des commentaires au regard de mes codes, pouvez vous me
confirmer qu'ils soient corrects, histoire de savoir si j'ai bien compris,
et surtout ne pas communiquer des idioties aux autres.

Merci,

Patrice
'__________________________________________________
Private Sub BtnTrier_Click()
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)
Dim MonTab() As String
Dim MonInd As Integer

On Error GoTo Err_BtnTrier_Click

If Acteurs = "" Or IsNull(Acteurs) Then
MsgBox "Il n'y a pas d'acteurs enregistrés", 48

Else
DoCmd.SetWarnings False
DoCmd.OpenQuery ("R_ActeursFilm_Del ") 'Supprime les enregistrements de
la T_ActeursFilm de l'enregistrement courant du Formulaire
'Transformation des éléments du contrôle [Acteurs] en éléments
distincts :
MonTab = Split(Acteurs, ", ") 'Coupe au séparateur
"virgule+espace"les enregistrements du contrôle "Acteurs" du formulaire
For MonInd = 0 To UBound(MonTab) 'Cré un "tableau" avec chaque
élément trouvé
dbsCurrent.Execute "INSERT INTO [T_Acteurs] (NomActeur) VALUES ('" &
MonTab(MonInd) & "');" ' Tri et ajoute les enregistrements à la T_Acteurs
'Bogue dans la ligne du dessus si un nom d'acteur comporte une
apostrophe (ex : Beverly D'Angelo) ==> Détournement par MsgBox 3075
Next
'Fin de la transformation
DoCmd.OpenQuery ("R_ActeursFilm_Ajout") 'Ajoute les enregistrements de la
T_Acteurs + Le numéro de film à la T_ActeursFilm
DoCmd.OpenQuery ("R_Acteurs_Del ") 'Supprime les enregistrements de la
T_Acteurs

DoCmd.SetWarnings True
ListeActeurs.Requery
DoCmd.Beep
MsgBox "Tri terminé", vbInformation

End If

Set dbsCurrent = Nothing 'Libère la mémoire

'Gestion du message d'erreur n°3075 de Microsoft si un séparateur ou signe
particulier existe :
Exit_BtnTrier_Click:
Exit Sub

Err_BtnTrier_Click:
Select Case Err
Case 3075: Beep: MsgBox "Il ne faut pas de nom avec des apostrophes ou signe
particulier." _
& vbCrLf & "Merci de corriger.", 48, "Erreur de saisie"
Case Else: MsgBox Error$ & " " & Err
End Select
Resume Exit_BtnTrier_Click

End Sub
'________________________________________

6 réponses

Avatar
Raymond [mvp]
Bonjour.

je n'ai pas participé à la conversation, donc je ne connais pas le fond,
mais quelques remarques:
- Indique bien DAO devant database, recordset et querydef.

- ceci
Dim dbsCurrent As DAO.Database
Set dbsCurrent = CurrentDb
est plus simple que
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)

- ceci est plus rapide
If Nz(Acteurs, "") = "" Then
que
If Acteurs = "" Or IsNull(Acteurs) Then

- Pourquoi déclarer une dbsCurrent, si c'est pour passer par des DoCmd ?
pourquoi ne pas mettre tous les sql dans le code ?

- l'index commençant à 0 et le nombre à 1, il faut mettre:
For MonInd = 0 To UBound(montab) -1

- montab = Split(acteurs, ", ")
ne fonctionnera pas pour le dernier acteur car le champ ne peut pas se
terminer par un espace. Il ne faut prendre que la virgule comme délimiteur
et faire un Trim(Montab(Monind)) quand on récupère la donnée.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"PatCatNat's" a écrit dans le message de news:
cjiugj$146$
Bonjour à tous,

Grâce à l'aide de tous j'ai réussi à obtenir le résultat que j'attendais
et
en suis satisfait. Merci.
(Rappel : A partir d'un champ mémo comportant une série de noms -Acteurs-
séparés par une virgule et un espace, remplir une table avec 1 acteur par
enregistrement et par numéro de fiche film).

Question : J'ai mis des commentaires au regard de mes codes, pouvez vous
me
confirmer qu'ils soient corrects, histoire de savoir si j'ai bien compris,
et surtout ne pas communiquer des idioties aux autres.

Merci,

Patrice
'__________________________________________________
Private Sub BtnTrier_Click()
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)
Dim MonTab() As String
Dim MonInd As Integer

On Error GoTo Err_BtnTrier_Click

If Acteurs = "" Or IsNull(Acteurs) Then
MsgBox "Il n'y a pas d'acteurs enregistrés", 48

Else
DoCmd.SetWarnings False
DoCmd.OpenQuery ("R_ActeursFilm_Del ") 'Supprime les enregistrements de
la T_ActeursFilm de l'enregistrement courant du Formulaire
'Transformation des éléments du contrôle [Acteurs] en éléments
distincts :
MonTab = Split(Acteurs, ", ") 'Coupe au séparateur
"virgule+espace"les enregistrements du contrôle "Acteurs" du formulaire
For MonInd = 0 To UBound(MonTab) 'Cré un "tableau" avec chaque
élément trouvé
dbsCurrent.Execute "INSERT INTO [T_Acteurs] (NomActeur) VALUES ('" &
MonTab(MonInd) & "');" ' Tri et ajoute les enregistrements à la T_Acteurs
'Bogue dans la ligne du dessus si un nom d'acteur comporte une
apostrophe (ex : Beverly D'Angelo) ==> Détournement par MsgBox 3075
Next
'Fin de la transformation
DoCmd.OpenQuery ("R_ActeursFilm_Ajout") 'Ajoute les enregistrements de
la
T_Acteurs + Le numéro de film à la T_ActeursFilm
DoCmd.OpenQuery ("R_Acteurs_Del ") 'Supprime les enregistrements de la
T_Acteurs

DoCmd.SetWarnings True
ListeActeurs.Requery
DoCmd.Beep
MsgBox "Tri terminé", vbInformation

End If

Set dbsCurrent = Nothing 'Libère la mémoire

'Gestion du message d'erreur n°3075 de Microsoft si un séparateur ou signe
particulier existe :
Exit_BtnTrier_Click:
Exit Sub

Err_BtnTrier_Click:
Select Case Err
Case 3075: Beep: MsgBox "Il ne faut pas de nom avec des apostrophes ou
signe
particulier." _
& vbCrLf & "Merci de corriger.", 48, "Erreur de saisie"
Case Else: MsgBox Error$ & " " & Err
End Select
Resume Exit_BtnTrier_Click

End Sub
'________________________________________




Avatar
philippe d'isere
merci pour tes reponses Raymond. Je travaille sur le meme projet que Pat. De
mon je souhaite verifier l'existence des noms provenants du tableau dans la
table acteurs afin de ne pas les dupliquer. J'ai essaye la methode findfirst
mais je ne trouve pas la syntaxe exacte (pas d'exemple dans l'aide VB). Créer
une table provisoire et la comparer avec la table acteur avec une requete
serait aussi une solution mais sans doute moins élégante...Qu'en penses-tu ?


Bonjour.

je n'ai pas participé à la conversation, donc je ne connais pas le fond,
mais quelques remarques:
- Indique bien DAO devant database, recordset et querydef.

- ceci
Dim dbsCurrent As DAO.Database
Set dbsCurrent = CurrentDb
est plus simple que
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)

- ceci est plus rapide
If Nz(Acteurs, "") = "" Then
que
If Acteurs = "" Or IsNull(Acteurs) Then

- Pourquoi déclarer une dbsCurrent, si c'est pour passer par des DoCmd ?
pourquoi ne pas mettre tous les sql dans le code ?

- l'index commençant à 0 et le nombre à 1, il faut mettre:
For MonInd = 0 To UBound(montab) -1

- montab = Split(acteurs, ", ")
ne fonctionnera pas pour le dernier acteur car le champ ne peut pas se
terminer par un espace. Il ne faut prendre que la virgule comme délimiteur
et faire un Trim(Montab(Monind)) quand on récupère la donnée.
--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"PatCatNat's" a écrit dans le message de news:
cjiugj$146$
Bonjour à tous,

Grâce à l'aide de tous j'ai réussi à obtenir le résultat que j'attendais
et
en suis satisfait. Merci.
(Rappel : A partir d'un champ mémo comportant une série de noms -Acteurs-
séparés par une virgule et un espace, remplir une table avec 1 acteur par
enregistrement et par numéro de fiche film).

Question : J'ai mis des commentaires au regard de mes codes, pouvez vous
me
confirmer qu'ils soient corrects, histoire de savoir si j'ai bien compris,
et surtout ne pas communiquer des idioties aux autres.

Merci,

Patrice
'__________________________________________________
Private Sub BtnTrier_Click()
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)
Dim MonTab() As String
Dim MonInd As Integer

On Error GoTo Err_BtnTrier_Click

If Acteurs = "" Or IsNull(Acteurs) Then
MsgBox "Il n'y a pas d'acteurs enregistrés", 48

Else
DoCmd.SetWarnings False
DoCmd.OpenQuery ("R_ActeursFilm_Del ") 'Supprime les enregistrements de
la T_ActeursFilm de l'enregistrement courant du Formulaire
'Transformation des éléments du contrôle [Acteurs] en éléments
distincts :
MonTab = Split(Acteurs, ", ") 'Coupe au séparateur
"virgule+espace"les enregistrements du contrôle "Acteurs" du formulaire
For MonInd = 0 To UBound(MonTab) 'Cré un "tableau" avec chaque
élément trouvé
dbsCurrent.Execute "INSERT INTO [T_Acteurs] (NomActeur) VALUES ('" &
MonTab(MonInd) & "');" ' Tri et ajoute les enregistrements à la T_Acteurs
'Bogue dans la ligne du dessus si un nom d'acteur comporte une
apostrophe (ex : Beverly D'Angelo) ==> Détournement par MsgBox 3075
Next
'Fin de la transformation
DoCmd.OpenQuery ("R_ActeursFilm_Ajout") 'Ajoute les enregistrements de
la
T_Acteurs + Le numéro de film à la T_ActeursFilm
DoCmd.OpenQuery ("R_Acteurs_Del ") 'Supprime les enregistrements de la
T_Acteurs

DoCmd.SetWarnings True
ListeActeurs.Requery
DoCmd.Beep
MsgBox "Tri terminé", vbInformation

End If

Set dbsCurrent = Nothing 'Libère la mémoire

'Gestion du message d'erreur n°3075 de Microsoft si un séparateur ou signe
particulier existe :
Exit_BtnTrier_Click:
Exit Sub

Err_BtnTrier_Click:
Select Case Err
Case 3075: Beep: MsgBox "Il ne faut pas de nom avec des apostrophes ou
signe
particulier." _
& vbCrLf & "Merci de corriger.", 48, "Erreur de saisie"
Case Else: MsgBox Error$ & " " & Err
End Select
Resume Exit_BtnTrier_Click

End Sub
'________________________________________









Avatar
Raymond [mvp]
je n'ai pas du tout suivi la conversation qui est assez longue je crois et
qui a pas mal évolué. Mon intervention était seulement technique vba.
Pour le findfirst (et les connexes), c'est très facile, le paramètre est une
clause where sans le mot where.
Dim Rs As DAO.Recordset
Rs.FindFirst "[Nomauteur] = '" & Me.NomAuteur & "'"
If Rs.NoMatch Then
MsgBox "pas trouvé"
End If


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"philippe d'isere" a écrit dans
le message de news:
merci pour tes reponses Raymond. Je travaille sur le meme projet que Pat.
De
mon je souhaite verifier l'existence des noms provenants du tableau dans
la
table acteurs afin de ne pas les dupliquer. J'ai essaye la methode
findfirst
mais je ne trouve pas la syntaxe exacte (pas d'exemple dans l'aide VB).
Créer
une table provisoire et la comparer avec la table acteur avec une requete
serait aussi une solution mais sans doute moins élégante...Qu'en penses-tu
?



Avatar
philippe d'isere
salut Pat ! j'ai l'impression que nous travaillons sur le meme projet (base
video). je serai heureux de partager avec toi mes recherches et trouvailles.
grace a ta question j'ai resolu une partie du probleme de l'integration des
donnees que j'obtiens à partir du site Cinéfil. A ta disposition pour des
tuyaux dans ce domaine
cordialement


Bonjour à tous,

Grâce à l'aide de tous j'ai réussi à obtenir le résultat que j'attendais et
en suis satisfait. Merci.
(Rappel : A partir d'un champ mémo comportant une série de noms -Acteurs-
séparés par une virgule et un espace, remplir une table avec 1 acteur par
enregistrement et par numéro de fiche film).

Question : J'ai mis des commentaires au regard de mes codes, pouvez vous me
confirmer qu'ils soient corrects, histoire de savoir si j'ai bien compris,
et surtout ne pas communiquer des idioties aux autres.

Merci,

Patrice
'__________________________________________________
Private Sub BtnTrier_Click()
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)
Dim MonTab() As String
Dim MonInd As Integer

On Error GoTo Err_BtnTrier_Click

If Acteurs = "" Or IsNull(Acteurs) Then
MsgBox "Il n'y a pas d'acteurs enregistrés", 48

Else
DoCmd.SetWarnings False
DoCmd.OpenQuery ("R_ActeursFilm_Del ") 'Supprime les enregistrements de
la T_ActeursFilm de l'enregistrement courant du Formulaire
'Transformation des éléments du contrôle [Acteurs] en éléments
distincts :
MonTab = Split(Acteurs, ", ") 'Coupe au séparateur
"virgule+espace"les enregistrements du contrôle "Acteurs" du formulaire
For MonInd = 0 To UBound(MonTab) 'Cré un "tableau" avec chaque
élément trouvé
dbsCurrent.Execute "INSERT INTO [T_Acteurs] (NomActeur) VALUES ('" &
MonTab(MonInd) & "');" ' Tri et ajoute les enregistrements à la T_Acteurs
'Bogue dans la ligne du dessus si un nom d'acteur comporte une
apostrophe (ex : Beverly D'Angelo) ==> Détournement par MsgBox 3075
Next
'Fin de la transformation
DoCmd.OpenQuery ("R_ActeursFilm_Ajout") 'Ajoute les enregistrements de la
T_Acteurs + Le numéro de film à la T_ActeursFilm
DoCmd.OpenQuery ("R_Acteurs_Del ") 'Supprime les enregistrements de la
T_Acteurs

DoCmd.SetWarnings True
ListeActeurs.Requery
DoCmd.Beep
MsgBox "Tri terminé", vbInformation

End If

Set dbsCurrent = Nothing 'Libère la mémoire

'Gestion du message d'erreur n°3075 de Microsoft si un séparateur ou signe
particulier existe :
Exit_BtnTrier_Click:
Exit Sub

Err_BtnTrier_Click:
Select Case Err
Case 3075: Beep: MsgBox "Il ne faut pas de nom avec des apostrophes ou signe
particulier." _
& vbCrLf & "Merci de corriger.", 48, "Erreur de saisie"
Case Else: MsgBox Error$ & " " & Err
End Select
Resume Exit_BtnTrier_Click

End Sub
'________________________________________





Avatar
philippe d'isere
merci Raymond !


je n'ai pas du tout suivi la conversation qui est assez longue je crois et
qui a pas mal évolué. Mon intervention était seulement technique vba.
Pour le findfirst (et les connexes), c'est très facile, le paramètre est une
clause where sans le mot where.
Dim Rs As DAO.Recordset
Rs.FindFirst "[Nomauteur] = '" & Me.NomAuteur & "'"
If Rs.NoMatch Then
MsgBox "pas trouvé"
End If


--
@+
Raymond Access MVP
http://access.seneque.free.fr/
http://access.vba.free.fr/
http://access2003.free.fr/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"philippe d'isere" a écrit dans
le message de news:
merci pour tes reponses Raymond. Je travaille sur le meme projet que Pat.
De
mon je souhaite verifier l'existence des noms provenants du tableau dans
la
table acteurs afin de ne pas les dupliquer. J'ai essaye la methode
findfirst
mais je ne trouve pas la syntaxe exacte (pas d'exemple dans l'aide VB).
Créer
une table provisoire et la comparer avec la table acteur avec une requete
serait aussi une solution mais sans doute moins élégante...Qu'en penses-tu
?








Avatar
PatCatNat's
Salut,

Il n'y a pas de blème.
Je viens d'envoyer ma base à Raymond, puis une fois corrigée je te l'envoi.
Mais j'en suis au début seulement et continu le combat.
Laisses-moi ton adresse mail par courrier électronique.

De toute façon, je remettrais la totalité du code en ligne pour tous ceux
que çà interesse (et il semblerait qu'il y ait du monde...)

--
Merci beaucoup
Patrice
(Si vous voulez m'écrire directement, retirer BZH de mon adresse mail)




"philippe d'isere" a écrit dans
le message de news:
salut Pat ! j'ai l'impression que nous travaillons sur le meme projet
(base

video). je serai heureux de partager avec toi mes recherches et
trouvailles.

grace a ta question j'ai resolu une partie du probleme de l'integration
des

donnees que j'obtiens à partir du site Cinéfil. A ta disposition pour des
tuyaux dans ce domaine
cordialement


Bonjour à tous,

Grâce à l'aide de tous j'ai réussi à obtenir le résultat que j'attendais
et


en suis satisfait. Merci.
(Rappel : A partir d'un champ mémo comportant une série de
noms -Acteurs-


séparés par une virgule et un espace, remplir une table avec 1 acteur
par


enregistrement et par numéro de fiche film).

Question : J'ai mis des commentaires au regard de mes codes, pouvez vous
me


confirmer qu'ils soient corrects, histoire de savoir si j'ai bien
compris,


et surtout ne pas communiquer des idioties aux autres.

Merci,

Patrice
'__________________________________________________
Private Sub BtnTrier_Click()
Dim dbsCurrent As Database
Set dbsCurrent = OpenDatabase(CurrentDb.Name)
Dim MonTab() As String
Dim MonInd As Integer

On Error GoTo Err_BtnTrier_Click

If Acteurs = "" Or IsNull(Acteurs) Then
MsgBox "Il n'y a pas d'acteurs enregistrés", 48

Else
DoCmd.SetWarnings False
DoCmd.OpenQuery ("R_ActeursFilm_Del ") 'Supprime les enregistrements
de


la T_ActeursFilm de l'enregistrement courant du Formulaire
'Transformation des éléments du contrôle [Acteurs] en éléments
distincts :
MonTab = Split(Acteurs, ", ") 'Coupe au séparateur
"virgule+espace"les enregistrements du contrôle "Acteurs" du formulaire
For MonInd = 0 To UBound(MonTab) 'Cré un "tableau" avec chaque
élément trouvé
dbsCurrent.Execute "INSERT INTO [T_Acteurs] (NomActeur) VALUES
('" &


MonTab(MonInd) & "');" ' Tri et ajoute les enregistrements à la
T_Acteurs


'Bogue dans la ligne du dessus si un nom d'acteur comporte une
apostrophe (ex : Beverly D'Angelo) ==> Détournement par MsgBox 3075
Next
'Fin de la transformation
DoCmd.OpenQuery ("R_ActeursFilm_Ajout") 'Ajoute les enregistrements
de la


T_Acteurs + Le numéro de film à la T_ActeursFilm
DoCmd.OpenQuery ("R_Acteurs_Del ") 'Supprime les enregistrements de
la


T_Acteurs

DoCmd.SetWarnings True
ListeActeurs.Requery
DoCmd.Beep
MsgBox "Tri terminé", vbInformation

End If

Set dbsCurrent = Nothing 'Libère la mémoire

'Gestion du message d'erreur n°3075 de Microsoft si un séparateur ou
signe


particulier existe :
Exit_BtnTrier_Click:
Exit Sub

Err_BtnTrier_Click:
Select Case Err
Case 3075: Beep: MsgBox "Il ne faut pas de nom avec des apostrophes ou
signe


particulier." _
& vbCrLf & "Merci de corriger.", 48, "Erreur de saisie"
Case Else: MsgBox Error$ & " " & Err
End Select
Resume Exit_BtnTrier_Click

End Sub
'________________________________________