Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| base de donees | |
| | |
Auteur | Message |
---|
philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: base de donees Jeu 11 Nov 2010 - 9:04 | |
| un programme de bases de données avec lecture et écriture des données - Code:
-
label variable gosub variable
rem -----------------------début programme------------------------------ rem -----------------------open_base rem --------le premier chiffre le nombre dindex ,puis le fichier a creé,puis le nom de lindex suivi du nombre de caractères resevé et ainsi de suite jusqua 200 index rem --------vous pouvez créé plusieurs base différentes il suffira de faire un open_base avant chaque utilisation base$="3,c:\base\base3.bin,a,10,b,10,c,20" gosub open_base
rem ___exemple writebase_index_ligne_valeur rem ___ ecrit la valeur valeurws, dans la ligne lignew, dans lindex indexw$ indexw$="c" lignew=1 valeurw$="bonjour" gosub writebase_index_ligne_valeur
rem --- readbase_index_ligne_valeur rem ___ renvoi la valeur valeurws, de la ligne lignew, de lindex indexw$ indexw$="c" lignew=1 gosub readbase_index_ligne_valeur
print valeurw$
rem ------------------------------fin------------------------------ end
open_base: a$="" : a=0 : b$="" :r=0
for i=1 to len (base$) if mid$(base$,i,1)="," then goto saut_1 a$=a$+mid$(base$,i,1)
next i saut_1: a=val(a$) nbindex=a a$="" b=1 for i=1 to len(base$)
if mid$(base$,i,1)="," then b=b+1 if b=2 then a$=a$+mid$(base$,i,1) next i
a$=mid$(a$,2,len(a$)-1) fichier$=a$ rem --------- b=0 :a$="":b$="" a$="" for i=0 to nbindex+1
for x=1 to len(base$)
if mid$(base$,x,1)="," then b=b+1 if b=2+r then a$=a$+mid$(base$,x,1) : index$(i+1)=a$ if b=3+r then b$=b$+mid$(base$,x,1) : valeurchain$(i+1)=b$
next x r=r+2 b=0 a$="" b$="" next i for i=1 to nbindex
index$(i)=mid$(index$(i),2,len(index$(i))-1) valeurchain$(i)=mid$(valeurchain$(i),2,len(valeurchain$(i))-1) next i
return
rem ------------------------------------------------------------
writebase_index_ligne_valeur: debchain=0
for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew)
a=val(valeurchain$(p))-len(valeurw$) valeurw$=valeurw$+string$(a," ")
filebin_open_write 1,fichier$ filebin_position 1,debchain-1 for i=debchain to debchain+len(valeurw$)-1 blanc%(i)=asc(mid$(valeurw$,i-debchain+1,1))
filebin_block_write 1,1,blanc%(i) next i filebin_close 1
return rem ----------------------------------------------------------------------------------- readbase_index_ligne_valeur: debchain=0
for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew)
valeurw$="" filebin_open_read 1,fichier$ filebin_position 1,debchain-1 for i=debchain to debchain+val(valeurchain$(p))-1
filebin_block_read 1,1,blanc%(i) valeurw$=valeurw$+chr$(blanc%(i)) next i filebin_close 1 return variable: dim base$,a$,b$,c$,aa$,a,b,c,i,x,y,fichier$,nbindex,valindex,r,blanc%(100000),p,temp$,aa(1000) p=1 label readbase_index_ligne_valeur dim index$(200) dim valeurchain$(100) dim debchain label saut_1 label open_base label writebase_index_ligne_valeur dim indexw$ dim lignew dim valeurw$ return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 10:26 | |
| Intéressant. Pourrais-tu donner, dans la partie "exemple", quelques exemples supplémentaires ? Je l'au fait marcher, après avoir adapté le nom du fichier de la base, mais le but réel m'échappe un peu.
Est-ce qu'un peut enregistrer, dans la base, des "enregistrements" de données dond certaines parties peuvent servir de "cl" d'accès" pour retrouver un enregistrement en recherche par clé, ou en parcourant le fichier dans l'ordre d'une clé ? Est-ce qu'on peut faire une suppression d'un enregistrement ?
Une gestion évoluée de fichiers, ça manque certainement encore, et je suis très intéressé par toute initiative dans ce sens. J'avais fait, en son temps, une démonstration de gestion de base de données, en liant Excel à Panoramic via les fonctions dédiées de Panoramic (voir mon site, rubrique Panoramic, ligne PISAM avec Excel).
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 15:27 | |
| oui on peut mettre des clefs mais il y une astuce
par exemple on crée une base a 3 index nom prénom adresse avec des valeur avec des longueurs de chaine de 25 pour le nom 25 pour le prénom et 50 pour l'adresse donc base$="3,c:\base\base3.bin,nom,25,prénom,25,adresse,50" puis gosub open_base
pour créer base mais la base et réellement crée que si lon ecrit quelque chose dedans
donc on va écrire tout a la fin de la base dans index nom la base a une taille de 999 valeur indexw$="nom" lignew=999 valeurw$="bonjour" gosub writebase_index_ligne_valeur
la la base est partiellement créer tout au moins pour la partie nom en fait elle se construit au fur et a mesure que l'on y rentre des valeurs toutes les partie de la base vide son rempli avec le code ASCII 0 pour mettre un pointeur en début de programme dans l index nom exemple : pour inscrire a la prochaine entrée la ligne 2
en début de programme i faut écrire indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur
if valeurw$ =sting$(chr$(0),25) then indexw$="nom": lignew=1 : valeurw$="2" :gosub writebase_index_ligne_valeur donc au depart on a la valeur 2 dans la case 1 de lindex nom
après une nouvelle lecture de la case nom ligne1 on aura le retour de la valeur 2 ce qui pourra éventuellement indiquer qua la prochaine écriture qui faudra ecrire dans la case 2
j'ai un peu de mal a expliquer les choses de plus je ne suis pas un grand pédagogue mais j'enverrai un exemple genre carnet d'adresse ou fichier client pour démonter l'utilité de ce programme
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 15:57 | |
| Tu vois, ce qui serait intéressant, ce serait de pouvoir remplir la base par un moyen quelconque (comme ta fonction write_base, ou un chargemennt d'un fichier texte en format longueur constante des champs, par exemple), puis de faire ceci: - en fonction d'une clé, lire séquentiellement l'enregistrement suivant dans l'odre croissant de la clé - en fonction d'une clé, lire l'enregistrement dont la valeur de clé est passée en paramètre - en fonction d'une clé, lire le premier engregistrement - en fonction d'une clé, lire l'engregistrement "suivant" par rapport au dernier traité - en fonction d'une clé, lire le dernier engregistrement etc
Tu vois, des fonctions utilisant de CONTENU de la clé comme moyen d'accès à un enregistrement, et non son numéro. Une base de données (simple) pourrait être construite de la manière suivante (je passe sur les infos de structure à mémoriser comme nombre d'indexes, position et longueur de chaque indexe, etc): Indexe 1--->(pointeur vers première clé),(pointeur vers clé actuelle),(pointeur vers dernière cle) Indexe 2--->(pointeur vers première clé),(pointeur vers clé actuelle),(pointeur vers dernière cle) ... clé dans un indexe--->(valeur de la clé),(pointeur vers l'enregistrement data correspondant)
En s'assurant que les valeurs des clés dans un indexe sont toujours triées dans l'ordre croissant, on peut réaliser des méthodes d'accès du type de celles décrites ci-dessus, par exemple.
J'enfonce peut-être des portes ouvertes, mais ce sont ces fonctions qui manquent à Panoramic pour gérer des données de type gestion. Exemple pour un carnet d'adresses: "trouver le contact dont le numéro de téléphone (défini comme un des indexes) est "0123456789", trouver les contacts résidant dans le département 38 (avec code postal comme un des indexes), etc. Tout ceci bien sûr en accédant par les indexes, et non en parcourant les données des enregistrements de façon linéaire. De cette façon, sans retraiter le fichier, on peut lister, par exemple, les contacts par répartition géographique (accès séquentiel par la clé "code postal" en ordre croissant), par fonction (ayant un champ "fonction" dans le fichier et en définisant ce champ comme indexe), etc.
Ton programme me paraît prometteur, mais pour le moment, j'ai du mal à cerner jusqu'où il va, quelles sont ses fonctions et ses limites.
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 16:33 | |
| pour le moment les limites sont 200 index et environ 1000 valeur par index lecture d'une ligne écriture d'une ligne le nombre de base que l'on peut creer est illimité il suffit de l'appeler a chaque fois que l'on veut l'utiliser avec create_base qui pourrai s'appeler opencreate _base car il ouvre la base quand elle existe et la cré quand elle n'existe pas. pour l'instant j'ai mis le minimum vital pour pouvoir l'utiliser dans la-venir j'avais penser a mettre d'autre fonction genre efface ligne et une fonction genre vrecherche de excel mais j'avoue que les fonctions que tu ma énumérer je ny avais même pas penser je vais y réfléchir il ya du boulot sur la planche | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 16:49 | |
| OK, je vois mieux le cadre dans lequel ton programme fonctionne. Comme j'ai dit, c'est intéressant. Je voulais simplement te dire que ce qui manque, c'est la fonction de retrouver une information par une partie de l'information quelque part dans son milieu au lieu de la trouver par son numéro, son rang ou son numéro de case. Car dans ce cas, tu as une gestion de tableau Basic adapté à un problème spécifique, et nous le faisons tous, avec plus ou moins de gymnastique, pour retrouver nos informations.
Je te suggère de télécharger le module PISAM avec Excel (si tu as Excel, bien sûr). ce module contient un programme de démo et une doc complète, et tu pourrais voir ce que l'on peut faire avec un fichier ayant plusieurs clés utilisées comme chemin d'accès. Ca pourrait te donner des idées... | |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 17:25 | |
| merci klauss de toutes tes bonnes informations demain j'enverrai un exemple concret d'utilisation par contre je ne suis pas trop pour l'utilisation d'un programme externe sauf si on ne peut pas faire autrement je l'ai deja fait en en codant un tableau dans un fichier html pour pouvoir imprimer a l'aide de mon navigateur j'aurai bien voulu utiliser ton winprint mais il ne marche pas evec win7 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 18:49 | |
| C'est vrai - utiliser un programme externe n'est pas la solution idéale. Je ne le fais que si je ne trouve pas de moyens appropriés dans Panoramic. Mais dans certains cas, ça permet de repousser les limites (en attendant que Jack éventuellement ajoute la fonction...), ou alors de réaliser très facilement ce qu'on ferait autrement avec beaucoup d'effort. A chacun de faire son choix.
Je ne savais pas que WinTextPrint ne marche pas sous Windows 7. Est-ce que d'autres Panoramiciens ont le même problème ? Quel est le problème ou le message d'erreur exactement ? Ou est-ce que certains ont trouvé un moyen de contourner le problème ? Je serais très intéressé par un "feed-back" si vous me permettez cet anglicisme.
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 20:42 | |
| il demande vb40032.dll
quand je veux charger vb4 il dit que la version est incompatible avec Windows 32 64 bit a moi qui ai une version vb4 32-64 bit | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: base de donees Jeu 11 Nov 2010 - 21:54 | |
| - Citation :
- ou un chargemennt d'un fichier texte en format longueur constante des champs, par exemple),
Si vous faites ça, essayez de "respecter/utiliser" le format CSV qui est le classique format d'export/import de base de données sous forme texte : Nom;Prenom;Adresse Tartan;gilles;15 rue de la pomme Andrieu;pierre;20 chemin michelet C'est comme ça par exemple qu'excel sauvegarde en CSV. Comme ça les gens ne seront pas perdus et on se maintiendra dans un standard, car je suis un peu contre le fait que chacun fait son propre truc aprés ce sont les utilisateurs qui en pâtissent, j'aime bien les standards parfois, pour certaines choses. Comme ça ce que tu exporte pourra être utilisé ailleurs dans une autre base. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: base de donees Ven 12 Nov 2010 - 8:26 | |
| D'accord avec dragonno :
En effet les ";" comme séparateur de champs sont une bonne option pour l'import dans Excel... ou alors tu peux avoir ton propre format et proposer à côté l'export en CSV ou XML.
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Ven 12 Nov 2010 - 20:35 | |
| un carnet d'adresse avec base de donnee il y avais des bug dans le prog j'ai corriger - Code:
-
label variable gosub variable label ajouter label modifier label effacer label rescombo dim pointeur dim bo,point
rem -----------------------debut programe------------------------------ rem -----------------------open_base rem --------le premier chiffre le nombre dindex ,2 le fichier a creé,puis le nom de lindex suivi du nombre de carateres reseré et ainsi de suite jusqua 200 index rem --------vous pouvez cree plusieur base differente il suffira de faire un open_base avant chaque utilisation base$="3,c:\base\base4.bin,nom,25,prenom,25,adresse,50" gosub open_base
rem ___exemple writebase_index_ligne_valeur rem ___ ecrit la valeur valeurws, dans la ligne lignew, dans lindex indexw$ indexw$="nom" lignew=999 valeurw$="findebase" gosub writebase_index_ligne_valeur
rem --- readbase_index_ligne_valeur rem ___ renvoi la valeur valeurws, de la ligne lignew, de lindex indexw$ indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur
if valeurw$=string$(25,chr$(0)) then indexw$="nom":lignew=1 :valeurw$="2" : gosub writebase_index_ligne_valeur rem -------------------------prog carnet adresse COMBO 3 left 3,100 top 3,110 width 3,222
edit 4 left 4,100 top 4,140 width 4,222
edit 5 left 5,100 top 5,170 width 5,300 alpha 8 left 8,6 top 8,110 width 8,87 caption 8,"NOM"
alpha 9 left 9,10 top 9,140 caption 9,"PRENOM"
alpha 10 left 10,10 top 10,170 caption 10,"ADRESSE" button 31 caption 31,"AJOUTER" left 31,450 top 31,100 BUTTON 32 CAPTION 32,"MODIFIER" left 32,450 top 32,130 button 33 caption 33,"SUPRIMER" left 33,450 top 33,160 clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo on_click 31,ajouter on_click 32,modifier on_click 33,effacer on_click 3,rescombo end rem ------------------------------------debut ajouter------------ ajouter: if text$(3)="" then return indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) indexw$="nom" lignew=pointeur valeurw$=text$(3) gosub writebase_index_ligne_valeur indexw$="prenom" lignew=pointeur valeurw$=text$(4) gosub writebase_index_ligne_valeur indexw$="adresse" lignew=pointeur valeurw$=text$(5) gosub writebase_index_ligne_valeur pointeur=pointeur+1 valeurw$=str$(pointeur) lignew=1 indexw$="nom" gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" rem -----------------------------------fin de ajouter return rem ----------------------------------debut modifier modifier: if text$(3)="" then return point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return indexw$="nom" lignew=1
indexw$="prenom" lignew=point valeurw$=text$(4) gosub writebase_index_ligne_valeur
indexw$="adresse" lignew=point valeurw$=text$(5) gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" return fin ------------------fin modifier effacer: rem --------------------------------------------debut effacer--------------------------------- if text$(3)="" then return point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return for bo=point to pointeur indexw$="nom" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="nom" lignew=bo gosub writebase_index_ligne_valeur indexw$="prenom" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="prenom" lignew=bo gosub writebase_index_ligne_valeur indexw$="adresse" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="adresse" lignew=bo gosub writebase_index_ligne_valeur next bo indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) pointeur=pointeur-1 indexw$="nom" lignew=1 valeurw$=str$(pointeur) gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" return rem ----------------------------------------fin effacer---------- rem ---------------------------------rescombo----debut rescombo: point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return indexw$="prenom" lignew=point gosub readbase_index_ligne_valeur text 4,valeurw$ indexw$="adresse" lignew=point gosub readbase_index_ligne_valeur text 5,valeurw$ return end rem ------------------------------fin------------------------------
open_base: a$="" : a=0 : b$="" :r=0
for i=1 to len (base$) if mid$(base$,i,1)="," then goto saut_1 a$=a$+mid$(base$,i,1)
next i saut_1: a=val(a$) nbindex=a a$="" b=1 for i=1 to len(base$)
if mid$(base$,i,1)="," then b=b+1 if b=2 then a$=a$+mid$(base$,i,1) next i
a$=mid$(a$,2,len(a$)-1) fichier$=a$ rem --------- b=0 :a$="":b$="" a$="" for i=0 to nbindex+1
for x=1 to len(base$)
if mid$(base$,x,1)="," then b=b+1 if b=2+r then a$=a$+mid$(base$,x,1) : index$(i+1)=a$ if b=3+r then b$=b$+mid$(base$,x,1) : valeurchain$(i+1)=b$
next x r=r+2 b=0 a$="" b$="" next i for i=1 to nbindex
index$(i)=mid$(index$(i),2,len(index$(i))-1) valeurchain$(i)=mid$(valeurchain$(i),2,len(valeurchain$(i))-1) next i
return
rem ------------------------------------------------------------
writebase_index_ligne_valeur: debchain=0
for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew) a=val(valeurchain$(p))-len(valeurw$) if a=0 then goto petitsaut
valeurw$=valeurw$+string$(a," ") petitsaut:
filebin_open_write 1,fichier$ filebin_position 1,debchain-1 for i=debchain to debchain+len(valeurw$)-1 blanc%(i)=asc(mid$(valeurw$,i-debchain+1,1))
filebin_block_write 1,1,blanc%(i) next i filebin_close 1
return rem ----------------------------------------------------------------------------------- readbase_index_ligne_valeur: debchain=0
for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew)
valeurw$="" filebin_open_read 1,fichier$ filebin_position 1,debchain-1 for i=debchain to debchain+val(valeurchain$(p))-1
filebin_block_read 1,1,blanc%(i) valeurw$=valeurw$+chr$(blanc%(i)) next i filebin_close 1 return variable: dim base$,a$,b$,c$,aa$,a,b,c,i,x,y,fichier$,nbindex,valindex,r,blanc%(100000),p,temp$,aa(1000) p=1 label readbase_index_ligne_valeur dim index$(200) dim valeurchain$(100) dim debchain label saut_1 label open_base label writebase_index_ligne_valeur dim indexw$ dim lignew dim valeurw$ label petitsaut return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Sam 13 Nov 2010 - 1:45 | |
| Joli. Je l'ai chargé pour voir un peu mieux son potentiel.
Je constate que tu stockes les contacts dans l'ordre de création (logique), et pour les retrouver, dans le combo, ils s'affichent effectivement dans l'ordre de création. Je vois que les indexes servent à retrouver les enregistrements. Dans ton programme, si j'ai bien compris, tu as utilisé l'indexe "nom". Normal. Tel que c'est conçu, cela permet de retrouver les cases utilisées en gérant les suppression, etc. Très bien.
Ce qui me manque un peu, avec cette conception de l'indexe, c'est qu'il n'y a pas d'ordre. Les clés ne sont pas triées. Imagine si ton indexe "nom" était trié alphabétiquement, de même ton indexe "prénom" etc. Et tu aurais alors la combo "nom" qui afficherait les noms en ordre croissant en non plus en ordre chronologique de création, le champ "prénom" pourrait devenir un combo affichant les prénoms en ordre alphabétique, etc. Et suivant l'information cliquée, on chargerait le contact dont le nom a été cliqué, ou celui dont le prénom a été cliqué.
D'accord, chercher un contact par le prénom, cela ne semble pas très intéressant. Mais imagine ajouter à ton fichier un champ "numéro de téléphone" et le déclarer comme clé, et tu aurais immédiatement la possibilité de retrouver un contact par son numéro de téléphone...
Enfin, je pense que tu vois ce que je veux dire. Je suivrai l'évolution de ce programme avec grand intérêt. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: base de donees Sam 13 Nov 2010 - 7:33 | |
| bonjour philou029 ! J'ai fais un test en rentrant 2 noms : je me retrouve avec un fichier de 50 Ko. Après coup j'ai regardé ce que tu faisais au niveau du fichier: Pour alléger celui-ci, tu pourrais rajouter, par exemple, en tout début de ton fichier, le nombre total d'éléments enregistrés. Comme cela, à l'ouverture de la base, tu viendrais lire ce nombre et cela t'éviterai de faire des boucles de 1 à 200 (tu y gagnerais en vitesse et tu ne serais pas obliger de réserver de la place pour 200 éléments). Qu'en penses-tu ? A+ Pour les Panoramiciens qui voudraient tester ton prog, je me suis permis d'intégrer ton programme de gestion de données avec ton exemple carnet d'adresse : - Code:
-
label variable gosub variable label ajouter label modifier label effacer label rescombo dim pointeur dim bo,point
rem ******************************************************************* rem * DEBUT DU PROGRAMME rem ******************************************************************* rem --------le premier chiffre le nombre dindex ,2 le fichier a creé,puis le nom de lindex suivi du nombre de carateres reseré et ainsi de suite jusqua 200 index rem --------vous pouvez cree plusieur base differente il suffira de faire un open_base avant chaque utilisation
base$="3,c:\base\base4.bin,nom,25,prenom,25,adresse,50"
gosub open_base
rem ___exemple writebase_index_ligne_valeur rem ___ ecrit la valeur valeurws, dans la ligne lignew, dans lindex indexw$ indexw$="nom" lignew=999 valeurw$="findebase" gosub writebase_index_ligne_valeur
rem --- readbase_index_ligne_valeur rem ___ renvoi la valeur valeurws, de la ligne lignew, de lindex indexw$ indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur
if valeurw$=string$(25,chr$(0)) then indexw$="nom":lignew=1 :valeurw$="2" : gosub writebase_index_ligne_valeur
rem -------------------------prog carnet adresse COMBO 3 left 3,100 top 3,110 width 3,222
edit 4 left 4,100 top 4,140 width 4,222
edit 5 left 5,100 top 5,170 width 5,300
alpha 8 left 8,6 top 8,110 width 8,87 caption 8,"NOM"
alpha 9 left 9,10 top 9,140 caption 9,"PRENOM"
alpha 10 left 10,10 top 10,170 caption 10,"ADRESSE"
button 31 caption 31,"AJOUTER" left 31,450 top 31,100
BUTTON 32 CAPTION 32,"MODIFIER" left 32,450 top 32,130
button 33 caption 33,"SUPRIMER" left 33,450 top 33,160
clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo on_click 31,ajouter on_click 32,modifier on_click 33,effacer on_click 3,rescombo
end
rem ******************************************************************* rem PROCEDURES DU CARNET D'ADRESSE rem ******************************************************************* rem ------------------------------------debut ajouter------------ ajouter: if text$(3)="" then return indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) indexw$="nom" lignew=pointeur valeurw$=text$(3) gosub writebase_index_ligne_valeur
indexw$="prenom" lignew=pointeur valeurw$=text$(4) gosub writebase_index_ligne_valeur
indexw$="adresse" lignew=pointeur valeurw$=text$(5) gosub writebase_index_ligne_valeur
pointeur=pointeur+1 valeurw$=str$(pointeur) lignew=1 indexw$="nom" gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" return rem -----------------------------------fin de ajouter
rem ----------------------------------debut modifier modifier: if text$(3)="" then return point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return indexw$="nom" lignew=1
indexw$="prenom" lignew=point valeurw$=text$(4) gosub writebase_index_ligne_valeur
indexw$="adresse" lignew=point valeurw$=text$(5) gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" return fin ------------------fin modifier
rem --------------------------------------------debut effacer--------------------------------- effacer: if text$(3)="" then return point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return for bo=point to pointeur indexw$="nom" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="nom" lignew=bo gosub writebase_index_ligne_valeur
indexw$="prenom" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="prenom" lignew=bo gosub writebase_index_ligne_valeur
indexw$="adresse" lignew=bo+1 gosub readbase_index_ligne_valeur indexw$="adresse" lignew=bo gosub writebase_index_ligne_valeur next bo indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) pointeur=pointeur-1 indexw$="nom" lignew=1 valeurw$=str$(pointeur) gosub writebase_index_ligne_valeur clear 3 for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur ITEM_ADD 3,valeurw$ next bo text 4,"" text 5,"" return rem ----------------------------------------fin effacer----------
rem ---------------------------------rescombo----debut rescombo: point=0 indexw$="nom" lignew=1 gosub readbase_index_ligne_valeur pointeur=val(valeurw$) for bo=2 to pointeur indexw$="nom" lignew=bo gosub readbase_index_ligne_valeur if text$(3)=valeurw$ then point=bo next bo if point=0 then return indexw$="prenom" lignew=point gosub readbase_index_ligne_valeur text 4,valeurw$ indexw$="adresse" lignew=point gosub readbase_index_ligne_valeur text 5,valeurw$ return
rem ******************************************************************* rem * DEBUT DES PROCEDURES DE LA BASE DE DONNEES rem *******************************************************************
open_base: a$="" : a=0 : b$="" :r=0 for i=1 to len (base$) if mid$(base$,i,1)="," then goto saut_1 a$=a$+mid$(base$,i,1) next i saut_1: a=val(a$) nbindex=a a$="" b=1 for i=1 to len(base$) if mid$(base$,i,1)="," then b=b+1 if b=2 then a$=a$+mid$(base$,i,1) next i
a$=mid$(a$,2,len(a$)-1) fichier$=a$ rem --------- b=0 :a$="":b$="" a$=""
for i=0 to nbindex+1 for x=1 to len(base$) if mid$(base$,x,1)="," then b=b+1 if b=2+r then a$=a$+mid$(base$,x,1) : index$(i+1)=a$ if b=3+r then b$=b$+mid$(base$,x,1) : valeurchain$(i+1)=b$ next x r=r+2 b=0 a$="" b$="" next i
for i=1 to nbindex index$(i)=mid$(index$(i),2,len(index$(i))-1) valeurchain$(i)=mid$(valeurchain$(i),2,len(valeurchain$(i))-1) next i
return
rem ------------------------------------------------------------
writebase_index_ligne_valeur: debchain=0 for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew)
a=val(valeurchain$(p))-len(valeurw$) valeurw$=valeurw$+string$(a," ")
filebin_open_write 1,fichier$ filebin_position 1,debchain-1
for i=debchain to debchain+len(valeurw$)-1 blanc%(i)=asc(mid$(valeurw$,i-debchain+1,1)) filebin_block_write 1,1,blanc%(i) next i
filebin_close 1 return
rem -----------------------------------------------------------------------------------
readbase_index_ligne_valeur: debchain=0 for i=1 to 200 if indexw$=index$(i) then p=i next i
if p=1 then debchain=1000+(val(valeurchain$(p))*lignew)+1 if p>1 then for i=1 to p-1:debchain=debchain+(val(valeurchain$(i))*1000):next i:debchain=debchain+1000+1+(val(valeurchain$(p))*lignew) valeurw$=""
filebin_open_read 1,fichier$ filebin_position 1,debchain-1
for i=debchain to debchain+val(valeurchain$(p))-1 filebin_block_read 1,1,blanc%(i) valeurw$=valeurw$+chr$(blanc%(i)) next i filebin_close 1 return
variable: dim base$,a$,b$,c$,aa$,a,b,c,i,x,y,fichier$,nbindex,valindex,r,blanc%(100000),p,temp$,aa(1000) p=1 label readbase_index_ligne_valeur dim index$(200) dim valeurchain$(100) dim debchain label saut_1 label open_base label writebase_index_ligne_valeur dim indexw$ dim lignew dim valeurw$ return | |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Sam 13 Nov 2010 - 9:29 | |
| la boucle servant a savoir le nombre d'index n'est exécuter qu'une seul fois avec gosub creatbase je ne vois pas trop l'intérré de modifié ca d'autre par je me suis aperçu qu'il y avais des erreur notamment dans la gestion des longueurs de chaine malheureusement en modifiant le prog tu également copier ses erreurs par contre une option intégrant le nombre de valeur par index serait plus judicieux pour le reste j'enverrai une autre version avec les erreurs corrigé le test ca prend un peu de temps il faut que je vérifie que tout colle bien | |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Sam 13 Nov 2010 - 9:56 | |
| erreur de ma par c'est toi qui a raison a boucle servant a savoir le nombre d'index est exécuter a chaque read ou write je vais remédier a sa merci a toi
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: autanpour moi Sam 13 Nov 2010 - 10:16 | |
| c'etait prevu il faut remplacer fori=1 to 200 par for i=1 to nbindex
| |
| | | philou029
Nombre de messages : 49 Age : 57 Localisation : BREST Date d'inscription : 17/10/2010
| Sujet: Re: base de donees Sam 13 Nov 2010 - 18:08 | |
| les nouvelles fonctionnalité de Pbase seront gosub writepop_index_valeur: écrira valeurw$ dans l'index dans a la position du pointeur et incrémentera le pointeur gosubl delval_index_ligne : effacera la valeur de lindex de la ligne et décrémentera le pointeur gosub search_valeur_index_nbs_vt(x) cherchera la chaine valeurw$ dans index et revoie le nombre de valeur trouvé et indiquera leur positions dans le tableau vt(x) gosub position_p_ligne_index donnera la ligne ou sera ecrite la prochaine valeur dans index
je pense ne pas en avoir pour trop longtemps car ses sous-programmes feront appelle a gosub writebase_index_ligne_valeur et gosub readbase_index_ligne_valeur | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Lun 15 Nov 2010 - 18:55 | |
| Si tu as un moment, jette un coup d'oeil sur mon pseudo-objet FAM (File Access Method) disponible sur mon site: http://klaus.panoramic.voila.net/Bienvenue.1.htmlLe fichier ZIP contient la doc complète et un programme de démo (fichier contact, comme par hasard...). Il s'agit d'une gestion de fichier (base de données ?) avec multi-clé, chaque clé pouvant être composée de multiples segments non contigus dans l'enregistrement, avec lecture par clé, séquentiellement en avant et en arrière, changement de clé active etc. Cela pourra peut-être te donner des idées... | |
| | | dragonno
Nombre de messages : 341 Localisation : Près de Toulouse Date d'inscription : 22/01/2009
| Sujet: Re: base de donees Mar 16 Nov 2010 - 0:04 | |
| Klaus, si j'ai 3 champs "texte" servant à inscrire par exemple un nom, un age, et une adresse : Quel est l'algo qu'il faut utiliser pour dire au programme quelque soit le langage utilisé, que l'on veut une recherche soit avec l'un des champs, soit avec un groupe de ces champs (un, deux, ou trois champs).
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Mar 16 Nov 2010 - 0:59 | |
| Imagine un fichier de contacts avec 5 champs: nom, prénom, code postal, adresse, téléphone
Ce fichier à 3 clés: nom, code postal, téléphone
Il contient les enregistrements suivants: Dupont Jaques 88340 Les Bruyères 0344556677 Pontet Albert 27690 La Fonderie 0299887766 Mongin Martin 45050 Chassol 0288994512 Fichet Martine 45140 Pointilleau 02658743412
Maintenant, c'est à l'utilisateur de choisir sa clé d'accès, visuellement par un bouton sur l'écran, ou le programmeur qui préétablit le choix, mais dans tous les cas, c'est une sous-programme qui séléction la clé "active". A partir du choix de la clé, toutes les fonctions se déroulent selon cette clé, jusqu'au changement de clé.
On peu ainsi choisir "nom", lire le "premier", puis en booucle les "suivants" jusqu'à la fin du fichier, et on obtient: Dupont Fichet Mongin Pontet
On peut aussi choisir "code postal" et avec le même programme, on obtient: Pontet Mongin Fichet Dupont
On peut aussi choisir "téléphone", et lire l'enregistrement "dont la clé est 0288994512", et on obtient: Mongin et ceci SANS avoir à parcourir tous les enregistrements et s'arrêter lorsqu'on rencontre celui qui est recherché.
Ca sert à ça, les indexes. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: base de donees Mar 16 Nov 2010 - 7:24 | |
| Des méthodes, il en existe des tonnes ! Par exemple avec des fichiers d'index :tu peux très bien faire comme cela: 1- Avoir un fichier de données "base.bdt" dans lequel on retrouve toutes les infos saisies dans l'ordre chronologique. 2- Avoir un 2eme fichier que l'on vas appeler "index_nom.dat" qui contient une liste triée composée par [nom,offset] de tous les enregistrements de base.bdt 3- Un 3eme classé par "prenom" [prenom,offset], 4 - Etc.. L'avantage : - La vitesse : en dehors de la fonction pour l'affichage(un filebin_position offset pour accéder directement à l'enregistrement que tu veux), tout se passe en mémoire sans accès disque - Tu ne charges en mémoire que le fichier d'index que tu as choisis et non pas la totalité du fichier de données. - Cela va beaucoup plus vite pour effectuer un tri. (tu ne touches que le fichier d'index et non pas le principal) - Idem pour la recherche Inconvénient:- à chaque ajout/suppression d'enregistrement, il faut faire une mise à jour de tout tes fichiers d'index... - Avoir des champs de dimensions fixes - En cherchant un peu il y en a d'autres... Pour utiliser cette méthode, il faut passer par un fichier binaire pour la base principale, notamment pour accéder à la fonction FILEBIN_POSITION (Seek dans d'autres langages). Les fichiers d'index quand à eux peuvent être en format txt (que tu peux charger dans une dlist) Sinon il y a aussi une autre méthode : les arbres binaires (b-tree en anglais) qui sont assez performants quand on commence à avoir beaucoup de données. mais là je ne me lancerais pas dans l'explication sauf si ça intéresse quelqu'un... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: base de donees Mar 16 Nov 2010 - 10:33 | |
| Une application concrète: Imagine un logiciel de facturation pour une PME.
Dans une version simpliste, il y aurait 4 fichiers: - produits, clients, entêtes de facture, lignes de facture
Les champs des fichiers: produits: code produit, libellé, taux TVA, prix HT client: code client, nom, code postal, adresse, téléphone, en-cours facturé, en-cours réglé entête de facture: numéro de facture, code client, date facture, total HT, total TV1, total TTC ligne de facture: numéro de facture, numéro de ligne, code produit, quantité, taux TVA, prix unitaire
Les clés des fichiers: produits: code produit, libellé client: code client, nom, code postal entête de facture: numéro de facture, code client, date facture, numéro de facture suivi de code client, code client suivi de date facture ligne de facture: numéro de facture suivi de numéro de ligne, code produit
Les affaires marchent bien pour cette société: elle a environ une centaine de clients et 5.000 factures avec une moyenne de 10 lignes par facture, soit 50.000 lignes de facture. On voit immédiatement l'intérêt d'accéder directement à un enregistrement SANS lire tout le fichier séquentiellement !
Une tâche concrète: rééditer la facture du 18/7/2010 du client Margoulin SA !
On procéderait de la manière suivante: - lire enregistrement client clé "nom"="Margoulin SA", erreur si inexistant on voit que le code client est 0082 - lire entête facture clé "code client suivi de date facture"="201007180082", erreur si inexistant on voit que le numéro de facture est 201007003715 - éditer entête de facture avec les infos de "entête" et "client" - lire ligne de facture clé "numéro de facture suivi de numéro de ligne"="20100700371500" ( ici, on met "00" comme numéro de ligne, et on tombe automatiquement sur la première ligne réelle ! ) - tantque numéro de facture de l'enregistrement ligne de facture = "201007003715" et pas fin de fichier ** lire produit cle "code produit"=champ "code produit" de l'enregistrement "ligne de facture" ** éditer ligne de facture ** lire ligne de facture suivante selon clé "numéro de facture suivi de numéro de ligne" - éditer pied de facture avec les infos des enregistrements entête de facture et client - fin de travail
Une autre tâche intéressante: envoyer un mailing à tous les clients de Loire Atlantique. On procéderait ainsi: - rédiger une lettre type dont le contenu est à personnaliser - lire client avec clé "code postal"=44000 - tantque code postal<45000 et pas fin de fichier ** créer une version personnalisée la lettre ** éditer la lettre personnalisée ** lire client suivant selon clé "code postal" - fin de travail
En réalité, les choses sont infiniment plus complexes, et les volumes souvent très importants. Tout l'intérêt d'une bonne gestion de l'information est là: donner de la souplesse à l'accès aux informations tout en préservant la vitesse. Une base de données actuelle engloberait l'ensemble des fichiers cités ci-dessus dans un seul gros "paquet", chaque fichier étant représenté par une "table". Une table d'une base de données correspond à l'image sur disque d'un objet grille de Panoramic, avec une ligne par entité (un produit, un client, ,...). Chaque colonne représente un champ (nom client, date facture, ...). Une cellule de la grille représente une information individuelle (prix unitaire du produit "Joint de culasse 3XXX", ...).
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: base de donees Mar 16 Nov 2010 - 17:21 | |
| Bon, manifestement ça n'interesse personne les b-tree... je remballe mon programme dans le carton... | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: base de donees Mar 16 Nov 2010 - 17:36 | |
| Dis-moi, ça n'a rien à voir avec les two b-tree ? Blague à part, pour gérer des bases de données domestiques qui ne contiennent quand même pas des dizaines ou des centaines de milliers de données, je ne vois pas trop l'intérêt de tant se compliquer la vie... il existe des méthodes plus simplistes et suffisamment efficaces pour un usage courant, enfin il me semble | |
| | | Contenu sponsorisé
| Sujet: Re: base de donees | |
| |
| | | | base de donees | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |