logiciel de gestion

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

logiciel de gestion

Message 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 ;)
Anonyme

Message 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()

@++
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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à @+
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message 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
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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à
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Message 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
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Message 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 ...
ImageImage
poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Je plussoie le SQLite par ce que c'est rudement simple... Sinon, structure dans une liste chainée, ca trace aussi.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'est quoi, le contraire de "plussoyer" :?

moinsoyer?
moinsser?
moinssir?
moinssoir?


:?: :?: :?: :?:
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message 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:
Avatar de l’utilisateur
Le psychopathe
Messages : 764
Inscription : jeu. 03/mars/2005 19:23

Message 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à :?
Répondre