Créer et mettre à jour une base de données Sqlite

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Créer et mettre à jour une base de données Sqlite

Message par falsam »

En préambule.
Créer et mettre à jour une base de données Sqlite n'est pas très compliqué.

Une base de données est matérialisée par un fichier constitué de une ou plusieurs tables.
Chaque table représente un ensemble d'enregistrements de longueurs fixes.
Chaque enregistrement est constitué de variables. Chaque variable à une longueur fixe.

Nous savons utiliser Pure Basic. Par contre une base de données SQLite ne connait que le langage SQL (SELECT, INSERT, UPDATE, DELETE, ...)

Nous verrons donc aussi comment insérer des ordres SQL dans notre code Pure Basic.

Mise en oeuvre.
Pour cette exercice nous allons créer une base de données SQlite "matable.sqlite" qui contiendra la table "contacts"

-Structure de la table contacts
   idauto   INTEGER PRIMARY KEY    (Identifiant automatique qui sera géré par Sqlite.)
   nom      TEXT
   prenom TEXT
   age       INTEGER

Le code qui permet de créer la base de donnée et sa table contact : Mes adresses (Création de la table).pb

Code : Tout sélectionner

;Tutoriel SQLite : Création d'une base de données

;Une base de données SQLite est matérialisée par un fichier 
;constitué de une ou plusieurs tables.
;Chaque table représente un ensemble d'enregistrements

;Dans cet exemple, chaque enregistrement possédera un identifiant automatique
;Cet identifiant sera utile pour les opérations de mise à jour  et de suppression d'un enregistrement.

;Initialisation de SQlite
UseSQLiteDatabase()

Database.i ;Identifiant de la base de données 
DatabaseName.s="mabase.sqlite" ;l'extension du fichier n'est pas obligatoirement .sqlite
ReqSql.s="" ;Requete 

;Création d'un fichier vierge
If CreateFile(Database, DatabaseName)
  CloseFile(Database) 
Else
  MessageRequester("Erreur", "Impossible de créer un fichier") ;En principe ça ne devrait pas arriver :)
  End
EndIf

;Ouverture de la base de données et création de la table des "contacts"
;SQlite ne necessite pas de nom et de mot de passe utilisateur
If OpenDatabase(Database, DatabaseName, "", "", #PB_Database_SQLite)
  
  ;Préparation de la requête de création de la table
  ReqSql = "CREATE TABLE contacts (" 
  
  ReqSql + "Idauto INTEGER PRIMARY KEY," ;Identifiant automatique pour chaque enregistrement
  ReqSql + "nom TEXT," ;nom
  ReqSql + "prenom TEXT," ;prenom
  ReqSql + "age INTEGER" ;Age
  
  ReqSql + ")" ;Fin de la requete
  
  ;Exécution de la requete
  DatabaseUpdate(Database, ReqSql) 
  
  ;La création de la base de données est terminée ...... pour le moment
  CloseDatabase(Database)
  MessageRequester("Information","Création de la base terminée")
  
Else
 
  MessageRequester("Erreur","Erreur lors de la création de la base de données" + Chr(13) + DatabaseError() )
EndIf  
Enregistrer ce code dans un nouveau dossier et exécuter le.

Voila vous venez de créer votre base de données.
Dernière modification par falsam le mar. 04/févr./2014 18:10, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Ouvrir une base de donnée SQlite.
C'est trés simple, on va mettre en oeuvre la fonction :
OpenDatabase(#BaseDeDonnees, NomBaseDeDonnes$, Utilisateur$, MotdePasse$ [, Plugin])

Une base de données SQlite ne possédant pas de protection par mot de passe il sera inutile de fournir le nom et le mot de passe utilisateur. (Utilisateur$, MotdePasse$).

Nous avons une base de données qui se nomme "mabase.sqlite". Le code d'ouverture de la base de données sera:

Code : Tout sélectionner

Databasefile = "\mabase.sqlite"
If OpenDatabase(#Database, GetCurrentDirectory()+Databasefile, "", "", #PB_Database_SQLite)
   ... reste du code .....
EndIf
Insertion d'un enregistrement.
La syntaxe pour l’insertion de données dans une table une ligne à la fois est comme suit :
        INSERT INTO "nom de table" ("colonne 1", "colonne 2", ...) VALUES ("valeur 1", "valeur 2", ...);

Rappelez vous de la structure de notre table contacts.
   idauto   INTEGER PRIMARY KEY    (Identifiant automatique qui sera géré par Sqlite.)
   nom      TEXT
   prenom TEXT
   age       INTEGER

Pour insérer un enregistrement d'un formulaire de saisie
        INSERT INTO "contacts" ("nom", "prenom", "age") VALUES ("martin", "pierre", "32");

Après validation d'un formulaire de saisie, les information du contact sont stockées dans des variables.
nom.s = "martin"
pierre.s = "pierre"
age.s = "32"

On aura défini une variable qui contiendra notre requête d'insertion de données.
Préparation de la requête

Code : Tout sélectionner

ReqSql = "insert into contacts (nom, prenom, age) values ("
ReqSql + Chr(34) + nom + Chr(34)+Chr(44)
ReqSql + Chr(34) + prenom + Chr(34)+Chr(44)
ReqSql + Chr(34) + age + Chr(34)+")"
A présent envoyons cette requête.

Code : Tout sélectionner

If DatabaseUpdate(#Database, ReqSql) <>0
  .... votre code de traitement ..... 
Else
  .... gestionnaire d'erreur
EndIf
L'insertion des données est effectuée. Vous êtes toujours là ? Passons à la suite.

Afficher les enregistrement d'une table..
Nous allons lire la totalité de notre table contact et l'afficher dans une liste. Pour ce faire, il convient d’utiliser la commande SELECT. La syntaxe de cette commande est :
        SELECT "colonne 1", "colonne 2", ... FROM "nom de table"
pour sélectionner l'ensemble des colonnes on peut aussi utiliser la syntaxe suivante
        SELECT * FROM "nom de table"
C'est cette dernière que nous allons utiliser pour notre exercice.

Code : Tout sélectionner

If DatabaseQuery(#Database, "select * from contacts")
   ... Traitement de la sélection ....
EndIf
Voyons voir maintenant comment envoyer ces données à notre liste.

Chaque enregistrement dans la table constitue une rangée. En anglais Row

Assimiler bien ce qui suit :
- Après la clause SELECT précédent l'ensemble des donnée se trouvent stocké en mémoire dans un tableau constitué de rangées (Row) et de colonnes.

- Chaque rangée est un enregistrement de notre table et chaque colonne correspond à une variable de notre enregistrement.

- L'indice de la première colonne commencera à 0.

la fonction NextDatabaseRow(#BaseDeDonnees) incluse dans une boucle va nous permettre de lire séquentiellement chacun de nos rangées.

Chaque enregistrement sera envoyé à un tableau (#tableau)
Souvenez vous de notre identifiant automatique (idauto).

Le contenu de chaque variable contenu dans la rangée pourra être lu avec les fonctions suivantes.
GetDatabaseString(#BaseDeDonnees, Colonne)

Code : Tout sélectionner

If DatabaseQuery(#Database, "select * from contacts")
      While NextDatabaseRow(#Database)
        LigneTableau = GetDatabaseString(#Database, 1) + Chr(10) ;Nom
        LigneTableau + GetDatabaseString(#Database, 2) + Chr(10) ;Prenom
        LigneTableau + GetDatabaseString(#Database, 3) + Chr(10) ;Age
               
        AddGadgetItem(#tableau, -1, LigneTableau)
        
        ;Pour chaque ligne du tableau on indique l'identifiant automatique de l'enregistrement (idauto)
        SetGadgetItemData(#tableau, CountGadgetItems(#Tableau)-1, GetDatabaseLong(#Database, 0))
      Wend
      FinishDatabaseQuery(#Database)
EndIf
Modification d'un enregistrement.
Vous pouvez, être amenés à modifier les données contenues dans une table. Pour ce faire, il convient d’utiliser la commande UPDATE. La syntaxe de cette commande est :
        UPDATE "nom de table" SET "colonne 1" = [nouvelle valeur] WHERE "condition"

Il est également possible de UPDATE plusieurs variables de notre enregistrement à la fois. La syntaxe dans ce cas-ci ressemblerait à ce qui suit :
        UPDATE "nom de table" SET
        colonne 1 = [valeur 1],
        colonne 2 = [valeur 2]
        WHERE "condition"
Nous allons nous servir de cette dernière syntaxe pour traiter notre formulaire de modification d'enregistrement.

Après validation d'un formulaire de modification, les information du contact sont stockées dans des variables.
nom.s = "Martin"
pierre.s = "Pierre"
age.s = "52"

On aura défini une variable qui contiendra notre requête d'insertion de données.
Préparation de la requête.

Code : Tout sélectionner

ReqSql = "update contacts set "
ReqSql + "nom=" + Chr(34) +  nom + Chr(34)+Chr(44)
ReqSql + "prenom=" + Chr(34) + prenom + Chr(34)+Chr(44)
ReqSql + "age=" + Chr(34) + age + Chr(34)
ReqSql + "where idauto = " + Chr(34)+Str(Idauto)+Chr(34)
    
;Ajout de l'enregistrement 
If DatabaseUpdate(#Database, ReqSql) <>0
  .... votre code de traitement ..... 
Else
  .... gestionnaire d'erreur
EndIf
Suppression d'un enregistrement.
Tout comme la modification, vous pouvez, être amenés à supprimer les données contenues dans une table. Pour ce faire, il convient d’utiliser la commande DELETE FROM. La syntaxe de cette commande est :
        DELETE FROM "nom de table" WHERE "condition";

Après validation d'un formulaire de suppression, la seule information qui nous intéresse est l'identifiant automatique (IdAuto) de l'enregistrement qui sera supprimer.

Code : Tout sélectionner

ReqSql="delete from contacts where idauto=" + Str(Idauto)
If DatabaseUpdate(#Database,ReqSQL)
  FinishDatabaseQuery(#Database)     
  ... reste de votre code ....    
Else
  ... gestionnaire d'erreur ....
End
Et aussi ...(Cliquez sur le lien)
:idea: Sélectionner un ou plusieurs enregistrements en fonction d'un critère de recherche.
Utilisation de la commande SELECT "colonne 1", "colonne 2", ... FROM "nom de table" WHERE "Colonne 1" LIKE Value
Dernière modification par falsam le mar. 12/août/2014 9:29, modifié 6 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Dans le premier post vous avez vu comment créer une base de données. Voici maintenant le code qui permer de

-Ouvrir une base de données.
-Insérer un enregistrement.
-Modifier un enregistrement
-Supprimer un enregistrement.

Enregistrer le dans le même dossier que la base de données.

Code : Tout sélectionner

;Tutorial : Utilisation d'une base de données SQLite
;Ajout modification et suppression d'un enregistrement
;

EnableExplicit

Enumeration
  #Database     ;Base de données
  
  #Mainform     ;Fenetre principale
  
  #Tableau      ;Liste des adresses
  #Nom          ;Nom du contact
  #Prenom       ;Prénom du contact
  #Age          ;Age du contact
  
  #Nouveau      ;Bouton Créer un nouveau contact
  #Enregistrer  ;Bonton enregistrer un nouveau contact
  #Supprimer    ;Supprimer un contact
  
EndEnumeration

Global Databasefile.s
Global ReqSQL.s 

Global Creation.i = 1 ;Indicateur de création d'un enregistrement
Global Modification = 2 ;Indicateur de modification d'un enregistrement
Global LigneTableau.s ;Nom + Prenom + Age
Global IndexItem.i ;Mémorise l'item selectionné dans #tableau

;Plan de l'application
Declare MainformOpen()            ;Fenetre principale de l'application
Declare MainFormDisable(Value.i)  ;Activation ou désactivatoin du formulaire de saisie

Declare ContactNouveau()          ;Initialisation du formulaire
Declare ContactEnregistre()       ;Ajouter ou modifier un contact
Declare ContactSupprime()         ;Supprimer un contact
Declare ContactSelectionne()      ;Selectionner un contact

Declare Error(Value)              ;Gestionnaire d'erreurs SQlite

Declare SessionStart()            ;Initialisation de l'application 
Declare SessionEnd()              ;Fin du programme

;Fenetre principale
Procedure MainFormOpen()
  OpenWindow(#Mainform, 0, -35, 600, 226, "Mes contacts", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  ;List des contacts
  ListIconGadget(#Tableau, 10, 30, 407, 180, "Nom", 100, #PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#Tableau, 1, "Prénom", 200)
  AddGadgetColumn(#Tableau, 2, "Age", 100)
  
  ;Formulaire de saise 
  TextGadget(#PB_Any, 430, 55, 80, 22, "Nom")
  StringGadget(#Nom, 480, 50, 100, 22, "")
  
  TextGadget(#PB_Any, 430, 85, 80, 22, "Prénom")
  StringGadget(#Prenom, 480, 80, 100, 22, "")
  
  TextGadget(#PB_Any, 430, 115, 80, 22, "Age")
  StringGadget(#Age, 480, 110, 100, 22, "")
  
  ;Boutons de Mise à jour.
  ButtonGadget(#Nouveau, 499, 139, 80, 22, "Nouveau")
  ButtonGadget(#Enregistrer, 498, 166, 80, 22, "Enregistre")
  ButtonGadget(#Supprimer, 498, 193, 80, 22, "Supprimer")
EndProcedure


Procedure MainFormReset()
  SetGadgetText(#Nom, "")
  SetGadgetText(#Prenom, "")
  SetGadgetText(#Age, "0")
EndProcedure

;Activation ou desactivation du formulaire de saisie.
; Value 
; #True Le formulaire est desactivé
; #False : Le formulaire est activé
Procedure MainFormDisable(Value.i)
  DisableGadget(#Nom, Value)
  DisableGadget(#Prenom, Value)
  DisableGadget(#Age, Value)
  DisableGadget(#Enregistrer, Value)
  DisableGadget(#Supprimer, Value)
EndProcedure

;-
;Mise en place d'une nouvelle saisie
Procedure ContactNouveau()
  MainFormReset()
  
  MainFormDisable(#False) ;Activation du formulaire  
  
  ;On indique au bouton Enregistrer qu'il s'agit d'une création  
  SetGadgetData(#Enregistrer, Creation)
  
  ;On neutralise le bouton #Supprimer
  DisableGadget(#Supprimer, #True)
  
  SetActiveGadget(#Nom)
EndProcedure


;Enregistrer une opération
;Le bouton #Enregistrer indique s'il s'agit d'un ajout ou d'une modification
;Chaque ligne du tableau est tagué avec l'identifiant automatique de l'enregistrement correspondant
Procedure ContactEnregistre()
  Protected Idauto.i,  LigneTableau.s, Nom.s, Prenom.s, Age.s
  
  ;Récupération des données
  Idauto=GetGadgetItemData(#Tableau, GetGadgetState(#Tableau))
  Nom = GetGadgetText(#Nom)
  Prenom = GetGadgetText(#Prenom)
  Age = GetGadgetText(#Age)
  
  LigneTableau = Nom + Chr(10) + Prenom + Chr(10) + Age
  
  
  ;Création ou modification ?
  If GetGadgetData(#Enregistrer)=Creation
    
    ;Préparation de la requete de création 
    ReqSql = "insert into contacts (nom, prenom, age) values ("
    ReqSql + Chr(34) + nom + Chr(34)+Chr(44)
    ReqSql + Chr(34) + prenom + Chr(34)+Chr(44)
    ReqSql + Chr(34) + age + Chr(34)+")"
   
    ;Ajout de l'enregistrement 
    ;Si l'opération réussi, on ajoute aussi la ligne dans le tableau
    If DatabaseUpdate(#Database, ReqSql) <>0
      
      AddGadgetItem(#Tableau, -1, LigneTableau)
      
      ;Récupération de l'identifiant automatique du dernier enregistrement
      ;Mise en oeuvre de last_insert_rowid()
      ReqSQL ="select last_insert_rowid() from operations"
      If DatabaseQuery(#Database, ReqSQL)
        NextDatabaseRow(#Database)
        
        ;On va stocker l'identifiant automatique de cet enregistrement 
        ;dans la ligne correspondante du tableau
        SetGadgetItemData(#tableau, CountGadgetItems(#Tableau)-1, GetDatabaseLong(#Database, 0))
      EndIf
     
      ContactNouveau()
      MainFormDisable(#True)
      SetGadgetState(#Tableau, CountGadgetItems(#Tableau)-1)
      MessageRequester("Information","Opération ajouté")
    Else
      Error(3)
    EndIf

  
  Else ;C'est une modification de la table "contacts"
    
    ;Preparation de la requete de modification
    ReqSql = "update contacts set "
    ReqSql + "nom=" + Chr(34) +  nom + Chr(34)+Chr(44)
    ReqSql + "prenom=" + Chr(34) + prenom + Chr(34)+Chr(44)
    ReqSql + "age=" + Chr(34) + age + Chr(34)
    ReqSql + "where idauto = " + Chr(34)+Str(Idauto)+Chr(34)
    
    ;Mise à jour de l'enregistrement 
    ;Si l'opération réussi, on modifie aussi la ligne dans le tableau
    If DatabaseUpdate(#Database, ReqSql) <>0
      FinishDatabaseQuery(#Database) 
      RemoveGadgetItem(#Tableau, IndexItem)
      AddGadgetItem(#Tableau, IndexItem, LigneTableau)
      ContactNouveau()
      MainFormDisable(#True)
      SetGadgetState(#Tableau, IndexItem)
      MessageRequester("Information","Modification effectuée.")
    Else
      Error(3)
    EndIf

  EndIf
EndProcedure


;Supprimer une opération
Procedure ContactSupprime()
  Protected Idauto.i
  ;Préparation de la requete de suppression
  Idauto=GetGadgetItemData(#Tableau, IndexItem)

  ReqSql="delete from contacts where idauto=" + Str(Idauto)
  If DatabaseUpdate(#Database,ReqSQL)
    FinishDatabaseQuery(#Database)     
    RemoveGadgetItem(#Tableau, IndexItem)
    SetGadgetState(#Tableau, IndexItem)
    ContactNouveau()
    MainFormDisable(#True)
    MessageRequester("Information","Suppression effectuée.")
    
  Else
      
    Error(4) ;Erreur durant la supression
    End
  EndIf
  
EndProcedure


;Selectionne une opération
Procedure ContactSelectionne()
  Protected Nom.s, Prenom.s, Age.s
  
  ;Mémorise l'item sélectionné
  IndexItem=GetGadgetState(#Tableau)
  
  If IndexItem <> -1
    ;Lecture de la ligne du tableau en cours de selection
    Nom    = GetGadgetItemText(#Tableau, IndexItem, 0)  
    Prenom = GetGadgetItemText(#Tableau, IndexItem, 1)    
    Age    = GetGadgetItemText(#Tableau, IndexItem, 2)
 
    ;Initialisation du formulaire
    SetGadgetText(#Nom, Nom)
    SetGadgetText(#Prenom, Prenom)
    SetGadgetText(#Age, Age)
   
    ;On indique au bouton Enregistrer qu'il s'agit d'une modification
    SetGadgetData(#Enregistrer, Modification)
  
    ;Activation du formulaire
    MainFormDisable(#False)
  Else
    MainFormReset()
    MainFormDisable(#True)
  EndIf  
EndProcedure

;-
;Gestionnaire d'erreurs
Procedure Error(Value)
  Select Value
    Case 0 : MessageRequester("Information", "Impossible d'initialiser SQLite") : End
    Case 1 : MessageRequester("Information", "Impossible d'ouvrir la base de données"+#CRLF$+DatabaseError())
    Case 2 : MessageRequester("Information", "Erreur durant la selection des opérations"+#CRLF$+DatabaseError())
    Case 3 : MessageRequester("Information", "Erreur durant l'enregistrement de l'opération"+#CRLF$+DatabaseError())
    Case 4 : MessageRequester("Information", "Erreur durant la supression de l'opération"+#CRLF$+DatabaseError())
  EndSelect
EndProcedure

Procedure SessionStart()
  ;Initialisation de l'environnement SQlite
  If Not UseSQLiteDatabase()
    Error(0)
  EndIf
  
  ;Ouverture de la fenetre principale
  MainFormOpen()
  
  ;Desactivation  du formulaire de saisie
  MainFormDisable(#True)  
  
  ;Ouverture et lecture de la base de données 
  Databasefile = "\mabase.sqlite"
  If OpenDatabase(#Database, GetCurrentDirectory()+Databasefile, "", "", #PB_Database_SQLite)
    
    ;Selection de tout les enregistrement de la base de données 
    ;tri sur le champ nom : Mise en oeuvre de ORDER BY ASC ou DESC 
    If DatabaseQuery(#Database, "select * from contacts order by nom asc")
      While NextDatabaseRow(#Database)
        LigneTableau = GetDatabaseString(#Database, 1) + Chr(10) ;Nom
        LigneTableau + GetDatabaseString(#Database, 2) + Chr(10) ;Prenom
        LigneTableau + GetDatabaseString(#Database, 3) + Chr(10) ;Age
               
        AddGadgetItem(#tableau, -1, LigneTableau)
        
        ;Pour chaque ligne du tableau on indique l'identifiant automatique de l'enregistrement
        SetGadgetItemData(#tableau, CountGadgetItems(#Tableau)-1, GetDatabaseLong(#Database, 0))
      Wend
      
      FinishDatabaseQuery(#Database)
          
    Else
      
      Error(2)
    EndIf
  Else
    Error(1)
  EndIf
  
EndProcedure

Procedure SessionEnd()
  CloseDatabase(#Database)
  End
EndProcedure


SessionStart()

;-Boucle evenementielle
Repeat
  Select WaitWindowEvent()
         
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #Tableau ;Selection et affichage du détail d'un contact dans le formulaire
          If EventType()=#PB_EventType_LeftClick
            ContactSelectionne()  
          EndIf   
              
        Case #Nouveau ;Initialisation du formulaire de saisie 
          ContactNouveau()
          
        Case #Enregistrer ;Ajout ou modification d'un contact
          ContactEnregistre()
                   
        Case #Supprimer ;Suppression d'un contact
          ContactSupprime()
                              
      EndSelect   
      
    Case #PB_Event_CloseWindow
      SessionEnd()
      
  EndSelect 
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Super ton tuto falsam. Pourrait tu ajouter la recherche dans une base de données ?
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par Ar-S »

Je plussoie, va falloir que je m'y mette, les fichiers prefs c'est gentil mais pour du lourd, une bdd devient nécessaire.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Ar-S a écrit :Je plussoie, va falloir que je m'y mette, les fichiers prefs c'est gentil mais pour du lourd, une bdd devient nécessaire.
Ouiiii :)
36000 communes dans un ficher préférence ce n'est même pas la peine de l'envisager. Avec Sqlite une recherche d'une commune prends le temps de presser la touche entrée.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Falsam tu pourrai ajouter à ton tuto la possibilité de faire une recherche dans une base de données sqlite ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Rechercher un ou plusieurs enregistrement.
Vous pouvez, être amenés à rechercher le contenu partiel d'une table. Pour ce faire, il convient d’utiliser la commande SELECT FROM WHERE LIKE.

La syntaxe de cette commande est :
        SELECT "colonne 1", "colonne 2", ... FROM "nom de table" WHERE Colonne 1 LIKE Value

La commande LIKE en SQL permet de fouiller le contenu d'un champ.

Value représente la valeur à rechercher balisée par le signe %

■ Création d'une base de données en mémoire contenant la table MyTable
Chaque enregistrement est composé d'un champ (col) que j'ai appelé MyField.

Code : Tout sélectionner

DatabaseUpdate(#Database, "CREATE TABLE MyTable (MyField VARCHAR(255));")
MyField sera initialisé par la valeur "Item " suivi d'un compteur variant de 1 à 10000.

Code : Tout sélectionner

For i = 1 To 10000
   DatabaseUpdate(#Database, "insert into MyTable (MyField) values('Item " + Str(i)+ "')")
Next
Recherchons maintenant les enregistrements (row) dont le champ MyField commence par 'Item 202'.
Regardez bien ou est placé le signe %

Code : Tout sélectionner

DatabaseQuery(#Database, "SELECT * FROM MyTable WHERE Myfield LIKE 'Item 202%'")
Reste à afficher le résultat.

Code : Tout sélectionner

While NextDatabaseRow(#Database)
  Debug GetDatabaseString(#Database, 0)
Wend
■ Le code complet

Code : Tout sélectionner

Enumeration
  #Database
EndEnumeration

UseSQLiteDatabase()

If OpenDatabase(#Database, ":memory:", "", "")
    Debug "Connected"
   
    DatabaseUpdate(#Database, "CREATE TABLE MyTable (MyField VARCHAR(255));")       
    Debug DatabaseError()
   
    For i = 1 To 10000
      DatabaseUpdate(#Database, "insert into MyTable (MyField) values('Item " + Str(i)+ "')")
    Next
   
    DatabaseQuery(#Database, "SELECT * FROM MyTable WHERE Myfield LIKE 'Item 202%'")
    While NextDatabaseRow(#Database)
      Debug GetDatabaseString(#Database, 0)
    Wend
Else
    Debug DatabaseError()   
EndIf
■ Pour rechercher un ou plusieurs enregistrement contenant (et non plus commençant) il faut encadrer la valeur recherchée par le signe %.

Exemple rechercher les enregistrements dont le champ MyField contient "202"

Code : Tout sélectionner

DatabaseQuery(#Database, "SELECT * FROM MyTable WHERE Myfield LIKE '%202%'")
Dernière modification par falsam le mar. 12/août/2014 9:27, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Super... Merci falsam.

Je ne sais pas si je peut décrie mon problème ici ?

Je cherche à créer pour mon travail une petit main-courante événementielle et quand je cherche à ajouter des données dans ma base j’obtiens une erreur. Voici les trois procédure que j'utilise pour créer ma base, insérer des données et ouvrir une main-courante.

Code : Tout sélectionner

Procedure DB_Init()
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  If FileSize(#PB_Compiler_FilePath+"MainCourante.sqlite") < 0
    plFile = CreateFile(#PB_Any, #PB_Compiler_FilePath+"MainCourante.sqlite")
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, "MainCourante.sqlite", "", "", #PB_Database_SQLite)
  If glDBSQLite = 0
    MessageRequester("Main-Courante évènementielle", DatabaseError())
    End
  ElseIf plFile
    psSQLRequest = "CREATE TABLE IF NOT EXISTS mc ("
    psSQLRequest + "id_mc INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "mcnum TEXT Not NULL," ;Numéro de main-courante
    psSQLRequest + "date TEXT Not NULL,"  ;Date
    psSQLRequest + "heure TEXT Not NULL," ;heure
    psSQLRequest + "categorie TEXT Not NULL,";Catégories
    psSQLRequest + "sujet TEXT Not NULL,";Sujet
    psSQLRequest + "requerant TEXT Not NULL,";Requérant
    psSQLRequest + "lieu TEXT Not NULL,";lieu
    psSQLRequest + "compterendu TEXT Not NULL";Compte rendue de la main-courante
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("Main-Courante évènementielle - DB_Init()", DatabaseError())
    EndIf
  EndIf
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
EndProcedure

Procedure DB_InsertMC()
  Protected psSQLRequest.s
  psSQLRequest = "INSERT INTO mc (mcnum, date, heure, categorie, sujet, requerant, lieu, compterendu)"
  psSQLRequest + "VALUES ("
  psSQLRequest + "'"+GetGadgetText(#StringNumMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#String_DateMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#StringHeureMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#ComboCategorieMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#StringSujetMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#StringRequerantMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#StringLieuMC)+"',"
  psSQLRequest + "'"+GetGadgetText(#EditeurMC)+"'"
  psSQLRequest + ")"
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    Debug psSQLRequest
    MessageRequester("Main-Courante évènementielle - DB_InsertMC()", DatabaseError())
  EndIf
  
  ClearGadgetItems(#ListMC)
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
  
  ;actualisation automatique du numéro
  SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))
EndProcedure

Procedure DB_OpenMC(GadgetItem.l)
  Protected psSQLRequest.s
  psSQLRequest = "SELECT * FROM mc WHERE id_mc="+Str(GetGadgetItemData(#ListMC, GadgetItem))
  If DatabaseQuery(glDBSQLite, psSQLRequest) <> 0
    While NextDatabaseRow(glDBSQLite)
      SetGadgetText(#StringNumOpenMC, GetDatabaseString(glDBSQLite, 1))
      SetGadgetText(#String_DateOpenMC, GetDatabaseString(glDBSQLite, 2))
      SetGadgetText(#StringHeureOpenMC, GetDatabaseString(glDBSQLite, 3))
      SetGadgetText(#StringCategorieOpenMC, GetDatabaseString(glDBSQLite, 4))
      SetGadgetText(#StringSujetOpenMC, GetDatabaseString(glDBSQLite, 5))
      SetGadgetText(#StringRequerantOpenMC, GetDatabaseString(glDBSQLite, 6))
      SetGadgetText(#StringLieuOpenMC, GetDatabaseString(glDBSQLite, 7))
      SetGadgetText(#EditeurOpenMC, GetDatabaseString(glDBSQLite, 8))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("Main-Courante évènementielle - DB_OpenMC", DatabaseError())
  EndIf
EndProcedure

J'ai un problème sur la procédure DB_InsertMC(). Les autres procédure fonctionne très bien car j'ai entré des données grâce à ton super SqliteVision pour faire des test.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Sans pouvoir la tester, ta procédure à l'air correcte. Peut être que tu saisis des données contenant des apostrophes ou des guillemets.

Dans ce cas Sqlite retourne une erreur car l'apostrophe et les guillemets sont des délimitateurs de données si l'apostrophe fonctionne quand il est encadrait par des guillemets, les guillemets par contre doivent être doublées.

En Php le souci est le même avec MySql mais il est possible d'y palier grace à la fonction addslashes()

Mais cette fonctionnalité n'existe pas avec Sqlite.

La procédure SqliteString(Buffer.s) formate et retourne une variable après avoir vérifier que les guillemets sont bien doublés.

Code : Tout sélectionner

Procedure.s SqliteString(Buffer.s)
  Buffer=Chr(34)+ReplaceString(Buffer, Chr(34), Chr(34)+Chr(34)) + Chr(34)
  ProcedureReturn Buffer
EndProcedure
L'apostrophe si il y a sera bien encadrée par Chr(34)

Essayes ton code en intégrant cette procédure

Code : Tout sélectionner

Procedure DB_InsertMC()
  Protected psSQLRequest.s
  
  psSQLRequest = "INSERT INTO mc (mcnum, date, heure, categorie, sujet, requerant, lieu, compterendu)"
  psSQLRequest + "VALUES ("
  psSQLRequest + SqliteString(GetGadgetText(#StringNumMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#String_DateMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#StringHeureMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#ComboCategorieMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#StringSujetMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#StringRequerantMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#StringLieuMC)) + ","
  psSQLRequest + SqliteString+GetGadgetText(#EditeurMC)) + ")'"
  
  ;Reste du code
EndProcedure  
Dernière modification par falsam le mar. 12/août/2014 23:13, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Je test ce soir et je te tiens au courant. Merci falsam ;-)
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

C'est l'apostrophe qui semble me poser problème j'ai modifié ton code avec chr(44) mais ce ne fonctionne pas.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

MetalOS a écrit :C'est l'apostrophe qui semble me poser problème j'ai modifié ton code avec chr(44) mais ce ne fonctionne pas.
si tu utilises les modifications que j'ai citées, ça ne doit pas poser de problème.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Non ca ne fonctionne pas. Voici mon code de test.

Code : Tout sélectionner

Global glDBSQLite.l
Global glListviewItemSelected.l = -1
Global glImageMemory.l

;- Window Constants
Enumeration 1
  #Window_Form3
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue


;- Gadget Constants
Enumeration 1
  
  ;Window_Form3
  #TextHeaderMC
  #TextNumMC
  #StringNumMC
  #TextCategorieMC
  #ComboCategorieMC
  #TextDateMC
  #String_DateMC
  #TextHeureMC
  #StringHeureMC
  #TextRequerantMC
  #StringRequerantMC
  #TextLieuMC
  #StringLieuMC
  #TextSujetMC
  #StringSujetMC
  #EditeurMC
  #ListMC
  #BtnMC_Enregistrer
  #BtnMC_Ouvrir
  #BtnMC_Supprimer
  #BtnMC_Fermer
  #ListingMC
  
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue

Procedure.i Window_Form3()
  If OpenWindow(#Window_Form3,302,164,790,560,"Main-courante évènementielle expresse :",#PB_Window_ScreenCentered|#PB_Window_Invisible)
    
    TextGadget(#TextHeaderMC,0,0,790,20," Gestion main-courante évènementielle expresse")
    SetGadgetFont(#TextHeaderMC, Font0)
    SetGadgetColor(#TextHeaderMC, #PB_Gadget_BackColor, RGB(42, 85, 134))   
    SetGadgetColor(#TextHeaderMC, #PB_Gadget_FrontColor, RGB(223, 233, 245))
 
    TextGadget(#TextNumMC,10,32,60,15,"Numéro")
    StringGadget(#StringNumMC,70,30,100,20,"", #PB_String_ReadOnly)
    GadgetToolTip(#StringNumMC,"Numérotation automatique")
 
    TextGadget(#TextCategorieMC,180,32,55,15,"Catégorie :")
    ComboBoxGadget(#ComboCategorieMC,235,30,200,20,#PB_ComboBox_UpperCase);{
    AddGadgetItem(#ComboCategorieMC, -1, "FEU")
    AddGadgetItem(#ComboCategorieMC, -1, "SECOUR A VICTIME(S)")
    AddGadgetItem(#ComboCategorieMC, -1, "FUITE D'EAU")
    AddGadgetItem(#ComboCategorieMC, -1, "VERIFICATIONS")
    AddGadgetItem(#ComboCategorieMC, -1, "ASC OU MC")
    AddGadgetItem(#ComboCategorieMC, -1, "DEGRADATION")
    AddGadgetItem(#ComboCategorieMC, -1, "INCIDENT TECHNIQUE")
    AddGadgetItem(#ComboCategorieMC, -1, "AGRESSION VERBALE")
    AddGadgetItem(#ComboCategorieMC, -1, "LITIGE")
    AddGadgetItem(#ComboCategorieMC, -1, "EVACUATION")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL AVEC PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL SANS PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "BAGARRE")
    AddGadgetItem(#ComboCategorieMC, -1, "PRISE DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "FIN DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "RONDE DE SECURITE")
    AddGadgetItem(#ComboCategorieMC, -1, "PERCEPTION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "REINTEGRATION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "DIVERS")
    GadgetToolTip(#ComboCategorieMC,"Sélectionnez la catégorie")
;}
 
    TextGadget(#TextDateMC,450,32,30,15,"Date")
    Date$ = FormatDate("%dd / %mm / %yyyy", Date())
    StringGadget(#String_DateMC, 480, 30, 120, 20, Date$, #PB_String_ReadOnly)
    GadgetToolTip(#String_DateMC,"Sélectionnez la date de la MC")
 
    TextGadget(#TextHeureMC,620,32,35,15,"Heure")
    StringGadget(#StringHeureMC,655,30,50,20,FormatDate("%hh h %ii",Date()), #PB_String_ReadOnly)
    GadgetToolTip(#StringHeureMC,"Heure de réquisition")
 
    TextGadget(#TextRequerantMC,10,57,60,15,"Requérant")
    StringGadget(#StringRequerantMC,70,55,210,20,"")
    GadgetToolTip(#StringRequerantMC,"Nom et prénom si disponible")
 
    TextGadget(#TextLieuMC,290,57,50,15,"Lieu")
    StringGadget(#StringLieuMC,350,55,400,20,"")
    GadgetToolTip(#StringLieuMC,"Adresse de l'intervention / des faits")
 
    TextGadget(#TextSujetMC,10,82,50,15,"Sujet")
    StringGadget(#StringSujetMC,70,80,400,20,"")
    GadgetToolTip(#StringSujetMC,"Indiquez succintement le sujet de cette main-courante")
 
    EditorGadget(#EditeurMC, 10, 105, 770, 200, #PB_Editor_WordWrap)
    SetGadgetFont(#EditeurMC, Font1)
    SetGadgetColor(#EditeurMC, #PB_Gadget_BackColor, RGB(253, 251, 212))   
    SetGadgetColor(#EditeurMC, #PB_Gadget_FrontColor, RGB(29, 29, 118))
    GadgetToolTip(#EditeurMC,"Saisi du Compte-rendu des évènements")
 
    ;Dans ce listing on y met que les infos de fichier, pas la MC elle même.
    ListIconGadget(#ListMC,10,310,770,200,"Numéro",120, #PB_ListIcon_FullRowSelect)
     AddGadgetColumn(#ListMC, 1, "Date", 100)
     AddGadgetColumn(#ListMC, 2, "Heure", 70)
     AddGadgetColumn(#ListMC, 3, "Catégorie", 150)
     AddGadgetColumn(#ListMC, 4, "Sujet", 300)
     AddGadgetColumn(#ListMC, 5, "Requérant", 200)
     AddGadgetColumn(#ListMC, 6, "Lieu", 250)
     AddGadgetColumn(#ListMC, 7, "Compte rendu", 500)
   
 
    ButtonGadget(#BtnMC_Enregistrer, 10, 520, 80, 25, "Enregistrer")
     GadgetToolTip(#BtnMC_Enregistrer,"Enregistrer la main courante")
   
    ButtonGadget(#BtnMC_Ouvrir, 100, 520, 80, 25, "Ouvrir")
     GadgetToolTip(#BtnMC_Ouvrir,"Ouvrir la main courante sélectionnée")
   
    ButtonGadget(#BtnMC_Fermer, 700, 520, 80, 25, "Fermer")
     GadgetToolTip(#BtnMC_Fermer,"Quitter Main-Courante Express")
    
    HideWindow(#Window_Form3,0)
    ProcedureReturn WindowID(#Window_Form3)
  EndIf
EndProcedure

;****Fin procédures impression****
Procedure DB_Init()
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  If FileSize(#PB_Compiler_FilePath+"MainCourante.sqlite") < 0
    plFile = CreateFile(#PB_Any, #PB_Compiler_FilePath+"MainCourante.sqlite")
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, "MainCourante.sqlite", "", "", #PB_Database_SQLite)
  If glDBSQLite = 0
    MessageRequester("Main-Courante évènementielle", DatabaseError())
    End
  ElseIf plFile
    psSQLRequest = "CREATE TABLE IF NOT EXISTS mc ("
    psSQLRequest + "id_mc INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "mcnum TEXT Not NULL," ;Numéro de main-courante
    psSQLRequest + "date TEXT Not NULL,"  ;Date
    psSQLRequest + "heure TEXT Not NULL," ;heure
    psSQLRequest + "categorie TEXT Not NULL,";Catégories
    psSQLRequest + "sujet TEXT Not NULL,";Sujet
    psSQLRequest + "requerant TEXT Not NULL,";Requérant
    psSQLRequest + "lieu TEXT Not NULL,";lieu
    psSQLRequest + "compterendu TEXT Not NULL";Compte rendue de la main-courante
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("Main-Courante évènementielle - DB_Init()", DatabaseError())
    EndIf
  EndIf
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
EndProcedure

Procedure.s SqliteString(Buffer.s)
  Buffer=Chr(34)+ReplaceString(Buffer, Chr(34), Chr(34)+Chr(34)) + Chr(34)
  ProcedureReturn Buffer
EndProcedure

Procedure DB_InsertMC()
  Protected psSQLRequest.s
  
  psSQLRequest = "INSERT INTO mc (mcnum, date, heure, categorie, sujet, requerant, lieu, compterendu)"
  psSQLRequest + "VALUES ("
  psSQLRequest + SqliteString(GetGadgetText(#StringNumMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#String_DateMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#StringHeureMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#ComboCategorieMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#StringSujetMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#StringRequerantMC))+","
  psSQLRequest + SqliteString(GetGadgetText(#StringLieuMC))+"',"
  psSQLRequest + SqliteString(GetGadgetText(#EditeurMC))+"'"
  psSQLRequest + ")"
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    Debug psSQLRequest
    MessageRequester("Main-Courante évènementielle - DB_InsertMC()", DatabaseError())
  EndIf
  
  ClearGadgetItems(#ListMC)
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
  
  ;actualisation automatique du numéro
  SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))
EndProcedure

;- Main Loop
If Window_Form3()
   DB_Init()
    ;actualisation automatique du numéro
     SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))

  Define quitForm1=0
  Repeat
    EventID  =WaitWindowEvent()
    MenuID   =EventMenu()
    GadgetID =EventGadget()
    WindowID =EventWindow()

    Select EventID
      Case #PB_Event_CloseWindow
        If WindowID=#Window_Form3
          quitForm1=1
        EndIf 
        
      Case #PB_Event_Gadget
        Select GadgetID
          Case #BtnMC_Fermer
           End
          Case #BtnMC_Enregistrer
            A$ = GetGadgetText(#StringNumMC)
            B$ = GetGadgetText(#String_DateMC)
            C$ = GetGadgetText(#StringHeureMC)
            D$ = GetGadgetText(#ComboCategorieMC)
            E$ = GetGadgetText(#StringSujetMC)
            F$ = GetGadgetText(#StringRequerantMC)
            G$ = GetGadgetText(#StringLieuMC)
            H$ = GetGadgetText(#EditeurMC)
            I$ = ""
            
            If A$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf B$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf C$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf D$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf E$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf F$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf G$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf H$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            Else  
              Resultat = MessageRequester("MAIN-COURANTE n° "+GetGadgetText(#StringNumMC),"Vous allez enregistrer cette main-courante que vous ne pourrez modifier."+Chr(13)+"S'il vous reste des informations à vérifier ou des éléments à corriger, faites le avant."+Chr(13)+"Enregistrer maintenant ?", #PB_MessageRequester_YesNo)
              If Resultat = 6
               DB_InsertMC()
                ; on remet les champs à zéro et on actualise le compteur après enregistrement
                ClearGadgetItems(#EditeurMC)
                SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))
                SetGadgetText(#ComboCategorieMC,"")
                SetGadgetText(#StringHeureMC,FormatDate("%hh h %ii",Date()))
                SetGadgetText(#StringRequerantMC,"")
                SetGadgetText(#StringLieuMC,"")
                SetGadgetText(#StringSujetMC,"")
              ElseIf Resultat = 7
              ;annulé
              EndIf
            EndIf
        EndSelect

    EndSelect
  Until quitForm1
  CloseWindow(#Window_Form3)
EndIf
End

Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

MetalOS a écrit :Non ca ne fonctionne pas.
Ok je fais un test .... a suivre:)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre