Forum Liberty Basic France

Débutant » Tables et relations en Just/Liberty Basic tests de faisabilité d'une base de données
Le 23/07/2017 à 19h09

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Reprise du message précédent

Citation:
on est limité en taille
.
Purée..Moi je me demande quoi y mettre, et toi tu crains d'être limité en taille.
Mais qu'est-ce que tu compte y mettre dans cette base ?

Edit: Tiens sur "Jeux Vidéos", il y en a un qui a une liste de 20 millions de trucs à 5 ou 6 mots chaque
Il a l'air de faire de la recherche par mots
Il trouve que 3 secondes c'est trop long
Combien de temps mettrait JB à scanner la chose ? Un jour ou un an ?
____________________
Roro

   
Le 23/07/2017 à 23h17

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Citation:
qui a une liste de 20 millions de trucs à 5 ou 6 mots chaque
Bonne question, il faudrait que j'aille voir.

Ceci dit, au vu de ce que j'ai pratiqué jusqu'à présent dans cette discussion, Just/liberty Basic ne semblent pas conçus pour les bases de données. Bien sûr, si on peut lire des fichiers ou rechercher un mot dans un tableau, on peut lire des tables ou programmer des requêtes, mais je n'ai pas vu d'instructions dédiées. Ce qui veut dire que, pour maintenir et développer une vraie base, il faudrait compenser cette absence par une palanquée de codes rédigés à la main, de ruses de sioux et/ou l'utilisation de DLL. On sort là du cadre de mon petit essai (et accessoirement, la programmation me prend trop de temps, mais c'est difficile de résister^^ ).

Actuellement ma base qui était en datas est maintenant en fichiers dans sa version pratiquement définitive, et j'ai ajouté une table supplémentaire qui liste les paramétrages de la base et des tables, le programme se réfèrera à cette table pour examiner les fichiers de la base.

Donc je suis prêt pour l'étape suivante, tel un peintre devant sa toile blanche ;) je laisse reposer tout ça et je reviendrai à la prochaine avancée significative...
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 24/07/2017 à 10h11

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Citation:
ne semblent pas conçus pour les bases de données

Le défaut de JB c'est de ne pas permettre "l'emboitement" des variables ($); mais pour ça, il faut faire de "L'Orienté Objet", c'est une autre histoire...
Citation:
développer une vraie base

Et bien je ne sais pas, ne comprends pas ce que tu appelle une "vraie" base.
Si c'est de pouvoir modifier la base par l'interface, c'est très possible en JB. Et même d'en créer, d'en gérer plusieurs en même temps et de les faire interagir (multi-fenêtrage)
Citation:
se réfèrera à cette table pour examiner les fichiers de la base

ça sous-entend que le fichier doit être structuré (à partir de données brutes)
Alors autant travailler directement dans le fichier que d'entrer les données par une interface qui ne peut être que rigide et restrictive.
Pour moi, le programme ne doit servir qu'à faire ce qu'on veut faire des données. Il "suffit" d'ajouter des fonctions au programme; mais on ne refera pas un "Exel" ou un "Genumeric".
Citation:
la programmation me prend trop de temps

Ah ben, c'est ça ou les séries télé
Perso, il y a bien longtemps que j'ai jeté la télé; la télé, ça mange la vie
____________________
Roro

   
Le 25/07/2017 à 20h21

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Citation:
Citation:
se réfèrera à cette table pour examiner les fichiers de la base


ça sous-entend que le fichier doit être structuré (à partir de données brutes)


Tout à fait. J'étais parti sur une idée préconçue avec cette table auxiliaire, il suffit de figer l'organisation des données à l’intérieur du fichier, et le nombre d'enregistrements, de champs, le séparateur, peuvent être déduits de l'analyse du fichier.

Je veux parfois faire trop perfectionné dès le début...

Citation:
Perso, il y a bien longtemps que j'ai jeté la télé; la télé, ça mange la vie

Je dirais bien la même chose de la programmation ;)
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 25/07/2017 à 22h04

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Citation:
Je dirais bien la même chose de la programmation ;)

La programmation, ça fait pétiller le cerveau
Et des fois ça le fait fumer
____________________
Roro

   
Le 29/07/2017 à 22h46

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Je confirme... ;)

Quelques mots pour tenir au courant : ça avance pas trop mal.

J'ai repris la base avec les tables profs, matières et enseigne.

Dans cette version du programme il n'y a pas de tableaux : ce sont seulement des fichiers qu'on lit "à la demande" pour afficher leur contenu à l'écran.

Chaque table tient dans un fichier, le fichier comporte quatre lignes d'en-tête, et les lignes suivantes sont les données.

La première ligne indique le type de fichier, car selon si c'est une table de données, comme "profs" ou "matières", ou une table de relation, comme "enseigne", le traitement n'est pas le même.

Le seconde donne un nom compréhensible par l'humain si c'est une table de donnée, et le radical du verbe si c'est une table de relation, ces deux informations permettant de présenter le contenu de la table à l'utilisateur, de manière moins "informatique"

La troisième contient le numéro des champs qu'on désire afficher (données) ou le nom des tables liées (relations)

Et la quatrième contient le nom des colonnes du bloc de données.

c'est donc un formatage bien spécifique, et je doute fort qu'on puisse ouvrir quoique ce soit d'autres que les tables que nous avons nous-même généré. Même pas essayé, d'ailleurs...

Pour le moment le programme se contente d'afficher les champs dont on a décidé, lors de la création de la base, qu'ils seraient affichés. La prochaine évolution est un second mode d'affichage, qui montrerait l'intégralité des champs des tables. Ensuite on essaiera de créer un module de recherche multi-critère, chaque critère étant défini par une combobox dans laquelle on choisit la table, une seconde combobox définissant le champ, et la troisième, ou une textbox, contiendra la valeur recherchée. Je ne pense pas aller plus loin (il faudrait pouvoir ajouter, modifier ou supprimer des enregistrements, mais ça, vu la tempête cérébrale qui a soufflé cette dernière semaine, c'est pas pour tout de suite, il faut être complètement frappadingue pour faire de la programmation "de loisir" ;) )

Le programme pour créer les fichers à partir des tables en data :
(C'est celui-ci qu'il faut utiliser, car la structure interne des tables a changé) :
Code VB :
 
'générateur de tables simplifié - 29 juillet 2017
'
'Dans les fichiers générés, la première ligne contient :
'   * nom de la table,
'   * nom long de la table (utile pour formulaires et états) ou
'   * type de table : relation entre table (1) ou données(0) 'pour programme d'affichage
'   * nombre de champs par enregistrement
'
'une fois convertie en fichier, la structure de celui-ci est :
'   * tables de données
'       ligne 1 : type=0
'       ligne 2 : nom long de la table  (pour l'utilisateur)
'       ligne 3 : liste des champs à afficher (nombres séparés par des espaces)
'       ligne 4 : modèle de la table : noms de colonnes séparées par le séparateur (;)
'       ligne 5 et au delà : données
'
'   * tables de relation
'       ligne 1 : type=1
'       ligne 2 : racine du verbe nommant la table (pour pouvoir le conjuguer dans les états)
'       ligne 3 : nom des tables mises en relation (séparés par un espace)
'       ligne 4 : modèle de la table : identifiant, première table, seconde table (;)
'           (la première table doit être le sujet du verbe nommant la table de relation,
'           "un professeur enseigne une matière", première table=professeur
'       ligne 5 et au delà : données
'
'Dans les datas, si on ajoute ou retire des enregistrements, ne pas oublier de mettre à jour
'le nombre d'enregistrements.
'
'Ajout ou suppression de tables :
'   * NbreTables contient le nombre de tables
'   * modifier manuellement le select case qu'on trouve en
'     début de [créer_tables] et qui ressemble à :

       ''sélection de la table à afficher/transférer
       ' select case tables
       '     case 1 : restore [profs]
       '     case 2 : restore [matieres]
       '     case 3 : restore [enseigne]
       ' end select

 
 
 
'pas de fenetre de débugage
nomainwin
 
 
'** construction de la base de données :

NbreTables=3    'nombre de tables

[profs] '

        'nom de la table, nom long, relation, nbre d'enregistrements, nbre de champs par enregistrements
    data "Profs","professeur",0,12,2
    data "champs 1 2","Nom Prénom", 'nom des champs, champs affichés, séparés par des espaces, donc pas d'espace dans le nom des champs

    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"
 
 
[matieres]'
        'nom de la table, nom long, relation, nbre d'enregistrements, nbre de champs par enregistrements
    data "Matière","matière",0,8,2
    data "champs 1","Matière Abréviation"  'nom des champs, champs affichés, séparés par des espaces, donc pas d'espace dans le nom des champs

    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."
 
 
[enseigne] '
        'nom de la table, nom long, relation, nbre d'enregistrements, nbre de champs par enregistrements
    data "enseigne","enseign",1,14,2
    data "Profs Matière","id.prof id.matière" 'nom des tables liées, nom des champs

    data 0,7
    data 1,5
    data 2,2
    data 3,3
    data 4,4
    data 5,3
    data 5,7    
    data 6,1
    data 7,4
    data 8,5
    data 9,0
    data 9,6
    data 10,1
    data 11,7
 
 
 
'** mise en tableau du contenu des combobox servant
'à générer le nom des fichiers et du set de tables

    'combo date
    sepdate$=" "
    dim formatDate$(14)
    formatDate$(1)="jour"
    formatDate$(2)="mois"
    formatDate$(3)="année"
    formatDate$(4)="jj";sepdate$;"mm";sepdate$;"aa"
    formatDate$(5)="jj";sepdate$;"mm";sepdate$;"aaaa"
    formatDate$(6)="jour";sepdate$;"mois";sepdate$;"aa"
    formatDate$(7)="jour";sepdate$;"mois";sepdate$;"aaaa"
    formatDate$(8)="jj";sepdate$;"mois";sepdate$;"aa"
    formatDate$(9)="jj";sepdate$;"mois";sepdate$;"aaaa"
    formatDate$(10)="aa";sepdate$;"mm";sepdate$;"jj"
    formatDate$(11)="aaaa";sepdate$;"mm";sepdate$;"jj"
    formatDate$(12)="aa";sepdate$;"mois";sepdate$;"jour"
    formatDate$(13)="aaaa";sepdate$;"mois";sepdate$;"jour"
 
    'combo heure
    dim formatHeure$(7)
    formatHeure$(1)="hh-mm"
    formatHeure$(2)="hh-mm-ss"
    formatHeure$(3)="hh h mm"
    formatHeure$(4)="hh h mm min"
    formatHeure$(5)="hh h mm min ss"
    formatHeure$(6)="hh h mm min ss sec"
 
    'combos assemblage du nom
    dim formatNomFile$(5)
    formatNomFile$(1)="< rien >"
    formatNomFile$(2)="date"
    formatNomFile$(3)="heure"
    formatNomFile$(4)="nom"
 
 
'** boucle principale
    'définition de l'interface

    'taille et couleur de la fenêtre
    WindowWidth=800
    WindowHeight=600
 
    'choix de l'extension des fichiers
    extension$=""
    GROUPBOX #gener.extfic, "Extension des fichiers de table", 10, 100, 760, 42
    RADIOBUTTON #gener.rbtxt, "*.txt", [ext_txt], [rien], 20, 116, 80, 20
    RADIOBUTTON #gener.rbdat, "*.dat", [ext_dat], [rien], 120, 116, 80, 20
    RADIOBUTTON #gener.rbcsv, "*.csv", [ext_csv], [rien], 220, 116, 80, 20
    RADIOBUTTON #gener.rbextlib, "Libre :", [ext_libre], [rien], 320, 116, 50, 20
    TEXTBOX #gener.tbext, 370, 116, 30, 20
 
    'choix du type de nom pour le dossier qui contiendra les tables
    STATICTEXT #gener.stnom, "Nom du jeu de tables :", 20, 158, 130, 20 '113
    TEXTBOX #gener.tbnom, 150, 155, 500, 20 '110

    'nom du set de tables, date
    STATICTEXT #gener.stfmtdate, "Format date :", 20, 185, 90, 20
    combobox #gener.cbdatefile, formatDate$(), [creer_nom_dossier_cb], 20, 205, 90, 20
 
    STATICTEXT #gener.stfmtheure, "Format heure :", 120, 185, 90, 20
    combobox #gener.cbheurefile, formatHeure$(), [creer_nom_dossier_cb], 120, 205, 90, 20
 
    STATICTEXT #gener.stfmtjeutab, "Formation du nom du jeu de tables", 225, 185, 200, 20
    combobox #gener.cbchamp1, formatNomFile$(), [creer_nom_dossier_cb], 225, 205, 60, 20
    combobox #gener.cbchamp2, formatNomFile$(), [creer_nom_dossier_cb], 295, 205, 60, 20
    combobox #gener.cbchamp3, formatNomFile$(), [creer_nom_dossier_cb], 365, 205, 60, 20
 
    STATICTEXT #gener.stnomdeft, "Aperçu :", 440, 185, 340, 20
    STATICTEXT #gener.stnomdef, "nomdossier$", 440, 208, 340, 20
 
    'fenêtre de validation
    TEXTEDITOR #gener.visu, 20, 250, 750, 230
    fonteditor$="Liberation_Mono 12"
 
    'validation, quitter
    BUTTON #gener.eff, "Eff. Affichage", [Efface_texteditor], ul, 465, 500, 100, 35
 
    'génération des tables 285 235 = -50pix
    GROUPBOX #gener.extfic, "Générer les tables", 235, 483, 220, 62
    CHECKBOX #gener.chkaff, "sur Fenetre", [vers_affichage], [sans_affichage], 255, 500, 80, 20
    CHECKBOX #gener.chkfic, "sur Fichier", [vers_fichier], [sans_ficher], 255, 520, 80, 20
    BUTTON #gener.gen, "Générer", [generer_la_base], ul, 345, 500, 100, 35
 
    BUTTON #gener.quit, "Quitter", [quitter], ul, 680, 510, 100, 20
 
 
    'ouverture de l'interface
    open "Convertisseur tables en datas vers fichiers" for window as #gener
 
        print #gener.visu, "!font ";fonteditor$     'police d'affichage des données
        print #gener, "trapclose [quitter]"         'quitter par le gadget de fermeture

        rbtnEXT=1 : print #gener.rbtxt, "set"
        surfenetre=1 : print #gener.chkaff, "set"
        surfichier=0 : print #gener.chkfic, "reset"
 
        'preset nom du set de tables
        indexDate=9 : print #gener.cbdatefile, "!";formatDate$(indexDate)
        indexHeure=3 : print #gener.cbheurefile, "!";formatHeure$(indexHeure)
        indexChp1=2 : print #gener.cbchamp1, "!";formatNomFile$(indexChp1)
        indexChp2=3 : print #gener.cbchamp2, "!";formatNomFile$(indexChp2)
        indexChp3=4 : print #gener.cbchamp3, "!";formatNomFile$(indexChp3)
 
        'et avec ces preset on crée le nom du set de tables
        gosub [creer_nom_dossier]
        print #gener.stnomdef, nomdossier$
 
    wait
 
    'fin du programme
end
 
 
 
'** sous programmes

 
 
 
[Efface_texteditor]
    print #gener.visu, "!cls"
    wait
 
 
'extension des fichiers table
[rien]
    wait
 
[ext_txt]
    rbtnEXT=1
    extension$="txt"
    if origine=1 then return:origine=0 else wait
 
[ext_dat]
    rbtnEXT=2
    extension$="dat"
    if origine=1 then return:origine=0 else wait
 
[ext_csv]
    rbtnEXT=3
    extension$="csv"
    if origine=1 then return:origine=0 else wait
 
[ext_libre]
    rbtnEXT=4
    print #gener.tbext,"!contents? extension$"
    if origine=1 then return:origine=0 else wait
 
 
'générer la base de données
[vers_affichage]
    surfenetre=1
    if origine=1 then return:origine=0 else wait
 
[sans_affichage]
    surfenetre=0
    if origine=1 then return:origine=0 else wait
 
 
[vers_fichier]
    surfichier=1
    if origine=1 then return:origine=0 else wait
 
[sans_ficher]
    surfichier=0
    if origine=1 then return:origine=0 else wait
 
 
[creer_nom_dossier_cb]
    'on arrive ici après avoir fait un choix dans une combobox
    gosub [creer_nom_dossier]
    wait
 
 
[creer_nom_dossier]
 
    'on arrive ici par un 'gosub'

    'lit les index des combobox de création du nom du jeu de table
    '(priorité à l'actuel contenu des combobox sauf s'il est 0)
    #gener.cbdatefile, "selectionindex? idx" : if idx<>indexDate and idx>0 then indexDate=idx
    #gener.cbheurefile, "selectionindex? idx" : if idx<>indexHeure and idx>0 then indexHeure=idx
    #gener.cbchamp1, "selectionindex? idx" : if idx<>indexChp1 and idx>0 then indexChp1=idx
    #gener.cbchamp2, "selectionindex? idx" : if idx<>indexChp2 and idx>0 then indexChp2=idx
    #gener.cbchamp3, "selectionindex? idx" : if idx<>indexChp3 and idx>0 then indexChp3=idx
 
 
    'top horaire
    j$=date$("yyyy/mm/dd")
    h$=time$()
 
    'déterminer la date de l'instant
    annee$=left$(j$,4)
    anneeCourte$=right$(annee$,2)
    mois$=mid$(j$,6,2)
    nomMois$=word$("jan fév mar avr mai juin juil aout sept oct nov dec",val(mois$))
    jour$=right$(j$,2)
 
    nbrejour=val(date$("days")) 'nbrejour=42561 -> samedi
    numjour=1+nbrejour-int(nbrejour/7)*7
    nomJour$=word$("mardi mercredi jeudi vendredi samedi dimanche lundi",numjour)
 
    'formatage de la date
    select case indexDate
        case 1:ladate$ = nomJour$
        case 2:ladate$ = nomMois$
        case 3:ladate$ = annee$
        case 4:ladate$ = jour$;sepdate$;mois$;sepdate$;anneeCourte$
        case 5:ladate$ = jour$;sepdate$;mois$;sepdate$;annee$
        case 6:ladate$ = nomJour$;sepdate$;nomMois$;sepdate$;anneeCourte$
        case 7:ladate$ = nomJour$;sepdate$;nomMois$;sepdate$;annee$
        case 8:ladate$ = jour$;sepdate$;nomMois$;sepdate$;anneeCourte$
        case 9:ladate$ = jour$;sepdate$;nomMois$;sepdate$;annee$ 
        case 10:ladate$ = anneeCourte$;sepdate$;mois$;sepdate$;jour$
        case 11:ladate$ = annee$;sepdate$;mois$;sepdate$;jour$
        case 12:ladate$ = anneeCourte$;sepdate$;nomMois$;sepdate$;nomJour$
        case 13:ladate$ = annee$;sepdate$;nomMois$;sepdate$;nomJour$
    end select
 
    'déterminer l'heure de l'instant
    heure$=left$(h$,2)
    min$=mid$(h$,4,2)
    sec$=right$(h$,2)
 
    'formatage de l'heure
    select case indexHeure
        case 1:lheure$ = heure$;"-";min$
        case 2:lheure$ = heure$;"-";min$;"-";sec$
        case 3:lheure$ = heure$;"h";min$ 
        case 4:lheure$ = heure$;"h";min$;"min"
        case 5:lheure$ = heure$;"h";min$;"min";sec$
        case 6:lheure$ = heure$;"h";min$;"min";sec$;"s"
    end select
 
    'récupération du nom du jeu de tables
    print #gener.tbnom,"!contents? lenom$"
 
    'construction du nom complet du jeu de tables
    nomdossier$=""
    separation$=" - "     'chaine de séparation des paramètres dans le nom du set

    sep1$=separation$
    select case indexChp1
        case 1 : champ1$="":sep1$=""
        case 2 : champ1$=ladate$
        case 3 : champ1$=lheure$
        case 4 : champ1$=lenom$
    end select
 
    sep2$=separation$
    select case indexChp2
        case 1 : champ2$="":sep2$=""
        case 2 : champ2$=ladate$
        case 3 : champ2$=lheure$
        case 4 : champ2$=lenom$
    end select
 
    select case indexChp3
        case 1 : champ3$=""
        case 2 : champ3$=ladate$
        case 3 : champ3$=lheure$
        case 4 : champ3$=lenom$
    end select
 
    if champ3$="" then sep2$=""
    if champ2$="" and champ3$="" then sep1$=""
    nomdossier$=champ1$+sep1$+champ2$+sep2$+champ3$
 
    'vérification de la validité de nomdossier$
    if nomdossier$="" then
 
        if lenom$<>"" then
            'on prend le nom qui a été entré dans la textbox
            'on l'attribue au nom du dossier et on met en conformité
            'les combobox avec cette situation
            nomdossier$=lenom$
            indexChp1=4:print #gener.cbchamp1,"selectindex ";indexChp1
            indexChp2=1:print #gener.cbchamp2,"selectindex ";indexChp2
            indexChp3=1:print #gener.cbchamp3,"selectindex ";indexChp3
 
        else
            'et s'il n'y a pas de nom dans la textbox, on informe l'utilisateur
            ligne1$="Choisir au moins un champ <date> ou <heure> dans"
            ligne2$="la section 'Formation du nom du jeu de tables,'"
            ligne3$="ou entrer un nom dans la ligne 'Nom du jeu de tables'"
            ligne4$="puis cliquer sur <Générer>"
            notice ligne1$+chr$(10)+ligne2$+chr$(10)+ligne3$+chr$(10)+ligne4$
        end if
 
    end if
 
    print #gener.stnomdef, nomdossier$
 
    return
 
 
[generer_la_base]
 
    gosub [creer_nom_dossier]
 
    print #gener.visu, ""
    print #gener.visu, "nom du jeu de tables : ";nomdossier$
 
    creertables=0   'à 1, donne l'accord pour créer la base
                    ' et reste à zéro en cas d'anomalie

    'affichage des tables sur fenêtre
    if surfenetre=1 then creertables=1
 
    'création des tables dans fichiers
    if surfichier=1 then
 
        's'il n'existe pas, on tente de créer le dossier de la base
        test = mkdir(nomdossier$)
        if test = 0 then
            'dossier prêt, on peut continuer
            creertables=1
        else
            'il y a un problème, on s'arrête là
            n1$="Problème : la création du dossier a échoué"
            n2$="La base de donnée n'est pas créée"
            n3$="Code de l'erreur : ";str$(test)
            notice n1$+chr$(10)+n2$+chr$(10)+n3$
        end if
 
    end if
 
    if creertables=1 then gosub [créer_tables]
 
    wait
 
 
[créer_tables]
    'crée les table, et les affiche dans la fenêtre et/ou les enregistre en fichiers

    separ$=";"  'séparateur de champs

    for tables=1 to NbreTables  'on traite toutes les tables

        'sélection de la table à afficher/transférer
        select case tables
            case 1 : restore [profs]
            case 2 : restore [matieres]
            case 3 : restore [enseigne]
        end select
 
        'on récupère le nom, le complément (nom long ou racine verbe),le nombre d'enregistrements,
        'de champs par enregistrement, et le nom des colonnes
        read nom$,complement$,type,nbenr,nbchamps,courtoisie$,entete$
 
        'dimensionnement du tableau image du fichier
        longueurTI = nbenr + 4  'nbenr + nombre de lignes d'information avant le bloc de données
        dim Tableimage$(longueurTI)
 
 
        'bloc informatif
        Tableimage$(0)="type=";type 'table de données ou table de relation
        Tableimage$(1)=complement$      'nom long ou racine du verbe
        Tableimage$(2)=courtoisie$      'champs à afficher

        ta$="ident."+separ$             'ligne d'en-tête du bloc de données
        for col=1 to nbchamps
            ta$=ta$+word$(entete$,col," ")+separ$
        next
        tb$=left$(ta$, len(ta$)-len(separ$)) 'retrait du dernier séparateur
        Tableimage$(3)=tb$
 
 
        'bloc de données
        comptenr=0  'compteur d'enregistrement
        for enr=0 to nbenr-1
 
            ta$=str$(comptenr)+separ$   'ajout de l'identifiant

            for champ=1 to nbchamps
                read a$
                ta$=ta$+a$+separ$       'ajout des champs et du séparateur
            next
 
            tb$=left$(ta$, len(ta$)-len(separ$)) 'retrait du dernier séparateur
            Tableimage$(enr+4)=tb$
 
            ta$=""
            comptenr=comptenr+1
        next
 
        'générer le chemin de la base et le nom des fichiers
        print #gener.visu,""
        print #gener.visu,"nom de la table : ";nom$+"."+extension$
        nomdufichier$=DefaultDir$+"\"+nomdossier$+"\"+nom$+"."+extension$
        print #gener.visu,"chemin et nom du fichier : ";nomdufichier$ 
 
        'affichage des tables sur fenêtre
        if surfenetre=1 then
            for a=0 to longueurTI-1
                print #gener.visu, Tableimage$(a)
            next
        end if
 
        'écriture des tables en fichier
        if surfichier=1 then
 
            'création des tables
            open nomdufichier$ for output as #fichier
                for a=0 to longueurTI-1
                    print #fichier, Tableimage$(a)
                next
            close #fichier
        end if
 
    next
    return
 
 
[quitter]    'quitter le programme
    close #gener
    end
    wait
 
 


Le programme pour lire les tables créées par le logiciel ci-dessus :
Code VB :
 
'29 juillet 2017
'
'test de faisabilité d'une base de donnée, affichage du contenu de fichiers
'
'pour le moment ce qui fonctionne :
'   affichage des tables de donnée
'   affichage des tables de relation

'   l'ordre des enregistrement est l'ordre dans lequels ils sont dans le fichier, il
'   n'y a aucun tri ni regroupement

 
'préréglages
nomainwin
tab$=space$(4)  'pour indentation dans l'affichage des tables
separ$=";"      'caractère de séparation des champs dans les fichiers

'définition de l'interface
'taille de la fenêtre
WindowWidth=800
WindowHeight=600
 
'interface de commande
BUTTON #base.gen, "Afficher la base", [Afficher_la_base], ul, 20, 20, 100, 20
BUTTON #base.quit, "Quitter", [quitter], ul, 670, 510, 100, 20
 
'affichage des messages de fonctionnement
statictext #base.msgt,"Messages de fonctionnement :", 20, 60, 150, 20
TEXTEDITOR #base.msg, 20, 80, 750, 100
fonteditor$="Liberation_Mono 12"
 
'affichage de de la base
statictext #base.vis,"Etats et résultats de requêtes :", 20, 200, 150, 20
TEXTEDITOR #base.visu, 20, 220, 750, 260
fonteditor$="Liberation_Mono 12"
 
'ouverture de l'interface
open "Base de données" for window as #base
 
    print #base.visu, "!font ";fonteditor$     'police d'affichage des données
    print #base, "trapclose [quitter]"         'quitter par le gadget de fermeture

wait
 
'fin du programme
end
 
 
'** sous-programmes

 
[quitter]    'quitter le programme
    close #base
    end
 
 
[Afficher_la_base]
 
    'sélectionner la base qu'on veut afficher
    FILEDIALOG "Choisir un fichier de la base de données :", "*.*", fichier$
    print #base.msg, "Fichier sélectionné : ";fichier$
 
    'si pas de sélection par l'utilisateur
    anomalie=0
    if fichier$="" then
 
        anomalie=1
        anomalie1$="Annulation de l'opération par l'utilisateur"
 
    else
 
        'déterminer le nom du dossier de la base
        fin=0
        a=len(fichier$)
        posit=0
        while fin<>1
 
            if mid$(fichier$,a,1)="\" then
                posit=len(fichier$)-a
                fin=1
            end if
 
            a=a-1
            if a<0 then
                anomalie2$="Il aurait dû y avoir au moins un \ dans le chemin de la base"
                fin=1:anomalie=1
            end if
 
        wend
 
    end if
 
    'si tout va bien
    if anomalie=0 then      'analyse de la base de donnée

        'affichage du chemin du dossier de la base
        dossier$=left$(fichier$,len(fichier$)-posit)
        print #base.msg, "Base : ";dossier$
 
        'chargement des informations sur le dossier dans le tableau info$()
        dim info$(10,10)
        files dossier$, info$()
 
        'lecture des infos du dossier
        NbFic=val(info$(0, 0))
        NbDos=val(info$(0, 1))
        Lett$=info$(0, 2)
        chem$=info$(0, 3)
        chemincomplet$=Lett$+chem$
 
        'lecture des infos des fichiers
        print #base.msg,""
        print #base.msg,"Fichiers trouvés : "
 
        'extraire le nom de la base du nom de son dossier
        fin=0
        posit=1
        long=len(chemincomplet$)-1
        borne1=0
        borne2=0
        nbaslash=0
 
        while fin=0
            a$=mid$(chemincomplet$,posit,1)
            if a$="\" then borne1=borne2:borne2=posit
            posit=posit+1
            if posit>long then fin=1
        wend
 
        'détermination et affichage du nom et du chemin de la base
        nombase$ = mid$(chemincomplet$,borne2+1,long-borne2)
        cheminbase$ = left$(chemincomplet$,borne2)
        print #base.visu,"Base de données :"
        print #base.visu,tab$;"Nom : ";nombase$
        print #base.visu,tab$;"Chemin : ";cheminbase$
        print #base.visu,""
        print #base.visu,""
 
 
        'affichage des tables de données :
        for Fichier=1 to NbFic
 
            'nom et chemin de la table en cours d'analyse
            nomTable$=info$(Fichier, 0)
            chemtable$=chemincomplet$+nomTable$
 
            'lecture de l'en-tête du fichier contenant la table
            open chemtable$ for input as #table
 
                'déterminer le type de table : 0=donnée, 1=relation
                line input #table,type$ 
                type=val(word$(type$,2,"="))
 
                'affichage de la table si elle est une table de données
                if type=0 then
 
                    print #base.msg,"Trouvé : ";nomTable$
                    line input #table,nomlong$  'nom long de la table
                    line input #table,champaff$ 'champs à afficher lors de l'ouverture de la base
                    line input #table,entete$   'noms des colonnes du bloc de données
                    gosub [table_de_données]
 
                end if
 
            close #table
 
        next
 
 
        'affichage des tables de relation :
        for Fichier=1 to NbFic
 
            nomTable$=info$(Fichier, 0)
            chemtable$=chemincomplet$+nomTable$
 
            open chemtable$ for input as #table
 
                line input #table,type$ 
                type=val(word$(type$,2,"="))
 
                if type=1 then
 
                    print #base.msg,"Trouvé : ";nomTable$
                    line input #table,verbe$    'racine du verbe
                    line input #table,tables$   'nom des tables liées
                    line input #table,entete$   'noms des colonnes du bloc de données
                    gosub [table_de_relation]
 
                end if
 
            close #table
        next
 
        print #base.visu,""
        print #base.visu,""
 
    else
 
        'l'utilisateur n'a pas choisi la base, ou il y a un problème dans le chemin
        print #base.msg, "Afficher la base : opération annulée."
        if anomalie1$<>"" then print #base.msg,anomalie1$
        if anomalie2$<>"" then print #base.msg,anomalie2$
 
        print #base.msg, "En attente d'action de l'utilisateur..."
 
    end if
 
    wait
 
 
[table_de_données]
 
    'affichage en-tête explicatif : nom de la table et liste des champs désignés
    print #base.visu, "Table ";nomTable$;", liste des ";nomlong$;"s :"
    print #base.visu,""
 
    'détermination du nombre de champs à afficher
    nbchampaff=1
    for a=1 to len(champaff$)
        if mid$(champaff$,a,1)=" " then nbchampaff=nbchampaff+1
    next
    nbchampaff=nbchampaff-1
 
    'affichage des données, seulement les champs sélectionnés.
    while eof(#table)=0
 
        line input #table,enregistrement$
        b$=tab$ 'indentation
        for a=1 to nbchampaff
            champ=1+val(word$(champaff$,a+1," "))
            b$=b$+word$(enregistrement$,champ,separ$)+" "
        next
        print #base.visu,b$
 
    wend
 
    print #base.visu,""
    print #base.visu,""
 
    return
 
 
[table_de_relation]
    'on affiche les champs les champs de chaque table, correspondants à chaque relation

    'recherche des tables liées
    table1$=word$(tables$,1," ")
    table2$=word$(tables$,2," ")
 
    trouve1=0
    trouve2=0
    for a=1 to NbFic
        if table1$=info$(a, 0) then trouve1=a
        if table2$=info$(a, 0) then trouve2=a
    next
 
    'si l'une des tables liées n'est pas trouvée
    if trouve1=0 or trouve2=0 then
 
        print #base.msg, "!!!"
        print #base.msg, "Anomalie : la table ";nomTable$;" ne sera pas affichée, parce que :"
        if trouve1=0 then print #base.msg, "le programme ne trouve pas ";table1$
        if trouve2=0 then print #base.msg, "le programme ne trouve pas ";table2$
        print #base.msg, ""
 
    else    'sinon affichage de la table de relation

        'extraction du nom long de la table 1
        fic1$=chemincomplet$+info$(trouve1, 0)
        open fic1$ for input as #t1
            line input #t1, enr$
            line input #t1, enr$
            nomlong1$=enr$
        close #t1
 
        'extraction du nom long de la table 2
        fic2$=chemincomplet$+info$(trouve2, 0)
        open fic2$ for input as #t2
            line input #t2, enr$
            line input #t2, enr$
            nomlong2$=enr$
        close #t2
 
        'et affichage de l'en-tete de la table
        print #base.visu, "Table ";nomTable$;", ";nomlong1$;" : ";nomlong2$
        print #base.visu,""
 
        'affichage des relations
        while eof(#table)=0
 
            'pour chacun des enregistrements
            line input #table,enregistrement$
 
            'recherche de l'enregistrement de la première table liée
            id1=val(word$(enregistrement$,2,separ$))
 
            open fic1$ for input as #t1
 
                while eof(#t1)=0
                    line input #t1, enr$
                    premchamp=val(word$(enr$,1,separ$))
                    if premchamp=id1 then enr1$=enr$
                wend
 
            close #t1
 
            'recherche de l'enregistrement de la seconde table liée
            id2=val(word$(enregistrement$,3,separ$))
 
            open fic2$ for input as #t2
 
                while eof(#t2)=0
                    line input #t2,enr$
                    premchamp=val(word$(enr$,1,separ$))
                    if premchamp=id2 then enr2$=enr$
                wend
 
            close #t2
 
            'puis affichage de la table
            relation$=word$(enr1$,3,separ$)+" "+word$(enr1$,2,separ$)+" : "+word$(enr2$,2,separ$)
            print #base.visu,tab$;relation$
 
        wend
 
        print #base.visu,""
        print #base.visu,""
 
    end if
 
    return
 
 


Et le zip qui contient les deux programmes et une base toute prête, pour ceux qui aiment les zip : base-de-donnee-v0_2



Edité par Christophe Le 29/07/2017 à 22h47
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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/07/2017 à 23h08

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Bah moi je me demande toujours quelle sorte de traitement je pourrais bien leur faire subir aux données
A part la recherche et la combinatoire (et ses grands nombres)
____________________
Roro

   
Le 10/08/2017 à 21h00

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Je t'ai suggéré une idée sur l'autre fil.

Pour en revenir au présent projet :
* Il y a l'idée : faire le Tourmalet
* Il y a les moyens : utiliser un vélo
* et il y a la réalité : apprendre à faire du vélo et acquérir l'endurance ;)

C'est pour ça que c'est si long, que nous en sommes toujours à nos trois sempiternelles tables du début, et que je n'ai toujours pas l'outil pour vérifier la vertu que j'attribue à la séparation des données en de multiples tables.

Voici donc un simple rapport d'étape.

Mode d'emploi : découvrir la base, puis faire la recherche.

Pour faire des recherches, il faut cliquer sur les boutons "Champs pré-sélectionnés" ou "Tous les champs", car le bouton "Les fichiers bruts" ne fait que lister le contenu des tables de la base.

Pour le moment un seul critère fonctionne. Il n'y a pas de tri alphabétique dans l'affichage des résultats et les doublons ne sont pas supprimés.

Petit bug : dans le filtre, lorsqu'on change la table et le champ sur lesquels on veut faire la recherche, il arrive que la combobox "valeur" reste bloquée : choisir un autre champ, puis revenir au champ souhaité.

Les traitements se font toujours à partir des fichiers : il n'y a plus de données en tableau, sauf les caractéristiques nécessaires à leur affichage.

Tout en zip : générateur de base, base prête à l'emploi, et visualiseur. Comme d'hab, les versions ont changé, donc utiliser les fichiers d'une version précédente ne fonctionnera pas, on est toujours dans l'expérimental...

Voilà : base V0.03
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 10/08/2017 à 23h12

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Le tout n'est pas de savoir où on va
Mais d'y aller.
Et on va y arriver.
____________________
Roro

   
Le 12/08/2017 à 20h00

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Assurément. Et le projet commence à devenir solide. Me suis aperçu qu'auparavant je n'y connaissais rien en programmation ;)

Le tri alphabétique avec suppression de doublons a été intégré dans les listes affichées par les comboboxs, et ça change la vie : on sélectionne le seul prof "Bongrain" présent dans la combobox, et les dix "Bongrain" présents dans la base sont affichés dans le texteditor, chacun avec leur prénom (en fait j'ai juste fait l'essai avec Lavache, et il n'y en a que deux, mais le principe est le même pour dix)

Les bugs qui restent à résoudre ne semblent pas rhédibitoires, nous allons bientôt pouvoir nous attaquer au vrai problème, la la la lalère :party

En attendant, c'est le week-end...

A+
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 24/08/2017 à 01h02

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Bon, maintenant, les filtres filtrent selon ce que je voulais obtenir. Enfin, seulement la première colonne. L'évolution suivante est l'ajout d'une table de relation et d'une table de données, et voir si le filtrage fonctionne toujours.

Il y a un petit bug que je n'ai pas encore corrigé et qui traine depuis le début : il arrive que le changement de table dans le filtre perturbe le programme qui ne sort plus rien dans le fenêtre du bas. Dans ce cas, on le ferme et on le relance, ça ne prend pas de temps.

De même, quand on change de table, il faut d'abord choisir le champ vide, puis ensuite la table qu'on désire. Des petites bricoles à corriger ultérieurement.


Edit : A n'y rien comprendre, ça remarche...

J'avais retiré le lien de téléchargement, car j'obtenais une "OS error 16r57" quand je tentais d'utiliser la base que j'avais uploadé sur le forum. En fait le listing se chargeait bien et le programme fonctionnait mais l'erreur n'arrivait que lorsque je voulais analyser les tables de la base, que ce soit avec wine ou windows. Mon comparateur de fichier ne trouvait aucune différence entre les fichiers téléchargés et les fichiers originaux. Le fichier original fonctionnait sans problème... L'hypothèse vraisemblable est que mes fichiers basics sont sur un disque dur USB, et qu'il a parfois un petit temps de latence pendant lequel il est indisponible. C'est la première fois que ça me fait ça.

Donc je remet le lien : /upload/base-de-donnees-v0_04---filtres.zip



Edité par Christophe Le 24/08/2017 à 02h44
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 24/08/2017 à 21h39

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
L'ajout d'une table de donnée et d'une table de relation a mis un évidence un bug qui permettait à une table de relation, normalement invisible à l'utilisateur, de prendre la place d'une table de donnée sans que son nom apparaisse dans la combobox, l'utilisateur croyait sélectionner la table de donnée. Bug corrigé, il n'y a maintenant que les tables de données qui sont mises à disposition de l'utilisateur. (je fournirais le listing plus tard, quand il sera plus complet et fiabilisé)

Il reste toujours le bug du programme qui se met à faire n'importe quoi après un changement de table, c'est probablement un mélange quelque part, deux variables qui portent le même nom, ou un truc du genre. Ça reste à découvrir.

Petit à petit on avance dans le bon sens, mais je n'aurais jamais imaginé que ça me prendrait autant de temps ni d'énergie. Soit la programmation n'est pas vraiment mon truc, soit on aborde des domaines auxquels je n'était pas du tout préparé, donc il faut tout mettre en place, tout tester, avant de trouver la voie qui semble la bonne.

D'ailleurs, à ce titre et pour le moment, la lecture des fichiers se fait séquentiellement, du début à la fin, donc dès qu'on a besoin de retrouver une donnée il faut fermer le fichier, le ré-ouvrir, et le re-parcourir depuis le début, d'où des circonvolutions qui complexifient le programme.

Je reste sur ce système qui fonctionne, malgré tout, et dans une éventuelle seconde version, j'essaierais les fichiers à accès aléatoire (ça m'a toujours amusé, cette appellation, on peut penser qu'une fois l'ordi veut bien, une fois il veut pas et qu'on ne sait pas quand il voudra, enfin c'est aléatoire, comme accès ;)

En fait c'est un mode de gestion de fichier dans lequel on peut aller directement à un enregistrement spécifié.

Je pars oublier un peu toute cette technologie. Il est vrai qu'il y a bientôt un an j'avais dit que j'arrêtais, c'est raté pour cette fois ;)



Edité par Christophe Le 24/08/2017 à 21h41
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 25/08/2017 à 09h31

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Que tu ouvre-ferme des fichiers ou que tu transfère de tableaux en tableaux ou en chaînes, c'est du pareil au même. Dans un cas tu fais travailler le disque, et il est fait pour ça; dans l'autre c'est la RAM; et on manque rarement de RAM. Pour les temps de transfert, ça a l'air de se valoir, il faudrait tester sur des gros volumes; je me suis arrêté à 500 000.
Ce qui est long, c'est l'affichage et le tri multi niveaux.

Arrêter..Ne pas arrêter...Perso tant que je trouve des trucs à faire je les fais et j'en cherche d'autres; en me maudissant de mon manque de rigueur.

A-tu ou a-tu eu "Access" de "Mini-Mou-crosoft" ? Je l'ai eu peu de temps, ça ne m'avait pas paru casser des briques, mais ça a pu évoluer ?.
____________________
Roro

   
Le 25/08/2017 à 17h50

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Citation:
Que tu ouvre-ferme des fichiers ou que tu transfère de tableaux en tableaux ou en chaînes, c'est du pareil au même.


Pour l'ordi, oui, quoique le temps de lecture est dépendant de la mécanique du disque, et qu'on ne sait pas comment sont gérés en interne les accès séquentiels ou aléatoires du basic. Pour nous, par contre, il est intéressant de se poser la question de la commodité d'une méthode par rapport à une autre. Après on peut essayer de voir laquelle est la plus performante.

Travailler directement sur les fichiers est un test, et en meme temps j'en apprend davantage sur leur fonctionnement. L'autre point intéressant, c'est de pouvoir économiser de la mémoire, même si ce n'est plus aussi critique qu'autrefois. Tout dépend de la gourmandise des applications qui tournent en meme temps, et de la taille des tables qu'on voudrait mettre en tableau (les pixels d'un film, par exemple)

On est dans l'expérimental pur.


Citation:
A-tu ou a-tu eu "Access"


Non, j'ai eu accès à Access il y a 20 ans, le temps d'une formation. Aucune idée de savoir ce qu'il est devenu depuis. L'univers des bases de données me semble quand même assez abscon. J'ai essayé d'utiliser le module "base" d'Open Office avant le schisme Open Office - Libre Office, mais je le trouvais trop contraignant, je n'arrivais à afficher, dans un état, qu'une table liée à mon critère alors qu'il peut y avoir plusieurs tables qui lui sont liées. J'ai fini par laisser tomber, ça ne devait pas être d'une importance capitale.

L'objet actuel de cette discussion n'est qu'un visualiseur, il ne fait que lire l'état des liaison entre les tables et il affiche le rapport correspondant. Si un jour je gère aussi la modification dynamique des tables par le logiciel, là j'aurais créé une vraie base, qu'on pourra connecter à ton programme qui créait l'emploi du temps des professeurs. Ce qui, au vu de l'évolution du projet, est une douce ou fumeuse utopie ;)

Mais, bon, maintenant qu'on est lancé...
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 26/08/2017 à 10h39

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Aaaaaah ! ça y est ! J'ai compris ce que tu fais!
C'est comme un gestionnaire d'idées ou de projets: connaître les relations entres les choses.
C'est pas mal pour mettre en relations des articles ou parties de Wikipédia; je propose le système nerveux comme thème; bien propice aux relations.
Je vais attendre que ton truc te paraisse abouti avec un exemple. Le système de stockage sur fichiers .txt est très bien, c'est simple.
Je reste perplexe sur les noms des relations, ce que tu appelle: " l'état des liaison entre les tables et le rapport correspondant".
Citation:
l'emploi du temps des professeurs

Ce n'est pas utopique, c'est faisable "fixe" avec des boucles imbriquées ou récursif (si on y arrive, soyons modeste, et réaliste); mais on se heurte très vite à la masse des possibles (sorties) et à leur dépouillement. Mais bon, en filtrant c'est gérable, on peut aussi y appliquer de la statistique et autres...; mais on entre dans les cas particuliers (tel établissement, telles contraintes, tel code particulier...)
____________________
Roro

   
Le 27/08/2017 à 15h10

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Citation:
Ce n'est pas utopique, c'est faisable "fixe" avec des boucles imbriquées ou récursif (si on y arrive, soyons modeste, et réaliste)


Ce n'est pas ton projet que je trouve utopique, c'est le mien. Lorsqu'il donnera un reflet fidèle des fichiers, on pourra peut-être tenter de le brancher à ton générateur, ce qui était l'intention première de cette discussion, mais je n'ai pas encore réfléchi à comment on va procéder, ni si sera possible.

Citation:
Je reste perplexe sur les noms des relations, ce que tu appelle: " l'état des liaison entre les tables et le rapport correspondant".

C'était l'état à l'instant "t" de la base, pas l'état qui fournit sous forme lisible le résultat d'une recherche. Le programme lit simplement les relations qui existent entre les tables, et affiche à l'écran les relations qu'on désire voir, il ne les modifie pas et il n'en crée pas non plus.

J'ai aussi mon vocabulaire perso ;)

Pour le fonctionnement, si par exemple j'ai une table qui recense des professeurs, une table qui recense des matières, ces deux tables seront tables de données, je peux utiliser une table que j’appellerais "enseigne" et qui ne contiendra que des relations "profs-matières". Si Bidule enseigne le dessin et les maths, j'aurais dans "enseigne" deux relations, "Bidule-dessin" et "Bidule-maths" (en fait, leur identifiant)

A partir de là, on peut chercher dans la table enseigne :
les professeurs qui enseignent le dessin, la requête nous donnera Bidule
les professeurs qui enseignent les mathématiques : bidule
les professeurs qui enseignent la philo : pas de résultat
les matières enseignées par Bidule : dessin et maths
...
et les afficher dans un état.

Mes souvenirs en base de données sont plutôt lointains et je n'ai guère envie de me replonger dans des ouvrages techniques. Cette base est un essai "pour le fun", et avec ton histoire de profs qui enseignent des matières pendant des créneaux horaires, il était tentant d'essayer de créer une petite base simple en basic, pour voir où cela allait nous amener.

Citation:
Aaaaaah ! ça y est ! J'ai compris ce que tu fais!


Peut-être que j'étais trop accaparé par la programmation pour être plus explicite... Et des fois aussi on a sa propre solution "qui-va-bien" en tête, et on se demande pourquoi d'autres cherchent ailleurs, hein ? ;)

Voili voilà



Edité par Christophe Le 27/08/2017 à 15h11
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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 28/08/2017 à 00h06

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Le blème c'est le temps de traitement; avec seulement 1000 lignes et en shuntant l'affichage, on dépasse la minute pour le tri simple
____________________
Roro

   
Le 30/08/2017 à 15h18

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Roland:
Le blème c'est le temps de traitement; avec seulement 1000 lignes et en shuntant l'affichage, on dépasse la minute pour le tri simple


C'est en cela que je disais que Just/Liberty Basic n'était pas fait pour les bases de données, une fonction de tri y est très utile, et nous n'avons pas d'instruction de tri de table dans JB/LB... Donc il faut la programmer avec les instructions existantes, et le traitement sera nécessairement plus long qu'avec une instruction unique.
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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/08/2017 à 17h19

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Citation:
plus long qu'avec une instruction unique

Non, c'est juste parce que le langage est interprété
Plus on est proche du langage machine plus c'est rapide, mais plus c'est merdique à coder.
____________________
Roro

   
Le 31/08/2017 à 00h40

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 407
Je te trouve quand même un tantinet affirmatif. Le compilateur ne saura jamais ce que tu veux faire de ton code, et appliquera donc un traitement standard pour chacune des instructions qu'il a traiter pour créer l'exécutable, et tant pis s'il y a des pas pour rien ;)

Un petit testeur improvisé pour comparer deux méthodes différentes d'arriver au même résultat :

Code VB :
 
'comparaison de rapidité de deux blocs d'instructions ayant même fonction

nombressais=25
nombredetours=1000
 
WindowWidth = 800
WindowHeight = 400
nomainwin
 
statictext #1.qtetest,"Quantité de tests :", 10, 20, 150, 20
TEXTBOX #1.qtetest1, 170, 17, 100, 20
 
statictext #1.qteboucle,"Quantité de boucles par test :", 10, 40, 150, 20
TEXTBOX #1.qteboucle1, 170, 37, 100, 20
 
BUTTON #1.start, "Démarrer test", [start], ul, 280, 17, 100, 40
 
TEXTEDITOR #1.result, 10, 70, 790, 200
 
BUTTON #1.quit, "Quitter", [quitter], ul, 680, 310, 100, 20
 
 
open "Durée d'exécution d'un bloc d'instructions basic" for window as #1
 
    print #1.qtetest1, str$(nombressais)
    print #1.qteboucle1, str$(nombredetours)
    print #1, "trapclose [quitter]"
wait
 
 
[start]
 
    print #1.qtetest1, "!contents? nombressais$"
    print #1.qteboucle1, "!contents? nombredetours$"
 
 
    nombressais=val(nombressais$)
    nombredetours=val(nombredetours$)
    dim essais(nombressais,2)
 
    print #1.result,""
    print #1.result,"Test en cours pour ";nombressais$;" essais de "; nombredetours$;" boucles."
 
    for numessai=0 to nombressais-1
 
        debut=time$("ms")
        'instructions à tester : les placer à l'intérieur de la boucle "a"
        for a=1 to nombredetours
            b=int(rnd(1)*10)
            if b=0 then c=c
            if b=1 then c=c
            if b=2 then c=c
            if b=3 then c=c
            if b=4 then c=c
            if b=5 then c=c
            if b=6 then c=c
            if b=7 then c=c
            if b=8 then c=c
            if b=9 then c=c
        next
        fin=time$("ms")
        essais(numessai,0)=fin-debut
 
        debut=time$("ms")
        'instructions à tester : les placer à l'intérieur de la boucle "a"
        for a=1 to nombredetours
            b=int(rnd(1)*10)
            select case b
                case 0 : c=c
                case 1 : c=c
                case 2 : c=c
                case 3 : c=c
                case 4 : c=c
                case 5 : c=c
                case 6 : c=c
                case 7 : c=c
                case 8 : c=c
                case 9 : c=c
            end select
        next
    fin=time$("ms")
    essais(numessai,1)=fin-debut
 
    next
 
 
    b=0:bmin=0:bmax=0:bsum=0:bmoy=0
    c=0:cmin=0:cmax=0:csum=0:cmoy=0
 
    for a=0 to nombressais-1
 
        b=essais(a,0)
        if a=0 then bmin=b
        if b<bmin then bmin=b
        if b>bmax then bmax=b
        bsum=bsum+b
 
        c=essais(a,1)
        if a=0 then cmin=c
        if c<cmin then cmin=c
        if c>cmax then cmax=b
        csum=csum+c
 
    next
 
    bmoy=bsum/nombressais
    cmoy=csum/nombressais
 
    print #1.result,"série de tests achevées"
    print #1.result, "Solution 1 : durée mini = ";bmin;" ms, durée maxi = ";bmax;" ms, durée moyenne = ";bmoy;" ms"
    print #1.result, "Solution 2 : durée mini = ";cmin;" ms, durée maxi = ";cmax;" ms, durée moyenne = ";cmoy;" ms"
wait
 
 
[quitter]
    close #1
    end
 
 


'Tophe
____________________
Just Basic :
  • utilisation courante avec Linux/Mageia6 + 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/08/2017 à 09h27

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 1961
Dans ces deux c'est logique
Ton idée de "Testeur-Comparateur est très bonne
Pour générer le fichier de 7 mots 2000 lignes j'ai bricolé un "Chargeur" (aléatoire) qui ne demande qu'à être amélioré.
J'aimerais bien trouver la relation exacte entre le temps et la longueur pour deux boucles imbriquées du genre: (nlignes * nmots/ligne)/coeff lié à nlignes ?
En faisant empiriquement par tests on doit voir la forme de la courbe.
____________________
Roro

   
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