Mike
Nombre de messages : 31 Age : 73 Localisation : NANCY Date d'inscription : 12/06/2007
| Sujet: Isam quand tu nous tiens Dim 20 Sep 2015 - 21:58 | |
| Je suis à fond dans les fichiers Isam et passionné par cette implémentation à partir de Panoramic. C'est super et encore merci Klaus. (Comme l'a dit Cosmos, tu es vraiment le roi ici) Par contre, il y a encore quelques inconnues dont la logique m'échappe. Il s'agit des clés qui si j'ai bien compris peuvent être "multi champs" d'où l'intérêt du truc Je poste un petit prog qui renvoie le nombre de champs dans une clé, rien que pour voir si c'est oK pour la construction. Il écrase les .DAT et .IX pour retester ce qui aura été écrit dans la définition des clés. De plus, je n'ai pas de message d'erreur si ce n'est pas OK et les fichiers sont tronqués, voire inexistants pour l'extension .IX . Je lis dans le PDF ceci : dim def$, IsamID% def$ = "3,30,5,80" : ' 3 champs de longueur 30, 5 et 80 caractères res% = dll_call2("SetIsamFields",IsamID%,adr(def$)) def$ = "1,1,0,3" : ' clé 1: 1 seul champ, doublons non interdits, champ numéro 3 ??? res% = dll_call2("SetIsamFields",IsamID%,adr(def$)) def$ = "2,3,4,1,7" : ' clé 2: 3 champ,s doublons interdits, champ 4 suivi de champ 1 suivi de champ 7 ??? res% = dll_call2("SetIsamFields",IsamID%,adr(def$)) Je lis aussi dans KGF.chm ceci : Cette fonction définit les champs d'une clé d'un fichier ISAM. La définition des champs se fait par une variable de type chaîne de caractères, qui comprend la liste des numéros des champs composant la clé, dans l'ordre, séparées par des virgules. Le premier élément de cette liste doit être le numéro de la clé. Le deuxième élément est un indicateur pour l'unicité de la clé (doublons interdits). Ensuite, il y a la liste des champs composant la clé. La liste contient donc n+2 éléments pour n champs. Le nombre de champs peut être entre 1 et 16. Quelle est la façon de faire ? Je reste persuadé qu'il y a une logique que m'échappe. Par l'exemple et dans le fichier, la définition des clés en multi champs et la seule chose acceptée, en clé 2 d'où mon exemple. Tout le reste est voué à l’échec, même un truc simple qui définit la première clé avec un champ 4 comme '1,0,4' est rejetée Sauf erreur de ma part ou incompréhension, ce qui marche sans problème est clé 1 "1,0,1" + clé 2 "2,0,2" + ....et pareil pour les autres ce qui est déjà immense. Voilà un grand message pour toi Klaus, pour que tu expliques et en tout cas merci car c'est géant ce que tu fais pour Panoramic. Bonne soirée Mike - Code:
-
dim err%, res%, dim idsize%, Isam$, IsamID%, FName$, reclen%, rec$, cle$,rsize% ,fill$,v$,def$
If file_exists("test_isam.DAT")= 1 then File_delete "test_isam.DAT" If file_exists("test_isam.IX")= 1 then File_delete "test_isam.IX" Fname$ = "test_isam" ' trace_on "err.txt"
dll_on KGF.dll GUI() initisam()
end
sub InitIsam()
res% = dll_call0("InitIsam") idsize% = dll_call0("GetIsamIdentifierSize") Isam$ = string$(idsize%," ") IsamID% = dll_call1("CreateIsamIdentifier",adr(Isam$)) if dll_call1("IsamFileExists",adr(Fname$))<0 ' def$ = "3,30,5,80" def$ = "8,10,20,30,40,15,10,30,25" res% = dll_call2("SetIsamFields",IsamID%,adr(def$)) : ' définir les champs res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition des champs: "+str$(err%) exit_sub end_if
' *******************CLE 1*********************** def$ ="1,0,1" : ' clé 1: champ 1 ' ***********************************************
res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' autoriser doublons ' res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) res% = dll_call0("GetIsamOk") Text 13,res% if res%<0 exit_sub end_if res% = dll_call2("GetIsamKeyFieldCount",IsamID%,1) Text 11,res%
' ************************CLE 2****************** def$ = "2,0,2,6" : ' clé 2: champ 2 + champ 6 ' ***********************************************
res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' autoriser doublons res% = dll_call0("GetIsamOk") ' def$=" " if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition de clé 2: "+str$(err%) exit_sub end_if res% = dll_call2("GetIsamKeyFieldCount",IsamID%,2) Text 12,res% ' print res% ' pause 1000
' **********************CLE 3********************** def$ = "3,0,3" : ' clé 3: champ 3 ' ************************************************
res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' autoriser doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition de clé 2: "+str$(err%) exit_sub end_if
res% = dll_call2("GetIsamKeyFieldCount",IsamID%,3)
Text 13,res%
reclen% = dll_call1("GetIsamRecordLength",IsamID%) res% = dll_call0("GetIsamError") Text 14,reclen%
res% = dll_call2("CreateIsamFile",IsamID%,adr(FName$)) if res%<0 err% = dll_call0("GetIsamError")
print err% if res%=-1 then message "Erreur en création de base: "+str$(err%) if res%=-2 then message "Erreur en réouverture de base: "+str$(err%) exit_sub end_if else
res% = dll_call2("OpenIsamFile",IsamID%,adr(FName$))
if res%<0 print res% res% = dll_call0("GetIsamError") message "Erreur en ouverture: "+str$(res%) exit_sub end_if end_if
if res%<0 message "erreur" end_if
res% = dll_call0("FreeIsam") end_sub
Sub GUI() width 0,800 : height 0,200 alpha 1 : top 1,10 : left 1,10 : caption 1,"Nb champs clé 1:" alpha 2 : top 2,40 : left 2,10 : caption 2,"Nb champs clé 2:" alpha 3 : top 3,70 : left 3,10 : caption 3,"Nb champs clé 3:" alpha 4 : top 4,40 : left 4,220 : caption 4,"Longueur enr." edit 11 : top 11,10 : left 11,100 : width 11,30 edit 12 : top 12,40 : left 12,100 : width 12,30 edit 13 : top 13,70 : left 13,100 : width 13,30 edit 14 : top 14,40 : left 14,300 : width 14,50
End_sub | |
|
Mike
Nombre de messages : 31 Age : 73 Localisation : NANCY Date d'inscription : 12/06/2007
| Sujet: Résolu Lun 21 Sep 2015 - 19:10 | |
| Problème résolu: J'ai cherché un bon moment. En fait, et c'est dit par Klaus dans les restrictions, une clé ne doit pas faire plus de 30 caractères. (mais je n'avais pas fait attention à cette ligne et la notion de 30 caractères pour une clé ne m'avait pas fait percuter) Cela veut dire que l'on ne peux pas affecter une clé à un champ qui dépasse 30 caractères. De même, pour construire une clé multichamps, il ne faut pas que la longueur totale des champs déclarés dans la clé dépasse 30 caractères.
exemple : définition des champs = "4,5,5,20,40" . Soit 4 champs de 5;5,20 et 30 caractères On peut écrire pour la définition des clés "1,0,2,3" clé 1 avec champs 2 et 3 soit 25 caractères "4,0,4" clé 4 avec champ 4 soit 30 caractères Mais on ne peut pas écrire "4,0,4,1" car champ 4 + champ 1 égalent 35 caractères
Sinon, tout fonctionne parfaitement si ce n'est que l'indicateur d'unicité s'inverse dans le .DAT, mais c'est sûrement normal.
J'étais justement en train de faire un programme de gestion personnelle avec des fichiers texte mais je vais tout refondre maintenant car les temps d'accès devenaient prohibitifs. J'espère que mes déboires pourront servir à d'autres car c'est aussi un des but du forum.
Bonne soirée à tous Mike | |
|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Isam quand tu nous tiens Lun 21 Sep 2015 - 19:21 | |
| Bonsoir Mike ! Je suis surpris que tu n'es pas eu de retour de Klaus ! Il est peut être actuellement occupé. C'est vrai qu'il y a quelques jours il nous disait travailler sur un nouveau projet... En tous cas tant mieux si tu as trouvé la solution ! | |
|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Isam quand tu nous tiens Lun 21 Sep 2015 - 23:58 | |
| - Citation :
- Klaus a dit qu' il le mettrai dans la doc mais je te le précise ici.
il y a une longueur minimale des champs. Pas tout à fait. Il y a une longueur minimale pour un enregistrement (21 caractères), pas pour un champ ! J'étais absent toute la journée, et je reprends le fil des discussions maintenant. Bravo à toi, Mike, d'avoir trouvé le fin mot de l'histoire ! | |
|