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 toujours ISAM | |
| | |
Auteur | Message |
---|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 5 Oct 2015 - 23:02 | |
| @ Klaus, J' ai un doute. La fonction "ReplaceIsamKey" est elle faite pour remplacer une cle ou pouvoir changer le contenu d' un champ d' enregistrement ? ex: J' ai 1 enregistrement de 5 champs et voilà que je me suis planté pas le bon auteur pour cet article. si je veux modifier le champ "auteur" de mon enregistrement, comment dois je m' y prendre pour le faire de la bonne manière ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Mar 6 Oct 2015 - 0:17 | |
| Oups... je me rends compte que la doc de ReplaceIsamKey a été créée par copier/coller de UpdateIsamRecord, et je n'ai pas changé le descriptif... Je vais corriger cela? En attendant, voici la procédure à suivre: 1. pour chaque champ modifié, utiliser FillIsamField pour placer la nouvelle valeur dans l'enregistrement 2. utiliser UpdateIsamRecord pour mettre à jour la partie "données" de la base, pour cet enregistrement 3. pour chaque clé modifiée, utiliser ReplaceIsamKey pour actualiser la clé dans l'index
Si un champ modifié fait partie de 2 ou plusieurs clés, il faut faire le point (3) pour chaque clé concernée.
Est-ce c'est suffisamment clair ? | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 6 Oct 2015 - 0:23 | |
| heu...je te rappelle dans 2, 3 messages d' erreur.... Je vais essayer, j' ai eu une coupure de réseau pendant 2 heures alors que j' étais sur le FTP, du coup je suis revenu sur cette fonction qui était un "+" au départ mais qui pourrait s' avérer très utile. Comme je ne me plante jamais... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 9 Oct 2015 - 21:03 | |
| J' ai un petit souci qui est le suivant :
je définis un base dont le premier champ est l' "ID" de la fiche/enregistrement. je crée 3 enregistrements je supprime un des 3 enregistrement, le deuxième.
le résultat de "GetIsamRecordCount" me renvoie 2 ce qui est logique mais faux. car, si il y a bien 2 enregistrements pleins, il y en a trois dont 1 vide.
Je ne peux pas donner 3 comme "ID" à un nouvelle enregistrement, cet "ID" existe déjà. Ce sera 4 mais pour créer ce numéro valide automatiquement par prog, il me faut connaitre le nombre total des enregistrements, vide+plein. Le résultat de la fonction+1 me donnera automatiquement un "ID" déjà utilisé si il y a eu suppression d' une fiche/enregistrement.
Comment puis l' obtenir ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Ven 9 Oct 2015 - 22:34 | |
| Effectivement. Le "numéro d'enregistrement" est un identifiant technique qui donne l'adresse dans le fichier. Le fait de supprimer un enregistrement libère la place, mais ne décale pas les autres entregistrements. Et donc, le prochain aura un numéro d'enregistrement inattendu, car imposé par la configuration physique du fichier qui est totalement indépendant du nombre d'enregistrements réels disponibles dans le fichier.
Ce numéro d'enregistrement qui est retourné par la fonction de création d'enregistrement ou les fonctions de lecture, est prévu pour une autre série de fonctions en cours de conception (mais qui a pris un peu de retard, pour cause d'autres projets...). Ce sont des fonctions ayant pour but de "réorganiser" un fichier ISAM, en le comprimant pour supprimer tous les endroits non utilisées et pour reconstruire les indexes éventuellement abimés. Et pour cela, j'ai besoin de connaître les adresses physiques des enregistrements. Il ne faut surtout pas mettre cette valeur dans un enregistrement, encore moins dans un champ faisant partie d'une clé ! L'adresse physique d'un enregistrement est susceptible de varier, contrairement aux clés qui restent inchangées.
Si tu veux absolument avoir une référence genre identifiant; je te conseille de créer un enregistrement avec une clé principale spéciale (tout à zéro ou à blanc, par exemple) et de coller la valeur du dernier identifiant utilisé dans cet enregistrement. Puis, lors de la création d'un nouveau, tu lis celui-là, tu incrémentes sa valeur et tu la mets de côté, puis tu réécris cet enregistrement spécial. Puis, tu crées ton nouvel enregistrement en mettant cette nouvelle valeur dans un champ, mais certainement pas comme un champ clé. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 25 Mar 2016 - 13:41 | |
| @ Klaus,
Dans l' utilisation d' une base ISAM, n' est il pas préférable de l' ouvrir avant et de la fermer après chaque opération pour éviter des accès violation de KGF ou cela n' a t il aucune importance ? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Ven 25 Mar 2016 - 13:54 | |
| Non, cela n'a aucune incidence sur la survenue de ces violations de mémoire. Ces erreurs sont dues à des passages de paramètres mal construits. J'essaie de les intercepter et les neutraliser, mais je ne le fais que progressivement, au fil de l'identification de problèmes.
Je pourrais désactiver complètement ces violations de mémoire dans ISAM, mais alors, on ne se rendrait plus compte des erreurs, et cela conduirait à une destruction progressive de la base, sans aucune possibilité de déterminer le point de départ du problème.
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 25 Mar 2016 - 14:32 | |
| Je pose la question, car j' utilise plusieurs objets de KGF :
Toolbar TreeView ISAM Histogram
sans parler des autres fonctions style :
WindowTopMost etc...
Et parfois j' ai des messages d' erreur qui ne se produisent pas régulièrement. Je me demandais si, de temps en temps, il n' y avait pas des interférences entre toutes ces fonctions...
Là, je suis en train de regrouper les fonctions par objet dans des fichiers distincts pour réorganiser un peu mon source car, ajoutes une fonction puis ajoutes en une autre, et c' était devenu le footware et je n' y retrouvai plus mes petits... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Ven 25 Mar 2016 - 14:41 | |
| C'est vrai que les fonctions sont très nombreuses. Mais entre les différents groupes de fonctions, il n'y a aucune interaction. ISAM est bien séparé de BDR aui est bien séparé de Histogramme, ToolBar etc.
Initialement, tout cela était dans des DLLs séparés, mais cela devenait trop lourd à maintenir, et la limitation (ancienne) de Panoramic à une seule DLL posait problème. C'est la raison pour laquelle j'ai tout réuni dans KGF.dll. Mais techniquement, tout est bien séparé. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 25 Mar 2016 - 14:45 | |
| Ok Klaus, je poursuis mon ménage de printemps... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mer 6 Avr 2016 - 21:53 | |
| Klaus, j' ai créé cette sub : - Code:
-
sub CREATE_ISAM_files(name$) dim_local res%,def$,defkey$,i% ISAM_nam$ = name$ ' -> création des champs def$ ="4,5,4,10,10,3" for i%=1 to 384 : def$ = def$+",3" : next i% for i%=1 to 5 : def$ = def$+",10": next i% def$ = def$+",100,100" for i%=1 to 3 : def$ = def$+",10": next i% res% = dll_call2("SetIsamFields",Isam_ID%,adr(def$)) message str$(res%) ' -> création des clés ' ID defkey$ ="1,1,1" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' NUM Livret defkey$ ="2,0,2" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' NUM Feuille defkey$ ="3,0,3" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' IMMAT defkey$ ="4,0,4" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' DATE defkey$ ="5,0,5" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' MOIS defkey$ ="6,0,6" res% = dll_call2("SetIsamKeyFields",Isam_ID%,adr(defkey$)) ' -> enregistrement des fichiers res% = dll_call2("CreateIsamFile",Isam_ID%,adr(ISAM_nam$)) message str$(res%) end_sub Le premier message me renvoie -3 Dans la doc, il est dit : res% = -3 : Nbre de champs incohérent Comment un nombre de champs peut il être incohérent ? Je déclare le nombre de champs dont j' ai besoin même si dans ce cas, cela parait complètement fou. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Jeu 7 Avr 2016 - 0:28 | |
| - Citation :
- Comment un nombre de champs peut il être incohérent ?
Tu devrais relire lé début de la doc concernant la fonction SetIsamFields: - Citation :
- Cette fonction définit les champs des enregistrements 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 longueurs des champs, dans l'ordre, séparées par des virgules. Le premier élément de cette liste doit être le nombre de champs. La liste contient donc n+1 éléments pour n champs. Le nombre de champs peut être entre 1 et 1024. Les champs sont numérotés à partir de 1.
Dans ta variable def$, le premier élément est 4, et la fonction s'attend donc à trouver une liste de 5 éléménts: 4 étant le nombre de champs les autres éléments étant les longueurs des 4 champs Or, ta liste est beaucoup plus longue, et donc: "Le nombre de champs est incohérent" | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 7 Avr 2016 - 21:12 | |
| Effectivement, la fatigue de mon nouveau boulot me fait oublier les bases. Je crois que je vais réserver la prog pour le week-end pendant quelques temps. | |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Exemples avec Isam Jeu 11 Juil 2019 - 15:12 | |
| Bonjour à tous.
Y aurait il dans un Webdav une demo de création et de lecture avec ISAM.
Je voudrais juste faire un test pour savoir si cela me conviendrait.
Merci pour toutes les réponses.
Lepetitmarocain | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Jeu 11 Juil 2019 - 18:14 | |
| Tu as ceci, par exemple: - Code:
-
' test_ISAM.bas
label close0 label crefic, opnfic, clsfic, copfic, envers, choix label addrec, delrec, chgnam, chgid, chgadr
dim res%, version$, no%, n%, err%, s$, sr$, sf$, inverser%, lg%, f$ dim data$, key$, nrec%, key1$, key2$
dim dll$ : dll$ = "KGF.dll" dim FName$ : FName$ = "TestISAM"
dim Isam$, IsamID%, RecLen%
dim aNRec%, aDefSiz%, aNKeys%, aNFields%, aRecLen%, Grid%, envers%, gridlig% dim eNom%, eID%, eAdresse%
full_space 0 : on_close 0,close0 no% = no% + 1 : button no% : top no%,40 : left no%, 20 : caption no%,"Créer fichier" : on_click no%,crefic no% = no% + 1 : button no% : top no%,40 : left no%,120 : caption no%,"Ouvrir fichier" : on_click no%,opnfic no% = no% + 1 : button no% : top no%,40 : left no%,220 : caption no%,"Fermer fichier" : on_click no%,clsfic no% = no% + 1 : button no% : top no%,70 : left no%, 20 : caption no%,"Copier fichier" : on_click no%,copfic
no% = no% + 1 : alpha no% : top no%, 40 : left no%,400 : caption no%,"Enregistrements:" no% = no% + 1 : alpha no% : top no%, 10 : left no%,600 : caption no%,"Taille descripteur:" no% = no% + 1 : alpha no% : top no%, 40 : left no%,600 : caption no%,"Nombre de clés:" no% = no% + 1 : alpha no% : top no%, 70 : left no%,600 : caption no%,"Nombre de champs:" no% = no% + 1 : alpha no% : top no%,100 : left no%,600 : caption no%,"Longueur enregistrement:"
no% = no% + 1 : alpha no% : top no%, 35 : left no%,500 : caption no%,"0" font_bold no% : font_size no%,12 aNRec% = no% no% = no% + 1 : alpha no% : top no%, 5 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aDefSiz% = no% no% = no% + 1 : alpha no% : top no%, 35 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNKeys% = no% no% = no% + 1 : alpha no% : top no%, 65 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNFields% = no% no% = no% + 1 : alpha no% : top no%, 95 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aRecLen% = no%
no% = no% + 1 : check no% : top no%,120 : left no%, 20 : caption no%,"Ordre inverse" envers% = no% : on_click no%,envers no% = no% + 1 : grid no% : top no%,150 : left no%, 20 : width no%,776 : height no%,255 grid% = no% : on_click no%,choix grid_row no%,500 : grid_column no%,3 : grid_column_fixed grid%,0.01 grid_one_column_width no%,1,200 grid_one_column_width no%,2,50 grid_one_column_width no%,3,500 grid_write no%,1,1,"Nom" : grid_write no%,1,2,"ID" : grid_write no%,1,3,"Adresse"
no% = no% + 1 : alpha no% : top no%,430 : left no%, 20 : caption no%,"Nom:" no% = no% + 1 : alpha no% : top no%,430 : left no%,230 : caption no%,"ID:" no% = no% + 1 : alpha no% : top no%,430 : left no%,280 : caption no%,"Adresse:" no% = no% + 1 : edit no% : top no%,460 : left no%, 20 : width no%,200 eNom% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,230 : width no%,40 eID% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,280 : width no%,500 eAdresse% = no%
no% = no% + 1 : button no% : top no%,490 : left no%,20 : caption no%,"Ajouter" : on_click no%,addrec no% = no% + 1 : button no% : top no%,490 : left no%,120 : caption no%,"Supprimer" : on_click no%,delrec no% = no% + 1 : button no% : top no%,490 : left no%,280 : width no%,120 : caption no%,"Changer nom" : on_click no%,chgnam no% = no% + 1 : button no% : top no%,490 : left no%,410 : width no%,120 : caption no%,"Changer ID" : on_click no%,chgid no% = no% + 1 : button no% : top no%,490 : left no%,540 : width no%,120 : caption no%,"Changer adresse" : on_click no%,chgadr
dll_on dll$
version$ = string$(25," ") res% = dll_call1("GetIsamVersion",adr(version$)) caption 0,"Test ISAM (B-Tree) - "+version$ n% = dll_call0("GetIsamIdentifierSize") caption aDefSiz%,str$(n%)
res% = dll_call0("InitIsam")
end
close0: if IsamID%<>0 then res% = dll_call1("CloseIsamFile",IsamID%) res% = dll_call0("FreeIsam") return
crefic: res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if res% = dll_call1("IsamFileExists",adr(FName$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+" existe déjà. Remplacer ?")<>1 then return end_if CreateIdentifier() InitContext() res% = dll_call0("GetIsamOk") if res%<0 then return
res% = dll_call2("CreateIsamFile",IsamID%,adr(FName$)) if res%<0 err% = dll_call0("GetIsamError") 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%) return end_if AfficherEtat() gridlig% = 0 return opnfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if CreateIdentifier() res% = dll_call2("OpenIsamFile",IsamID%,adr(FName$)) if res%<0 res% = dll_call0("GetIsamError") message "Erreur en ouverture: "+str$(res%) return end_if AfficherEtat() AfficherTableau() gridlig% = 0 return
clsfic: res% = dll_call1("CloseIsamFile",IsamID%) caption aRecLen%,"0" caption aNFields%,"0" caption aNKeys%,"0" caption aNRec%,"0" EffacerTableau() gridlig% = 0 return
copfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if f$ = FName$ + "_copy" res% = dll_call1("IsamFileExists",adr(f$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+"_copy existe déjà. Remplacer ?")<>1 then return file_delete FName$+"_copy.DAT" file_delete FName$+"_copy.IX" end_if CreateIdentifier() res% = dll_call2("CopyIsamFile",IsamID%,adr(FName$)) res% = dll_call1("CloseIsamFile",IsamID%) message "Le fichier est recopié sous "+FName$+"_copy.DAT et "+FName$+"_copy.IX" return envers: inverser% = checked(envers%) AfficherTableau() return choix: lg% = grid_y_to_row(grid%,mouse_y_left_down(grid%)) if trim$(grid_read$(grid%,lg%,1))="" then return gridlig% = lg% text eNom%,grid_read$(grid%,lg%,1) text eID%,grid_read$(grid%,lg%,2) text eAdresse%,grid_read$(grid%,lg%,3) return addrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if sr$ = string$(RecLen%,"*") : ' construire la chaîne de caractères représentant l'enregistrement
s$ = trim$(text$(eNom%)) if s$="" message "Le nom manque" return end_if sf$ = " " res% = dll_call6("FillIsamField",IsamID%,1,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 1
s$ = trim$(text$(eID%)) if s$="" message "L'identifiant manque" return end_if sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(sr$),adr(s$),adr(sf$)) : ' champ 2
s$ = trim$(text$(eAdresse%)) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 3
res% = dll_call2("AddIsamRecord",IsamID%,adr(sr$)) : ' ajout dans le fichier ISAM if res%<0 err% = dll_call0("GetIsamError") message "Erreur en création "+str$(res%)+": "+str$(err%) return end_if res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) AfficherTableau() return delrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),2,adr(key$)) if message_confirmation_yes_no("Vraiment supprimer "+trim$(grid_read$(grid%,gridlig%,1))+" ?")<>1 then return res% = dll_call3("DeleteIsamRecord",IsamID%,adr(data$),nrec%) AfficherTableau() res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) gridlig% = 0 end_if return chgnam: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 key1$ = string$(20," ") res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),1,adr(key1$)) s$ = Trim$(text$(eNom%)) key2$ = Left$(s$+String$(20," "),20) res% = dll_call5("ReplaceIsamKey",IsamID%,1,nrec%,adr(key1$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "" res% = dll_call6("FillIsamField",IsamID%,1,0,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,1,trim$(key2$) AfficherTableau() else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if return
chgid: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Trim$(text$(eID%)) key2$ = Right$(String$(8,"²")+s$,8) res% = dll_call5("ReplaceIsamKey",IsamID%,2,nrec%,adr(key$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,2,trim$(text$(eID%)) else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if
return
chgadr: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Left$(Trim$(text$(eAdresse%))+string$(40," "),40) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(data$),adr(s$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) res% = dll_call0("GetIsamOk") if res%=0 grid_write grid%,gridlig%,3,trim$(s$) else res% = dll_call0("GetIsamError") message "Erreur en écriture: "+str$(res%) end_if else res% = dll_call0("GetIsamError") message "Erreur en lecture: "+str$(res%) end_if return sub CreateIdentifier() dim_local n%, i%, def$ n% = dll_call0("GetIsamIdentifierSize") Isam$ = string$(n%," ") IsamID% = dll_call1("CreateIsamIdentifier",adr(Isam$)) exit_sub for i%=0 to 3 poke adr(IsamID%)+i%,peek(adr(Isam$+i%)) next i% for i%=0 to n%-1 poke IsamID%+i%,0 next i% end_sub
sub InitContext() dim_local def$ def$ = "3,20,8,40" 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%) end_if def$ = "1,0,1" : ' clé 1: champ 1 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é 1: "+str$(err%) end_if def$ = "2,1,2" : ' clé 2: champ 2 res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' interdire doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition d clé 2: "+str$(err%) end_if end_sub
sub AfficherEtat() res% = dll_call1("GetIsamRecordLength",IsamID%) caption aRecLen%,str$(res%) RecLen% = res% res% = dll_call1("GetIsamFieldCount",IsamID%) caption aNFields%,str$(res%) res% = dll_call1("GetIsamKeyCount",IsamID%) caption aNKeys%,str$(res%) res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) end_sub
sub EffacerTableau() dim_local l%, c% l% = 1 while l%<500 l% = l% + 1 if trim$(grid_read$(grid%,l%,1))="" then exit_while grid_write grid%,l%,1,"" grid_write grid%,l%,2,"" grid_write grid%,l%,3,"" end_while text eNom%,"" text eID%,"" text eAdresse%,"" end_sub
sub AfficherTableau() dim_local r%, ref%, key$, data$, field$, fill$ EffacerTableau() r% = 2 ref% = 0 if inverser%=1 key$ = string$(20,chr$(255)) else key$ = string$(20," ") end_if data$ = string$(RecLen%," ") if inverser%=1 res% = dll_call3("ResetIsamKey",IsamID%,1,1) else res% = dll_call3("ResetIsamKey",IsamID%,1,0) end_if while dll_call0("GetIsamOk")=0 if inverser%=1 res% = dll_call4("ReadPreviousIsamRecord",IsamID%,adr(data$),1,adr(key$)) else res% = dll_call4("ReadNextIsamRecord",IsamID%,adr(data$),1,adr(key$)) end_if res% = dll_call0("GetIsamOk") if res%=0 if Left$(Key$,1)="²" else field$ = String$(20," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,1,adr(data$),adr(field$),adr(fill$)) key$ = field$ grid_write grid%,r%,1,trim$(field$)
field$ = String$(8," ") fill$ = "²" res% = dll_call5("ExtractIsamField",IsamID%,2,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,2,trim$(field$)
field$ = String$(40," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,3,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,3,trim$(field$)
r% = r% + 1 if r%>500 then exit_while end_if else res% = dll_call0("GetIsamError") if (res%<>10250) and (res%<>10260) then message "IsamError="+s$tr(res%) exit_while end_if end_while end_sub
| |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Isam Ven 12 Juil 2019 - 17:58 | |
| Bonjour Klaus
Merci pour le programme de test pour ISAM.
Mais le programme plante dés que j'essaie de creer le fichier
"Le programme a cessé de fonctionner"
Merci | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Ven 12 Juil 2019 - 18:26 | |
| Ca marchera mieux comme ceci: - Code:
-
' test_ISAM.bas
label close0 label crefic, opnfic, clsfic, copfic, envers, choix label addrec, delrec, chgnam, chgid, chgadr
dim res%, txtversion$, no%, n%, err%, s$, sr$, sf$, inverser%, lg%, f$ dim data$, key$, nrec%, key1$, key2$
dim dll$ : dll$ = "KGF.dll" dim FName$ : FName$ = "TestISAM"
dim Isam$, IsamID%, RecLen%
dim aNRec%, aDefSiz%, aNKeys%, aNFields%, aRecLen%, Grid%, envers%, gridlig% dim eNom%, eID%, eAdresse%
full_space 0 : on_close 0,close0 no% = no% + 1 : button no% : top no%,40 : left no%, 20 : caption no%,"Créer fichier" : on_click no%,crefic no% = no% + 1 : button no% : top no%,40 : left no%,120 : caption no%,"Ouvrir fichier" : on_click no%,opnfic no% = no% + 1 : button no% : top no%,40 : left no%,220 : caption no%,"Fermer fichier" : on_click no%,clsfic no% = no% + 1 : button no% : top no%,70 : left no%, 20 : caption no%,"Copier fichier" : on_click no%,copfic
no% = no% + 1 : alpha no% : top no%, 40 : left no%,400 : caption no%,"Enregistrements:" no% = no% + 1 : alpha no% : top no%, 10 : left no%,600 : caption no%,"Taille descripteur:" no% = no% + 1 : alpha no% : top no%, 40 : left no%,600 : caption no%,"Nombre de clés:" no% = no% + 1 : alpha no% : top no%, 70 : left no%,600 : caption no%,"Nombre de champs:" no% = no% + 1 : alpha no% : top no%,100 : left no%,600 : caption no%,"Longueur enregistrement:"
no% = no% + 1 : alpha no% : top no%, 35 : left no%,500 : caption no%,"0" font_bold no% : font_size no%,12 aNRec% = no% no% = no% + 1 : alpha no% : top no%, 5 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aDefSiz% = no% no% = no% + 1 : alpha no% : top no%, 35 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNKeys% = no% no% = no% + 1 : alpha no% : top no%, 65 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNFields% = no% no% = no% + 1 : alpha no% : top no%, 95 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aRecLen% = no%
no% = no% + 1 : check no% : top no%,120 : left no%, 20 : caption no%,"Ordre inverse" envers% = no% : on_click no%,envers no% = no% + 1 : grid no% : top no%,150 : left no%, 20 : width no%,776 : height no%,255 grid% = no% : on_click no%,choix grid_row no%,500 : grid_column no%,3 : grid_column_fixed grid%,0.01 grid_one_column_width no%,1,200 grid_one_column_width no%,2,50 grid_one_column_width no%,3,500 grid_write no%,1,1,"Nom" : grid_write no%,1,2,"ID" : grid_write no%,1,3,"Adresse"
no% = no% + 1 : alpha no% : top no%,430 : left no%, 20 : caption no%,"Nom:" no% = no% + 1 : alpha no% : top no%,430 : left no%,230 : caption no%,"ID:" no% = no% + 1 : alpha no% : top no%,430 : left no%,280 : caption no%,"Adresse:" no% = no% + 1 : edit no% : top no%,460 : left no%, 20 : width no%,200 eNom% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,230 : width no%,40 eID% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,280 : width no%,500 eAdresse% = no%
no% = no% + 1 : button no% : top no%,490 : left no%,20 : caption no%,"Ajouter" : on_click no%,addrec no% = no% + 1 : button no% : top no%,490 : left no%,120 : caption no%,"Supprimer" : on_click no%,delrec no% = no% + 1 : button no% : top no%,490 : left no%,280 : width no%,120 : caption no%,"Changer nom" : on_click no%,chgnam no% = no% + 1 : button no% : top no%,490 : left no%,410 : width no%,120 : caption no%,"Changer ID" : on_click no%,chgid no% = no% + 1 : button no% : top no%,490 : left no%,540 : width no%,120 : caption no%,"Changer adresse" : on_click no%,chgadr
dll_on dll$
txtversion$ = string$(25," ") res% = dll_call1("GetIsamVersion",adr(txtversion$)) caption 0,"Test ISAM (B-Tree) - "+txtversion$ n% = dll_call0("GetIsamIdentifierSize") caption aDefSiz%,str$(n%)
res% = dll_call0("InitIsam")
end
close0: if IsamID%<>0 then res% = dll_call1("CloseIsamFile",IsamID%) res% = dll_call0("FreeIsam") return
crefic: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if res% = dll_call1("IsamFileExists",adr(FName$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+" existe déjà. Remplacer ?")<>1 then return end_if CreateIdentifier() InitContext() res% = dll_call0("GetIsamOk") if res%<0 then return
res% = dll_call2("CreateIsamFile",IsamID%,adr(FName$)) if res%<0 err% = dll_call0("GetIsamError") 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%) return end_if AfficherEtat() gridlig% = 0 return opnfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if CreateIdentifier() res% = dll_call2("OpenIsamFile",IsamID%,adr(FName$)) if res%<0 res% = dll_call0("GetIsamError") message "Erreur en ouverture: "+str$(res%) return end_if AfficherEtat() AfficherTableau() gridlig% = 0 return
clsfic: res% = dll_call1("CloseIsamFile",IsamID%) caption aRecLen%,"0" caption aNFields%,"0" caption aNKeys%,"0" caption aNRec%,"0" EffacerTableau() gridlig% = 0 return
copfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call0("IsamFileIsOpen") if res%=0 message "Le fichier est actuellement ouvert !" return end_if f$ = FName$ + "_copy" res% = dll_call1("IsamFileExists",adr(f$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+"_copy existe déjà. Remplacer ?")<>1 then return file_delete FName$+"_copy.DAT" file_delete FName$+"_copy.IX" end_if CreateIdentifier() res% = dll_call2("CopyIsamFile",IsamID%,adr(FName$)) res% = dll_call1("CloseIsamFile",IsamID%) message "Le fichier est recopié sous "+FName$+"_copy.DAT et "+FName$+"_copy.IX" return envers: inverser% = checked(envers%) AfficherTableau() return choix: lg% = grid_y_to_row(grid%,mouse_y_left_down(grid%)) if trim$(grid_read$(grid%,lg%,1))="" then return gridlig% = lg% text eNom%,grid_read$(grid%,lg%,1) text eID%,grid_read$(grid%,lg%,2) text eAdresse%,grid_read$(grid%,lg%,3) return addrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if sr$ = string$(RecLen%,"*") : ' construire la chaîne de caractères représentant l'enregistrement
s$ = trim$(text$(eNom%)) if s$="" message "Le nom manque" return end_if sf$ = " " res% = dll_call6("FillIsamField",IsamID%,1,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 1
s$ = trim$(text$(eID%)) if s$="" message "L'identifiant manque" return end_if sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(sr$),adr(s$),adr(sf$)) : ' champ 2
s$ = trim$(text$(eAdresse%)) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 3
res% = dll_call2("AddIsamRecord",IsamID%,adr(sr$)) : ' ajout dans le fichier ISAM if res%<0 err% = dll_call0("GetIsamError") message "Erreur en création "+str$(res%)+": "+str$(err%) return end_if res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) AfficherTableau() return delrec: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),2,adr(key$)) if message_confirmation_yes_no("Vraiment supprimer "+trim$(grid_read$(grid%,gridlig%,1))+" ?")<>1 then return res% = dll_call3("DeleteIsamRecord",IsamID%,adr(data$),nrec%) AfficherTableau() res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) gridlig% = 0 end_if return chgnam: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 key1$ = string$(20," ") res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),1,adr(key1$)) s$ = Trim$(text$(eNom%)) key2$ = Left$(s$+String$(20," "),20) res% = dll_call5("ReplaceIsamKey",IsamID%,1,nrec%,adr(key1$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "" res% = dll_call6("FillIsamField",IsamID%,1,0,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,1,trim$(key2$) AfficherTableau() else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if return
chgid: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Trim$(text$(eID%)) key2$ = Right$(String$(8,"²")+s$,8) res% = dll_call5("ReplaceIsamKey",IsamID%,2,nrec%,adr(key$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,2,trim$(text$(eID%)) else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if
return
chgadr: res% = dll_call0("IsamFileIsOpen") if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Left$(Trim$(text$(eAdresse%))+string$(40," "),40) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(data$),adr(s$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) res% = dll_call0("GetIsamOk") if res%=0 grid_write grid%,gridlig%,3,trim$(s$) else res% = dll_call0("GetIsamError") message "Erreur en écriture: "+str$(res%) end_if else res% = dll_call0("GetIsamError") message "Erreur en lecture: "+str$(res%) end_if return sub CreateIdentifier() dim_local n%, i%, def$ n% = dll_call0("GetIsamIdentifierSize") Isam$ = string$(n%," ") IsamID% = dll_call1("CreateIsamIdentifier",adr(Isam$)) exit_sub for i%=0 to 3 poke adr(IsamID%)+i%,peek(adr(Isam$+i%)) next i% for i%=0 to n%-1 poke IsamID%+i%,0 next i% end_sub
sub InitContext() dim_local def$ def$ = "3,20,8,40" 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%) end_if def$ = "1,0,1" : ' clé 1: champ 1 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é 1: "+str$(err%) end_if def$ = "2,1,2" : ' clé 2: champ 2 res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' interdire doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition d clé 2: "+str$(err%) end_if end_sub
sub AfficherEtat() res% = dll_call1("GetIsamRecordLength",IsamID%) caption aRecLen%,str$(res%) RecLen% = res% res% = dll_call1("GetIsamFieldCount",IsamID%) caption aNFields%,str$(res%) res% = dll_call1("GetIsamKeyCount",IsamID%) caption aNKeys%,str$(res%) res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) end_sub
sub EffacerTableau() dim_local l%, c% l% = 1 while l%<500 l% = l% + 1 if trim$(grid_read$(grid%,l%,1))="" then exit_while grid_write grid%,l%,1,"" grid_write grid%,l%,2,"" grid_write grid%,l%,3,"" end_while text eNom%,"" text eID%,"" text eAdresse%,"" end_sub
sub AfficherTableau() dim_local r%, ref%, key$, data$, field$, fill$ EffacerTableau() r% = 2 ref% = 0 if inverser%=1 key$ = string$(20,chr$(255)) else key$ = string$(20," ") end_if data$ = string$(RecLen%," ") if inverser%=1 res% = dll_call3("ResetIsamKey",IsamID%,1,1) else res% = dll_call3("ResetIsamKey",IsamID%,1,0) end_if while dll_call0("GetIsamOk")=0 if inverser%=1 res% = dll_call4("ReadPreviousIsamRecord",IsamID%,adr(data$),1,adr(key$)) else res% = dll_call4("ReadNextIsamRecord",IsamID%,adr(data$),1,adr(key$)) end_if res% = dll_call0("GetIsamOk") if res%=0 if Left$(Key$,1)="²" else field$ = String$(20," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,1,adr(data$),adr(field$),adr(fill$)) key$ = field$ grid_write grid%,r%,1,trim$(field$)
field$ = String$(8," ") fill$ = "²" res% = dll_call5("ExtractIsamField",IsamID%,2,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,2,trim$(field$)
field$ = String$(40," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,3,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,3,trim$(field$)
r% = r% + 1 if r%>500 then exit_while end_if else res% = dll_call0("GetIsamError") if (res%<>10250) and (res%<>10260) then message "IsamError="+str$(res%) exit_while end_if end_while end_sub
En ligne 94, il manquait le paramètre pour la fonction. Tel que c'est, ça devrait marcher. | |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Isam toujours Isam Sam 13 Juil 2019 - 18:08 | |
| Bonjour Klaus
Merci pour la modif, mais le programme plante dés que j'essaie de faire un ajout.
Je pense que c'est la ligne
192 res% = dll_call0("IsamFileIsOpen")
qui plante
Désolé de te mettre à contribution
Merci
Bonne soirée | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Dim 14 Juil 2019 - 0:10 | |
| Exact. Et pas seulement à cet endroit. Voici la version corrigée: - Code:
-
' test_ISAM.bas
label close0 label crefic, opnfic, clsfic, copfic, envers, choix label addrec, delrec, chgnam, chgid, chgadr
dim res%, txtversion$, no%, n%, err%, s$, sr$, sf$, inverser%, lg%, f$ dim data$, key$, nrec%, key1$, key2$
dim dll$ : dll$ = "KGF.dll" dim FName$ : FName$ = "TestISAM"
dim Isam$, IsamID%, RecLen%
dim aNRec%, aDefSiz%, aNKeys%, aNFields%, aRecLen%, Grid%, envers%, gridlig% dim eNom%, eID%, eAdresse%
full_space 0 : on_close 0,close0 no% = no% + 1 : button no% : top no%,40 : left no%, 20 : caption no%,"Créer fichier" : on_click no%,crefic no% = no% + 1 : button no% : top no%,40 : left no%,120 : caption no%,"Ouvrir fichier" : on_click no%,opnfic no% = no% + 1 : button no% : top no%,40 : left no%,220 : caption no%,"Fermer fichier" : on_click no%,clsfic no% = no% + 1 : button no% : top no%,70 : left no%, 20 : caption no%,"Copier fichier" : on_click no%,copfic
no% = no% + 1 : alpha no% : top no%, 40 : left no%,400 : caption no%,"Enregistrements:" no% = no% + 1 : alpha no% : top no%, 10 : left no%,600 : caption no%,"Taille descripteur:" no% = no% + 1 : alpha no% : top no%, 40 : left no%,600 : caption no%,"Nombre de clés:" no% = no% + 1 : alpha no% : top no%, 70 : left no%,600 : caption no%,"Nombre de champs:" no% = no% + 1 : alpha no% : top no%,100 : left no%,600 : caption no%,"Longueur enregistrement:"
no% = no% + 1 : alpha no% : top no%, 35 : left no%,500 : caption no%,"0" font_bold no% : font_size no%,12 aNRec% = no% no% = no% + 1 : alpha no% : top no%, 5 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aDefSiz% = no% no% = no% + 1 : alpha no% : top no%, 35 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNKeys% = no% no% = no% + 1 : alpha no% : top no%, 65 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aNFields% = no% no% = no% + 1 : alpha no% : top no%, 95 : left no%,750 : caption no%,"0" font_bold no% : font_size no%,12 aRecLen% = no%
no% = no% + 1 : check no% : top no%,120 : left no%, 20 : caption no%,"Ordre inverse" envers% = no% : on_click no%,envers no% = no% + 1 : grid no% : top no%,150 : left no%, 20 : width no%,776 : height no%,255 grid% = no% : on_click no%,choix grid_row no%,500 : grid_column no%,3 : grid_column_fixed grid%,0.01 grid_one_column_width no%,1,200 grid_one_column_width no%,2,50 grid_one_column_width no%,3,500 grid_write no%,1,1,"Nom" : grid_write no%,1,2,"ID" : grid_write no%,1,3,"Adresse"
no% = no% + 1 : alpha no% : top no%,430 : left no%, 20 : caption no%,"Nom:" no% = no% + 1 : alpha no% : top no%,430 : left no%,230 : caption no%,"ID:" no% = no% + 1 : alpha no% : top no%,430 : left no%,280 : caption no%,"Adresse:" no% = no% + 1 : edit no% : top no%,460 : left no%, 20 : width no%,200 eNom% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,230 : width no%,40 eID% = no% no% = no% + 1 : edit no% : top no%,460 : left no%,280 : width no%,500 eAdresse% = no%
no% = no% + 1 : button no% : top no%,490 : left no%,20 : caption no%,"Ajouter" : on_click no%,addrec no% = no% + 1 : button no% : top no%,490 : left no%,120 : caption no%,"Supprimer" : on_click no%,delrec no% = no% + 1 : button no% : top no%,490 : left no%,280 : width no%,120 : caption no%,"Changer nom" : on_click no%,chgnam no% = no% + 1 : button no% : top no%,490 : left no%,410 : width no%,120 : caption no%,"Changer ID" : on_click no%,chgid no% = no% + 1 : button no% : top no%,490 : left no%,540 : width no%,120 : caption no%,"Changer adresse" : on_click no%,chgadr
dll_on dll$
txtversion$ = string$(25," ") res% = dll_call1("GetIsamVersion",adr(txtversion$)) caption 0,"Test ISAM (B-Tree) - "+txtversion$ n% = dll_call0("GetIsamIdentifierSize") caption aDefSiz%,str$(n%)
res% = dll_call0("InitIsam")
end
close0: if IsamID%<>0 then res% = dll_call1("CloseIsamFile",IsamID%) res% = dll_call0("FreeIsam") return
crefic: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if res% = dll_call1("IsamFileExists",adr(FName$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+" existe déjà. Remplacer ?")<>1 then return end_if CreateIdentifier() InitContext() res% = dll_call0("GetIsamOk") if res%<0 then return
res% = dll_call2("CreateIsamFile",IsamID%,adr(FName$)) if res%<0 err% = dll_call0("GetIsamError") 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%) return end_if AfficherEtat() gridlig% = 0 return opnfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if CreateIdentifier() res% = dll_call2("OpenIsamFile",IsamID%,adr(FName$)) if res%<0 res% = dll_call0("GetIsamError") message "Erreur en ouverture: "+str$(res%) return end_if AfficherEtat() AfficherTableau() gridlig% = 0 return
clsfic: res% = dll_call1("CloseIsamFile",IsamID%) caption aRecLen%,"0" caption aNFields%,"0" caption aNKeys%,"0" caption aNRec%,"0" EffacerTableau() gridlig% = 0 return
copfic: res% = dll_call1("IsamFileExists",adr(FName$)) if res%<0 message "Le fichier "+FName$+" n'existe pas" return end_if res% = dll_call1("IsamFileIsOpen",IsamID%) if res%=0 message "Le fichier est actuellement ouvert !" return end_if f$ = FName$ + "_copy" res% = dll_call1("IsamFileExists",adr(f$)) if res%=0 if message_confirmation_yes_no("Le fichier "+FName$+"_copy existe déjà. Remplacer ?")<>1 then return file_delete FName$+"_copy.DAT" file_delete FName$+"_copy.IX" end_if CreateIdentifier() res% = dll_call2("CopyIsamFile",IsamID%,adr(FName$)) res% = dll_call1("CloseIsamFile",IsamID%) message "Le fichier est recopié sous "+FName$+"_copy.DAT et "+FName$+"_copy.IX" return envers: inverser% = checked(envers%) AfficherTableau() return choix: lg% = grid_y_to_row(grid%,mouse_y_left_down(grid%)) if trim$(grid_read$(grid%,lg%,1))="" then return gridlig% = lg% text eNom%,grid_read$(grid%,lg%,1) text eID%,grid_read$(grid%,lg%,2) text eAdresse%,grid_read$(grid%,lg%,3) return addrec: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if sr$ = string$(RecLen%,"*") : ' construire la chaîne de caractères représentant l'enregistrement
s$ = trim$(text$(eNom%)) if s$="" message "Le nom manque" return end_if sf$ = " " res% = dll_call6("FillIsamField",IsamID%,1,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 1
s$ = trim$(text$(eID%)) if s$="" message "L'identifiant manque" return end_if sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(sr$),adr(s$),adr(sf$)) : ' champ 2
s$ = trim$(text$(eAdresse%)) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(sr$),adr(s$),adr(sf$)) : ' champ 3
res% = dll_call2("AddIsamRecord",IsamID%,adr(sr$)) : ' ajout dans le fichier ISAM if res%<0 err% = dll_call0("GetIsamError") message "Erreur en création "+str$(res%)+": "+str$(err%) return end_if res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) AfficherTableau() return delrec: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),2,adr(key$)) if message_confirmation_yes_no("Vraiment supprimer "+trim$(grid_read$(grid%,gridlig%,1))+" ?")<>1 then return res% = dll_call3("DeleteIsamRecord",IsamID%,adr(data$),nrec%) AfficherTableau() res% = dll_call1("GetIsamRecordCount",IsamID%) caption aNRec%,str$(res%) gridlig% = 0 end_if return chgnam: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 key1$ = string$(20," ") res% = dll_call4("CreateIsamKey",IsamID%,adr(data$),1,adr(key1$)) s$ = Trim$(text$(eNom%)) key2$ = Left$(s$+String$(20," "),20) res% = dll_call5("ReplaceIsamKey",IsamID%,1,nrec%,adr(key1$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "" res% = dll_call6("FillIsamField",IsamID%,1,0,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,1,trim$(key2$) AfficherTableau() else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if return
chgid: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Trim$(text$(eID%)) key2$ = Right$(String$(8,"²")+s$,8) res% = dll_call5("ReplaceIsamKey",IsamID%,2,nrec%,adr(key$),adr(key2$)) res% = dll_call0("GetIsamOk") if res%=0 sf$ = "²" res% = dll_call6("FillIsamField",IsamID%,2,1,adr(data$),adr(key2$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) grid_write grid%,gridlig%,2,trim$(text$(eID%)) else res% = dll_call0("GetIsamError") if res%=10230 message "Mise à jour impossible - double clé" else message "Erreur en mise à jour: "+str$(res%) end_if end_if end_if
return
chgadr: res% = dll_call1("IsamFileIsOpen",IsamID%) if res%<0 message "Le fichier n'est actuellement pas ouvert !" return end_if if gridlig%=0 message "Aucune ligne n'est sélectionnée." return end_if data$ = string$(reclen%," ") key$ = right$(string$(8,"²")+trim$(grid_read$(grid%,gridlig%,2)),8) nrec% = dll_call4("ReadIsamRecordByKey",IsamID%,adr(data$),2,adr(key$)) res% = dll_call0("GetIsamOk") if res%=0 s$ = Left$(Trim$(text$(eAdresse%))+string$(40," "),40) sf$ = " " res% = dll_call6("FillIsamField",IsamID%,3,0,adr(data$),adr(s$),adr(sf$)) res% = dll_call3("UpdateIsamRecord",IsamID%,adr(data$),nrec%) res% = dll_call0("GetIsamOk") if res%=0 grid_write grid%,gridlig%,3,trim$(s$) else res% = dll_call0("GetIsamError") message "Erreur en écriture: "+str$(res%) end_if else res% = dll_call0("GetIsamError") message "Erreur en lecture: "+str$(res%) end_if return sub CreateIdentifier() dim_local n%, i%, def$ n% = dll_call0("GetIsamIdentifierSize") Isam$ = string$(n%," ") IsamID% = dll_call1("CreateIsamIdentifier",adr(Isam$)) exit_sub for i%=0 to 3 poke adr(IsamID%)+i%,peek(adr(Isam$+i%)) next i% for i%=0 to n%-1 poke IsamID%+i%,0 next i% end_sub
sub InitContext() dim_local def$ def$ = "3,20,8,40" 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%) end_if def$ = "1,0,1" : ' clé 1: champ 1 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é 1: "+str$(err%) end_if def$ = "2,1,2" : ' clé 2: champ 2 res% = dll_call2("SetIsamKeyFields",IsamID%,adr(def$)) : ' interdire doublons res% = dll_call0("GetIsamOk") if res%<0 res% = dll_call0("GetIsamError") message "Erreur en définition d clé 2: "+str$(err%) end_if end_sub
sub AfficherEtat() res% = dll_call1("GetIsamRecordLength",IsamID%) caption aRecLen%,str$(res%) RecLen% = res% res% = dll_call1("GetIsamFieldCount",IsamID%) caption aNFields%,str$(res%) res% = dll_call1("GetIsamKeyCount",IsamID%) caption aNKeys%,str$(res%) res% = res% - 1 - 2 : ' déduire la définition des champs et la définition des deux clés caption aNRec%,str$(res%) end_sub
sub EffacerTableau() dim_local l%, c% l% = 1 while l%<500 l% = l% + 1 if trim$(grid_read$(grid%,l%,1))="" then exit_while grid_write grid%,l%,1,"" grid_write grid%,l%,2,"" grid_write grid%,l%,3,"" end_while text eNom%,"" text eID%,"" text eAdresse%,"" end_sub
sub AfficherTableau() dim_local r%, ref%, key$, data$, field$, fill$ EffacerTableau() r% = 2 ref% = 0 if inverser%=1 key$ = string$(20,chr$(255)) else key$ = string$(20," ") end_if data$ = string$(RecLen%," ") if inverser%=1 res% = dll_call3("ResetIsamKey",IsamID%,1,1) else res% = dll_call3("ResetIsamKey",IsamID%,1,0) end_if while dll_call0("GetIsamOk")=0 if inverser%=1 res% = dll_call4("ReadPreviousIsamRecord",IsamID%,adr(data$),1,adr(key$)) else res% = dll_call4("ReadNextIsamRecord",IsamID%,adr(data$),1,adr(key$)) end_if res% = dll_call0("GetIsamOk") if res%=0 if Left$(Key$,1)="²" else field$ = String$(20," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,1,adr(data$),adr(field$),adr(fill$)) key$ = field$ grid_write grid%,r%,1,trim$(field$)
field$ = String$(8," ") fill$ = "²" res% = dll_call5("ExtractIsamField",IsamID%,2,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,2,trim$(field$)
field$ = String$(40," ") fill$ = " " res% = dll_call5("ExtractIsamField",IsamID%,3,adr(data$),adr(field$),adr(fill$)) grid_write grid%,r%,3,trim$(field$)
r% = r% + 1 if r%>500 then exit_while end_if else res% = dll_call0("GetIsamError") if (res%<>10250) and (res%<>10260) then message "IsamError="+str$(res%) exit_while end_if end_while end_sub
| |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Isam toujours Isam Lun 15 Juil 2019 - 18:13 | |
| Bonjour Klaus
Toujours au sujet du test Isam.
J'ai un problème au niveau de l'affichage dans le grid après avoir saisi la 1ere ligne
Le grid se rempli entièrement avec le mème enregistrement.
Merci par avance . | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Lun 15 Juil 2019 - 18:38 | |
| Ah, je vois.. je vais regarder ça | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: ISAM toujours ISAM Mar 16 Juil 2019 - 1:58 | |
| C'est plus compliqué que je ne croyais - je n'avais pas encore adapté ce module à la nouvelle définition de passage de paramètres de type string vers une DLL. C'est en cours et ça avance. Patience... | |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Re: ISAM toujours ISAM Sam 31 Juil 2021 - 19:30 | |
| Bonjour à tous
J'ouvre une très ancienne discussion sur ISAM.
Cela va rappeler des souvenirs à certains.
Je voudrais savoir si un d'entre vous se sert d'ISAM.
Si oui, pouvez vous me donner un petit exemple fonctionnel, pour voir ce que je pourrais faire avec.
Sinon existe t'il d'autres bases de données en Panoramic
Merci pour votre aide.
Bonne soirée | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 31 Juil 2021 - 19:49 | |
| C'est un peu loin tout çà. Pour les autres bases, tout dépend de ce que tu veux faire et du nombre d'enregistrements. Pour une petite base simple tu peux te servir de fichiers csv dès que tu compliques le truc il y a ISAM et Klaus en avait fait une autre aussi je crois mais je ne suis pas sûr. ISAM permet des recherches assez rapide dans la base et tout est très documenté dans l'aide de KGF. J'en profite pour faire un petit coucou à nôtre ami Klaus si il nous lit. | |
| | | lepetitmarocain
Nombre de messages : 341 Age : 82 Localisation : Région Parisienne (à mon grand désespoir) Date d'inscription : 04/07/2018
| Sujet: Re: ISAM toujours ISAM Dim 21 Jan 2024 - 19:24 | |
| Bonsoir à tous.
Je voudrais faire un programme en utilisant ISAM , et j'aimerais m’inspirer d'un petit programme existant.
Si vous avez cela, pouvez SVP vous le mettre sur le Forum
Remerciements par avance
Bonne soirée | |
| | | Contenu sponsorisé
| Sujet: Re: ISAM toujours ISAM | |
| |
| | | | ISAM toujours ISAM | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |