IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

création d'enregistrements correspondant aux jours


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 016
    Points : 308
    Points
    308
    Par défaut création d'enregistrements correspondant aux jours
    Hello,

    J'ai une table paradox.

    Je voudrais que le programme cré une suite d'enregistrements correspondant à tous les jours de l'année en respectant le nom du jour, le nombre de jour dans le mois et les années bisextiles et en reprenant la ou la table s'était arretée.


    exemple :

    Si le dernier enregistrement de la table était le Mecredi 31 Décembre 2003
    le programme devra créé a partir de

    Jeudi 1 Janvier 2004
    Vendredi 2 Janvier 2004
    etc...
    jusqu'au Vendredi 31 Décembre 2004

    Je voudrais que les enregistrements soient toujours classés par date, la plus ancienne étant l'enregistrement n°1 et le comptage étant ascendant vers l'enregistrement le plus réscent.

    Je vois plus ou moins comment faire un tableau de dates, j'avais écrit un truc comme ca pour écrire dans un stringgrid

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    procedure xxxxxxxxxxxxxxxxxxxxxxxx (Sender: TObject);
    Var
     
      ADate: Double;
      TempoDate: Double;
      days: array[1..7] of string;
      i:Integer;
     
    begin
      days[1] := 'Dimanche';
      days[2] := 'Lundi';
      days[3] := 'Mardi';
      days[4] := 'Mercredi';
      days[5] := 'Jeudi';
      days[6] := 'Vendredi';
      days[7] := 'Samedi';
     
      ADate:=MonthCalendar1.date;
      for i:=-11 to 11 do begin
         TempoDate:=ADate+i;
    end;
    end;
    Mais je ne sais pas comment adapter cela a une écriture dans une BD.
    Je suppose que je devrais construire chaque fois la date en la mettant dans de DBEDIT et puis en validant chaque rec, mais je ne sais pas ou dans le code et comment implenter ca.

    En fait pour être franc je ne comprends pas tout dans la création des tableaux et le code ci dessu n'est plus très clair pour moi, si kelkun se sent le courrage de l'expliquer ce serait cool

  2. #2
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    procedure AjouteAnnee;
    var d : TDateTime; annee : integer;
      function YearOf(adate : TDateTime) : integer;
      begin
        result := IntToStr(formatdatetime('YYYY', adate));
      end;
    begin
      // T est la table, contenant un champ "LeJour" de type date
      T.Open;
      T.Last;
      d := T.FieldByName('LeJour').AsDateTime + 1;
      annee := YearOf(d) + 1;
      While YearOf(d) < annee do 
      begin
         T.append;
         T.FieldByName('LeJour').AsDateTime := d;
         T.Post;
         d := d + 1;
      end;
      T.Close;
    end;
    En ce qui concerne la représentation d'une date, elle dépend uniquement du format utilisé (voir formatdatetime, et displayformat) ; on peut mettre le nom du jour de la semaine (dddd) ou le nom du mois (mmmm) etc .

  3. #3
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut
    Salem,

    j'ai un peu transformé le code de "CMen", mais ça fait presque la même chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    procedure AjouteUneAnnee;
     var d : TDateTime;
     var LastDate_Plus_1Year : TDateTime;
    begin
      // T est la table, contenant un champ "LeJour" de type date
      T.Open;
      T.Last;
      d := T.FieldByName('LeJour').AsDateTime + 1;
      LastDate_Plus_1Year := d + 365 ;
      while (d < LastDate_Plus_1Year) do
       begin
         T.Append;
         T.FieldByName('LeJour').AsDateTime := d;
         T.Post;
         d := d + 1;
       end; // while
      T.Close;
    end;
    Bon courage, @ ciao bonsoir!
    --------------
    Mettre le Tag est aussi une aide aux développeurs

  4. #4
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 016
    Points : 308
    Points
    308
    Par défaut Je ne comprends pas ce code !
    Je ne comprends pas le bout de code et lorsque je l'execute dans Delphi, j'ai des messages d'erreur :

    [Error] Unit1.pas(27): There is no overloaded version of 'IntToStr' that can be called with these arguments

    [Error] Unit1.pas(33): Statement expected, but expression of type 'Integer' found

    1/ Je ne vois pas ou dans ce morceau de code, le programme lie une BD pour voir quel est la date du dernier enregistrement.

    2/ Je comprends bien qu'on met dans "résult" sour forme de string la date au format jj/mm/yyyy, mais après ca devient obscure pour moi. En fait je ne comprends pas la portin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    T.Open; 
      T.Last; 
      d := T.FieldByName('LeJour').AsDateTime + 1; 
      annee := YearOf(d) + 1; 
      While YearOf(d) < annee do 
      begin 
         T.append; 
         T.FieldByName('LeJour').AsDateTime := d; 
         T.Post; 
         d := d + 1; 
      end; 
      T.Close;
    Séparément je comprends plus ou moins les instructions (et j'aurais qu'a aller dans l'aide si non), mais je ne comprends pas ce que cette suite est sensée faire. D'autant que je ne vois pas des strings contenant les mots LUNDI, MARDI,... pourant il faut bien les donner à Delphi pour qu'il puisse les coller sur les bonnes dates non ?

    3/ Finalement je ne vois aucune trace d'écriture dans une BD.

    Donc en fait je me dis que j'ai peut être mal exprimé ma question, je reformule :

    Voila ce que je veux arriver à faire

    J'ai une table paradox.
    1 Je click sur générer année
    2 --> le programme regarde quel est le dernier enregistrement de la table.
    dison que c'est le MERCREDI 31 Décembre 2003.
    3 --> le programme cré le jour suivant (JEUDI 1 Janvier 2004)
    4 --> le programme cré un nouvel enregistrement et place dans des champs différents les valeur JEUDI, 11, JANVIER ET 2004.
    Le programme retourne auatant de X que nécéssaire à la ligne 3 pour créer tous les jours de l'année.

    Créer la table paradox pas de problème.
    Créer le bouton pas de problème.
    Faire que le PRG regarde le dernier enregistrement pas de problème.

    ENSUITE, COMMENT faire :
    Pour que les jours s'ajoutent en tenant compte des années bisextiles, des mois de 31 ou 30 jours.
    Comment faire pour que les jours en lettre (LUNDI, MARDI,...) soient générés et associés aux bonnes dates.

    Pour que le programme s'arrète en fin d'année le plus simple serait que je teste que la date créé est le 31 Décembre non ?

    Pour écrire chaque date dans la base je vois aussi comment faire.

    Mon problème est donc bien de créer une boucle qui me donnerait (à chaque incrémentation de la boucle) dans des STRING séparés les données pour remplir ma table (a savoir STRING1:jour en lettre, STRING2: jour(jj), STRING3: mois (mm), STRING4 : année (YYYY)

    Ma dernière question est :

    Si je cré cette table de cette manière est ce que les enregistrements resteront toujours dans l'ordre quel que soit les modif que je ferais après ? Il est fondamental pour moi que les dates restent dans l'ordre.

    Voila j'ai été un peu long mais c'est pour essayé d'être clair, aidez moi svp parceque je bloque vraiment sur ce bête truc.
    MERCI

  5. #5
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    [Error] Unit1.pas(27): There is no overloaded version of 'IntToStr' that can be called with these arguments
    Oui : erreur d'étourderie , il fallait lire StrToInt (formatdatetime renvoie l'année sous forme de chaîne)
    1/ Je ne vois pas ou dans ce morceau de code, le programme lie une BD pour voir quel est la date du dernier enregistrement.
    ...partant du prnicipe que le jour est la clé primaire de la table
    je ne vois pas des strings contenant les mots LUNDI, MARDI
    Normal : une date est stockée en "nombre de jours depuis une date de référence" Exemple : 35000 = 28/10/1995
    FormatDateTime('dddd d mmmm yyyy', cettedate) -> samedi 28 octobre 1995
    FormatDateTime('d/m/yy', cettedate) -> 28/10/95
    FormatDateTime('ddd', cettedate) -> sam

    3/ Finalement je ne vois aucune trace d'écriture dans une BD.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
         T.append; 
         T.FieldByName('LeJour').AsDateTime := d; 
         T.Post;
    Et ça, c'est quoi ?
    ENSUITE, COMMENT faire :
    Pour que les jours s'ajoutent en tenant compte des années bisextiles, des mois de 31 ou 30 jours.
    Comment faire pour que les jours en lettre (LUNDI, MARDI,...) soient générés et associés aux bonnes dates.
    Tu n'as pas à te préoccuper de cela : ajouter 1 à une date suffit à passer au jour suivant en tenant compte de tout, nb de jours du mois, jour de la semaine, année bissextile ou pas.

  6. #6
    Membre actif Avatar de Fares BELHAOUAS
    Homme Profil pro
    Développeur Flex & Java
    Inscrit en
    Mars 2002
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Flex & Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 182
    Points : 252
    Points
    252
    Par défaut
    Salem,

    Cette fonction génère une erreur :
    function YearOf(adate : TDateTime) : integer;
    begin
    result := IntToStr(formatdatetime('YYYY', adate));
    end;
    En plus elle est prédéclaré dans delphi

    c'est pas la peine de faire une implémentation, donc le code en haut devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    procedure AjouteAnnee; 
    var d : TDateTime; annee : integer; 
    begin 
      // T est la table, contenant un champ "LeJour" de type date 
      T.Open; 
      T.Last; 
      d := T.FieldByName('LeJour').AsDateTime + 1; 
      annee := YearOf(d) + 1; 
      While YearOf(d) < annee do 
      begin 
         T.append; 
         T.FieldByName('LeJour').AsDateTime := d; 
         T.Post; 
         d := d + 1; 
      end; 
      T.Close; 
    end;
    Mais il faut mettre dans les uses l'unité :

    uses DateUtils;
    Bon courage, @ ciao bonsoir!
    --------------
    Mettre le Tag est aussi une aide aux développeurs

  7. #7
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 016
    Points : 308
    Points
    308
    Par défaut ca s'éclaire mais ....
    Bon je crois que j'ai compris l'exemple mais j'ai encore des problème, voila ce que j'ai fait du code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // Table1 est la table, contenant un champ "LeJour" de type date
      Table1.Open;
      Table1.Last;
      d := Table1.FieldByName('LeJour').AsDateTime + 1;
      :arrow:  annee := YearOf(d) + 1;     
      While YearOf(d) < annee do
      begin
         Table1.append;
         Table1.FieldByName('LeJour').AsDateTime := d;
         Table1.Post;
         d := d + 1;
      end;
      Table1.Close;
    end;
    J'ai mis un composant TTAble sur la form pour pointer vers ma BD qui est
    D:\projet\bd\journal.db

    La le PRG met dans un champs de la BD (le champs "LeJour"), la date complète (jour_en_lettre, jour, mois_en_lettre, année)....
    Ce que je veux arriver à faire c'est mettre les différents composants de la date dans différents champs. (1 pour le jour en lettre, 1 pour les deux chiffres du jour, 1 pour deux chiffres pour le mois (pas en lettre) et 1 champs de 4 chiffres pour l'année).
    ....

  8. #8
    Membre averti
    Profil pro
    xxxxxxxxxxx
    Inscrit en
    Juin 2004
    Messages
    308
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : xxxxxxxxxxx

    Informations forums :
    Inscription : Juin 2004
    Messages : 308
    Points : 407
    Points
    407
    Par défaut
    Ce que je veux arriver à faire c'est mettre les différents composants de la date dans différents champs.
    Alors, il te faut créer autant de champs, et les renseigner ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    T.FieldByName('ANNEE').AsString := formatdatetime('YYYY', d);
    T.FieldByName('JOURLITT').AsString := formatdatetime('DDDD', d);
    T.FieldByName('JOUR').AsString := formatdatetime('D', d);
    T.FieldByName('MOISLITT').AsString := formatdatetime('MMMM', d);
    T.FieldByName('MOIS').AsString := formatdatetime('M', d);
    Mais je ne vois pas bien l'intérêt de stocker ces résultats dans la table, sachant qu'à partir de la seule info de type TDatetime, tous ces éléments peuvent être aisément retrouvés de la façon décrite plus haut...

  9. #9
    Membre averti
    Homme Profil pro
    aux études mais 40 ans
    Inscrit en
    Juin 2004
    Messages
    2 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : aux études mais 40 ans

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 016
    Points : 308
    Points
    308
    Par défaut la solution uttilisée testée et qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, DB, DBTables,  :arrow: DateUtils;
     
    type
      TForm1 = class(TForm)
        GroupBox1: TGroupBox;
        Button1: TButton;
        Table1: TTable;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
      d : TDateTime;
      annee : integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      // T est la table, contenant un champ "LeJour" de type date
      Table1.Open;
      Table1.Last;
      d := Table1.FieldByName('complet').AsDateTime + 1;
      annee := Yearof(d)+1;
      While YearOf(d) < annee do
      begin
         Table1.append;
          Table1.FieldByName('complet').AsDateTime := d;
          Table1.FieldByName('Lettre').AsString := formatdatetime('DDDD', d);
          Table1.FieldByName('Jour').AsString := formatdatetime('D', d);
          Table1.FieldByName('Mois').AsString := formatdatetime('M', d);
          Table1.FieldByName('Moislettre').AsString := formatdatetime('MMMM', d);
          Table1.FieldByName('Annee').AsString := formatdatetime('YYYY', d);
     
         Table1.Post;
         d := d + 1;
      end;
      Table1.Close;
    end;
     
    end.
    Il faut un composant TTable sur le form

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Enregistrement et mise à jour
    Par delcroixf dans le forum Access
    Réponses: 4
    Dernier message: 16/01/2007, 10h24
  2. création d'enregistrement sur 2 tables liées
    Par cyrillescot dans le forum Access
    Réponses: 2
    Dernier message: 15/01/2007, 08h22
  3. Date de création des enregistrements
    Par Ender dans le forum Access
    Réponses: 6
    Dernier message: 19/08/2006, 22h10
  4. Quel SGBD correspond aux fichiers à extension .DAT
    Par jcpitaud dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 12/04/2006, 20h11
  5. Réponses: 7
    Dernier message: 30/12/2005, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo