[résolu] Planning en ordre chronologique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[résolu] Planning en ordre chronologique

Message par Micoute »

Bonjour à tous,

je souhaiterais faire un planning, mais je n'arrive pas à le mettre en ordre chronologique.

Il ne doit afficher que les rendez-vous dont la date est à venir exclusivement.

Code : Tout sélectionner

DisableDebugger
; Enumerations / DataSections
Enumeration
   #Fenetre_principale
   #Base_de_donnees
EndEnumeration

Enumeration   
   #Liste
   #Bouton_Quitter
EndEnumeration

Structure Rdv
   Quand.s
   Qui.s
   AvecQui.s
   Ville.s
   Heure.s
   Duree.s
   Note.s
EndStructure

Global NewList Rdv.Rdv()
;Application 
Global TitreApplication.s="Planning"

;Base_de_donnees
Global Base_de_donnees.s = "D:\Programmation\Compil\Planning.Sqlite"
Global.s Table = "Rdv", ReqSql = ""
Global.i NbRdv = 0 

; Déclarer les variables
Global.s Date_Quand, Qui, AvecQui, Ville, Heure, Duree, Note

UseJPEGImageDecoder()
UseSQLiteDatabase()

Procedure CentrerTitreFenetre(TitreFenetre.s, NumeroFenetre)
   Protected NCM.NonClientMetrics, ValeurRetournee, DcSauve, AncObjet
   Protected hFonteConsole, HdcCourant, TailleTs.SIZE
   Protected Espace_a_remplir, RectFenetre.Rect, NbrEspaceDemandes
   
   NCM\cbSize = SizeOf(NCM)
   ValeurRetournee = SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, 0, @NCM, 0)
   hFonteConsole = CreateFontIndirect_(@NCM\lfCaptionFont)
   If hFonteConsole <> 0
      HdcCourant = GetDC_(WindowID(NumeroFenetre))
      DcSauve = SaveDC_(HdcCourant)
      AncObjet = SelectObject_(HdcCourant, hFonteConsole)
      ValeurRetournee = GetWindowRect_(WindowID(NumeroFenetre), @RectFenetre)
      ValeurRetournee = GetTextExtentPoint32_(HdcCourant, @TitreFenetre, Len(TitreFenetre), @TailleTs)
      Espace_a_remplir = RectFenetre\right - RectFenetre\left - 4 * NCM\iCaptionWidth - TailleTs\cx
      ValeurRetournee = GetTextExtentPoint32_(HdcCourant, " ", 1, @TailleTs)
      NbrEspaceDemandes = (Espace_a_remplir / TailleTs\cx)/2
      If NbrEspaceDemandes > 0
         TitreFenetre = Space(NbrEspaceDemandes) + TitreFenetre
      EndIf    
   EndIf
   ValeurRetournee = SetWindowText_(WindowID(NumeroFenetre), TitreFenetre)
   ValeurRetournee = RestoreDC_(HdcCourant, DcSauve) ; mettre en ordre
   ValeurRetournee = DeleteObject_(hFonteConsole)
   ReleaseDC_(WindowID(NumeroFenetre), HdcCourant)  
EndProcedure

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

