Je suis en train de créer une DB de mes chansons. Et je ne fais que débuter dans les SGBD.
Pour mes besoins, j'ai crée une table Chansons et ses champs correspondants:
[Table= Chansons]
ID en numérotation automatique
Artiste en texte
Titre en texte
etc...
Sauf les genres car il peut y en avoir plusieurs.
En effet, j'ai lu que s'il y a plusieurs infos sur un champs, alors il faut créer une table 'de jonction' (c'est ce que j'ai lu).
Je ne sais pas si c'est la bonne solution au final, mais pour l'instant je fait ainsi.
Alors soit, je créée une 2ème table:
[Table=Genres_Chanson]
ID en numéro
Genre en texte
Genres_Chanson.ID = Chansons.ID, Donc un genre est lié à une chanson par son Index
Par exemple, j'ajoute une nouvelle chanson dans [Table=Chansons] supposée vierge.
Donc première ligne (ou enregistrement):
ID=1 (c'est auto incrémenté)
Artiste="Balavoine"
Titre="L'Aziza"
Pour cette même chanson, j'ajoute 2 'genres' dans [Table=Genres_Chanson]
1ère ligne:
ID=1 (celui associé à ma chanson)
Genre="Variété française"
2ème ligne:
ID=1 (Et oui, toujours celui associé à ma chanson)
Genre="Favoris"
Cette théorie est un peu longue, mais fallait bien que j'explique le contexte.
Maintenant, je passe à la pratique.
J'ai créé mon fichier mDB sous MS Access avec les deux tables, mais vides.
Ensuite, je passe par mon appli sous VB6:
(Je précise que je travaille sous ADODB, Provider =Microsoft.Jet.OLEDB.4.0, et que ma connexion est déjà ouverte)
Enregistrement de ma 1ère chanson dans [Table= Chansons]:
Dim myRs As New ADODB.Recordset
Dim sSQL As String
'# Mise en forme de la requête
sSQL = "INSERT INTO Chansons (Artiste,Titre) VALUES (""Balavoine"",""L'Aziza"")"
'# Exécution de la requête:
Set myRs = New ADODB.Recordset
'! Rappel : myCnx est déjà ouverte
With Requete_Execute
'# (La requète SQL est dans sSQL)
'# L'exécution:
.CursorLocation = adUseClient
.Open sSQL, myCnx, adOpenStatic, adLockOptimistic
End With
Ca fonctionne, ma [Table=Chansons] est mis à jour avec mon premier enregistrement .
Sauf que je ne sais pas comment récupérer Chansons.ID qui est donné d'office dans cet enregistrement.
Et j'en ai besoin pour créer ma 1ère ligne dans [Table =Genres_Chanson]
Quelqu'un peut me conseiller?
titicar
A voir également:
VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables
Ta façon de faire suppose que pour chaque chanson, il y a un genre.
Alors que c' est pas vrai.Dans la mesure ou deux chansons ou plus peuvent correspondre au même genre.
Voilà ce que tu dois faire.
-Tu crées d' abors ta table GENRE.Clé primaire ID_GENRE.
-Tu remplis ensuite cette table (manuellement ou par code) avec tous les genres possibles et imaginaires.
-Tu crées ensuite ta table CHANSONS.
ID_CHANSON
ARTISTE
TITRE
ID_GENRE
Et à chaque ajout d' une chanson tu sélectionnes un genre parmi ceux de ta table GENRE.
C' est ainsi que chaque chanson sera liée à un genre.
Et c' est ainsi que tu pourras regrouper plusieurs chansons dans un même genre.
Dim sSQL As String
'# Mise en forme de la requête
sSQL = "INSERT INTO Chansons (Artiste,Titre) VALUES ("Balavoine","L'Aziza","Variétés");"
'Remarque:Le genre Variétés doit exister au préalable dans ta table Genres.
'# Exécution de la requête:
'Tu as besoin d' un objet Command
Dim MaCommand As ADODB.Command
Set MaCommand = New ADODB.Command
'vérifier si la connexion est ouverte
If myCnx.State = 0 Then myCnx.Open
'ammorcer une transaction
myCnx.BeginTrans
With MaCommand
.ActiveConnection = CNX
.CommandType = adCmdText
.CommandText = sSQL
.Execute
End With
myCnx.CommitTrans
Ceci dit, tu peux aussi utiliser un recordset de la façon suivante.
Dim myRs As ADODB.Recordset
Set myRs = New ADODB.Recordset
sSQL="SELECT * FROM Chansons;"
With myRs
.CursorLocation = adUseClient
.LockType = adLockOptimistic
If myCnx.State = 0 Then myCnx.Open
.Open sSQL, myCnx, adOpenDynamic
'ajouter la ligne chanson
.AddNew
!Artiste="Balavoine"
!Titre="L'Aziza"
!Genre="Variétés"
.Update
End With
De toute façon, tu n' auras donc pas à te soucier de l' id_chanson.
Ta chason est rattachée à un genre.Et tu pourras rattacher autant de chansons à ce même genre. [] Ce qui va sans dire. va mieux en le disant.
Et encore..
Te sachant débutant, je ne veux pas te compliquer la tâche en te proposant de créer une 3ième table se réfèrant aux Artistes.Dans laquelle tu répertories tout les artcles.
Ainsi, lors de la saisie d' une chanson, tu n' as qu' à en sélectionner un.
Dans ce genre de schéma, mieux vaut sélectionner que saisir.
Un artiste avec deux orthographes ou deux casses différentes et ce n' est plus le même artiste.
Penses-y.
Hélas, il me semble qu'il n'y a pas d'autre moyen que de repréparer une requète pour relire la donnée. En tous les cas, pour Access car mySql dispose d'une instruction particulière capable de retourner le dernier Id créé, mais je ne sait plus lequel.
Pourquoi une même chanson aurait-elle plusieurs genres ?
Puisque le nom de l'artiste va se répéter dans chaque chanson, il convient aussi de créer une table Artistes, avec des Id.
Si tu as intéressé par la reconnaissance automatique des titres d'un CD, je te suggère de jeter un œil à <cette source> qui traite de CDDB.
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Merci à LibreMax et Jack pour vos réponses.
Il est vrai que j'hésitais pour le genre multiple, mais je vous assure que j'en ai plusieurs dans des chansons récentes. A croire que c'est à la mode d'inscrire plusieurs genres. Les mp3 proviennent de Virginmega (Pub lol)
J'ai par exemple:
Pop, Rock (1 chanson)
Rap, Hip Hop international (1 autre)
Dance, Clubbing, Techno (et encore une autre)
A la limite, je préfèrerais ne garder qu'un seul genre par chanson rien que pour simplifier les choses.
Et d'un autre côté, puisque ce cas existe, pourquoi ne pas en tenir compte?
Mais maintenant, je commence à douter de l'importance du 'genre multiple'.
Celà dit, l'exemple peut être le même pour un titre chantée en duo : une chanson qui possède 2 artistes (ou plus)...Ok, je pousse peut-être un peu loin. Mais je préfère me poser ces questions maintenant, car il sera trop tard quand j'aurai défini toute la structure de ma DB et toutes les lignes de codes associés.
Je ne l'avais pas encore précisé, mais la grande majorité des enregistrements de la DB proviendront directement du tag ID3v2 des mp3, et donc sans intervention de ma part. Et si le fichier audio ne contient pas d'information exploitable (genre pas de tag), alors je créerai une autre procédure...je ne sais pas encore.
Table GENRES
1 Pop Rock ""
2 Rap Hip Hop international ""
3 Dance Clubbing Techno
etc...
et aussi pour des chansons qui ne possède qu'un seul genre :
4 Pop
5 Rock
6 Rap
etc...
Et donc si je fais une recherche sur toutes mes chansons qui sont du genre Rock, je fais une requête non pas EGAL à Rock, mais une requête qui contient le mot Rock dans une valeur.
Oui, c'est vrai, c'est sans doute plus simple comme ça.
Oups, non je crois que j'ai mal compris ce que tu voulais dire en voyant les "" : Placer 2 champs supplémentaires 'genre1' et 'genre2' sur une même ligne. Donc quand je fais une requête juste sur le genre Rock, il faut que je cherche sur plusieurs lignes, et plusieurs champs aussi?
Et donc si j'ai une nouvelle chanson d'un seul genre Techno, ce dernier doit être référencé par Id_Genre=3 ET Genre3? Là, je crois que je vais me perdre.
un seul genre Techno est identifié par Id=x avec Genre1=Techno,Genre2="", Genre3=""
Quand je cherche Techno, je cherche l' id_genre dont Genre1="Techno OU "Genre2="Techno OU Genre3 ="Techno
Donc pour reprendre, j'ai 2 tables:
[Table CHANSONS]
ID_CHANSON
ARTISTE
TITRE
ID_GENRE
[Table GENRES]
ID_GENRE
Genre1
Genre2
Genre3
Puis j'enregistre mes genres et chansons:
[Table GENRES]
1, Pop, Rock, ""
2, Rap, Hip Hop international, ""
3, Dance, Clubbing, Techno
4, Variété, "", ""
Maintenant en reliant Chansons à Genres sur id_genre, chaque chanson hérite des champs genre1, genre2 et genre3.
Reste à savoir si une recherche est exclusive ou sélective.Autrement dit, si je cherche exclusivement Techno ou si je considère que Dance Techno est aussi du Techno.
Ok,
Je n'ai plus qu'à étoffer ma table Chansons, ajouter une table Artistes, une autre pour Albums et écrire du code pour gérer tout ça : Ajout, effacement, modification, filtrage...
Et merci
titicar