Forum Liberty Basic France

Débutant » Tables et relations en Just/Liberty Basic tests de faisabilité d'une base de données
Le 29/05/2017 à 01h33

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Hello !

Un petit (?) travail pour s'initier au fonctionnement des tableaux en essayant - à notre niveau très très amateur - une approche "base de données relationnelle".

En fait cette discussion a été initiée dans le fil affectation combinatoire ouvert par Roland, discussion où je me suis aperçu qu'on pouvait assez facilement créer des tables et des relations en JB/LB. Du coup j'en ai lâché le travail de Roland, qui doit m'en vouloir puisqu'il se retrouve tout seul pour son projet, et qu'il n'a rien posté de plus depuis plusieurs jours... ;)

Programme vraiment basique :

Il n'y a pas de tri alphabétique : l'ordre dans lequel les noms apparaissent dans les combobox est l'ordre où ils ont été stockés dans les lignes de datas.

Un prof n'enseigne qu'une seule matière.

On ne peut que consulter, on ne peut pas créer ou modifier.

Il n'y a aucune relation, juste une seule table nommée Prof, qui recense pour chaque prof, son nom, son prénom et la matière enseignée.

En JB/LB on peut traduire cette table en trois tableaux : par exemple profNom$(), profPrenom$() et profMatiere$(). Si on veut tout connaître du professeur 6, même s'il déclare ne pas être un numéro mais un homme libre, et même s'il est de plus en plus impossible de ne pas être un numéro, il suffit de demander à chacun des tableaux le contenu correspondant à l'index 6.

Pour faire une telle demande et en afficher le résultat à l'écran, on s'est servi d'une combobox par tableau. Particularité : l'index d'un tableau commence à 0, l'index d'une combobox commence à 1. Seconde particularité, nous allons filtrer la base par l'intermédiaire des noms qu'on aura choisi dans les combobox, et il se peut qu'on ne veuille pas utiliser telle ou telle combobox : donc il faut un critère "vide", qui sera, dans notre cas, un espace.

Une combobox étant, dans notre utilisation, le reflet du tableau qui lui correspond, le premier élément du tableau doit aussi être un espace...

Il y a sûrement moyen de compacter davantage le sous-programme [critere] dans lequel on trouve beaucoup de for a=0 to 12 et de structures identiques, mais ce n'est pas la priorité pour ce premier programme, que voici :

Code VB :
 
'profs 0b

nomainwin
 
'base de donnée : nom, prénom, matière enseignée
    [datas]
    data "Trucmuche","Alain","Mathématiques"
    data "Machin","Marcel","Philosophie"
    data "Lapaille","Jean-Benoît","Français"
    data "Lapoutre","Ulysse","Histoire-Géographie"
    data "Legendre","Lucienne","Français"
    data "Lebianski","Josiane","Mathématiques"
    data "Lavache","Ernest","Histoire-Géographie"
    data "Tuboeuf","Adrienne","Education Physique et Sportive"
    data "Sinclair","Bratt","Physique"
    data "Rabeau","Elisabeth","Mathématiques"
    data "Nun","Elodie","Physique"
    data "Lavache","Michel","Arts Plastiques"
 
    dim profNom$(13),profPrenom$(13),profMatiere$(13), dejalu(13)
    profNom$(0)=" ":profPrenom$(0)=" ":profMatiere$(0)=" "
 
    for a=1 to 12
        read a$:profNom$(a)=a$
        read a$:profPrenom$(a)=a$
        read a$:profMatiere$(a)=a$
        print profNom$(a);" ";profPrenom$(a);" ";profMatiere$(a)
    next
 
    'dimension maxi des champs, en caractères
    longMaxNom=20
    longMaxPrenom=20
    longMaxMat=40
    entetecolonnes$="Nom :               Prenom :            Matière enseignée :"
 
    'fonte de caractère à chasse fixe (pour afficher en belles colonnes rectilignes)
    fonteditor$="Liberation_Mono"
 
'prepa et ouverture fenetre "Professeurs"
    'taille et couleur de la fenêtre
    WindowWidth=800
    WindowHeight=600
 
    BackgroundColor$ = "lightgray"
    ForegroundColor$ = "blue"
    TextboxColor$ = "white"
    ComboboxColor$ = "white"
 
    'définition des controles
    'STATICTEXT #profs.info, "Professeurs", 20, 20, 200, 20
    BUTTON #Profs.bttout, "tous les professeurs", [tous_les_profs], ul, 20, 30, 100, 20
 
    STATICTEXT #Profs.stNom, "Nom :", 140, 10, 100, 20
    COMBOBOX #Profs.cbnom, profNom$(), [critere], 140, 30, 100, 20
 
    STATICTEXT #Profs.stPre, "Prénom :", 260, 10, 100, 20
    COMBOBOX #Profs.cbprenom, profPrenom$(), [critere], 260, 30, 100, 20
 
    STATICTEXT #Profs.stMat, "Matière :", 380, 10, 100, 20
    COMBOBOX #Profs.cbmat, profMatiere$(), [critere], 380, 30, 100, 20
 
    STATICTEXT #Profs.stFil, "Filtres :", 520, 10, 100, 20
    RADIOBUTTON #Profs.rbou, "OU", [ou], [rien], 520, 30, 50, 20
    RADIOBUTTON #Profs.rbet, "ET", [et], [rien], 570, 30, 50, 20
 
    TEXTEDITOR #Profs.visu, 20, 70, 760, 450
 
    'ouverture fenetre
    open "Professeurs" for window as #Profs
 
        print #Profs.visu, "!font ";fonteditor$
        print #Profs, "trapclose [quit_Profs]"
 
        filtre$="OU"    'prépostionnement du filtre d'affichage
        if filtre$="ET" then print #Profs.rbet, "set":reprocede=1 : gosub [critere] : reprocede=0
        if filtre$="OU" then print #Profs.rbou, "set":reprocede=1 : gosub [critere] : reprocede=0
    wait
 