Procedure DatabaseOpen()
   If OpenDatabase(#Base_de_donnees, Base_de_donnees, "", "", #PB_Database_SQLite)
   Else
      Erreurs(1)
      End      
   EndIf
EndProcedure

Procedure ViewRecord()
   ReqSql = "SELECT * FROM " + Table
   If DatabaseQuery(#Base_de_donnees, ReqSql) <> 0
      While NextDatabaseRow(#Base_de_donnees)         
         
         AddElement(Rdv())  
         Rdv()\Quand = Left(GetDatabaseString(#Base_de_donnees, 1),2)+"/"+Mid(GetDatabaseString(#Base_de_donnees, 1),3,2)+"/"+
                                                                                                                       Right(GetDatabaseString(#Base_de_donnees, 1),4)
         Rdv()\Qui = GetDatabaseString(#Base_de_donnees, 2)
         Rdv()\AvecQui = GetDatabaseString(#Base_de_donnees, 3)
         Rdv()\Ville = GetDatabaseString(#Base_de_donnees, 4)
         Rdv()\Heure = GetDatabaseString(#Base_de_donnees, 5)
         ;EndIf
      Wend
      
      FinishDatabaseQuery(#Base_de_donnees)
   Else
      Erreurs(2)
   EndIf
EndProcedure

Procedure Ouvrir_Fenetre_principale()
   If OpenWindow(#Fenetre_principale, 0, 0, 675, 330, "", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
      CentrerTitreFenetre(".:LISTE RDV Par Michel Lye © 30/05/2013:.", #Fenetre_principale)
      
      ListIconGadget(#Liste, 0, 0, 675, 250, "Nom", 200,
                     #PB_ListIcon_FullRowSelect)
      AddGadgetColumn(#Liste, 1,"Rdv le", 70)
      AddGadgetColumn(#Liste, 2,"avec", 200)
      AddGadgetColumn(#Liste, 3, "où", 150)
      AddGadgetColumn(#Liste, 4, "heure", 50)
      
      ButtonGadget(#Bouton_Quitter, 297, 280, 80, 30, "Quitter")
   EndIf
EndProcedure

;Création de la base de données si inexistante 
If Not ReadFile(#Base_de_donnees, Base_de_donnees)
   MessageRequester("ATTENTION", "Votre base de données" + Base_de_donnees + #CRLF$ + "n'existe pas !", #MB_ICONWARNING)
Else
   CloseFile(#Base_de_donnees)
EndIf 

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

;Lire la base de données
ViewRecord()

Ouvrir_Fenetre_principale()

;Trier la liste dans l'ordre chronologique
SortStructuredList(Rdv(), #PB_Sort_Ascending, OffsetOf(Rdv\Quand), #PB_Sort_String)

;Analyser les données et les ajouter à la liste si elle correspondent à nos critères
ForEach rdv()
   Aujourdhui = Date(Year(Date()), Month(Date()), Day(Date()), 0, 0, 0)
   difference =(Date(Val(Right(Rdv()\Quand,4)), Val(Mid(Rdv()\Quand, 4, 2)), Val(Left(Rdv()\Quand,2)), 0, 0, 0)-Aujourdhui)/86400
   
   If difference >= 0
      NbRdv + 1
      Texte.s = Rdv()\Qui + #LF$ + Rdv()\Quand + #LF$ + Rdv()\AvecQui + #LF$ + Rdv()\Ville + #LF$ + Left(Rdv()\Heure, 2)+" h " + 
                Right(Rdv()\Heure, 2)
      AddGadgetItem(#Liste, -1, Texte)
   EndIf  
Next

;- Boucle
;{- Boucle d'événements
Repeat 
  Event = WaitWindowEvent() 
  Select Event 
    Case #PB_Event_Gadget 
      EventGadget = EventGadget() 
      EventType = EventType() 
      If EventGadget = #Bouton_Quitter 
        CloseWindow(#Fenetre_principale) 
        Break          
      EndIf 
    Case #PB_Event_CloseWindow 
      EventWindow = EventWindow() 
      If EventWindow = #Fenetre_principale 
        CloseWindow(#Fenetre_principale) 
        Break 
      EndIf 
  EndSelect 
ForEver 
Je vous remercie d'avance pour vos réponses !
Dernière modification par Micoute le ven. 21/juin/2013 14:33, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Planning en ordre chronologique

Message par G-Rom »

Pour ranger des dates dans l'ordre chronologique , c'est facile , un date en informatique c'est un "timestamp" , un integer , a partir de là et d'une liste chainée , tu peu effectuer un tri et mettre dans l'ordre que tu veut.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Planning en ordre chronologique

Message par falsam »

Une autre méthode consiste à SÉLECTIONNER et TRIER via une requête SQL tous les rendez vous à partir d'une date donnée.

Un peut de code :
■ Création d'une base de donnée succincte composée d'une table de rendez vous (Date et avec qui)

■ Ajout d'un jeu de données composé de 5 rendez vous dont 2 sont datés du 21 Juin.

■ On liste tous les rendez vous afin de controler que notre jeu est bon.
■ On liste que les rendez vous à partir du 21 juin (L'objectif de ta demande)

Code : Tout sélectionner

UseSQLiteDatabase()

If OpenDatabase(0, ":memory:", "", "")
    Debug "Connected"
    
    ;Création de la base de données en mémoire 
    ReqSql$ = "CREATE TABLE rdv("+
                "date DATETIME," +
                "qui VARCHAR(50)" +
               ");"
    
    DatabaseUpdate(0, ReqSql$)       
    Debug DatabaseError()
    
    
    ;Création d'un jeu de données 
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 01, 14, 30, 00) + "','La pluie')")
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 20, 16, 20, 00) + "','Toujours la pluie')")
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 21, 20, 00, 00) + "','Fete de la musique')")
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 21, 22, 30, 00) + "','Au bistrot')")
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 21, 23, 00, 00) + "','la fete continue')")
    DatabaseUpdate(0, "insert into rdv (date, qui) values('" + Date(2013, 06, 22, 06, 00, 00) + "','Sous ma couette')")
    
    ;Affichons tous les rdv
    Debug "Affichage de toutes les données"
    DatabaseQuery(0, "SELECT * FROM rdv")
    While NextDatabaseRow(0)
        Debug "Date"+ FormatDate("%dd/%mm/%yyyy - %hh:%ii", GetDatabaseLong(0, 0)) + " avec " + GetDatabaseString(0, 1)
    Wend
    Debug ""
    
    ;Affichons que les rdv à partir du 21 Juin trié dans l'ordre ASCendant
    Debug "Affichage des rendez vous à partir du 21 juin "
    DatabaseQuery(0, "SELECT * FROM rdv WHERE date >="+Date(2013, 06, 21, 00, 00, 00) + " ORDER BY date ASC")
    While NextDatabaseRow(0)
        Debug "Date"+ FormatDate("%dd/%mm/%yyyy - %hh:%ii", GetDatabaseLong(0, 0)) + " avec " + GetDatabaseString(0, 1)
    Wend
    
Else
    Debug DatabaseError()   
EndIf
De manière plus générale pour avoir les rendez vous à venir, remplaces

Code : Tout sélectionner

DatabaseQuery(0, "SELECT * FROM rdv WHERE date >="+Date(2013, 06, 21, 00, 00, 00) + " ORDER BY date ASC")
par

Code : Tout sélectionner

DatabaseQuery(0, "SELECT * FROM rdv WHERE date >="+Date() + " ORDER BY date ASC")
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%
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Planning en ordre chronologique

Message par G-Rom »

Code : Tout sélectionner

Structure sRendezVous
  mTimeStamp.l  
  mName.s
EndStructure

Global NewList planning.sRendezVous()


Procedure AddRendezVous(name.s, day.i, month.i, year.i, hour.i, minute.i)
  
 Protected timeStamp.l = Date(year,month,day,hour,minute,0)
   
 If timeStamp > Date() 
  AddElement(planning())
    planning()\mName      = name
    planning()\mTimeStamp = timeStamp
    
    
    SortStructuredList(planning(),#PB_Sort_Ascending, OffsetOf(sRendezVous\mTimeStamp) ,#PB_Sort_Long)
 EndIf 
  
EndProcedure


;
; On ajoute des rdv
;
For year = 2013 To 2015
  For month = 1 To 12
    AddRendezVous("Versement salaire",31,Month,year,12,00)
  Next 
Next 

AddRendezVous("Licenciement",31,1,2016,00,00)

For i = 0 To 50
  AddRendezVous("Rdv factice avec ...",Random(28,1),Random(12,1),Random(2016,2013),Random(23,0),00)
Next 

;
; On les affiches
;

ForEach planning()
  
  Debug "--"
  Debug "PLANNING : " + planning()\mName
  Debug "--"
  Debug "Le "+Str( Day(planning()\mTimeStamp) )+"/"+Str( Month(planning()\mTimeStamp) )+"/"+Str( Year(planning()\mTimeStamp) ) 
  Debug "--"
  Debug "" 
  
Next 
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Planning en ordre chronologique

Message par Ar-S »

Code : Tout sélectionner

AddRendezVous("Licenciement"
:mrgreen: :mrgreen: :mrgreen:
~~~~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
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Planning en ordre chronologique

Message par Micoute »

Merci beaucoup pour vos réponses, ça fonctionne comme ça aurait dû dès le début, alors merci encore !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre