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 :

Faire une somme d'heures au format VARCHAR


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut Faire une somme d'heures au format VARCHAR
    Bonjour,

    Sous Delphi 7 et Firebird j'ai un champ FEUDUREECHANTIER d'une table FEU qui donne par fiche de pointage journalière le temps passé sur un chantier.

    Ce champ est au format VARCHAR alimenté donc par des heures formatées (--:--) par un TMaskEdit.

    J'aimerais arriver à faire la somme des heures passées sur chaque chantier. Existe il un moyen de faire la somme de ces heures par chantier?

    D'avance merci

    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Question bête: pourquoi as-tu stocké des heures en VARCHAR ?
    Ne peux-tu modifier ce temps et le basculer en numérique ? Stockage en heures ou minutes ou heures décimales.
    Il me semble que ta gestion en sera nettement simplifiée.

    @+ Claudius

  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    IL existe bien évidemment de multiples solutions :
    1/ tu récupères tes 'varchar' dans ton prog, tu les transformes en mnet puis tu fais la somme.
    2/ tu fais la manip. avec une requète SQL mais là ça dépend de ta base.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonsoir à tous,

    Pour Claudius: avec le recule je reconnais que c'est une erreur mais c'était pour une facilité de saisie et d'affichage. Erreur que je peux encore corriger mais ça implique que je reprenne le code de toute la saisie et je ne maitrise pas trop la gestion des heures, je l'avoue!!

    En fait sur mon formulaire de pointage journalier j'ai mis quatre TMaskEdit correspondant à:
    Heure départ dépôt
    Heure arrivée chantier
    Heure départ chantier
    Heure arrivée dépôt

    Le but étant de voir chaque jour les temps passés en trajet et sur le chantier et de faire la somme par chantier des temps trajets et chantier.

    Donc pour faciliter la saisie les TMaskEdit ont le format (--:--) et enregistré comme tel dans le champ FEUDUREECHANTIER pour ce qui concerne les chantiers.

    En numérique je ne sais pas comment faire pour les afficher dans mon form?

    pour philnext:
    tu récupères tes 'varchar' dans ton prog, tu les transformes en mnet puis tu fais la somme
    Si tu peux m'expliquer comment je les transforme en mn et pour les intégre dans une requête SELECT SUM? ma base de données est une base Firebird.

    D'avance merci

    Cordialement

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Ouvre un nouveau project et ajout 3 TEDit et un button1.
    Cet exemple montre la soustraction d'une heure.
    Colle ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.Button1Click(Sender: TObject);
    var time1,time2:TTime;
    begin
    time1:=StrToTime(Edit1.Text);
    time2:=StrToTime(Edit2.Text);
    Edit3.Text:=TimeToStr(time1-time2);
    end;
    Les heurs que tu rentre doivent être du format "HEUR:MIN:SEC"
    par exemple si tu entre dans Edit1 : 11:00:00 et dans edit 2 tu entre :1:00:00
    tu obtiens 10:00:00;

    Bon courage !

    psour transformer des Int en String, tu fait : IntToStr(Ta valeur);

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    merci pour ta réponse, mais ça c'est fait. le problème est que je stocke mais heures en varchar dans ma BDD.

    Il faudrait que je les stocke en numérique pour pouvoir les additionner, en tenant compte des 24 heures naturellemeny, et là je bute.
    Dans ma base je dois stocker quoi? Du numérique ou du Time.

    Cordialement

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut
    Citation Envoyé par codial Voir le message
    Dans ma base je dois stocker quoi? Du numérique ou du Time.
    Du numérique, ainsi tu pourras facilement faire des calculs sur les données: Cumul, Moyenne, ...

    A toi de choisir l'unité: Heure ou Minute.

    @+ Claudius

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour Claudius,

    c'est à dire que je dois transformer ma saisie 07:30 en minutes ?

    As tu un lien explicatif, parce que je suis un peu perdu là?

    Cordialement

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Re,
    Citation Envoyé par codial Voir le message
    c'est à dire que je dois transformer ma saisie 07:30 en minutes ?
    Oui c'est cela.
    Tu stockes dans ta base la valeur en minutes soit 450 (7 * 60 + 30), ou bien en heures soit 7,5.

    Citation Envoyé par codial Voir le message
    As tu un lien explicatif, parce que je suis un peu perdu là?
    Non je n'ai pas de lien sous la main, mais la gestion des heures n'est pas très compliquée en soit.

    @+ Claudius

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Merci Claudius pour les explications, je vais tester tout celà et si besoin je reviens

    Cordialement

  11. #11
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Pour l'occasion, j'ai fais une petite application qui convertit les heures en Minutes et l'inverse aussi. Pour te donner une idée de se que ça donne, tu peux essayer histoire de voir si c'est bien ce que tu souhaites :

    Telechargement de l'application :
    http://georges86.free.fr/Prog/Conver...ertirHeure.exe

    Et voici le dossier zippé avec le project :
    http://georges86.free.fr/Prog/Conver...rtirHeures.zip


    Sinon, si jamais un jour le lien est Mort, voici le code,
    Alors sur une form, il faut Un maskEdit1 avec un masque "HeureCourte" un maskEdit2, un Edit1 et un Edit2 et Un Button1, Un Button2
    Et voici le 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
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    procedure TForm1.Button1Click(Sender: TObject);
    //Déclaration des différentes variables
    var HeuresSaisie,MinuteSaisie,HeureConvertie:Integer;
    begin
    {On vient récupérer les informations saisies dans le TMaskEdit}
    HeuresSaisie:=StrToInt(Copy(MaskEdit1.Text,1,2));//Copy 2 caractères à partir du caractère 1
                                                     //Donc on prend les HEURES
    MinuteSaisie:=StrToInt(Copy(MaskEdit1.Text,4,2));//Copy 2 caractères à partir du caractère 4
                                                     //Donc on prend les Minutes
    HeureConvertie:= (HeuresSaisie*60+MinuteSaisie); //Calcul des heures en Minutes
    Edit1.Text:=IntToStr(HeureConvertie);            //Affichage du résultat dans Edit1.text
    {Si tu veux insérer ce nombre dans ta bdd, il te suffit d'utiliser la variable ''HeureConvertie''
    qui est en Integer}
    end;
     
     
     
     
     
    procedure TForm1.Button2Click(Sender: TObject);
    var NombreAConvertir,PositionVirgule,TailleHeure:Integer;
        TransformationMinutesEnHeures,ChiffreApresVirgule,MinutesConvertie:Real;
    begin
    {NombreAConvertir Correspond au chiffre de ta bdd}
    NombreAConvertir:=StrToInt(Edit2.Text);//Convertion du Contenu du TEdit en Integer.
    {Ici, on vient Convertir le Nombre de ta base en Heure}
    TransformationMinutesEnHeures:= (NombreAConvertir/60);
    {On vient compter la longeur du chiffre qui est contenu
    dans la variable TransformationMinutesEnHeures}
    TailleHeure:=Length(FloatToStr(TransformationMinutesEnHeures));
    {On Vient Compter en quel position ce trouve la Virgule du chiffre
    Qui est contenu dans la même variable}
    PositionVirgule:=Pos(',',FloatToStr(TransformationMinutesEnHeures));
    {On vient Maintenant Prendre Tout les chiffres qui sont après la virgule
    et qui coresponde donc au Minute Mais au format Heure Exemple : 1,25 Heure donne 1H15minute}
    ChiffreApresVirgule:=StrToFloat(Copy(FloatToStr(TransformationMinutesEnHeures),PositionVirgule,TailleHeure-(PositionVirgule-1)));
    {On Convertit Donc Nom Minute "Heure" en véritable Minutes"}
    MinutesConvertie:=SimpleRoundTo((chiffreApresVirgule*60),0);
     
    {On vient Vérifier la présence d'une virgule en Utilisant le
    résultat de la variable PositionVirgule, si PositionVirgule=0 ça
    veut dir qu'il n'y à pas de virgule}
    If PositionVirgule>0 then begin
       {On vient Compter combien de chiffre nous avons pour les Heures
       SI on à Un seul chiffre, il faut penser à ajouter le 0 devant exemple :
       7H = 07H}
       if Length(Copy(FloatToStr(TransformationMinutesEnHeures),1,PositionVirgule))-1=1 then begin
         {Ajout d'un 0, puis ajout du chiffre qui est avant
         la virgule, Ajout du séparateur ':' puis ajout des minutes converties}
         MaskEdit3.Text:='0'+(Copy(FloatToStr(TransformationMinutesEnHeures),1,PositionVirgule-1))+':'+FloatToStr(MinutesConvertie);
          end
       else begin
         {Si Nous avons deux chiffres, avant la virgule, Nous
         Ajouton Tout les chiffres qui sont avant la virgule
         grace à Copy(), Puis on ajoute le séparateur ':'
         Puis on fini par ajouter les minutes}
         MaskEdit3.Text:=Copy(FloatToStr(TransformationMinutesEnHeures),1,PositionVirgule-1)+':'+FloatToStr(MinutesConvertie);
         end
       end
     
    {Si nous n'avons pas de virgule, nous ajouton donc le chiffre Unique}
    Else Begin
       {On vient Compter combien de chiffre nous avons pour les Heures
        Si on à qu'un seul chiffre, on vient Ajouter un 0 devant les heures
        et on vient rajouter les 00 pour les minutes}
       if Length (FloatToStr(TransformationMinutesEnHeures))=1 then begin
          MaskEdit3.Text:='0'+FloatToStr(TransformationMinutesEnHeures)+':'+'00';
          end
       else begin
       {Si On à Deux chiffres ou plus,Nous
        Ajouton Tout les chiffres qui sont avant la virgule
        Comme precedement}
          MaskEdit3.Text:=FloatToStr(TransformationMinutesEnHeures)+':'+'00';
          end;
       end;
    end;
    Voila, j'éspère avoir été Utile, c'est pas souvent que j'arrive à aider quelqu'un, alors j'éspère que je ne tape pas hors sujet...

    Bonne Prog à tous !

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Non, tu n'es pas hors sujet. J'ai suivi les conseils de Claudius et j'ai mis mes champ en numérique.
    J'ai testé ton prog cette nuit mais il me semble qu'il y ait un problème. En effet, par exemple si je tape 17:55 j'ai bien comme résultat 1075 mais quand je veux convertir le nombre en heure j'obtiens 67:00.

    Perso je ne suis pas resté inactif et j'ai étudié le problème de mon coté hier après midi et j'ai écrit une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function TForm1.ConvertMn(Extr:String):Integer;
    var t1,t2:Integer;
    begin
      t1:=StrToInt(copy(Extr,1,2));
      t2:=StrToInt(copy(Extr,4,2));
      Result:=(t1*60) + t2;
    end;
    que j'appelle par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    var time1,time2, time3 :TTime;
    begin
        Edit2.Text:=IntToStr(ConvertMn(Edit1.Text));
    end;
    Pour restituer l'heure j'ai utiliser la fonction format :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TForm1.Button2Click(Sender: TObject);
    var ElemCount:Integer;
    begin
      ElemCount:=StrToInt(Edit2.Text)  ;
      Edit4.Text:= Format('%.2d',[ElemCount DIV 60]) + ':' + Format('%.2d',[ElemCount mod 60]);
    end;
    et ça semble bien fonctionner.

    Il me reste à voir pour les jours.

    Si quelqu'un peut me dire si on peut l'affiner, je suis preneur

    En tout cas merci pour le coup de main.

    Cordialement

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par codial Voir le message
    Il me reste à voir pour les jours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function IntTimeToStr(Value: Integer): string;
    var
      J, H, M: Integer;
    begin
      J := Value div (24 * 60);
      Value := Value mod (24 * 60);
      H := Value div 60;
      M := Value mod 60;
      if J > 0 then
        Result := Format('%dj %.2d:%.2d', [J, H, M])
      else
        Result := Format('%.2d:%.2d', [H, M])
    end;
    Voilà !

    @+ Claudius

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    merci Claudius pour le code.

    Et encore merci à Jojo86.

    Amicalement

    Codial

  15. #15
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    J'ai amélioré légèrement le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    function IntTimeToStr(const Value: Integer): string;
    var
      J, H, M: Integer;
    begin
      J := Value div MinsPerDay;
      H := (Value mod MinsPerDay) div MinsPerHour;
      M := Value mod MinsPerHour;
      if J > 0 then
        Result := Format('%dj %.2d:%.2d', [J, H, M])
      else
        Result := Format('%.2d:%.2d', [H, M])
    end;

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    ok, merci. On ne connait vraiment pas toutes les constantes!

    Cordialement

    Codial

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

Discussions similaires

  1. Faire une somme d'heures au format VARCHAR (Suite)
    Par codial dans le forum Bases de données
    Réponses: 9
    Dernier message: 02/03/2008, 11h59
  2. Probleme pour faire une somme sous Excel
    Par Nicolas92 dans le forum Excel
    Réponses: 5
    Dernier message: 02/12/2005, 11h38
  3. Probleme pour faire une somme dans header ??
    Par snoop57 dans le forum Access
    Réponses: 7
    Dernier message: 01/12/2005, 13h40
  4. filtrer saisies et faire une somme globale
    Par mcellier dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/09/2005, 17h00
  5. faire une somme dans un état
    Par PAINCO dans le forum Access
    Réponses: 1
    Dernier message: 23/06/2005, 19h41

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