Page 1 sur 2

logiciel de gestion

Publié : ven. 16/nov./2007 8:38
par Le psychopathe
Boujours
Voilà je voudrai savoir la meilleure façon de stocker les données et de pouvoir effectuer des recherches rapide et efficace.

du style : nom, emplacement, fonction, numero

Pouvoir effectuer une recherche par rapport au nom, à l'emplacement ou le reste.
voilà voilà

merci ;)

Publié : ven. 16/nov./2007 10:07
par Anonyme
salut.
  • - Tableau
    - liste chaînée
    - Tableau & structure
    - liste chaînée & Structure
    - Pointeur de mémoire alloué.

ex:

Code : Tout sélectionner

struct info
 Nom.s
 Prenom.s
 etc.x
endstruct

global newlist Donnees.info()

@++

Publié : ven. 16/nov./2007 14:26
par Le psychopathe
Merci, peux tu me donner un petit peu plus d'indices stp.
Car je suis un peu perdus dans ce genre d'application car j'ai environ 500 personnes à gerer avec par personne 6 champs minimum à renseigner.
voilà @+

Publié : ven. 16/nov./2007 14:40
par bernard13
Le psychopathe voici une base de debut



Code : Tout sélectionner

; Mes contact version 01
; écris par jbernard - copyright 2007

; Les constantes

; Fenetres
 Enumeration
  #Fenetre_main
  #Fenetre_ajouter
 EndEnumeration
 ;Gadgets
 Enumeration
  #Liste_amie
  #Bouton_nouveau
  #Bouton_sauver
  #bouton_effacer
  #bouton_info
  #cadre
  #text_pseudo
  #champ_pseudo
  #text_prenom
  #champ_prenom
  #text_age
  #champ_age
  #text_ville
  #champ_ville
  #text_mail
  #champ_mail
  #bouton_ajouter
  #bouton_annule
  #file
  #BarreEtat
 EndEnumeration
;procedure pour ajouter un ou une ami(e) à la liste
 Structure Gestion
  Pseudo.s
  Prenom.s
  Age.s
  Ville.s
  Email.s
 EndStructure
 
 Global NewList Amis.Gestion()
 Procedure.b Effacer_liste()
  ClearList(Amis())
   ProcedureReturn l
 EndProcedure   

 ; Creation de la liste chainée
 
 Procedure.b ajoute_amis()
  LastElement(Amis())
  If AddElement(Amis())
    Amis()\Pseudo=GetGadgetText(#champ_pseudo)
    Amis()\Prenom=GetGadgetText(#champ_prenom)
    Amis()\Age=GetGadgetText(#champ_age)
    Amis()\Ville=GetGadgetText(#champ_ville)
    Amis()\Email=GetGadgetText(#champ_mail)
   AddGadgetItem(#Liste_amie,-1,Amis()\pseudo+Chr(10)+Amis()\Prenom+Chr(10)+Amis()\age+Chr(10)+Amis()\ville+Chr(10)+Amis()\Email)
  Resultat = CountGadgetItems(#Liste_amie);<---------------------------- ici --------------------------
  StatusBarText(#BarreEtat, 0, "nombre de contacte: "+Str(Resultat));<---------------------------- ici --------------------------
   EndIf
  ProcedureReturn l
 EndProcedure
 
 
 ;Procedure d'effacement d'un nom de la liste
 Procedure Supprimer_nom()
  Protected i,total_item.l
  total_item=CountGadgetItems(#Liste_amie)-1
   For i=total_item To 0  Step -1
   If GetGadgetItemState(#Liste_amie,i)&#PB_ListIcon_Checked
    RemoveGadgetItem(#Liste_amie,i)
    SelectElement(Amis(),i)
    DeleteElement(Amis())
    EndIf
    Next i
  Resultat = CountGadgetItems(#Liste_amie);<---------------------------- ici --------------------------
  StatusBarText(#BarreEtat, 0, "nombre de contacte: "+Str(Resultat));<---------------------------- ici --------------------------
 EndProcedure
 
 ; procedure de sauvegarde du fichier
 Procedure sauver()
  ResetList(Amis())
  CreateFile(#file,"Contact.dat")
  ForEach Amis()
   WriteStringN(#file,Amis()\Pseudo)
   WriteStringN(#file,Amis()\Prenom)
   WriteStringN(#file,Amis()\Age)
   WriteStringN(#file,Amis()\Ville)
   WriteStringN(#file,Amis()\Email)
   Next
   CloseFile(#file)
 EndProcedure
 
 
 
 
 
 
 
 
 
 ;Procedure des fenetres
 
 ; Fenetre principale
 
 Procedure main()
 If OpenWindow(#Fenetre_main,0,0,640,350," Mes Contacts version 01-2007",#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
 If CreateGadgetList(WindowID(#Fenetre_main))
  ListIconGadget(#Liste_amie,10,50,620,280,"Pseudo :",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
   AddGadgetColumn(#Liste_amie,1,"Prénom:",100)
   AddGadgetColumn(#Liste_amie,2,"Age:",50)
   AddGadgetColumn(#Liste_amie,3,"Ville:",195)
   AddGadgetColumn(#Liste_amie,4,"Email:",200)
   ButtonGadget(#Bouton_nouveau,10,10,120,30,"Ajouter un contact")
   ButtonGadget(#Bouton_sauver,150,10,120,30,"Sauver la liste")
   ButtonGadget(#Bouton_effacer,290,10,120,30,"Effacer un contact")
   ButtonGadget(#bouton_info,435,10,120,30,"Information")
   CreateStatusBar(#BarreEtat, WindowID(#Fenetre_main))
   Resultat = CountGadgetItems(#Liste_amie)
   StatusBarText(#BarreEtat, 0, "nombre de contacte: "+Str(Resultat))

  EndIf
  EndIf
 EndProcedure
 
 ;Fenetre ajouter un ami ou une amie
 Procedure ajouter()
 If OpenWindow(#Fenetre_ajouter,0,0,320,340,"Ajouter un nouveau contact",#PB_Window_TitleBar|#PB_Window_ScreenCentered)
 If CreateGadgetList(WindowID(#Fenetre_ajouter))
  Frame3DGadget(#cadre,10,10,300,280,"")
  TextGadget(#text_pseudo,90,25,120,30,"Pseudo :",#PB_Text_Center)
  StringGadget(#champ_pseudo ,45,45,220,20,"")
  TextGadget(#text_prenom,90,75,120,30,"Prenom :",#PB_Text_Center)
  StringGadget(#champ_prenom,45,95,220,20,"")
  TextGadget(#text_age,90,125,120,30,"Age :",#PB_Text_Center)
  StringGadget(#champ_age,135,145,25,20,"",#PB_String_Numeric)
  TextGadget(#text_ville,90,175,120,30,"Ville :",#PB_Text_Center)
  StringGadget(#champ_ville,45,195,220,20,"")
  TextGadget(#text_mail,90,225,120,30,"Email :",#PB_Text_Center)
  StringGadget(#champ_mail,45,245,220,20,"")
  ButtonGadget(#bouton_ajouter,20,300,120,30,"Ajouter")
  ButtonGadget(#bouton_annule,180,300,120,30,"Annuler")
 ProcedureReturn #True
  EndIf
  EndIf
 
 
 EndProcedure
 
 
 
 ;Boucle du programme
 main()
 ;Chargement de la liste au demarrage du programme
  If OpenFile(#file,"Contact.dat")<>0
   ResetList(Amis())
   OpenFile(#file,"Contact.dat")
   While Eof(#file)=0
   If AddElement(Amis())
     Amis()\Pseudo=ReadString(#file)
     Amis()\Prenom=ReadString(#file)
     Amis()\Age=ReadString(#file)
     Amis()\Ville=ReadString(#file)
     Amis()\Email=ReadString(#file)
   AddGadgetItem(#Liste_amie,-1,Amis()\pseudo+Chr(10)+Amis()\Prenom+Chr(10)+Amis()\age+Chr(10)+Amis()\ville+Chr(10)+Amis()\Email)
   EndIf
   Wend
   CloseFile(#file)
   EndIf
 ; programation de la gestion des evenements des fenetres
 Repeat
   Select WaitWindowEvent ()
    Case #PB_Event_Gadget
     Select EventGadget()     
     Case #Bouton_nouveau:ajouter()
     Case#bouton_sauver:sauver()
     Case #bouton_effacer:Supprimer_nom()
     Case #bouton_info:MessageRequester("Information","Contact crée par Jbernard copyright 2007",#PB_MessageRequester_Ok)         
     Case #bouton_ajouter:ajoute_amis()
     CloseWindow(#Fenetre_ajouter)
     Case #bouton_annule
     CloseWindow(#Fenetre_ajouter)
     
      EndSelect
        Case #PB_Event_CloseWindow
  Select EventWindow()
   Case #Fenetre_main
   Quit=#True
   EndSelect
  EndSelect
  Until Quit
  End

Publié : ven. 16/nov./2007 14:49
par Le psychopathe
Merci j'avais déjà vu ton code mais je pensais pas faire comme cela au début.
Mais si c'est le système le plus rapide pour gêrer des données alors je l'adopte ;)
voilà voià

Publié : ven. 16/nov./2007 15:22
par Thyphoon
Et pourquoi ne pas utiliser une base de donnée Sqlite ? il existe un wrapper de la lib multiplatforme et ça te permet de faire les recherches comme tu veux en SQL dans tout les sens et c'est tres rapide. :P

Publié : ven. 16/nov./2007 16:26
par Oliv
Le psychopathe a écrit :Merci j'avais déjà vu ton code mais je pensais pas faire comme cela au début.
Mais si c'est le système le plus rapide pour gêrer des données alors je l'adopte ;)
voilà voià
C'est loin d'être le plus rapide car il utilise des listes chaines, il vaut mieux utiliser des tableaux.

Je crois que le plus rapide est de faire un tableau, avec une fonction de hachage sur les noms pour les retrouver plus vite. ( Hachage - Wikipedia )

Sinon la solution sql peut être plus rapide que les listes chaînées et plus facile que le hachage.

Publié : lun. 19/nov./2007 7:28
par Chris
Oliv a écrit :
Le psychopathe a écrit :Merci j'avais déjà vu ton code mais je pensais pas faire comme cela au début.
Mais si c'est le système le plus rapide pour gêrer des données alors je l'adopte ;)
voilà voià
C'est loin d'être le plus rapide car il utilise des listes chaines, il vaut mieux utiliser des tableaux.

Je crois que le plus rapide est de faire un tableau, avec une fonction de hachage sur les noms pour les retrouver plus vite. ( Hachage - Wikipedia )

Sinon la solution sql peut être plus rapide que les listes chaînées et plus facile que le hachage.
Tu crois que les recherches dans les listes chainées sont moins rapides?

Parce que je sais pas, mais mon petit prog de code postal utilise les listes chainées, et la fonction de recherche de Fred me paraît déjà vachement rapide, il me semble.
Et il y a quand même près de 39000 entrées, dans la liste.

Publié : lun. 19/nov./2007 10:09
par case
en même temps 500 personnes indexes c'est pas la mer a boire :)

et niveau rapidité a moins de le faire tourner sur un 486 Dx 33 ca devrais rester quand même gérable :)

moi je ferais un tableau de structures

Code : Tout sélectionner

structure personne
   nom.s
   prenom.s
   adresse.s
   telephone.s
   codepostal.s
endstructure

global dim base.personne(500)

ensuite pour les recherches je ferais une procedure de ce type

Code : Tout sélectionner

procedure find(stg$,champ)
   st=0
   repeat
   select champ
      case 1 ; nom
         if instr(personne(st)\nom,stg$,1)
            return st
         endif
      case 2 ; prenom
         if instr(personne(st)\prenom,stg$,1)
            return st
         endif
      case 3 ; adresse
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 4 ; telephone
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 5 ; code postal
         if instr(personne(st)\codepostal,stg$,1)
            return st
         endif
       endselect
       st=st+1
  until st>500
return -1 ; non trouvé
endprocedure

bien sur mon exemple ne geres pas les resultats multiples, par exemple pour trouver toute les personnes avec le meme code postal et ne renvois que la premiere trouvée

pour cela j'utiliserais un espace en memoire (de taille de la base*2 octets) pour stocker les resultats a l'aide de pokew :) terminé par une valeur du style $ffff (ce qui donnerais une base de 65634 noms indexes maximum)

ensuite il sufis de lire l'espace memoire avec peekw et d'afficher le contenu du champ correspondant a la valeur retournée :)

pour le code de cette partie je n'ai pas le temps d'y reflechir je dois aller au travail ...

Publié : lun. 19/nov./2007 10:35
par poshu
Je plussoie le SQLite par ce que c'est rudement simple... Sinon, structure dans une liste chainée, ca trace aussi.

Publié : lun. 19/nov./2007 10:49
par Chris
C'est quoi, le contraire de "plussoyer" :?

moinsoyer?
moinsser?
moinssir?
moinssoir?


:?: :?: :?: :?:

Publié : lun. 19/nov./2007 15:14
par Le psychopathe
case a écrit :en même temps 500 personnes indexes c'est pas la mer a boire :)

et niveau rapidité a moins de le faire tourner sur un 486 Dx 33 ca devrais rester quand même gérable :)

moi je ferais un tableau de structures

Code : Tout sélectionner

structure personne
   nom.s
   prenom.s
   adresse.s
   telephone.s
   codepostal.s
endstructure

global dim base.personne(500)

ensuite pour les recherches je ferais une procedure de ce type

Code : Tout sélectionner

procedure find(stg$,champ)
   st=0
   repeat
   select champ
      case 1 ; nom
         if instr(personne(st)\nom,stg$,1)
            return st
         endif
      case 2 ; prenom
         if instr(personne(st)\prenom,stg$,1)
            return st
         endif
      case 3 ; adresse
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 4 ; telephone
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 5 ; code postal
         if instr(personne(st)\codepostal,stg$,1)
            return st
         endif
       endselect
       st=st+1
  until st>500
return -1 ; non trouvé
endprocedure

bien sur mon exemple ne geres pas les resultats multiples, par exemple pour trouver toute les personnes avec le meme code postal et ne renvois que la premiere trouvée

pour cela j'utiliserais un espace en memoire (de taille de la base*2 octets) pour stocker les resultats a l'aide de pokew :) terminé par une valeur du style $ffff (ce qui donnerais une base de 65634 noms indexes maximum)

ensuite il sufis de lire l'espace memoire avec peekw et d'afficher le contenu du champ correspondant a la valeur retournée :)

pour le code de cette partie je n'ai pas le temps d'y reflechir je dois aller au travail ...
Je vais faire comme cela sachant que comme il doit y avoir au grand max 1000 noms avec derrière 5-6 colonnes donc je pense que les listes chainées suffiront. voilà thx

Publié : lun. 19/nov./2007 19:48
par Oliv
Chris a écrit : Tu crois que les recherches dans les listes chainées sont moins rapides?

Parce que je sais pas, mais mon petit prog de code postal utilise les listes chainées, et la fonction de recherche de Fred me paraît déjà vachement rapide, il me semble.
Et il y a quand même près de 39000 entrées, dans la liste.
En fait de mémoire c'est ce que l'ont m'avait dit il y a quelques temps (et PB dans les versions 3.7X). Ce n'est peut être plu vrai, mais ça me parraitrait logique vu la construction d'une liste chainée par rapport au tableau, je testerai à l'occassion. Par contre que veux tu dire par "la fonction de recherche de Fred" ?

Après c'est sur que sur 500 entrées sur les machines actuelles....je pense que ça ne change pas grand chose, mais je venais juste d'en parler avec quelqu'un mais pour beaucoup plus d'entrées et de champs, donc je vous ai dit ce à quoi il avait pensé, et à la réflexion le hachage est vraiment inutile ici :oops:

Publié : lun. 19/nov./2007 20:22
par Chris
Oliv a écrit :
Chris a écrit : Tu crois que les recherches dans les listes chainées sont moins rapides?

Parce que je sais pas, mais mon petit prog de code postal utilise les listes chainées, et la fonction de recherche de Fred me paraît déjà vachement rapide, il me semble.
Et il y a quand même près de 39000 entrées, dans la liste.
En fait de mémoire c'est ce que l'ont m'avait dit il y a quelques temps (et PB dans les versions 3.7X). Ce n'est peut être plu vrai, mais ça me parraitrait logique vu la construction d'une liste chainée par rapport au tableau, je testerai à l'occassion. Par contre que veux tu dire par "la fonction de recherche de Fred" ?

Après c'est sur que sur 500 entrées sur les machines actuelles....je pense que ça ne change pas grand chose, mais je venais juste d'en parler avec quelqu'un mais pour beaucoup plus d'entrées et de champs, donc je vous ai dit ce à quoi il avait pensé, et à la réflexion le hachage est vraiment inutile ici :oops:
Euhhh! J'm'ai gourré, c'est des fonctions de tri.

Et en plus, c'est même pas dans ce prog que je les utilise. :mrgreen:


En tout cas, c'est hyper-rapide. :wink:

Publié : jeu. 06/mars/2008 9:21
par Le psychopathe
case a écrit :

Code : Tout sélectionner

procedure find(stg$,champ)
   st=0
   repeat
   select champ
      case 1 ; nom
         if instr(personne(st)\nom,stg$,1)
            return st
         endif
      case 2 ; prenom
         if instr(personne(st)\prenom,stg$,1)
            return st
         endif
      case 3 ; adresse
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 4 ; telephone
         if instr(personne(st)\adresse,stg$,1)
            return st
         endif
      case 5 ; code postal
         if instr(personne(st)\codepostal,stg$,1)
            return st
         endif
       endselect
       st=st+1
  until st>500
return -1 ; non trouvé
endprocedure

Par contre c'est quoi ce instr ?????
Et pour sauvegarder mon tableau je dois lire toutes les colonnes et les écrires ? Si oui c'est donc possible d'écrire dans le fichier texte juste une valeure modififée au lieu de tout réécrire à chaque modification.

voilà voilà :?