end
 
 
'sous programmes

[quit_Profs]    'quitter le programme
    close #Profs
    end
    wait
 
 
[et]
    filtre$="ET"
    reprocede=1 : gosub [critere] : reprocede=0
    wait
 
 
[ou]
 
    filtre$="OU"
    reprocede=1 : gosub [critere] : reprocede=0
    wait
 
 
[rien]  'particularité des radiobuttons, le second sous-programme est spécifié
        'mais inutile, à ce jour.
    wait
 
 
[tous_les_profs]    'on affiche tous les profs

    'réinitialiser les combobox
    print #Profs.cbnom, "selectindex 1"
    print #Profs.cbprenom, "selectindex 1"
    print #Profs.cbmat, "selectindex 1"
    nom$="":prenom$="":matiere$=""
    indexnom=0:indexprenom=0:indexmatiere=0
 
    'affichage de tous les enregistrements
    print #Profs.visu, "!cls"
    print #Profs.visu, entetecolonnes$
    for a=1 to 12
        gosub [affiche_ligne]
    next
 
    wait
 
 
[critere]   'on affiche nom, prénom et matière correspondant
            'aux choix fait dans les comboboxs

    for a=0 to 12:dejalu(a)=0:next
        'dejalu() sert à ne pas afficher deux fois le même prof en filtre "ou"

    'réinitialisation, pour être sûr de repartir de zéro à chaque nouveau choix de l'utilisateur
    nom$="":prenom$="":matiere$=""
    indexnom=0:indexprenom=0:indexmatiere=0
 
    'relevé des index des combobox
    print #Profs.cbnom, "selectionindex? indexnom"
    print #Profs.cbprenom, "selectionindex? indexprenom"
    print #Profs.cbmat, "selectionindex? indexmat"
 
    'y aura-t-il une nouvelle recherche ?
    if indexnom>0 or indexprenom>0 or indexmat>0 then 'il y aura un affichage

        print #Profs.visu, "!cls"   'donc on efface les données précédemment inscrites
                                    'dans le texteditor
        print #Profs.visu, entetecolonnes$ 'et on affiche les en-tetes de colonne

        'on met en chaîne les caractéristiques sélectionnées dans les combobox
        if indexnom>1 then print #Profs.cbnom, "contents? nom$" else nom$=""
        if indexprenom>1 then print #Profs.cbprenom, "contents? prenom$" else prenom$=""
        if indexmat>1 then print #Profs.cbmat, "contents? matiere$" else matiere$=""
 
        'et on recherche dans les tableaux les enregistrement correspondant à ces chaînes
        if filtre$ = "OU" then
            if indexnom>1 then 'un nom est sélectionné
                'on fait défiler tous les noms
                for a=1 to 12
                    'si on trouve un nom identique, on l'affiche, avec ses prénoms et matière
                    if profNom$(a)=nom$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
 
            if indexprenom>1 then 'un prénom est sélectionné
                'on fait défiler tous les prénoms
                for a=1 to 12
                    'si on trouve un prénom identique, on l'affiche, avec ses noms et matière
                    if profPrenom$(a)=prenom$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
 
            if indexmat>1 then 'une matière est sélectionnée
                'on fait défiler toutes les matières
                for a=1 to 12
                    'si on trouve une matière identique, on l'affiche, avec ses noms et prenom
                        if profMatiere$(a)=matiere$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
        end if
 
        if filtre$ = "ET" then
            'relevé des indexs des combobox utilisées
            cas=0
            if indexnom>1 then cas=100
            if indexprenom>1 then cas=cas+10
            if indexmat>1 then cas=cas+1
 
            select case cas
                case 000    'rien

                case 001    'recherche matière
                    for a=0 to 12
                        if profMatiere$(a)=matiere$ then gosub [affiche_ligne]
                    next
 
                case 010    'recherche prénom
                    for a=0 to 12
                        if profPrenom$(a)=prenom$ then gosub [affiche_ligne]
                    next
 
                case 011    'recherche matière et prénom
                    for a=0 to 12
                        compte=0
                        if profMatiere$(a)=matiere$ then compte=compte+1
                        if profPrenom$(a)=prenom$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 100    'recherche nom
                    for a=0 to 12
                        if profNom$(a)=nom$ then gosub [affiche_ligne]
                    next
 
                case 101    'recherche nom et matière
                    for a=0 to 12
                       compte=0
                        if profNom$(a)=nom$ then compte=compte+1
                        if profMatiere$(a)=matiere$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 110    'recherche nom et prénom
                    for a=0 to 12
                        compte=0
                        if profNom$(a)=nom$ then compte=compte+1
                        if profPrenom$(a)=prenom$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 111    'recherche nom, prénom et matière
                    for a=0 to 12
                        compte=0
                        if profNom$(a)=nom$ then compte=compte+1
                        if profPrenom$(a)=prenom$ then compte=compte+1
                        if profMatiere$(a)=matiere$ then compte=compte+1
                        if compte=3 then gosub [affiche_ligne]
                    next
            end select
 
        end if
    end if
 
    'choix de la fin du sous programme,
    'si le programme arrive en provenance d'un combobox ou d'un gosub
    if reprocede=0 then wait else return
    'wait

 
[affiche_ligne]
    a$=left$(profNom$(a)+space$(longMaxNom),longMaxNom)
    b$=left$(profPrenom$(a)+space$(longMaxPrenom),longMaxPrenom)
    c$=left$(profMatiere$(a)+space$(longMaxMat),longMaxMat)
    print #Profs.visu, a$;b$;c$
    return
 
 


Bonne lecture !



Edité par Christophe Le 29/05/2017 à 01h34
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/05/2017 à 22h32

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Citation:
et qu'il n'a rien posté de plus depuis plusieurs jours

Je rumine dans mon coin, je réfléchissais aussi à une table, concomitamment à la combinatoire que je me demande par quel bout attraper.
Citation:
on peut traduire cette table en trois tableaux

Bah je la voyait en un seul Dim tableau$(Nnoms, Xcaractéristiques)
Et il suffit de rechercher par mots-clé, et de noter les index pour les afficher; sélection sur place
Sélection="Blond" => Affiche tous les blonds
Mais pour rendre la chose polymorphique (par exemple pouvoir ajouter des caractéristiques , c'est une autre paire de manches; sauf à agir sur les fichiers d'entrée avec exploration préalable (dim tableau)
J'ai fait ça: Qui rempli le tableau avec des nombres de 1 à 20 (sortie en mainwin)
On entre un nombre de 1 à 20 dans le textbox, puis "Go!"
Et ça affiche(en mainwin) les places dans le tableau, il suffit d'afficher les contenus
Modifié le 30 à 17h50
Code VB :
 
    '  NOMAINWIN
    WindowWidth = 280
    WindowHeight = 460
    UpperLeftX = (DisplayWidth-WindowWidth)-200
    UpperLeftY = 20 ' (DisplayHeight-WindowHeight)
    TEXTBOX #w.entr, 20 , 50, 50, 25
    BUTTON #w.go, "Go !", [go], UL, 90, 50, 40, 20
    GRAPHICBOX #w.m 0, 0, 280, 460
    OPEN "Help" FOR window_nf AS #w
    #w, "TRAPCLOSE [closeH]"
    dim stat(11,5)
    #w.m , "down"
    'wait
  [p1]
    #w.m , "fill blue; color yellow; backcolor blue"
    #w.m , "PLACE 10, 20": #w.m, "\- well "
       for n=1 to 10
         for x=1 to 5
           stat(n,x)=int(rnd(1)*20) + 1
         next x
       next n
    '-------------
       for n=1 to 10
       print "Prof N°: ";n
         for x=1 to 5
         print stat(n,x)
         next x
         print
       next n
  wait
  [go]
    #w.entr, "!contents? var$": var=val(var$)
    if var$="" then wait
         print "Les: ";var$
       for n=1 to 10
         for x=1 to 5
         if str$(stat(n,x))=var$ then
           print "stat(";n;" , ";x;")   Contenu: ";
         end if
         next x
        ' print
       next n
  wait
  [closeH]
    CLOSE  #w
    END
 
____________________
Roro

   
Le 30/05/2017 à 22h41

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Purée ! Bien vu. En effet, un tableau à deux index peut être intéressant, mais je n'ai jamais beaucoup travaillé avec ce genre de bestiole. En fait, un exemple que j'ai pris dans l'aide présente tout à fait la structure d'une table de base de donnée :
Code VB :
 
dim customerInfo$(10, 5)
  print "Please enter information for 10 customers."
  for index = 0 to 9
    input "Customer name >"; info$ : customerInfo$(index, 0) = info$
    input "Address >"; info$ : customerInfo$(index, 1) = info$
    input "City >"; info$ : customerInfo$(index, 2) = info$
    input "State >"; info$ : customerInfo$(index, 3) = info$
    input "Zip >"; info$ : customerInfo$(index, 4) = info$
  next index
 

Le petit inconvénient est qu'une fois qu'on se retrouve dans les profondeurs du listing, il faut se souvenir à quel champ correspond l'enregistrement tableau$(2,3), par exemple. En cela, définir des tableaux à un seul index en leur donnant un nom explicite est plus accessible.

Quoique, si on compare
Code VB :
 
dim ProfNom$(10), ProfPrenom$(10)
ProfNom$(3)="Letourneur"
ProfPrenom$(3)="Sibellius"
 

avec
Code VB :
 
dim Prof$(10,2)
Prof$(3,0)="Letourneur"
Prof$(3,1)="Sibellius"
 

je dirais que la formulation la plus claire est la seconde.

Je vais réécrire le prochain programme, celui où prof et matière sont deux tables séparées, en utilisant ces tableaux à deux indexes (indexs, index ??).

Il y avait aussi la solution que tu as employé dans ton programme Affectations : tous les champs dans la même chaine, et la chaine stockée en tableau, accessible par un seul index. En utilisant l'instruction WORD et un caractère de séparation dont on est quasi-certain qu'il ne sera jamais utilisé par un utilisateur, on peut facilement accéder à un champ précis...

Finalement on a le choix des méthodes.

PS : Dans le prog dans ton post précédent, tu as oublié d'afficher str$(stat(n,x)), c'est plus clair comme ça (sp [go]) :
Code VB :
 
         if str$(stat(n,x))=var$ then
           print "stat(";n;" , ";x;")   Contenu: ";str$(stat(n,x))
         end if
 

C'était pour voir si je suivais ? ;)



Edité par Christophe Le 31/05/2017 à 19h02
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 30/05/2017 à 23h57

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
J'avais fait ce que tu propose , mais je l'ai enlevé car ça pouvait dérouter vu qu'il ne s'agit que de nombres et non de caractéristiques identifiables
Et si on met l'index de comptage des items; celui de la boucle for next en "n" dans stat(n,x)
Et que le nom des profs ne soit plus qu'une caractéristiques de plus: "x;y;z;t;u;v;w..."
On obtient n tableaux à 1 dimension et à x index's
C'est maaaagique.
____________________
Roro

   
Le 31/05/2017 à 18h58

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Oki, c'est vrai qu'il fallait avoir envie de savoir ce qu'il y avait derrière ces nombres ;)


Voilà la mouture avec deux tables et l'utilisation de tableaux multidimensionnels. Je suis un peu déçu.

C'est assez commode à concevoir, mais il y a deux bémols :
  • 1. quand on lit une ligne de code il est en effet moins évident de savoir ce que représente prof$(2,1), alors que ProfPrenom$(2) était plus parlant.
  • 2. les combobox n'acceptent que des tableaux unidimensionnels, d'où l'obligation de créer à leur usage une copie unidimensionnelle des tableaux qu'on souhaite leur attribuer, ce qui amène à des tables en double et c'est dommage. Y'a sûrement moyen de limiter le nombre de données, cependant... (*)

J'ai seulement modifié le programme pour qu'il accepte les deux tables et la liaison, "pour voir si ça marche", je n'ai rien optimisé.

Est-ce normal : à un moment j'avais mis les déclarations des tableaux en sous-programme, tout en bas du listing, avec en début de programme un gosub qui pointait sur ces déclarations, mais le compilateur ne voulait rien savoir, pour lui je n'avais pas déclaré les tableaux.

Les prochaines versions seront en zip, car j'y mettrai les données non plus en data, mais en fichiers txt indépendants, et le code est appelé à grandir.

The code :
Code VB :
 
'profs 0ca

nomainwin
 
'construction de la base de données :
    [profs] '   "nom","prénom"
    data "Trucmuche","Alain"
    data "Machin","Marcel"
    data "Lapaille","Jean-Benoît"
    data "Lapoutre","Ulysse"
    data "Legendre","Lucienne"
    data "Lebianski","Josiane"
    data "Lavache","Ernest",
    data "Tuboeuf","Adrienne"
    data "Sinclair","Bratt"
    data "Rabeau","Elisabeth"
    data "Nun","Elodie"
    data "Lavache","Michel"
 
    dim prof$(13,2)     'second index : nom, prénom
    dim ,ComboProfNom$(13),ComboProfPrenom$(13) 'tableaux pour les combobox

    'enregistrement 0 (réservé pour le fonctionnement du programme)
    prof$(0,0)=" "
    prof$(0,1)=" "
    ComboProfNom$(0)=" "
    ComboProfPrenom$(0)=" "
 
    restore [profs]
    print
    print "Professeurs :"
    for a=1 to 12
        read a$,b$
        prof$(a,0)=a$
        ComboProfNom$(a)=a$
        prof$(a,1)=b$
        ComboProfPrenom$(a)=b$
        print prof$(a,0);" ";prof$(a,1)
    next
 
 
    [matieres]' "matière","abréviation"
    data "Mathématiques","Maths."
    data "Philosophie","Philo."
    data "Français","Franç."
    data "Histoire-Géographie","Hist.-Géo."
    data "Education Physique et Sportive","EPS"
    data "Physique","Phys."
    data "Biologie","Biolo."
    data "Arts Plastiques","Arts P."
 
    dim matiere$(8,2)   'second index : nom matière, abréviation
    dim ComboMatiere$(8)'tableau pour la combobox Matière

    'enregistrement 0 (réservé pour le fonctionnement du programme)
    matiere$(0,0)=" "
    matiere$(0,1)=" "
    ComboMatiere$(0)=" "
 
    restore [matieres]
    print
    print "Matières :"
    for a=1 to 8
        read a$,b$
        matiere$(a,0)=a$
        ComboMatiere$(a)=a$
        matiere$(a,1)=b$
        print matiere$(a,0);" ";matiere$(a,1)
    next
 
 
    [enseigne] '   id. prof, id. matière
    data 1,1
    data 2,2
    data 3,3
    data 4,4
    data 5,3
    data 6,1
    data 7,4
    data 8,5
    data 9,6
    data 10,1
    data 11,7
    data 12,8
 
 
    dim enseigne(50,2)     'second index : identifiant prof, identifiant matière

    'enregistrement 0 (réservé pour le fonctionnement du programme)
    enseigne(0,0)=0 'posera peut-être problème avec les combobox
    enseigne(0,1)=0
 
    restore [enseigne]
    print
    print "Prof x enseigne matière y :"
    for a=1 to 12
        read b,c
        enseigne(a,0)=b
        enseigne(a,1)=c
        print prof$(b,0);" ";prof$(b,1);" : ";matiere$(c,0)
    next
 
    dim dejalu(13)
 
    'formatage de l'affichage
    longMaxNom=20
    longMaxPrenom=20
    longMaxMat=40
    entetecolonnes$="Nom :               Prenom :            Matière enseignée :"
 
    'fonte de caractère à chasse fixe (pour afficher en belles colonnes rectilignes)
    fonteditor$="Liberation_Mono"
 
'prepa et ouverture fenetre "Professeurs"
    'taille et couleur de la fenêtre
    WindowWidth=800
    WindowHeight=600
 
    BackgroundColor$ = "lightgray"
    ForegroundColor$ = "blue"
    TextboxColor$ = "white"
    ComboboxColor$ = "white"
 
    'définition des controles
    'STATICTEXT #profs.info, "Professeurs", 20, 20, 200, 20
    BUTTON #Profs.bttout, "tous les professeurs", [tous_les_profs], ul, 20, 30, 100, 20
 
    STATICTEXT #Profs.stNom, "Nom :", 140, 10, 100, 20
    COMBOBOX #Profs.cbnom, ComboProfNom$(), [critere], 140, 30, 100, 20
 
    STATICTEXT #Profs.stPre, "Prénom :", 260, 10, 100, 20
    COMBOBOX #Profs.cbprenom, ComboProfPrenom$(), [critere], 260, 30, 100, 20
 
    STATICTEXT #Profs.stMat, "Matière :", 380, 10, 100, 20
    COMBOBOX #Profs.cbmat, ComboMatiere$(), [critere], 380, 30, 100, 20
 
    STATICTEXT #Profs.stFil, "Filtres :", 520, 10, 100, 20
    RADIOBUTTON #Profs.rbou, "OU", [ou], [rien], 520, 30, 50, 20
    RADIOBUTTON #Profs.rbet, "ET", [et], [rien], 570, 30, 50, 20
 
    TEXTEDITOR #Profs.visu, 20, 70, 760, 450
 
    'ouverture fenetre
    open "Professeurs" for window as #Profs
 
        print #Profs.visu, "!font ";fonteditor$
        print #Profs, "trapclose [quit_Profs]"
 
        filtre$="OU"    'prépostionnement du filtre d'affichage
        if filtre$="ET" then print #Profs.rbet, "set":reprocede=1 : gosub [critere] : reprocede=0
        if filtre$="OU" then print #Profs.rbou, "set":reprocede=1 : gosub [critere] : reprocede=0
    wait
 
end
 
 
'sous programmes

[quit_Profs]    'quitter le programme
    close #Profs
    end
    wait
 
 
[et]
    filtre$="ET"
    reprocede=1 : gosub [critere] : reprocede=0
    wait
 
 
[ou]
 
    filtre$="OU"
    reprocede=1 : gosub [critere] : reprocede=0
    wait
 
 
[rien]  'particularité des radiobuttons, le second sous-programme est spécifié
        'mais inutile, à ce jour.
    wait
 
 
[tous_les_profs]    'on affiche tous les profs

    'réinitialiser les combobox
    print #Profs.cbnom, "selectindex 1"
    print #Profs.cbprenom, "selectindex 1"
    print #Profs.cbmat, "selectindex 1"
    nom$="":prenom$="":matiere$=""
    indexnom=0:indexprenom=0:indexmatiere=0
 
    'affichage de tous les enregistrements
    print #Profs.visu, "!cls"
    print #Profs.visu, entetecolonnes$
    for a=1 to 12
        gosub [affiche_ligne]
    next
 
    wait
 
 
[critere]   'on affiche nom, prénom et matière correspondant
            'aux choix fait dans les comboboxs

    for a=0 to 12:dejalu(a)=0:next
        'dejalu() sert à ne pas afficher deux fois le même prof en filtre "ou"

    'réinitialisation, pour être sûr de repartir de zéro à chaque nouveau choix de l'utilisateur
    nom$="":prenom$="":matiere$=""
    indexnom=0:indexprenom=0:indexmatiere=0
 
    'relevé des index des combobox
    print #Profs.cbnom, "selectionindex? indexnom"
    print #Profs.cbprenom, "selectionindex? indexprenom"
    print #Profs.cbmat, "selectionindex? indexmat"
 
    'y aura-t-il une nouvelle recherche ?
    if indexnom>0 or indexprenom>0 or indexmat>0 then 'il y aura un affichage

        print #Profs.visu, "!cls"   'donc on efface les données précédemment inscrites
                                    'dans le texteditor
        print #Profs.visu, entetecolonnes$ 'et on affiche les en-tetes de colonne

        'on met en chaîne les caractéristiques sélectionnées dans les combobox
        if indexnom>1 then print #Profs.cbnom, "contents? nom$" else nom$=""
        if indexprenom>1 then print #Profs.cbprenom, "contents? prenom$" else prenom$=""
        if indexmat>1 then print #Profs.cbmat, "contents? matiere$" else matiere$=""
 
        'et on recherche dans les tableaux les enregistrement correspondant à ces chaînes
        if filtre$ = "OU" then
            if indexnom>1 then 'un nom est sélectionné
                'on fait défiler tous les noms
                for a=1 to 12
                    'si on trouve un nom identique, on l'affiche, avec ses prénoms et matière
                    if prof$(a,0)=nom$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
 
            if indexprenom>1 then 'un prénom est sélectionné
                'on fait défiler tous les prénoms
                for a=1 to 12
                    'si on trouve un prénom identique, on l'affiche, avec ses noms et matière
                    if prof$(a,1)=prenom$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
 
            if indexmat>1 then 'une matière est sélectionnée
                'on fait défiler toutes les matières
                for a=1 to 12
                    'si on trouve une matière identique, on l'affiche, avec ses noms et prenom
                        idmat=enseigne(a,1)
                        if matiere$(idmat,0)=matiere$ and dejalu(a)=0 then
                        dejalu(a)=1
                        gosub [affiche_ligne]
                    end if
                next
            end if
        end if
 
        if filtre$ = "ET" then
            'relevé des indexs des combobox utilisées
            cas=0
            if indexnom>1 then cas=100
            if indexprenom>1 then cas=cas+10
            if indexmat>1 then cas=cas+1
 
            select case cas
                case 000    'rien

                case 001    'recherche matière
                    for a=0 to 12
                        idmat=enseigne(a,1)
                        if matiere$(idmat,0)=matiere$ then gosub [affiche_ligne]
                    next
 
                case 010    'recherche prénom
                    for a=0 to 12
                        if prof$(a,1)=prenom$ then gosub [affiche_ligne]
                    next
 
                case 011    'recherche matière et prénom
                    for a=0 to 12
                        compte=0
                        idmat=enseigne(a,1)
                        if matiere$(idmat,0)=matiere$ then compte=compte+1
                        if prof$(a,1)=prenom$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 100    'recherche nom
                    for a=0 to 12
                        if prof$(a,0)=nom$ then gosub [affiche_ligne]
                    next
 
                case 101    'recherche nom et matière
                    for a=0 to 12
                       compte=0
                        if prof$(a,0)=nom$ then compte=compte+1
                        idmat=enseigne(a,1)
                        if matiere$(idmat,0)=matiere$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 110    'recherche nom et prénom
                    for a=0 to 12
                        compte=0
                        if prof$(a,0)=nom$ then compte=compte+1
                        if prof$(a,1)=prenom$ then compte=compte+1
                        if compte=2 then gosub [affiche_ligne]
                    next
 
                case 111    'recherche nom, prénom et matière
                    for a=0 to 12
                        compte=0
                        if prof$(a,0)=nom$ then compte=compte+1
                        if prof$(a,1)=prenom$ then compte=compte+1
                        idmat=enseigne(a,1)
                        if matiere$(idmat,0)=matiere$ then compte=compte+1
                        if compte=3 then gosub [affiche_ligne]
                    next
            end select
 
        end if
    end if
 
    'choix de la fin du sous programme,
    'si le programme arrive en provenance d'un combobox ou d'un gosub
    if reprocede=0 then wait else return
    'wait

 
[affiche_ligne]
    a$=left$(prof$(a,0)+space$(longMaxNom),longMaxNom)
    b$=left$(prof$(a,1)+space$(longMaxPrenom),longMaxPrenom)
    idmat=enseigne(a,1)
    c$=left$(matiere$(idmat,0)+space$(longMaxMat),longMaxMat)
    print #Profs.visu, a$;b$;c$
    return
 
 




Edité par Christophe Le 31/05/2017 à 19h16
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 31/05/2017 à 19h26

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
(*) et je disais une bêtise : la combobox n'a pas à accueillir la totalité de la table, si on a 50 "Machefer" dans la table prof$(i,0) il serait bon de n'en faire figurer qu'un seul dans la combobox, et les 50 s'afficheront dans le texteditor quand on choisira "Machefer"...

Le prochain travail : obtenir le tableau destiné au combobox #Profs.cbnom en filtrant la table prof$() pour supprimer les doublons, et en faisant un tri alphabétique...



Edité par Christophe Le 01/06/2017 à 20h50
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 31/05/2017 à 23h00

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Je pense qu'il faut définir le (les) but(s)
Pour moi, c'est d'extraire tous les ensembles contenant la sélection
Quand tu a l'air de t'orienter vers une base par rubriques
Il semble que la structure des bases dépend de leur contenu et de ce qu'on veut en faire
____________________
Roro

   
Le 01/06/2017 à 20h46

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
alut Roland,

C'est vrai, il faut définir les but, mais nous n'en sommes pas encore là...

Sorry, j'en ai écrit une tartine...

Pour le moment, j'en suis à la programmation des relations entre les tables. Cela ne devrait pas être sorcier d'en faire un sous-programme, car c'est toujours le même schéma qui sera utilisé : une table d'un coté, une table de l'autre, et au milieu des indexes pour les mettre en relation. Bon, il existe aussi des relations à plus de deux tables, mais on va déjà commencer par plus courant et plus facile.

A terme, si on arrive au bout du projet sans tomber dans l'usine à gaz, il y aura au minimum 3 tables : profs, matières, salles, et les autres tables seront le reflet des relations mises en place entre ces trois tables principales.

Tant qu'il s'agit de quelques profs qui enseignent une matière, et qu'on est dans notre monde d'expérimentateurs libres de programmes basic et qu'on fait ce que bon nous semble, on peut sans souci se contenter d'une table unique, ou de concevoir plusieurs tables sans trop y réfléchir.

Mais créer deux tables et les relier correctement clarifie la base de donnée. Imagine un instant qu'au fil du temps, avec les mutations des personnels enseignants et administratifs, des personnes différentes créent des fiches de professeurs de maths, donc nom, prénom et tout le toutim, puis à matière : mathématique, ou Mathématique, ou Mahtematiques, ou maths, ou Math, ou Mathém. ou que sais-je encore... La requête pour extraire la totalité des professeurs de math risque fort de friser l'impossible.

Alors que si on crée une table Matière, comprenant les infos qui s'y rapportent, comme un champ "nom" (Mathématiques), un champ "abreviation" (Math., utile lorsque la place est comptée, comme dans un emploi du temps), un champ "niveau" (Seconde), et pourquoi pas un champ "spécialité", un seul identifiant permet d'accéder à l'entrée "Mathématiques" et à toutes ses caractéristiques..

Dans notre JB/LB, lorsqu'on créera une fiche "Prof", il y aura un moment donné dans le formulaire, une combobox "Matières" listant les matières disponibles, et dans laquelle il y aura bien un seul "Mathématiques", ou plusieurs "Mathématiques" mais ayant une raison valable d'être là, et clairement identifiables les uns des autres, comme "Mathématiques SP1", "Mathématiques AB3", etc...,

Une fois fait le choix de l'utilisateur on récupèrera alors l'index de la combobox pour déterminer l'identifiant de "Mathématiques" dans la table matières$(), c'est déjà comme ça que fonctionnent les filtres des programmes que j'ai mis ici.

De même, s'il y a besoin de modifier une caractéristique de "Mathématiques", on ne le fait qu'une fois au niveau de la table matières$(), on a pas à reprendre le champ matière pour chaque prof tel qu'on devrait le faire si nous avions tout mis dans une table unique.

Un autre avantage est de permettre l'enseignement de plusieurs matières, Français et Histoire-Géo par un certain John Ouenne, par exemple :
On appellera "enseigne" la relation entre prof et matière : la table "enseigne" aura deux enregistrements relatifs à Ouenne, un premier qui lie l'idendifiant de J. Ouenne avec celui de Français, et un second qui lie J. Ouenne à l'Histoire-Géo, ce qui en clair donne ceci :
Code VB :
 
'quelque part dans le programme,
'	(My name is Ouenne, John Ouenne)
prof$(4,0)="Ouenne"
prof$(4,1)="John"
 
'un peu plus loin
matiere$(3,0)="Histoire Géographie"
'...
matiere$(6,0)="Français"
 
'et au final, quand on aborde les compétences de J. Ouenne,
'on le retrouve, par ex, dans les 12è et 13è éléments de la table "enseigne"
enseigne(12,0)=4:enseigne(12,1)=6	'J.Ouenne (prof$(4)) enseigne le Français (matiere$(6))
enseigne(13,0)=4:enseigne(13,1)=3	'J.Ouenne (prof$(4)) enseigne l'Histoire-Géo. (matiere$(3))


si on fait une recherche sur les matières enseignées par J Ouenne, on fait le tour des champs enseigne(x,0) et à chaque fois qu'on trouve 4 on applique le contenu de enseigne(x,1) à matiere$(), et on devrait retrouver Français et Histoire.
Code VB :
 
  if enseigne(boucle,0)=4 then print matiere$(enseigne(x,1),0) 
 


De même, si on recherche qui enseigne le Français, on fait le tour des champs enseigne(x,1) et à chaque fois qu'on trouve 6 on affiche le contenu de prof$(enseigne(x,0),0), et dans la liste obtenue on devrait y retrouver notre John Ouenne. Idem pour l'histoire-géo.

Code VB :
 
  if enseigne(boucle,1)=6 then print prof$(enseigne(x,0),0);" ";prof$(enseigne(x,0),1)	' -> Ouenne John


Tout ça en ne travaillant que sur une table qui a été créée pour lier profs et matières...

Alors que si nous voulions entrer nos deux matières dans une table unique, on pourrait s'en sortir en ajoutant un nouveau champ "seconde matière", mais ce serait écrit en dur, donc pas modifiable, ce ne sont pas tous les profs qui enseignent deux matières, et il se peut qu'il y en ait qui en enseignent trois, c'est moins souple à gérer...

Je ne vois que des avantages à cette organisation en tables et relations, plutôt qu'en tables qu'on établit à l'instinct. Au moins ça mérite le questionnement.

Ceci dit, c'est expérimental, il n'y a pas de prétention à faire une vraie base de données

A+
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 01/06/2017 à 21h16

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Citation:
Pour moi, c'est d'extraire tous les ensembles contenant la sélection

C'est déjà ce qui se passe :
ET : pour afficher seulement les enregistrements qui correspondent à nom ET prénom ET matière,
OU : pour afficher tous les enregistrements qui contiennent nom OU prénom OU matière.

Une combobox dans laquelle on a choisi l'espace, est ignorée.
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 02/06/2017 à 07h10

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Je réfléchis, et ce week-end, je ponds un truc qui déchire
____________________
Roro

   
Le 03/06/2017 à 01h32

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Le premier arrivé attend l'autre :)
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 03/06/2017 à 14h13

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Bah finalement, il sort un simple outil de recherche
Tout se passe dans le fichier "data.txt", dans lequel on mets ce qu'on veut
Je crois que je capte pas bien la notion de base de données
Pourtant je me sers de dbwork dans laquelle j'ai mis des articles par thèmes, pages et N° de revue

C'est là--->: essai table.zip

Edit: Comme on peut le constater, je me suis fais avoir avec la largeur des caractères
Et je ne suis pas parvenu à faire fonctionner le: "!origin?!?...gloups" pour faire des colonnes
Je vais fouiner chez les anglophones...
____________________
Roro

   
Le 03/06/2017 à 19h01

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Citation:
il sort un simple outil de recherche

Citation:
Je crois que je capte pas bien la notion de base de données

C'est bien là l'intéret de la base de donnée, que de pouvoir y faire des recherches avec différents critères ?

En fait, pour être à l'aise dans la conception des bases de données il faut une bonne dose de pratique derrière soi, et pour ma part je n'ai que quelques notions... De ce que j'ai retenu, entre autres, c'est "pas de doublons", "pas d'incertitudes", une organisation des données tracée au cordeau, des étapes et des règles à respecter avant de seulement songer à programmer. Alors que nous sommes davantage dans le "Si j'avais telle table à numériser, je m'y prendrais comment ?"

Donc ne sois pas déçu, il fonctionne bien, ton prog. N’empêche, ça me fait aussi cet effet-là, de temps en temps : on passe des heures à tout mettre en place, et au final on obtient un petit truc qui clignote à l'écran. Tout ça pour ça. Quoi de plus affligeamment banal que ce truc qui clignote ? On ne se rend pas compte, quand on utilise un logiciel, du travail qu'il y a derrière une combobox ou une case à cocher (qui serait plutôt une banquette qu'une case, mais je ne suis pas spécialiste es-diligence ;) )

Sympa le double clic sur un mot dans la liste du haut puis un clic sur le bouton pour afficher toutes les occurrences de ce nom dans la liste du bas. Y'aurait pas moyen de se passer du bouton pour afficher directement les occurrences trouvées juste avec le double-clic ?

Pour faire les colonnes dans un texteditor, j'utilise une police à chasse fixe et je formate chaque ligne avant de l'imprimer, mais peut-être que ce n'est pas compatible avec ton approche. Cependant j'ai essayé les modifs ci-dessous (Liberation_mono à la place d'Arial), et ça a un peu arrangé les choses :
Code VB :
#s.m, "font Liberation_Mono 10 bold": #s.tp, "!font Liberation_Mono 10 bold": #s.sor, "!font Liberation_Mono 10 bold"
et j'ai passé de 20 à 15 le nombre d'espaces dans ta boucle
Code VB :
for e=1 to 15-len(word$(donnee$,x))

Je n'ai pas regardé ailleurs (il y a maintenant un léger décalage dans la liste du bas)

Ton essai est pas mal, je trouve...
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 03/06/2017 à 20h08

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Je vais tester ta fonte (si je l'ai dans mes tablettes où je ne pense pas l'avoir vue)
Je n'ajoute pas un nombre fixe d'espaces, mais je complète à 20 la len(mot$) avec des espaces

Edit: JB n'a pas trouvé la "libération_mono" sur mon pc
____________________
Roro

   
Le 03/06/2017 à 21h08

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Citation:
"libération_mono"
Si tu as mis l'accent, c'est normal ;) Je ne sais plus si la casse a de l'importance. En tout cas il faut remplacer un éventuel espace dans le nom de la fonte par le caractère de soulignement

Autrement tu dois bien avoir Courrier (ou Courier ? ) ou Lucida Console ou Terminal ou quelque chose du genre ?

De mémoire, quelle police est utilisée par la fenetre DOS qu'on trouve dans les windows ?



Edité par Christophe Le 03/06/2017 à 21h09
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 04/06/2017 à 08h30

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Par: Demarrer/Panneau de Configuration/Polices, on est dans le dossier des polices.
Il faut réfléchir au mode d'affichage.
Chez moi ça ne change rien, JB a dû importer quelques polices mais pas toutes.
____________________
Roro

   
Le 04/06/2017 à 13h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Avec "font courrier new", ça s'aligne nickel.
Mais il doit y avoir un bug car de temps en temps ça ne marche pas à la première manip.
C'est le: "De temps en temps" qui est inquiétant
____________________
Roro

   
Le 05/06/2017 à 12h25

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Pour ton bug, si tu parles du texteditor du bas, c'est peut-être parce que ton formatage oublie de donner une taille fixe aux champs :
Code VB :
 
       for b=1 to 7
         #s.sor, entr$(resn(h),b);"     ";
       next b
 

pourquoi pas #s.sor, left$(entr$(resn(h),b)+space$(15),15); ?

Si c'est autre chose je n'ai pas réussi à le reproduire...

Pour la compréhension de la base de données, il faut oublier le langage courant, parce qu'on y fait des quantités de raccourcis.

Ainsi telle personne n'est pas blonde, ce sont ses cheveux qui le sont. "blond" est une caractéristique du cheveu, qui en a d'autre : épaisseur, souplesse, nombre au cm2, etc...

Après, qu'on stocke toutes ces données en une seule table, ou en une multitude de tables liées par des relations, ce n'est qu'une histoire d'organisation des dites données, du moment qu'on retrouve ultérieurement les données qu'on cherche.

L'âge n'est pas un bon critère puisqu'il change tout le temps, ou alors associé à la date où on crée la personne dans la base de donnée.

Je n'ai pas l'expérience pour en dire plus sans prendre le risque de dire des âneries. Les gens intéressés peuvent écrire "merise" dans leur google favori, il y a beaucoup de littérature sur le sujet (bon courage ;) )

Je m'en retourne, d'ici quelques jours, à ma base de profs qui enseignent des matières dans des salles...
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 05/06/2017 à 12h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1905
Lol ! J'ai mis ce qui me passait par la tête pour avoir plusieurs occurrences pour tester
Vu que les tableaux sont surdimensionnés, on peut allonger dans les deux sens
Le blème, c'est pour créer des textbox à la demande puisque à chaque modif de code il faut recompiler
Un "Auto-recompile" serait le bienvenu.
____________________
Roro

   
Le 07/06/2017 à 19h28

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 394
Oki,

Citation:
Le blème, c'est pour créer des textbox à la demande


je ne saisis pas trop ce que tu entend par "à chaque modif de code il faut recompiler" : à vue de nez ça semble automatique, tu modifie le code donc tu es obligé de recompiler... voulais-tu dire "redéfinir la fenêtre et donc ses textbox quand il en faut un nombre différent de l'actuel affichage" ?
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia5 + Wine (support partiel et quelques petites choses non implémentées dans l'aide mais pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Débutant » Tables et relations en Just/Liberty Basic tests de faisabilité d'une base de données  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie