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 :

probleme de date et de recherche


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut probleme de date et de recherche
    Bonjour à tous!
    je suis entrain de faire une recherche dans une table à partir de deux dates.
    A la fin de la recherche , je dois afficher les resultats dans le Dbgrid et les montants dans des Edit .
    Au fait, je desire rechercher les entrées(somme) et les sorties(somme) d'une personne dans une table et afficher le total Entrée , Total Sortie et le Solde dans des Edit à la fin de la recherche entre deux dates;
    Mais ça ne marche pas, et il y a rien dans les Edit.
    Voici mon 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
    procedure TGestionForm.SpeedButton3Click(Sender: TObject);
    var nEntree,nSortie :variant;
    begin
      nEntree:=0; nSortie:=0;
      DM.tbDetailPerson.First;
      while not DM.tbDetailPerson.Eof do
      begin
        DM.tbDetailPerson.Locate('DATEPERS',DateInitiale.Date,[]);
        DM.tbDetailPerson.Locate('DATEPERS',DateFinale.Date,[]);
        if (FormatDateTime('dd/mm/yyyy',DM.tbDetailPersonDATEPERS.Value)=
           FormatDateTime('dd/mm/yyyy',DateInitiale.Date)) and  (FormatDateTime('dd/mm/yyyy',DM.tbDetailPersonDATEPERS.Value)=
           FormatDateTime('dd/mm/yyyy',DateFinale.Date)) then
      begin
        if (DM.tbDetailPersonDATEPERS.Value >= DateInitiale.Date)and
           (DM.tbDetailPersonDATEPERS.Value <= DateFinale.Date)and
           (DM.tbDetailPersonTYPEMVT.Value = 'ENTREE GERANT') then
      begin
        nEntree:=nEntree + DM.tbDetailPersonSOMPERS.Value;
      end;
        if (DM.tbDetailPersonDATEPERS.Value >= DateInitiale.Date)and
           (DM.tbDetailPersonDATEPERS.Value <= DateFinale.Date)and
           (DM.tbDetailPersonTYPEMVT.Value = 'SORTIE GERANT') then
      begin
        nSortie:=nSortie + DM.tbDetailPersonSOMPERS.Value;
      end;
     
      end;
        DM.tbDetailPerson.Next;
      end;
        EditEntree.Text:=FloatToStr(nEntree);
        EditSortie.Text:=FloatToStr(nSortie);
        EditSolde.Text:=FloatToStr(nEntree - nSortie);
    end;
    il ne m'affiche pas d'erreur , et pourtant il ne me donne pas ce que je veux.
    Merci pour votre aide.

  2. #2
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    c'est pas la bon solution ton code il te faut enormément de temps pour calculer tes totaux il faut utiliser les requete pour le filtrage et le calcule.

    vous ecrivez une requete pour afficher le détails
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QueryDetailPers.Close;
    QueryDetailPers.SQL.Add('SELECT * FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QueryDetailPers.ParamByName('DateInitial').Value :=DateInitiale.Date;
    QueryDetailPers.ParamByName('DateFinale').Value :=DateFinale.Date;
    QueryDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QueryDetailPers.Open;
    et une autres pour calculer le total.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QuerySumDetailPers.Close;
    QuerySumDetailPers.SQL.Add('SELECT Sum(SOMPERS) AS Total FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QuerySumDetailPers.ParamByName('DateInitial').Value :=DateInitiale.Date;
    QuerySumDetailPers.ParamByName('DateFinale').Value :=DateFinale.Date;
    QuerySumDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QuerySumDetailPers.Open;
    DateInitial,Datefinale,Mouvement sont des paramtres d'entrer.
    Attention si vous utilser access il faut formatern la date au format mm/dd/yyyy
    et vous faite la meme chose pour calculer les sortie

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    suggestion : parfois plus performant: faire travailler ton SGBD par une procédure stockèe.
    Bon code :

  4. #4
    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
    Je trouve la solution de aityahia plus générique, donc à utiliser.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    merci je vais travailler avec ce code.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    j'ai essayer le code , il y a pas d'erreur à l'execution, mais lorsque je clique sur le bouton il m'affiche une erreur de syntaxe à ce niveau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ('WHERE (DATEPERS BETWEEN :DateInitiale AND :DateFinale) AND (TYPEMVT = :Mouvement) ')
    je voudrais aussi savoir si DateInitiale et DateFinale qui sont utilisés dans cette requete sont bien les noms de mes objets DateTimepicker, aussi je ne comprends pas bien la provenance de 'Mouvement'.
    Excuser moi je connais juste un peu le sql , mais pas très bien , donc veillez m'excuser pour mes questions, je voudrais seulement comprendre le code.
    merci

  7. #7
    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
    Pour te répondre les parties avec ':' dans ta requète sont des paramètres que tu définis avec ParamByName.
    Tu as quoi comme erreur de syntaxe ?

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    voici l'erreur qui s'affiche:

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    tchimou: STP evite d'envoyer un document au format propriétaire... même si c'est permis par le forum.
    Peux tu redonner les lignes de codes de la requête précédent ton erreur?

  10. #10
    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
    A la lecture de ton erreur c'est la passagede paramètres qui n'a pas fonctionné.
    Je ne peux pas t'aider car je n'utilise pas ça.
    Essaye de modifier directement dans ta requete sans passer par les parametres (c'est ce que je fais ça me semble plus clair)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    Ok voici mon code , je le mets derrière une boucle while do , mais je crois que l'erreur n'est pas à ce niveau :
    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
    nEntree:=0; nSortie:=0;
      DM.tbDetailPerson.First;
      while not DM.tbDetailPerson.Eof do
      begin
         DM.QueryDetail.Close;
         DM.QueryDetail.SQL.Add('SELECT * FROM DETAIL_PERS');
         DM.QueryDetail.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitiale AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
         DM.QueryDetail.ParamByName('DateInitiale').Value :=DateInitiale.Date;
         DM.QueryDetail.ParamByName('DateFinale').Value :=DateFinale.Date;
         DM.QueryDetail.ParamByName('Mouvement').Value :='ENTREE GERANT';
         DM.QueryDetail.Open;
     
         DM.QuerySomme.Close;
         DM.QuerySomme.SQL.Add('SELECT Sum(SOMPERS) AS Total FROM DETAIL_PERS');
         DM.QuerySomme.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitiale AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
         DM.QuerySomme.ParamByName('DateInitiale').Value :=DateInitiale.Date;
         DM.QuerySomme.ParamByName('DateFinale').Value :=DateFinale.Date;
         DM.QuerySomme.ParamByName('Mouvement').Value :='ENTREE GERANT';
         DM.QuerySomme.Open;
     
     
        DM.tbDetailPerson.Next;
      end;
        EditEntree.Text:=FloatToStr(nEntree);
        EditSortie.Text:=FloatToStr(nSortie);
        EditSolde.Text:=FloatToStr(nEntree - nSortie);
    merci

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DM.QuerySomme.ParamByName('Mouvement').Value :='ENTREE GERANT';
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DM.QuerySomme.ParamByName('Mouvement').AsString :='ENTREE GERANT';

  13. #13
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    QueryDetailPers.Close;
    QueryDetailPers.SQL.Clear;
    QueryDetailPers.SQL.Add('SELECT * FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QueryDetailPers.ParamCheck := True;
    QueryDetailPers.ParamByName('DateInitial').Value :=DateInitiale.Date;
    QueryDetailPers.ParamByName('DateFinale').Value :=DateFinale.Date;
    QueryDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QueryDetailPers.Open;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    QuerySumDetailPers.Close;
    QuerySumDetailPersSQL.clear;
    QuerySumDetailPers.SQL.Add('SELECT Sum(SOMPERS) AS Total FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QuerySumDetailPers.paramCheck := True;
    QuerySumDetailPers.ParamByName('DateInitial').Value :=DateInitiale.Date;
    QuerySumDetailPers.ParamByName('DateFinale').Value :=DateFinale.Date;
    QuerySumDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QuerySumDetailPers.Open;
    Déjà la grosse erreur d'utiliser Add et de ne pas faire un Clear avant.
    Puis il est préférable de faire un paramcheck := true avant de saisir les paramètres ca mange pas de pain et on est sur qu'ils sont détectés après
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    Merci pour le code , je l'ai modifié avec vos conseils ;
    mais j'ai un autre problème , il ne me donne aucun resultat , mais il ne donne plus d'erreur comme les fois dernières.
    J'ai même l'impression qu'il ne fait pas le filtrage, c'est exactement comme mon premier code plus haut . Il s'execute bien , sans erreur, lorsque je clique sur le bouton pour valider mes deux dates choisies , il y a rien qui marche.
    je ne sais pas quoi faire.
    je crois que le problème , c'est au niveau des calculs, il ne fait pas les calculs.
    je dois afficher la somme des entrees dans un Edit et la somme des sorties dans un Edit aussi , et afficher enfin le solde (Entree - Sortie) dans un Edit .
    comment faire pour integrer cela avec des requetes .
    merci de votre aide.

  15. #15
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Tu utilises quoi comme base de données ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    je travaille avec Access comme Base de donnees. j'ai une table que j'appelle Personne qui contient les noms de personnes et une autre table DetailPers qui contient les details de personnes; donc je travaille en maitre - esclave , donc les donnees que je cherche à calculer se trouve dans la table DetailPers qui est liée à Personne .
    Merci

  17. #17
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Essaie comme ca alors

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QueryDetailPers.SQL.Clear;
    QueryDetailPers.SQL.Add('SELECT * FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QueryDetailPers.ParamCheck := True;
    QueryDetailPers.ParamByName('DateInitial').Value :=FormatDateTime('mm/dd/yyyy',DateInitiale.Date);
    QueryDetailPers.ParamByName('DateFinale').Value :=FormatDateTime('mm/dd/yyyy',DateFinale.Date);
    QueryDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QueryDetailPers.Open;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    QuerySumDetailPers.Close;
    QuerySumDetailPersSQL.clear;
    QuerySumDetailPers.SQL.Add('SELECT Sum(SOMPERS) AS Total FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QuerySumDetailPers.paramCheck := True;
    QuerySumDetailPers.ParamByName('DateInitial').Value :=FormatDateTime('mm/dd/yyyy',DateInitiale.Date);
    QuerySumDetailPers.ParamByName('DateFinale').Value :=FormatDateTime('mm/dd/yyyy',DateFinale.Date);
    QuerySumDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QuerySumDetailPers.Open;
    En Access le format est MM/DD/YYYY normalement.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 121
    Points : 59
    Points
    59
    Par défaut
    merci pour le code!
    en Access le format c'est : DD/MM/YYYY ;
    j'ai modifié de nouveau le code en tenant compte du format , mais toujours rien qui se passe , mais ici maintenannt je vois le Dbgrid bougé du premier enregistrement au dernier , mais il ne fait pas toujours le filtrage par Date , il me donne tous les enregistrements avec toutes les dates;
    je ne sais pas où ce trouve le problème, pourtant tout à l'air bon.
    merci de nouveau pour votre aide.

  19. #19
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    C'est vrai, je viens de me souvenir qu'ACCESS a un système d'appel de date spécial (Merci MS ... )

    Essaie comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    QueryDetailPers.SQL.Clear;
    QueryDetailPers.SQL.Add('SELECT * FROM DetailPresonne');
    QueryDetailPers.SQL.Add('WHERE (DATEPERS BETWEEN :DateInitial AND :DateFinale) AND (TYPEMVT = :Mouvement) ');
    QueryDetailPers.ParamCheck := True;
    QueryDetailPers.ParamByName('DateInitial').Value := '#' + FormatDateTime('mm/dd/yyyy',DateInitiale.Date) + '#';
    QueryDetailPers.ParamByName('DateFinale').Value :='#' + FormatDateTime('mm/dd/yyyy',DateFinale.Date) + '#';
    QueryDetailPers.ParamByName('Mouvement').Value :='ENTREE GERANT';
    QueryDetailPers.Open;
    fait un test déjà avec cette partie
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 343
    Points : 392
    Points
    392
    Par défaut
    Je dis sans doute une bêtise En mode DEBUG faire des watch des affectations avant et après chaque Value.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme avec des filtres de recherche sur des dates
    Par MCarole dans le forum Access
    Réponses: 2
    Dernier message: 24/07/2006, 10h22
  2. Problème de date
    Par rh0D'm@n dans le forum Modules
    Réponses: 3
    Dernier message: 11/05/2004, 15h16
  3. Probleme de date
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/03/2004, 14h19
  4. probleme de date (toujours et encore des dates)
    Par Yannesco dans le forum SQL
    Réponses: 3
    Dernier message: 02/02/2004, 19h04
  5. Probleme de date
    Par danuz dans le forum XMLRAD
    Réponses: 3
    Dernier message: 24/09/2003, 15h57

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