Database: ==> suite du post commencé sur "Suggestion

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Database: ==> suite du post commencé sur "Suggestion

Message par Chris »

Bon, j'ai commencé de faire un fichier pour faire un "Include", ou peut-être une lib, si c'est possible.

Voilà le début de la bête :roll:

Pour l'instant, on peut créer le fichier, ajouter des champs à la fin, en inserer au milieu de la base.

J'aurais peut-être pu faire plus rapide, mais je ne sais pas comment.
Faudrait que je voie ça... :?

Bon, pour le moment, ça donne ça :

Code : Tout sélectionner

Structure CHAMPS
  Index.b
  Insertion.w
EndStructure
NewList Valeur.CHAMPS()

Declare DB_CsvInsertField(Position.b, Name.s)

Global Temp$

;- Ouverture de la base
Procedure DB_CsvOpen(Index.b, Fichier.s)      
  If ReadFile(Index,Fichier) = 0 
    CreateFile(Index,Fichier)
    CloseFile(Index)
  Else
    CloseFile(Index)
  EndIf
  If OpenFile(Index,Fichier) = 0
    MessageRequester("Erreur","Impossible d'ouvrir le fichier!!!",#PB_MessageRequester_Ok|#MB_ICONERROR)
  EndIf
EndProcedure

;- Fermeture de la base
Procedure DB_CsvClose(Index.b)
  CloseFile(Index)
EndProcedure

;- Ajout de champs à la fin de la base
Procedure DB_CsvCreateField(Position.b, Name.s)
  Field.s = Chr(34) + Name + Chr(34)                      ; on ajoute les guillemets
  FileSeek(0) : Temp$ = ReadString()                      ; lecture de la ligne des champs
  If Len(Temp$) = 0                                       ; si la longueur est à 0
    WriteString(Field)                                    ; ecrit le champ tel quel
  ElseIf Len(Temp$) > 0                                   ; sinon, si la longueur > 0
    If FindString(Temp$,Field,0) = 0                      ; et si le nom n'existe pas déjà
      If Position = -1                                    ; si "Position" = -1
        FileSeek(Len(Temp$))                              ; déplace le pointeur à la fin
        WriteString(";"+Field)                            ; écrit la valeur
      Else                                                ; sinon, si "Position" <> -1
        ; appelle la procedure d'insertion
        DB_CsvInsertField(Position, Name)
      EndIf
    EndIf
  EndIf
EndProcedure
        
;- Insertion de champs au milieu de la base
Procedure DB_CsvInsertField(Position.b, Name.s)
  Field.s = Chr(34) + Name + Chr(34) + ";"                ; on ajoute les guillemets
  FileSeek(0) : Temp$ = ReadString()                      ; lecture de la ligne des champs
;** Appel de procedure Anti Neu-Neu ****************************************************
  If Len(Temp$) = 0                                       ; Pour les neu-neu qui voudraient
    DB_CsvCreateField(Position, Name)                     ; "Inserer" un champ dans une
  EndIf                                                   ; base vide... ;o)
;**************************************************************************************
  Start = 1 : NumChamps = 0                               ; Initialise les variables
  Repeat                                                  ;
    pos = FindString(Temp$,";",Start)                     ; recherche le séparateur
    If pos > 0                                            ; si il existe
      AddElement(Valeur())                                ; on stocke les valeurs dans la liste
      Valeur()\Index = NumChamps                          ; N° du champ
      Valeur()\Insertion = pos                            ; Position
    EndIf
    NumChamps + 1 : Start = pos +1                        ;
  Until pos = 0                                           ; jusqu'à la fin
  SelectElement(Valeur(),Position -1)
  InsPoint = Valeur()\Insertion
  G_Tmp$ = Left(Temp$,InsPoint)
  R_Tmp$ = Right(Temp$,Len(Temp$) - InsPoint)
  If AllocateMemory(0,256,0)
    *Pointer = MemoryID()
    CopyMemoryString(G_Tmp$,@*Pointer)
    CopyMemoryString(Field)
    CopyMemoryString(R_Tmp$)
    Temp$ = PeekS(MemoryID())
    FileSeek(0)
    WriteString(Temp$)
    FreeMemory(0)
  EndIf
EndProcedure

;/ Commandes de test  
DB_CsvOpen(0,"Liens.csv")           ; Ouvre la base, ou en crée une
DB_CsvCreateField(-1, "Champ 0")    ; Insère 4 champs l'un à la suite de l'autre
DB_CsvCreateField(-1, "Champ 1")
DB_CsvCreateField(-1, "Champ 2")
DB_CsvCreateField(-1, "Champ 3")

; Insertion de champs : Le premier est le champ 0
DB_CsvCreateField(4, "Champ 4")     ; Insère un champ à la position 4
DB_CsvCreateField(1, "Champ 5")     ; Insère un champ à la position 1

DB_CsvClose(0)
Voilà la liste des fonctions prévues :

Code : Tout sélectionner

DB_CsvClose()                   ; Ferme le fichier
DB_CsvCreateField()             ; Crée un champ dans la base
DB_CsvInsertField()             ; Insère un champ à une position donnée
DB_CsvOpen()                    ; Ouvre une base, ou en crée une
DB_CsvDeleteField()             ; Supprime un champ
DB_CsvDeleteItem()              ; Supprime une fiche
DB_CsvFindItem()                ; Recherche une fiche
DB_CsvCountField()              ; Retourne le nombre de champs
DB_CsvGetFieldIndex()           ; Retourne l'index du champ sélectionné
DB_CsvGetFieldName()            ; Retourne le nom du champ sélectionné
DB_CsvItemCount()               ; Retourne le nombre de fiches
DB_CsvItemIndex()               ; Retourne l'index de la fiche sélectionnée
DB_CsvItemValue()               ; Retourne la valeur de la fichie (Champ/Fiche)
DB_CsvInsertItem()              ; Insère une nouvelle fiche
DB_CsvMergeItems()              ; Fusionne deux bases
DB_CsvReset()                   ; Réinitialise la base (Supprime Champs et Fiches)
DB_CsvResetItems()              ; Supprime toutes les fiches
DB_CsvResetSelectedItem()       ; Vide la fiche, sans l'effacer
DB_CsvSetFieldName()            ; Change le nom d'un champ
DB_CsvSetItemValue()            ; Inscrit une valeur dans une fiche (Ligne/Colonne)
Voilà : n'hésitez pas à critiquer, il y a encore une quinzaine de fonctions à faire, alors si c'est pas comme ça qu'il faut faire, autant que je le sache tout de suite :lol:

Chris :)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Message par Patrick88 »

pourquoi t'embêter à faire des fileseek ?
lire le fichier en une fois dans une zone mémoire, puis travailler à partir de cette zone mémoire...

tu crées 2 zones mémoire une avec le "fichier" source et une seconde extensible qui contient uniquement les modifs. sorte de fichier undo.

au moment de l'écriture "finale" il suffira de lire les 2 tampons en tenant compte des modifs uniquement du 2ème

...

patrick
Répondre