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 |
|
|
| ISAM vs BDR database | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mar 28 Juil 2015 - 22:00 | |
| - Citation :
- key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2))
Evidemment, tu te doutes: le "²" devrait être remplacé par "0" ! Le premier exemple concerne une clé sur un champ contenant des données alpha, cadré à gauche et complété par des espaces. Le second exemple concerne une clé sur un champ contenant des données numériques, cadrées à droite et complété par des zéros en tête de champ. La code erreur 10200 est documenté dans la fonction GetIsamError comme ceci: - Citation :
- 10200 1 No matching key found (BTFindKey)
Ceci veut dire que le système ISAM n'a pas trouvé d'enregistrement avec la clé exacte telle qu'elle a été spécifiée. Exemple: tu as une clé sur un nom, et tu as 2 enregistrements avec les clés Paul et Martin. Si tu donnes la clé Mortimer, tu auras ce code erreur, mais tu trouveras Paul, soit le premier enregistrement de clé juste supérieur. Ceci peut être un effet recherché: tu peux chercher par une clé contenant juste la première lettre, comme M, et tu auras comme premier enregistrement trouvé (malgré le code 10200 !) Martin, puis Paul en lecture séquentielle. Pour voir ce qui se passe, affiche bien la valeur de la clé avant lecture, puis après lecture. Car en effet, la clé est modifiée, ainsi que l'enregistrement, qu'il y ait le code erreur 10200 ou non, comme le dit la doc pour la fonction ReadIsamRecordByKey: - Citation :
- Cette fonction lit un enregistrement dans un fichier ISAM, en fonction du numéro de la clé et de la valeur de la clé, passés en paramètre. Si l'enregistrement existe, il est lu et placé dans la variable contenant l'enregistrement. Si la clé exacte n'existe pas, une erreur est signalée. Cependant, si un enregistrement existe dont la valeur de la clé est supérieur à la clé recherchée, il est lu et placé dans la variable d'enregistrement. Ainsi, on peut faire une lecture avec une clé partielle (la première lettre d'un nom, par exemple), et on obtient le premier enregistrement dont le nom commence par cette lettre.
Donc, vérifie l'enregistrement lu, ainsi que sa clé. Dans ton cas, tu peux utiliser simplement la fonction ExtractIsamField car ta clé n'est composée que d'une seule zone. Normalement, tu devrais utiliser CreateIsamKey qui te restitue la clé exacte correspondant à l'enregistrement donné en paramètre, donc à l'enregistrement lu, et non la clé telle que tu l'as spécifiée pour la lecture. Affiche les valeurs de la clé avant et après lecture par - Code:
-
message "["+cle$+"]" tu as ainsi une vision claire de ce qui est passé et retourné. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Juil 2015 - 22:27 | |
| Là je cherche par ID% l' enregistrement se passe bien j' ai réservé 4 caractères ( ID% de 1 à 9999, ca fait du monde ) bref pour pas me planter, j' ai un enregistrement, je passe la valeur key$ en dur une fois par key$="1000" et l' autre "0001" dans les deux cas, j' ai cette erreur. voilà où j' en suis de ma sub - Code:
-
SUB AffichRecord() dim_local res%,key$ res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
ISAM_record$ = string$(ISAM_RecLen%," ") message str$(len(text$(ID%))) if len(text$(ID%))=0 key$ = "1000" else key$ = left$(trim$(text$(id%))+string$(4," "),4) end_if res% = dll_call4("ReadIsamRecordByKey",Isam_ID%,adr(ISAM_record$),1,adr(key$)) res% = dll_call0("GetIsamOk") if res% = 0 else res% = dll_call0("GetIsamError") message str$(res%) end_if END_SUB cette sub doit me permettre de passer en mode affichage si ( cas de démarrage ) le champ ID% est vide la sub doit m' afficher la fiche avec l' ID%=1 sinon on reste sur la fiche en cours, on change juste de mode ( ex : Enregistrement >>affichage ) le numéro de la clé est : 1 def$ ="1,1,1" ( clé1,pas de doublons,champ1) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mar 28 Juil 2015 - 22:58 | |
| As-tu mis à jour le ZIP pour que je puisse regarder ? En tout cas, il y a différentes choses qui sont incohérentes: si ton champ clé doit contenir un identifiant numérique, il devrait être formaté cadré à droite, avec des zéros à gauche, comme suit: - Code:
-
if len(text$(ID%))=0 key$ = "0001" else key$ = right$(string$(4,"0")+trim$(text$(id%)),4) end_if à condition que le champ 1 (celui qui sert de clé 1) fasse 4 caractères de long, et de mémoire, ce n'est pas le cas... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Juil 2015 - 23:25 | |
| J' ai mis le zip à jour sur mon webdav. Je poursuit mon apprentissage. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Juil 2015 - 23:31 | |
| Si tu peux, jette un oeil sur les fichiers ISAM, il me semble qu' il manque du monde. Je ne vois ni le champ ID%, ni le champ Nom%, ni le champ Prenom%.
Pour le champ ID%, la justification est à droite.
Dernière édition par ygeronimi le Mar 28 Juil 2015 - 23:38, édité 1 fois | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mar 28 Juil 2015 - 23:38 | |
| Dans le module FCT.bas, tu as une SUB SDaveRecord. Elle contient le segment suivant: - Code:
-
s$ =trim$(text$(ID%)) : if len(s$)=0 : message "Le champ ID est vide !" : exit_sub : end_if s$ =trim$(text$(ID%)) : if len(s$)>4 : message "Vous avez atteint le nombre maximum d' enregistrement !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,1,1,adr(ISAM_Record$),adr(s$),adr(sf$)) C'est presque bon, sauf que sf$ devrait être chargé par "0" et non " ". Car du crées des champs contenant des espaces à gauche, puis la valeur de l'ID. Et donc, tes tentatives de lecture par "1" ou "1000" ou même "0001" sont vouées à l'échec. Supprime le fichier, mets sf$ = "0" pour le champ 1, puis recrée un nouvel enregistrement. Ensuite, tu le liras en construisant la clé comme indiquée dans mon post précédent. EDIT Dans ton fichier, voici ce que je vois dans les données: - Citation :
- . 1.Geronimi .Yannick .0298269236.0789080331ÿygeronimi@hotmail.fr
Donc, il y a bien l'ID, cadré à droite, mais avec des espaces à gauche ce qui n'est pas bon. Les autres champs sont biens présents. Je ne vois pas ce que tu vois comme problème à ce niveau-là...
Dernière édition par Klaus le Mar 28 Juil 2015 - 23:41, édité 1 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 28 Juil 2015 - 23:41 | |
| Tu peux me traiter de bachibouzouk ! Je viens de m' en rendre compte de l' histoire du "0" Quel imbécile que je suis, c' était devant mes yeux depuis le début de la soirée... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 0:10 | |
| Tu vas pas me croire Klaus... ...j' ai réussi à récupérer ma fiche. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mer 29 Juil 2015 - 1:34 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 10:25 | |
| Je viens de faire les procédures pour le mode visualisation, Fiche suivante et fiche précédente. J' ai une bizarrerie. il a fallu que j' inverse les deux . La procédure pour la fiche suivante me donne la précédente et inversement... - Code:
-
SUB PreviousRecord() dim_local res%,key$,v$,fill$
res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
ISAM_record$ = string$(ISAM_RecLen%," ") res% = dll_call3("ResetIsamKey",Isam_ID%,1,1) key$ = string$(20,chr$(255)) res% = dll_call4("ReadPreviousIsamRecord",Isam_ID%,adr(ISAM_record$),1,adr(key$))
if res% >0 ' id v$=string$(4," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,1,adr(ISAM_record$),adr(v$),adr(fill$)) text id%,v$ ' nom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,2,adr(ISAM_record$),adr(v$),adr(fill$)) text Nom%,v$ ' prenom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,3,adr(ISAM_record$),adr(v$),adr(fill$)) text Prenom%,v$ ' Tel v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,4,adr(ISAM_record$),adr(v$),adr(fill$)) text Tel%,v$ ' Port v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,5,adr(ISAM_record$),adr(v$),adr(fill$)) text Port%,v$ ' Mail v$=string$(255," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,6,adr(ISAM_record$),adr(v$),adr(fill$)) text Mail%,v$ res% = dll_call1("GetIsamRecordCount",Isam_ID%) caption alph%(6),"Enregistrement "+str$(val(text$(id%)))+" / "+str$(res%) left alph%(6),width(frame0%)-(width(alph%(6))+5) end_if END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB NextRecord() dim_local res%,key$,v$,fill$
res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
ISAM_record$ = string$(ISAM_RecLen%," ") res% = dll_call3("ResetIsamKey",Isam_ID%,1,0) key$ = string$(20," ") res% = dll_call4("ReadNextIsamRecord",Isam_ID%,adr(ISAM_record$),1,adr(key$))
if res% >0 ' id v$=string$(4," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,1,adr(ISAM_record$),adr(v$),adr(fill$)) text id%,v$ ' nom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,2,adr(ISAM_record$),adr(v$),adr(fill$)) text Nom%,v$ ' prenom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,3,adr(ISAM_record$),adr(v$),adr(fill$)) text Prenom%,v$ ' Tel v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,4,adr(ISAM_record$),adr(v$),adr(fill$)) text Tel%,v$ ' Port v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,5,adr(ISAM_record$),adr(v$),adr(fill$)) text Port%,v$ ' Mail v$=string$(255," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,6,adr(ISAM_record$),adr(v$),adr(fill$)) text Mail%,v$ res% = dll_call1("GetIsamRecordCount",Isam_ID%) caption alph%(6),"Enregistrement "+str$(val(text$(id%)))+" / "+str$(res%) left alph%(6),width(frame0%)-(width(alph%(6))+5) end_if END_SUB | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mer 29 Juil 2015 - 14:26 | |
| Voici le début d'une des deux procédures, avec les corrections nécessaires: - Code:
-
SUB PreviousRecord() dim_local res%,key$,v$,fill$
res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
ISAM_record$ = string$(ISAM_RecLen%," ") ' <===== repositionne chaque fois au début de l'index - ne pas faire ! ' res% = dll_call3("ResetIsamKey",Isam_ID%,1,1) ' <========= repart sur une clé avant la première existante, et c'est beaucoup trop long ! - ne pas faire ! ' key$ = string$(20,chr$(255)) res% = dll_call4("ReadPreviousIsamRecord",Isam_ID%,adr(ISAM_record$),1,adr(key$))
if res% >0
tu repars systématiquement au début de l'index, avec une clé avant la première existante, et beaucoup trop longie. Regarde dans le programme de démo d'un fichier de contacts que j'ai posté. Il devrait s'appeler Test_ISAM.bas. Il a une prcédure AfficherTableau() qui affiche tous les enregistrements dans un GRID, séquentiellement, selon la clé 1. Il utilise pour cela justement la fonction ReadNextIsamRecord dans une boucle. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 17:16 | |
| Je me disais aussi... Je vais corriger cette horreur.... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 20:15 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 20:59 | |
| Allo Houston !...
Les renvoies des fonctions ( ReadPreviousIsamRecord et ReadNextIsamRecord )posent un souci. lorsque l' on arrive en bout des enregistrement d' un côté comme de l' autre de la liste des enregistrements, les fonctions devraient renvoyer "-1" hors ce n' est pas le cas.
Pour la fonction Previous : "1" Pour la fonction Next : "0"
ce qui pose un souci pour le traitement un traitement conditionnel à cette valeur par la suite... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 29 Juil 2015 - 21:19 | |
| J' ai mis le zip à jour avec un tas de message pour voir ce qu' il se passe. Jette un oeil, c' est.... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Mer 29 Juil 2015 - 21:56 | |
| Désolé, mais ce soir, je n'ai pas beaucoup de temps. Mais j'ai regardé dans les sources de KGF.dll et dans la doc, et j'ai découvert une erreur dans la doc ! En effet, leus deux fonctions GetNExtIsamRecord et GetPreviousIsamRecord retournent 0 si l'on est arrivé en fin d'index et on tente une nouvelle lecture par une de ces fonctions, et non -1 comme indiquée dans la doc. Ces fonctions retournent un numéro d'enregistrement, et ces numéros sont comptés à partir de 1. La valeur 0 signfie "rien trouvé".
Essaie d'adapter ton code à cela - je mets une correction de la doc en ligne prochainement. Demain, j'aurai plus de temps pour regarder ton code. Désolé. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 30 Juil 2015 - 0:38 | |
| Mode visualisation essayes de forcer previous essayes de forcer next par deux fois le deuxième résultat est... ...çà mérite le coup d' oeil. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Jeu 30 Juil 2015 - 6:35 | |
| J'ai pris le ZIP et je vais regarder... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Jeu 30 Juil 2015 - 10:18 | |
| Bon, j'ai trouvé. C'était vraiment tordu. D'une part, il y avait une anomalie de codage dans ton code, et en plus, il y avait un bug insidieux dans la DLL. J'ai mis une nouvelle version de la DLL en ligne. Bien que la doc à ce niveau n'ait pas changé, reprends-la quand-même, puisqu'elle a changé la veille, concernant les fonctions de gestion des polices. Et voici ton module FCT.bas avec mes corrections. Tu compareras avec le tien: - Code:
-
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' FONCTIONS ET PROCEDURES ' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB SelectMode(m%) dim_local i%,res% for i% = 1 to 4 : mark_off sm%(i%) : next i% mark_on sm%(m%) select m% case 1 caption sm%(0),"Mode enregistrement" res% = dll_call4("ModifyToolbar",4,1,1,0) res% = dll_call4("ModifyToolbar",4,2,1,0) res% = dll_call4("ModifyToolbar",4,3,0,0) res% = dll_call4("ModifyToolbar",4,4,0,0) res% = dll_call4("ModifyToolbar",4,5,0,0) res% = dll_call3("ObjectGroupFunction",Group%,1,0) inactive frame2% case 2 caption sm%(0),"Mode modification" res% = dll_call4("ModifyToolbar",4,1,0,0) res% = dll_call4("ModifyToolbar",4,2,1,0) res% = dll_call4("ModifyToolbar",4,3,0,0) res% = dll_call4("ModifyToolbar",4,4,0,0) res% = dll_call4("ModifyToolbar",4,5,0,0) res% = dll_call3("ObjectGroupFunction",Group%,1,0) active frame2% case 3 caption sm%(0),"Mode visualisation" res% = dll_call4("ModifyToolbar",4,1,0,0) res% = dll_call4("ModifyToolbar",4,2,0,0) res% = dll_call4("ModifyToolbar",4,3,0,0) res% = dll_call4("ModifyToolbar",4,4,1,0) res% = dll_call4("ModifyToolbar",4,5,1,0) res% = dll_call3("ObjectGroupFunction",Group%,1,1) AffichRecord() active frame2% case 4 caption sm%(0),"Mode recherche" res% = dll_call4("ModifyToolbar",4,1,0,0) res% = dll_call4("ModifyToolbar",4,2,0,0) res% = dll_call4("ModifyToolbar",4,3,0,0) res% = dll_call4("ModifyToolbar",4,4,0,0) res% = dll_call4("ModifyToolbar",4,5,0,0) res% = dll_call3("ObjectGroupFunction",Group%,1,0) active frame2% end_select END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB NewRecord() dim_local x% active frame2% x% = len(text$(id%)) if x%=0 text ID%,string$(3," ")+"1" else text ID%,right$(string$(4," ")+str$(val(text$(id%))+1),4) end_if ' message text$(id%) text Nom%,"" text Prenom%,"" text Tel%,"" text Port%,"" text Mail%,"" END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB ModifRecord() Message "Mode modification" END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB SaveRecord() dim_local res%,s$,sf$,err%,a$ res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if ISAM_record$ = string$(ISAM_RecLen%,"*")
s$ =trim$(text$(ID%)) : if len(s$)=0 : message "Le champ ID est vide !" : exit_sub : end_if s$ =trim$(text$(ID%)) : if len(s$)>4 : message "Vous avez atteint le nombre maximum d' enregistrement !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,1,1,adr(ISAM_Record$),adr(s$),adr(sf$))
s$ =trim$(text$(Nom%)) : if len(s$)=0 : message "Le champ Nom est vide !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,2,0,adr(ISAM_Record$),adr(s$),adr(sf$)) s$ =trim$(text$(Prenom%)): if len(s$)=0 : message "Le champ Prenom est vide !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,3,0,adr(ISAM_Record$),adr(s$),adr(sf$)) s$ =trim$(text$(Tel%)) : if len(s$)=0 : message "Le champ Tel-fixe est vide !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,4,0,adr(ISAM_Record$),adr(s$),adr(sf$)) s$ =trim$(text$(Port%)) : if len(s$)=0 : message "Le champ Tel-Portable est vide !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,5,0,adr(ISAM_Record$),adr(s$),adr(sf$)) s$ =trim$(text$(Mail%)) : if len(s$)=0 : message "Le champ Mail est vide !" : exit_sub : end_if sf$ =" " res% = dll_call6("FillIsamField",Isam_ID%,6,0,adr(ISAM_Record$),adr(s$),adr(sf$))
a$="ID : "+text$(id%)+chr$(13)+"Nom : "+text$(nom%)+chr$(13)+"Prenom : "+text$(Prenom%)+chr$(13) a$=a$+"Tel : "+text$(tel%)+chr$(13)+"Port : "+text$(port%)+chr$(13)+"mail : "+text$(mail%) message a$ res% = dll_call2("AddIsamRecord",Isam_ID%,adr(ISAM_Record$)) if res%<0 err% = dll_call0("GetIsamError") message "Erreur en création "+str$(res%)+": "+str$(err%) exit_sub end_if
inbase% = dll_call1("GetIsamRecordCount",Isam_ID%) caption alph%(6),"Enregistrement "+str$(res%)+" / "+str$(inbase%) left alph%(6),width(frame0%)-(width(alph%(6))+5) END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB AffichRecord() dim_local res%,key$,v$,fill$ res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
ISAM_record$ = string$(ISAM_RecLen%," ")
if len(text$(ID%))=0 text ID%,string$(3," ")+"1" key$ = string$(3," ")+"1" else key$ = right$(string$(4," ")+trim$(text$(id%)),4) end_if res% = dll_call4("ReadIsamRecordByKey",Isam_ID%,adr(ISAM_record$),1,adr(key$)) res% = dll_call0("GetIsamOk") if res% = 0 ' nom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,2,adr(ISAM_record$),adr(v$),adr(fill$)) text Nom%,v$ ' prenom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,3,adr(ISAM_record$),adr(v$),adr(fill$)) text Prenom%,v$ ' Tel v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,4,adr(ISAM_record$),adr(v$),adr(fill$)) text Tel%,v$ ' Port v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,5,adr(ISAM_record$),adr(v$),adr(fill$)) text Port%,v$ ' Mail v$=string$(255," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,6,adr(ISAM_record$),adr(v$),adr(fill$)) text Mail%,v$ inbase% = dll_call1("GetIsamRecordCount",Isam_ID%) caption alph%(6),"Enregistrement "+str$(val(text$(id%)))+" / "+str$(inbase%) left alph%(6),width(frame0%)-(width(alph%(6))+5) else res% = dll_call0("GetIsamError") message str$(res%) end_if END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB DeleteRecord() END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB NextPreviousRecord(npr$) dim_local res%,key$,v$,fill$,rpi%,rni%,a$,rnx%
res% = dll_call1("IsamFileIsOpen",Isam_ID%) if res%<0 message "Le fichier ISAM est fermé !" exit_sub end_if
' ISAM_record$ = string$(ISAM_RecLen%," ") key$ = string$(4," ") res% = dll_call4("CreateIsamKey",Isam_ID%,adr(ISAM_record$),1,adr(key$))
if npr$="P" rpi% = dll_call4("ReadPreviousIsamRecord",Isam_ID%,adr(ISAM_record$),1,adr(key$)) rnx% = rpi% else rni% = dll_call4("ReadNextIsamRecord",Isam_ID%,adr(ISAM_record$),1,adr(key$)) rnx% = rni% end_if ' message "rnx%="+str$(rnx%)+" key$ après=["+key$+"] record="+ISAM_record$ if rnx%>0 ' id v$=string$(4," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,1,adr(ISAM_record$),adr(v$),adr(fill$)) text id%,v$ ' nom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,2,adr(ISAM_record$),adr(v$),adr(fill$)) text Nom%,v$ ' prenom v$=string$(30," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,3,adr(ISAM_record$),adr(v$),adr(fill$)) text Prenom%,v$ ' Tel v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,4,adr(ISAM_record$),adr(v$),adr(fill$)) text Tel%,v$ ' Port v$=string$(10," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,5,adr(ISAM_record$),adr(v$),adr(fill$)) text Port%,v$ ' Mail v$=string$(255," ") : fill$ =" " res% = dll_call5("ExtractIsamField",Isam_ID%,6,adr(ISAM_record$),adr(v$),adr(fill$)) text Mail%,v$ else message "Oups... fin de fichier !" end_if
inbase% = dll_call1("GetIsamRecordCount",Isam_ID%)
a$="res% fonction Previous : "+str$(rpi%)+chr$(13) a$=a$+"res% fonction Next : "+str$(rni%)+chr$(13) a$=a$+"edit id% : "+text$(id%)+chr$(13) a$=a$+"Count base : "+str$(inbase%)
message a$
caption alph%(6),"Enregistrement "+str$(val(text$(id%)))+" / "+str$(inbase%) left alph%(6),width(frame0%)-(width(alph%(6))+5) END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB PreviousRecordKey(k%) END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB NextRecordKey(k%) END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB Quitter() dim_local fin% fin% = dll_call1("CloseIsamFile",Isam_ID%) wait 100 fin% = dll_call0("FreeIsam") wait 100 fin% = dll_call1("KillProcessByHandle",handle(0)) END_SUB
' ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SUB MessageErreur(e%) dim_local a$,i% i%=e%*-1 select i% case 1 : a$="[1] La chaîne de définition es incohérente" case 2 : a$="[2] Le numéro de la clé est non numérique" case 3 : a$="[3] Le nombre de clés est invalide (<1 ou >(nombre de clés)+1))" case 4 : a$="[4] Le flag ''pas de doublons'' est non numérique" case 5 : a$="[5] Un numéro de champ est non numérique" case 6 : a$="[6] Un numéro de champ est invalide (<1 ou >(nombre de champ))" case 7 : a$="[7] Clé > 30 caractères" end_select message str$(res%)+chr$(13)+a$
END_SUB Cela touche la SUB NextPreviousRecord. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 30 Juil 2015 - 10:56 | |
| Merci Klaus. Entre moi et la dll, 2 bugs pour le prix d' 1 . Je me posais la question de l' utilité de cette fonction CreateIsamkey vu qu' on avait déjà créé les clés avec Set......, maintenant je vois où elle intervient,même si je ne comprends pas tout. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Jeu 30 Juil 2015 - 11:26 | |
| Dans un cas général, une clé ISAM peut être composée de plusieurs champs. La chaîne de caractères keu$ qu'il faut construire, doit alors être la concaténation (sans le sans Panoramic) des différentes chaînes contenant les valeurs des champs concernés. On a besoin de construire une telle clé lorsqu'on veut lire directement un enregistrement par sa clé (ReadIsamRecordByKey), ou pour les fonctions ReadNextIsamRecord et ReadPreviousIsamRecord. Initialement, il faut donner la valeur de la clé, pour le premier accès. Ces fonctions modifient cette valeur automatiquement, lorsqu'un enregistrement est lu. C'est pourquoi il faut faire cela au début, ma si après, ce n'est plus nécessaire si l'on continue de lire, en avant ou en arrière, à partir de la clé qu'on vient juste de lire.
Et c'est pour cela que la fonction CreateIsamkey existe. Elle prend le contenu des champs de l'enregistrement, tel qu'il est, soit initialisé à blanc, soit rempli avec les valeurs des champs par la fonction FiiIsamField. Elle prend donc ces valeurs, dans l'ordre des champs dans la clé, et retourne une chaîne de caractères qui pourra être utilisée directement comme clé pour les fonctions de lecture. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 30 Juil 2015 - 11:52 | |
| En fait, avec "set..." on fait une création physique dans les fichiers, avec "create...." on a une création mémoire. Je me mets 2 minutes à ta place pour trouver les noms des fonctions, ce ne doit pas être simple. ( peut être plus compliqué que la fonction en elle même ) | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM vs BDR database Jeu 30 Juil 2015 - 12:03 | |
| C'est un peu ça. La fonction FillIsamField remplit un champ de l'enregistrement en mémoire, la fonction CreateIsamKey créer une variable en mémoire à partir d'un enregistrement en mémoire. Ces deux fonctions ne font aucune opération sur le fichier physique. | |
| | | Contenu sponsorisé
| Sujet: Re: ISAM vs BDR database | |
| |
| | | | ISAM vs BDR database | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |