FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» COMPILATEUR V 0.9 beta 8 du 18 aout 2017
par Pedro Alvarez Aujourd'hui à 7:10

» Pb 17 (en analyse): ITEM_SELECT ne fonctionne pas
par Jack Jeu 17 Aoû 2017 - 19:26

» Compilateur FBPano
par Mike Jeu 17 Aoû 2017 - 13:52

» un nouveau editeur panobasic
par Jean Claude Jeu 17 Aoû 2017 - 10:18

» Le compilateur.
par Pedro Alvarez Jeu 17 Aoû 2017 - 8:36

» Pb 16 (en analyse): ON_CLOSE plante à l'exécution
par Jack Mer 16 Aoû 2017 - 20:00

» Pb 15 (en analyse): TIMER_ON plante à l'exécution
par Jack Mer 16 Aoû 2017 - 19:58

» KGF_dll - nouvelles versions
par Yannick Dim 13 Aoû 2017 - 17:35

» probleme d'outil
par Yannick Dim 13 Aoû 2017 - 17:32

» Carte de France des régions
par Yannick Sam 12 Aoû 2017 - 21:33

» Pb 14 (en analyse): PRINT_LOCATE plante à l'exécution
par Jack Ven 11 Aoû 2017 - 22:37

» Petit avertissement [Mots réservés]
par papydall Ven 11 Aoû 2017 - 13:45

» Distances sur plan
par JL35 Jeu 10 Aoû 2017 - 21:29

» Tracé : Triangle, Carrée, Dents de scie, Sinusoïde redressée
par papydall Jeu 10 Aoû 2017 - 14:52

» Troncature dans une image
par JL35 Mer 9 Aoû 2017 - 13:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Août 2017
LunMarMerJeuVenSamDim
 123456
78910111213
14151617181920
21222324252627
28293031   
CalendrierCalendrier

Partagez | 
 

 ISAM vs BDR database

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : Précédent  1, 2, 3
AuteurMessage
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Mer 29 Juil 2015 - 1: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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 1: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 Laughing )
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)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Mer 29 Juil 2015 - 1: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 2:25

J' ai mis le zip à jour sur mon webdav.
Je poursuit mon apprentissage. Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 2: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 Mer 29 Juil 2015 - 2:38, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Mer 29 Juil 2015 - 2: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 Mer 29 Juil 2015 - 2:41, édité 1 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 2: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... Embarassed
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 3:10

Tu vas pas me croire Klaus...
...j' ai réussi à récupérer ma fiche.
Laughing
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Mer 29 Juil 2015 - 4:34

Bravo ! Tu progresses !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 13: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  Laughing.
La procédure pour la fiche suivante me donne la précédente et inversement... Laughing

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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Mer 29 Juil 2015 - 17: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 20:16

Je me disais aussi... Laughing
Je vais corriger cette horreur....
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 23:15

erreur
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Mer 29 Juil 2015 - 23: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...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 30 Juil 2015 - 0:19

J' ai mis le zip à jour avec un tas de message pour voir ce qu' il se passe.
Jette un oeil, c' est.... affraid
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Jeu 30 Juil 2015 - 0: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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 30 Juil 2015 - 3: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. Wink
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Jeu 30 Juil 2015 - 9:35

J'ai pris le ZIP et je vais regarder...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Jeu 30 Juil 2015 - 13: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 30 Juil 2015 - 13:56

Merci Klaus.

Entre moi et la dll, 2 bugs pour le prix d' 1  Laughing.
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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Jeu 30 Juil 2015 - 14: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Yannick

avatar

Nombre de messages : 7968
Age : 46
Localisation : Bretagne
Date d'inscription : 15/02/2010

MessageSujet: re   Jeu 30 Juil 2015 - 14: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 Wink)
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 10062
Age : 68
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: ISAM vs BDR database   Jeu 30 Juil 2015 - 15: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: ISAM vs BDR database   

Revenir en haut Aller en bas
 
ISAM vs BDR database
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 3 sur 3Aller à la page : Précédent  1, 2, 3
 Sujets similaires
-
» probleme maj " database for fm traffic providers " sur dezl 560lt
» Plus de réception trafic sur 1490
» Base de données SQL + serveur FTP pour mon forum
» Mise à jour système.
» Base de données de type ISAM par Excel sous PANORAMIC

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC 32 bits :: Présentation et bavardage-
Sauter vers: