masque de saisie et sqlite

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

masque de saisie et sqlite

Message par Patix »

Bonjour,

J'essaie d'utiliser sqlite pour me faire un carnet d'adresse et j'ai un problème avec les dates.

Je n'arrive pas à écrire les changement de date et je n'arrive pas à récupérer les champs date.

Dans le masque de saisie j'utilise DateGadget

Cette commande pour mettre à jour la bd:

Code : Tout sélectionner

psSQLRequest + "contact_datecrea='"+GetGadgetText(#String_15)+"', "
est elle correcte, sachant que #String_15 est le dateGadget ?

Si vous avez un petit exemple qui marche, ce n'est pas de refus :) !
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: masque de saisie et sqlite

Message par flaith »

Dans ta db sqlite, au lieu de mettre un champ type date, met plutôt VARCHAR(10) et tu gères tes dates par programme :mrgreen:
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: masque de saisie et sqlite

Message par Patix »

Bonjour,

Merci pour ta réponse mais j'aimerai une solution avec le dateGadget si possible !
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: masque de saisie et sqlite

Message par flaith »

Ha !! Un truc de ce genre (debug ON) :

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 200, 250, "DateGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  DateGadget(0, 10, 10, 180, 25, "Date: %mm/%dd/%yyyy Time: %hh:%ii")
  Repeat
  Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

Debug FormatDate("%dd/%mm/%yy",(GetGadgetState(0)))
:?:
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: masque de saisie et sqlite

Message par Patix »

Oui ça je sais faire le masque est bon mais ou je me plante c'est l'écriture du Dategadget dans la base sqlite !

C'est commande ou le format que j'utilise qui n'est pas bon !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: masque de saisie et sqlite

Message par falsam »

Cet exemple presque complet devrait répondre à ton souci.
-Création de la base de données si inexistant (Identifiant enregistrement, Date et Memo Texte).
-Visualisation (Liste et Fiche) , Ajout, Modification et suppression d'un enregistrement

Dans chaque cas la date est traitée.

Enregistre ton code avant l’exécution.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Database
  
  #MainForm
  #Vision
  #Idtable
  #Date
  #Memo
  
  #Btn_New
  #Btn_View
  #Btn_Update
  #Btn_Del
EndEnumeration

;Application 
Global ApplicationTitle.s="SQLite : Manipulation de dates"

;Database
Global Database.s="MaBase.Sqlite"
Global ReqSql.s = ""

;Mode mise à jour (0 : Rien  1 : Ajout  2 : Mise à jour
Global ModeUpdate.l = 0

;Description de la date
Global AA.s, MM.s, JJ.s

UseSQLiteDatabase()

;Gestionnaire d'erreurs
Procedure Errors(Value.l)
  Select Value
    Case 0 ;Erreur dans la création de la base de données 
      MessageRequester(ApplicationTitle,"Erreur durant la création de la base de données")
      
    Case 1 ;Base pas accessible
      MessageRequester(ApplicationTitle,"La base de donnée n'est pas accessible "+DatabaseError())  
      
    Case 2 ;Erreur lors del l'execution de la requete
      MessageRequester(ApplicationTitle,"Erreur durant l'exécution de la requete "+DatabaseError()) 
      
  EndSelect
  
  ;Sortie de l'application
  End
EndProcedure

;Création de la base de données 
Procedure DatabaseCreate()
  If CreateFile(#Database, Database)
    CloseFile(#Database) 
  Else
    Errors(0)
  EndIf
  
  If OpenDatabase(#Database, Database, "", "", #PB_Database_SQLite)
    
    ;Création de la table MaTable
    ReqSql = "CREATE TABLE MaTable (idtable INTEGER PRIMARY KEY, date TEXT, memo TEXT)"
    DatabaseUpdate(#Database, ReqSql)
   
    ;La création de la base de données est terminée
    CloseDatabase(#Database)
    MessageRequester(ApplicationTitle,"Création de la base terminée")
  Else
    Errors(1)
  EndIf   
EndProcedure

;Ouverture de la base de données 
Procedure DatabaseOpen()
  If OpenDatabase(#Database, Database, "", "", #PB_Database_SQLite)
  Else
    Errors(1)
    End      
  EndIf
EndProcedure

;Liste des enregistrements
Procedure ListeRecords()
  ClearGadgetItems(#Vision)
  If DatabaseQuery(#Database, "select * from matable order by date asc")
    While NextDatabaseRow(#Database)
      AA=Mid(GetDatabaseString(#Database,1), 1, 4)
      MM=Mid(GetDatabaseString(#Database,1), 5, 2)
      JJ=Mid(GetDatabaseString(#Database,1), 7, 2)

      AddGadgetItem(#Vision, -1, JJ+"/"+MM+"/"+AA+Chr(10)+GetDatabaseString(#Database, 2))
      SetGadgetItemData(#Vision, CountGadgetItems(#Vision)-1, GetDatabaseLong(#Database, 0))
    Wend
    FinishDatabaseQuery(#Database)  
  Else
    Errors(2)
  EndIf
EndProcedure

;Mise en place d'un nouvel enregistrement
Procedure NewRecord()
  SetGadgetText(#Idtable,"")
  SetGadgetState(#Date, Date())
  SetGadgetText(#Memo,"")
  ModeUpdate=1 ;Mode Creation
EndProcedure

;Affichage d'un enregistrement selectionné dans la liste
Procedure ViewRecord()
  ReqSql="Select * from matable where idtable="+Str(GetGadgetItemData(#Vision, GetGadgetState(#Vision)))
  
  If DatabaseQuery(#Database, ReqSql) <> 0
    While NextDatabaseRow(#Database)
      SetGadgetText(#Idtable, GetDatabaseString(#Database,0))
      SetGadgetText(#Memo, GetDatabaseString(#Database,2))
      AA=Mid(GetDatabaseString(#Database,1), 1, 4)
      MM=Mid(GetDatabaseString(#Database,1), 5, 2)
      JJ=Mid(GetDatabaseString(#Database,1), 7, 2)
      
      SetGadgetState(#Date,  Date(Val(AA), Val(MM), Val(JJ), 00, 00, 00))
      SetGadgetText(#Date,  "%dd/%mm/%yyyy")
    Wend
    
    FinishDatabaseQuery(#Database)
    ModeUpdate=2
  Else
    Errors(2)
  EndIf
EndProcedure

;Ajout d'un enregistrement
;SQlite implique de doubler les apostrophes
Procedure AddRecord()
  AA =Mid(GetGadgetText(#Date),7,4)
  MM = Mid(GetGadgetText(#Date),4,2)
  JJ = Mid(GetGadgetText(#Date),1,2)
  
  ReqSql = "insert into matable (date, memo) values ('"
  ReqSql + AA+MM+JJ + "','"
  ReqSql + ReplaceString(GetGadgetText(#Memo), "'", "''")+"')" 
  
  If DatabaseUpdate(#Database, ReqSql) <>0  
    ListeRecords()  
    MessageRequester(ApplicationTitle,"Enregistrement ajouté")
    ModeUpdate=2
  Else
    Errors(2)
  EndIf  
EndProcedure

;Mise à jour d'un enregistrement
Procedure UpdateRecord()
  AA =Mid(GetGadgetText(#Date),7,4)
  MM = Mid(GetGadgetText(#Date),4,2)
  JJ = Mid(GetGadgetText(#Date),1,2)

  ReqSql="update matable set "
  ReqSql + "date='" + AA+MM+JJ +"',"
  ReqSql + "memo='" + ReplaceString(GetGadgetText(#Memo), "'", "''") + "'"
  ReqSql + "where idtable=" + GetGadgetText(#Idtable)
  
  If DatabaseUpdate(#Database, ReqSql) <>0  
    ListeRecords()
    MessageRequester(ApplicationTitle,"Enregistrement modifié")
    ModeUpdate=2
  Else
    Errors(2)
  EndIf 
EndProcedure

;Suppression d'un enregistrement
Procedure DelRecord()
  ReqSql = "delete from matable where idtable = "+ Str(GetGadgetItemData(#Vision, GetGadgetState(#Vision)))
  
  If DatabaseUpdate(#Database, ReqSql) <>0 
    NewRecord() 
    ListeRecords()
    MessageRequester(ApplicationTitle,"Enregistrement supprimé")
  Else
    Errors(2)
  EndIf
EndProcedure

Procedure MainFormShow()
  OpenWindow(#Mainform, 0, 0, 760, 300, ApplicationTitle)
  ListIconGadget(#Vision, 20, 50, 300, 230, "Date", 80,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
  AddGadgetColumn(#Vision, 1, "Mémo", 215)

  TextGadget(#Idtable, 550, 50, 80, 22, "")
  DateGadget(#Date, 350, 50, 110 , 24)   
  EditorGadget(#Memo, 350, 80, 300, 200)  
    
  SetActiveGadget(#Memo)
  
  ButtonGadget(#Btn_New, 670, 50, 80, 22, "Nouveau")
  ButtonGadget(#Btn_Update, 670, 75, 80, 22, "Enregistrer")
  ButtonGadget(#Btn_Del, 670, 100, 80, 22, "Supprimer")
  
  ModeUpdate=1 ;Mode Création à l'ouverure de l'application
EndProcedure

MainFormShow()

;Création de la base de données si inexistant 
If Not ReadFile(#Database, Database)
  DatabaseCreate()
Else
  CloseFile(#Database)
EndIf 

;Ouverture de la base de données 
DatabaseOpen()

;Montre les mémos
ListeRecords()

;Analyse des évenements
Repeat
  Select WaitWindowEvent()
     Case #PB_Event_CloseWindow
       Select EventWindow() 
         Case  #MainForm
           End
       EndSelect     
      
    Case #PB_Event_Gadget
      Select EventGadget()  
        Case #Vision
          ViewRecord()
          
        Case #Btn_New ;Nouveau mémo
          NewRecord()
          
        Case #Btn_Del ; Suppression d'un mémo
          If ModeUpdate=2
            DelRecord()
          Else
            NewRecord()
          EndIf
            
        Case #Btn_Update ;Ajout ou modification d'un mémo 
          Select ModeUpdate
              Case 1 ;Ajout 
                AddRecord()
                
              Case 2 ;Mise à jour
                UpdateRecord()
                
            EndSelect            
      EndSelect       
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: masque de saisie et sqlite

Message par Patix »

Merci

je vais étudier cela de près :)
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: masque de saisie et sqlite

Message par flaith »

Patix a écrit :Oui ça je sais faire le masque est bon mais ou je me plante c'est l'écriture du Dategadget dans la base sqlite !

C'est commande ou le format que j'utilise qui n'est pas bon !
L'exemple que tu nous donnes n'est pas bon car tu utilise GetGadgetText alors que tu dois utiliser GetGadgetState associé avec la fonction FormatDate, le résultat te donne une chaine de caractère que tu peux aisément insérer via ta requête sqlite :wink:
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: masque de saisie et sqlite

Message par Patix »

Bonsoir,

Je reviens à la charge.

Mon champ est au format date. Quel est la commande purebasic pour insérer une date avec en utilisation le DateGadget.

Je n'y arrive pas ! Je ne comprends pas en quel format je dois le mettre !
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: masque de saisie et sqlite

Message par falsam »

Par défaut, les types Date et DateTime n'existe pas sous Sqlite http://www.sqlite.org/datatype3.html#datetime

Comme tu as pu le voir dans le code que j'ai fourni, le champ date de la base de données est au format TEXT

Code : Tout sélectionner

ReqSql = "CREATE TABLE MaTable (idtable INTEGER PRIMARY KEY, date TEXT, memo TEXT)"
Dans ta fenêtre je suppose que tu as un champ Dategadget comme l'exemple ci-dessous.

Code : Tout sélectionner

DateGadget(#Date, 350, 50, 110 , 24)  
Comment maintenant enregistrer cette date dans ta base.
:arrow: La méthode la plus simple :
le champ Date de ta base SQLite sera = GetGadgetText(#Date)

Une méthode plus traditionnel consiste à enregistrer cette date au format AAAAMMJJ (AAAA : Année , MM : Mois, JJ : Jour)

Au préalable tu déclares les variable AA MM JJ

Code : Tout sélectionner

;Description de la date
Global AA.s, MM.s, JJ.s
L'instruction Mid (Mid(Chaine$, PositionDepart [, Longueur])
) extrait une chaîne de longueur Longueur à partir du caractère situé à la position PositionDepart.

GetGadgetText(#Date) retourne la date au format JJ/MM/AAAA
AAAA se trouve en position 7 sur une longueur de 4
MM se trouve en position 4 sur une longueur de 2
JJ se trouve en position 1 sur une longueur de 2

Code : Tout sélectionner

AA =Mid(GetGadgetText(#Date),7,4)
  MM = Mid(GetGadgetText(#Date),4,2)
  JJ = Mid(GetGadgetText(#Date),1,2)
Le champ Date de ta base SQLite sera = AA+MM+JJ

Exemple dans le code ci-dessous

Code : Tout sélectionner

ReqSql = "insert into matable (date, memo) values ('"
  ReqSql + AA+MM+JJ + "','"
  ReqSql + ReplaceString(GetGadgetText(#Memo), "'", "''")+"')" 
L’avantage de cette méthode est de pouvoir créer un index sur le champ date :)


L'exemple que j'ai posté traite de la création de la modification et de la suppression d'un enregistrement SQLite contenant une donnée au format date. Récupére ce code et enregistre le avant de l’exécuter.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre