VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

Signaler
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012
-
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012
-
Bonjour à tous,

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

14 réponses

Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Bonsoir,

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.



[] Ce qui va sans dire. va mieux en le disant.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
voici une illustation de ce que je te propose.
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.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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.





[] Ce qui va sans dire. va mieux en le disant.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
67
Salut

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)
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Il ne faut pas confondre deux caractéristiques et deux valeurs d' une même caractéristique.
"Favoris" n' est pas un genre musical, à ce que je sache.

Si tu veux marquer une chanson comme favorite, tu dois ajouter un champ "TAG" à ta table Chansons, en plus du champ Genre bien sûr.

Si c' est pour dire qu' un genre est Favoris (ou pas), c' est dans la table Genres qu' il faudra le faire.


[] Ce qui va sans dire. va mieux en le disant.
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

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.

titicar
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Multiple ou pas, toujours est-il que dans ta table Chansons, il ne doit y avoir qu' un ID_GENRE.

C' est donc au niveau de la table GENRES qu' il faudra travailler.
Imaginons donc la structure suivante:

*GENRES;(Id_Genre, Genre1,Genre2,Genre3)
Pour exemple:
1 Pop Rock ""
2 Rap Hip Hop international ""
3 Dance Clubbing Techno



[] Ce qui va sans dire. va mieux en le disant.
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Ok, et donc j'aurai si j'ai bien compris

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.



titicar
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
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


[] Ce qui va sans dire. va mieux en le disant.
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
dsl pour la Mauvaise Mise en forme!

Genre1="Techno"
OU
Genre2="Techno"
OU
Genre3 ="Techno"




[] Ce qui va sans dire. va mieux en le disant.
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

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é, "", ""

[Table CHANSONS]
1, Balavoine, L'Aziza, 4
2, Black Eyed, Don't stop, 2
3, Agnes, Release,3 (Genre donnée=Dance Clubbing Techno)

Maintenant, je veux ajouter une chanson de Hypertrophy classée uniquement en Techno:
4, Hypertrophy, Come back, 3

C'est bien celà?
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

Ou alors j'ajoute dans [Table GENRES]
5, Techno, "", ""

et dans [Table CHANSONS], le 4ème enregistrement devient:
4, Hypertrophy, Come back, 5


titicar
Messages postés
1402
Date d'inscription
mardi 1 mai 2007
Statut
Membre
Dernière intervention
7 octobre 2012
5
Tout à fait !

5, Techno, "", ""
et
4, Hypertrophy, Come back, 5

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.


[] Ce qui va sans dire. va mieux en le disant.
Messages postés
181
Date d'inscription
jeudi 30 mai 2002
Statut
Membre
Dernière intervention
19 août 2012

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