begin process at 2013 05 20 00:23:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Visual Basic 6

 > 

Base de données

 > 

ADO & DAO

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

dimanche 19 août 2012 à 01:55:23 | VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

titicar

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]:

Code Visual Basic :
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
dimanche 19 août 2012 à 04:52:06 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX


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.
dimanche 19 août 2012 à 07:22:11 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX


voici une illustation de ce que je te propose.
Code Visual Basic :
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.
Code Visual Basic :
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.
dimanche 19 août 2012 à 07:34:17 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX


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.
dimanche 19 août 2012 à 13:48:11 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

jack

Administrateur CodeS-SourceS
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)
dimanche 19 août 2012 à 16:26:05 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX

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.
dimanche 19 août 2012 à 16:41:37 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

titicar

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
dimanche 19 août 2012 à 17:14:17 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX

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.
dimanche 19 août 2012 à 17:48:59 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

titicar

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
dimanche 19 août 2012 à 18:16:23 | Re : VB6\ADODB\Requête SQL\Ajout d'un 1er enregistrement divisé sur 2 tables

LIBRE_MAX

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.

1 2

Cette discussion est classée dans : table, color, blue, chanson, chansons


Répondre à ce message

Sujets en rapport avec ce message

Liaison de table [ par DutPower ] Salut. J'ai un petit probleme ça fait des heures que je suis dessus, aidez moi svp.....Voila la situation :J'ai créer une base de données acces avec d Access - VBA : Fonction sur chaque champ de chaque table [ par ghiscool ] Salut,alors voilà je voudrais virer tous les caractères spéciaux de chaque champ de chaque table. Ma fonction est faite, il n'y a plus qu'à l'applique Correspondance entre nom d'un champ et propriété d'une variable??? [ par Vince26 ] Salut à tous! Je fais de nouveau appelle à votre aide pour réaliser la dernière partie de mon code, que je n'arrive pas à effectuer! table de mixage multi piste [ par philippe100 ] Salut,quelq'un peut il m'expliquer ou je peu telecharger une table de mixage pour mp3 Votre texte ICI Color sous Excel 2000 [ par Estelle2003 ] Bonjour,Mon problème est le suivant : Si dans la colonne K, 'MAT' est trouvé colore la ligne en rouge.Mais moi je n'arrive qu'a coloré la cellule cont Editer une liste sous access 2000 [ par code9 ] Bonjour à tous, Voilà ce que je souhaite faire: créer une table comportant une liste de chansons: 1. chanson1 2. chanson2 3. chanson3 ... ensuite une GlobalAlloc et le partage d'adresse mémoire [ par jack ] Salut à tou(te)s Je n'ai déjà pas beaucoup de cheveux, mais là, j'arrive encore à me les arracher. J'ai une chaine à transmettre entre deux applicati Commentaire d'une propriété/fonction dans une DLL/EXE ActiveX [ par jack ] Salut Je développe une appli EXE ActiveX que d'autres développeurs pourront utiliser. Lorsque je fais référence à cette application dans un nouveau p Utilisation de matrice en VB 2008 [ par fradimed ] Slt à tous. Est ce que je peux savoir comment je déclare une matrice en [b]vb 2008[/b].Car je trouve un problème lors de la récuperation des données Pb effacement de fichier dans une listview VB [ par blinklimp ] Bonjour a tous Voici mon probleme. J'ai une listview ou j'affiche les images contenu dans un dossier precis. j'ai creer un bouton delete pour pouvoir


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,952 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales