IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

[Débutant] Création d'une base de données avec listes liées


Sujet :

IHM

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut [Débutant] Création d'une base de données avec listes liées
    Bonjour à toutes et à tous,

    Je suis chargé de développer une base de donnée pour l'ensemble de la documentation. Celle-ci doit répondre à deux objectifs principaux :
    - elle permet de retrouver rapidement l'ensemble de la documentation, par marque, concernant un type de produit
    - elle offre la possibilité de trier les documents par date
    Elle sera (accessoirement) évolutive.

    J'ai donc commencé, tout logiquement, par définir l'ensemble de mes catégories et sous catégories : j'en arrive à trois niveaux de hiérarchisation. (quelques documents seront rangés directement après le second niveau)
    Après lecture de la FAQ, d'un bon nombre de tutoriaux, j'ai toujours des soucis pour réaliser les premières étapes, alors que des informations à propos de mes questions sont données, néanmoins je n'arrive à les comprendre, ou les adapter à ma situation en cas de sources.

    J'ai réalisé trois schémas présentant l'ensemble de mes questions avant la mise en place du moteur de recherche, que j'espère arriver à réaliser seul, à l'aide de tutoriel de recherche multicritères présenté par Cafeine, une fois les principes de bases compris.

    Voila donc les schémas, avant les questions :







    Et voici les questions :
    *** Tout d'abord, pensez-vous que le choix de deux tables est bon ? Dans ma tête, l'une des table (tablearchives) sert à répertorier l'ensemble des documents selon les différents critères qui seront utilisés lors de la recherche. (système en entonnoir) Dans la seconde (tablehierarchique) l'ensemble des sous catégories enregistrées dans le champs de la catégorie, afin de "séparer" les listes pour les menus déroulants. (la première liste sera entrée manuellement dans le contenu du formulaire)
    *** Comment, dans le formulaire, lier les différents menus déroulants ?
    Je sais qu'il y a deux solutions proposées dans la FAQ, l'une géographique, l'autre sportive. Néanmoins je n'ai réussi à en comprendre aucune des deux : j'ai un problème avec les chemins d'accès. Petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub ListeSports_AfterUpdate()
     ListEpreuve.RowSource = "Select [ID_Epreuves],[Epreuve],[IDSport] From T_Epreuves " & _
                              "where IDSport= " & ListeSports & ";"
     ListEpreuve.Requery
    End Sub
    Je n'arrive pas à faire correspondre ces variables à mon cas, une petite aide explicative (sans réponse trop direct, au moins pour commencer) ne serait pas de refus. Le fait de ne pas avoir de clé primaire est sans doute en jeu, mais en ai-je vraiment besoin ? (et je n'ai pas trouvé non plus en ajoutant cette fameuse clé)
    Ce que je comprends de ce code est que l'on génère une action après un choix dans la ListeSports : elle définit la source de la ListeEpreuves en fonction de ce choix, puis actualise cette seconde liste pour opérer au changement. Mais je ne comprends rien à ce que j'ai surligné en gras ci-dessus.

    *** Est-il possible de n'affecter que la valeur "année" dans la colonne date ? Je n'ai pas trouvé ce format dans les formulaires, et il ne me faut pas plus précis, compte tenu de la fréquence de nettoyage des archives. (Une année de départ des nouvelles archives est décidée, l'ancien bazardé, le plus récent conservé)


    Voila, je ne vais pas plus continuer pour l'instant, ce serait inutile, ne pouvant pas plus avancer sans les premières réponses.
    Et j'espère pouvoir répondre aux prochaines (concernant l'installation du système de recherche et l'affectation de valeurs aux différents niveaux hiérarchiques) après avoir compris le principe de l'emplacement, le pourquoi des crochets et des virgules, ... Avec ça, moins de problème pour comprendre les sources, et donc avancer à nouveau de mon côté pour quelques temps au moins !

    Je vous remercie d'avance,
    Wulfram

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    je vais tenter de répondre à tes questions.

    1. Concernant le choix des tables, techniquement la table ARCHIVES seule est suffisante.

    2. Liaison des listes.
    Le code que tu cites est celui déclenché par l'événement "Après MAJ" de la liste ListeSports.
    Quand on change la valeur de la liste cela déclenche l'exécution du code.

    ListEpreuve.RowSource correspond à la propriété Contenu de la liste telle qu'on peut la voir lorsque le formulaire est ouvert en mode création.
    Le code visual basic lui affecte une instruction SQL SELECT (une requête de sélection).
    Ensuite il force la liste ListEpreuve à re-exécuter cette requête pour actualiser la liste.

    L'instruction SQL contient une clause WHERE qui permet de restreindre la sélection des enregistrement selon un critère.
    Ici le critère est IDSport = <une valeur>.
    Cette valeur est fournie par ListeSports qui dans le module de code du formulaire signifie "valeur sélectionnée dans la liste ListeSports".

    Dans ton cas, en supposant qu'on ait
    - une table ARCHIVES ayant au minimum les champs Niveau1, Niveau2, Niveau3
    - Un formulaire contenant trois listes dont les noms sont respectivement cboNiveau1, cboNiveau2, cboNiveau3

    Les instructions SQL (propriété Contenu de la liste en mode création) de base (sans restriction) pour les listes seraient ...

    Pour cboNiveau1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT [ARCHIVES].[Niveau1] FROM ARCHIVES ORDER BY [ARCHIVES].[Niveau1];
    Pour cboNiveau2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT [ARCHIVES].[Niveau2] FROM ARCHIVES ORDER BY [ARCHIVES].[Niveau2];
    Pour cboNiveau3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT [ARCHIVES].[Niveau3] FROM ARCHIVES ORDER BY [ARCHIVES].[Niveau3];
    Remarque : SELECT DISTINCT permet de ne pas dupliquer sur plusieurs lignes les valeurs identiques.

    Code de l'événement "après MAJ" de la liste cboNiveau1
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cboNiveau1_AfterUpdate()
     cboNiveau2.RowSource = "SELECT DISTINCT [ARCHIVES].[Niveau2] FROM ARCHIVES " & _
                            "WHERE ARCHIVES.Niveau1= '" & cboNiveau1 & "' ORDER BY [ARCHIVES].[Niveau2] ;"
     cboNiveau2.Requery
    End Sub

    Code de l'événement "après MAJ" de la liste cboNiveau2
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cboNiveau2_AfterUpdate()
     cboNiveau3.RowSource = "SELECT DISTINCT [ARCHIVES].[Niveau3] FROM ARCHIVES " & _
                            "WHERE (ARCHIVES.Niveau1= '" & cboNiveau1 & "') AND (ARCHIVES.Niveau2= '" & cboNiveau2 & "') ORDER BY [ARCHIVES].[Niveau3] ;"
     cboNiveau3.Requery
    End Sub

    3. Concernant le champ Date, il serait plus simple de l'appeller Annee et de lui donner lui le type Entier ou Entier Long (Numérique).
    On peut lui donner comme valeur par défaut
    soit au niveau de la table, soit au niveau du formulaire.

    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Merci bien pour ta réponse claire, je vais m’appuyer dessus pour continuer mes recherches, n’arrivant pas du tout au résultat attendu. Je ne suis pas certain de bien avoir expliqué ma problématique, et vais donc essayer une autre approche partant de ton exemple, dans le cas où une réponse viendrait avant une illumination de ma part : je ne me sens pas loin, mais franchir le pas n’est pas facile.

    Ce que ton code permet, c'est d'afficher dans la seconde liste (cboNiveau2) les valeurs du second champs (Niveau2) pour les enregistrement ayant, dans le premier champs (Niveau1), la valeur choisie par la première liste. (Niveau1 dans le screen ci-après)



    Ce que je cherche en fait à faire, c'est afficher dans la seconde liste l'ensemble des valeurs du champ choisi dans la première liste.
    Dans mon exemple, la seconde liste déroulante devrait afficher les valeurs « 1 » ; « 1* » ; « 1** ».

    Nickel pour la date, mon problème résultait effectivement d’un mauvais choix de type de données, à la création même des champs.
    Pour ce qui est de l’utilisation de la propriété « ORDER BY », je ne sais pas si elle me sera vraiment utile, il me faudra sans doute un ordre d’apparition tout autre qu’alphabétique, mais je me pencherai sur ces détails (importants !) une fois la base un minimum utilisable.

  4. #4
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Si on prend l'exemple de la base de donnée exemple du tutoriel de Caféine :

    - ma première liste cboNiveau1 pourrait correspondre au champ Type
    Elle liste "BD ALBUM", "DVD ROM", "Livre", "Livre de poche"

    - ma deuxième liste cboNiveau2 pourrait correspondre à Auteur.
    En fonction du type choisi, elle m'afficherait les auteurs correpondant.
    Si je choisi "Livre de poche" elle contiendra les auteurs
    "Frédéric DARD", "Guy MONTAGNE", "Jerry JOYCE", "marangraphics"

    - ma troisième liste pourrait être Famille.
    Si dans ma deuxième liste je choisi l'auteur "Jerry JOYCE", je n'aurai dans la lsite famille que "Informatique Office"
    Si dans ma deuxième liste je choisi l'auteur "marangraphics", je aurai dans la lsite famille que "Informatique Office", "Informatique windows"

    J'utilise le conditionnel car chacun peut définir une hiérarchie différente.

    On pourrait imaginer le même principe même avec Département(Niveau1)/Ville(Niveau2)/Rue(Niveau3) pour une table contenant toutes les rues de toutes les communes d'un pays.

    Concernant ton exemple de table ARCHIVES je ne comprends pas la logique.
    Je peux néanmoins répondre à ta question sur la deuxième liste.
    Admettons que la liste Origine s'appelle cboOrigine (le préfixe cbo est une convention pour nommer des contrôles dans un formulaire)
    et que la deuxième s'appelle cboChoix1.
    Le code pour l'évènement "Après MAJ" de cboOrigine serait :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub cboOrigine_AfterUpdate()
     cboChoix1.RowSource = "SELECT DISTINCT [ARCHIVES].[" & cboOrigine & "] FROM ARCHIVES " & _
                            "ORDER BY [ARCHIVES].[" & cboOrigine & "];"
     cboChoix1.Requery
    End Sub
    Lors de l'exécution du code, cboOrigine est remplacé par le contenu de la liste cboOrigine.
    Dans ton exemple "Niveau1" est sélectionné.
    L'instruction SQL affectée à la propriété Rowsource sera donc
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT [ARCHIVES].[Niveau1] FROM ARCHIVES ORDER BY [ARCHIVES].[Niveau1];
    Peut-être que pour bien se comprendre on pourrait partir de la base exemple du tutoriel de Caféine et construire ton formulaire en partant de zéro ?

    A+

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 206
    Points : 127
    Points
    127
    Par défaut
    Hmm, j'avais bien eu une idée dans ce genre, mais n'avais pas imaginé un seul instant placer des " dans les crochets... Un premier essai m'indique qu'il va falloir bidouiller encore un peu, la seconde liste m'affiche d'abord SELECT DISTINCT ... (le code en gros), et après modification de l'origine source, uniquement la valeur choisie dans cboOrigine, pas la liste des champs de...
    Hop, ça c'est bon, il fallait effacer le contenu et choisir "Table/Requête".

    Tu as très bien cerné le problème à en croire ton explication avec les noms de champs de l'exemple de Caféine.
    Les deux listes de son moteur de recherche ne sont pas liées entre elles, par contre. Il me semble nécessaire d'avoir deux tables pour pouvoir faire cela, sans pouvoir expliquer pourquoi.


    En fait, ce que je souhaite, c'est créer dans une table l'ensemble de la hiérarchie (le nom des I, II, 1., 2., a), b),... ), me préparer mon formulaire pour enregistrer plus rapidement l'ensemble des données dans une seconde table, sur laquelle travaillera le moteur de recherche.

    Ce formulaire servira par la suite à enregistrer les documents lors de leur arrivée, et je ne serai sans doutes plus là : les différents critères de recherche doivent être entrés de façon identique, d'où le choix de listes non modifiables.

    Je veux lier les listes pour éviter une perte de temps aux utilisateurs finaux, sachant que j'ai au total plus de 500 sous-sous-catégories : sans filtrer selon les choix précédents, difficile et laborieux de s'y retrouver.

    Si je ne suis pas assez clair, dis le moi, je peux récapituler l'ensemble de ce que je veux créer, avec détails techniques, de façon plus concise.
    [Sur ce, je vais retourner essayer de voir ce qui cloche avec le code que tu m'as donné, à la lecture il semblait correspondre...]

    Bon, ce soucis de lien est résolu, je vais essayer de voir ce que ça donne, si j'arrives à en faire quelque chose, et je reviens mettre le tag si je n'ai pas d'autres questions à poser avant la fin de l'après-midi.
    Est-il plus judicieux de ne garder qu'une discussion ouverte pour l'ensemble de mon projet, ou alors créer des thread pour chaque problème technique ? (Je sens qu'il va y en avoir bientôt...)

  6. #6
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    j'avais bien eu une idée dans ce genre, mais n'avais pas imaginé un seul instant placer des " dans les crochets
    En fait je ne mets pas de double guillemets (") à l'intérieur des crochets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "SELECT DISTINCT [ARCHIVES].[" & cboOrigine & "] FROM ARCHIVES " & _
                            "ORDER BY [ARCHIVES].[" & cboOrigine & "];"
    est une expression Visual basic servant à construire la chaînes de caractères de l'instruction SQL.

    Par exemple l'expression
    donne comme résultat la chaîne de caractère Texte1Texte2
    L'expression
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Texte1" & UneVariableTexte & "Texte2"
    donne comme résultat la chaîne de caractère Texte1, Texte2 si par exemple la variable UneVariable contient une virgule et un espace.

    En fait, ce que je souhaite, c'est créer dans une table l'ensemble de la hiérarchie (le nom des I, II, 1., 2., a), b),... ), me préparer mon formulaire pour enregistrer plus rapidement l'ensemble des données dans une seconde table, sur laquelle travaillera le moteur de recherche.
    Ok je crois saisir. Tu veux au préalable définir les combinaisons possibles (ou autorisées) entre les différents niveaux.

    Je pense qu'un exemple de ta table hierarchie avec des valeurs concrètes m'aiderai à comprendre comment tu cherches à la réaliser.
    Je persiste à croire que trois colonnes suffisent.
    Exemple de table hierarchie avec seulement les combinaisons autorisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    NIVEAU1 NIVEAU2 NIVEAU3
       I       1        a
       I       1        b
       I       1        c
       I       2        a
       I       2        b 
       II      1        a
       II      1        b
       II      2        a
       II      2        b
    Avantage : structure simple. Inconvénient : beaucoup de lignes.

    Est-il plus judicieux de ne garder qu'une discussion ouverte pour l'ensemble de mon projet, ou alors créer des thread pour chaque problème technique ?
    Il est préférable de créer un thread par question si ce sont des question techniques distinctes.
    Ça permet en plus d'avoir des réponses de personnes différentes, donc différents points de vue.

    Bon courage et A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. création d'une base de données avec dreamweaver
    Par eolia dans le forum Dreamweaver
    Réponses: 23
    Dernier message: 22/12/2013, 21h55
  2. Création d'une base de données avec les composants " BDE "
    Par Y013S dans le forum Bases de données
    Réponses: 4
    Dernier message: 22/12/2010, 23h43
  3. Réponses: 4
    Dernier message: 09/11/2007, 10h48
  4. [débutant] Création d'une base de données
    Par kimlee dans le forum Administration
    Réponses: 1
    Dernier message: 03/11/2006, 10h19
  5. Création d'une base de données avec wxWidgets
    Par solp dans le forum wxWidgets
    Réponses: 2
    Dernier message: 23/08/2006, 09h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo