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 :

Requête Champ Date en Delphi (déplacé)


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Requête Champ Date en Delphi (déplacé)
    J'ai fouillé partout et je n'arrive pas
    mon problème est d'envoyer une requête SQL en delphi (Embarcadero) avec une base access avec un champ date

    du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DM10.TabIndex.SQL.Add('Select * FROM Valeur  Where DateValeur < '+DateToStr(Now)+' ORDER BY DateValeur Asc');
    DM10.TabIndex.SQL.Add('Select * FROM Valeur  Where DateValeur < 01/01/2015 ORDER BY DateValeur Asc');
    rien ne fonctionne
    juste une petite info pour m'indiquer comment passer cette date dans ma requête

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 064
    Points : 41 021
    Points
    41 021
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Utilisez une requête paramétrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DM10.TabIndex.SQL.Add('Select * FROM Valeur Where DateValeur < :ParamDate  ORDER BY DateValeur Asc');
    et passez la valeur du paramètre avant d'ouvrir la requête , selon le composant utilisé la syntaxe n'est pas toujours la même donc faites une recherche de la syntaxe en fonction.

    et surtout postez au bon endroit, je me permets de déplacer la discussion vers Delphi/Base de Données
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Déjà je te remercie et m'excuse pour cette erreur de forum


    j'ai pas encore trouvé encore en ligne de commande donc j'ai été avec l'inspecteur d'objet sur mon composant ou j'ai ajouté un parametre
    Datatype ftDateTime
    Name ParamDate
    Value 01/01/2015
    Type Date

    J'ai donc modifié ma requête en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DM10.TabIndex.SQL.Clear;
    DM10.TabIndex.SQL.Add('Select * FROM Valeur Where DateValeur < :ParamDate  ORDER BY DateValeur Asc');
    Lorsque je l’exécute il me retourne une erreur sur "Aucun Valeur Donnée pour un ou plusieurs des paramètres requis"

    J'ai essaye dans le code de rajouter avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dt1:=StrToDate('01/01/2015');
    DM10.TabIndex.Parameters.Items[0].Value:=Dt1;
    J'ai une erreur Indice de List hors limite (0)

    J'ai essaye de créer en dynamique un paramètre mais là je m'en sort pas dans les données
    j'ai fait des recherches avec google

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DM10.TabIndex.Parameters.CreateParameter('ParamDate',ftDatetime,pdInput);
    le ftDateTime ne passe pas pourtant c'est ce qui est mis dans l'inspecteur d'objet

    Un dernier petit coup de pouce ne serait pas de refus car je ne dois pas être top loin pour que ça marche
    Images attachées Images attachées  

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 407
    Points : 3 027
    Points
    3 027
    Par défaut
    Écrire la requête correctement suffit généralement à créer automatiquement le paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.SQL.Text = 'select champ from tabletruc where champmachin = :param';
    Ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.ParamByName('param').asdatetime := Now;

    Mais un peu plus de précisions aurait été bienvenu :

    ADO ? DBE ? DBXpress ? autre ?

    un petit complément: Si je ne me trompe pas, la plupart des SGCB comprennent n'importe quelle date écrite au format YYYYMMDD.
    Par exemple, pour la requête donnée dans la question:

    DM10.TabIndex.SQL.Add('Select * FROM Valeur Where DateValeur < '20150101' ORDER BY DateValeur Asc');

    aurait des chances de fonctionner

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Non j'ai bien écris la requête sauf quand j'ai copié le ':p' a été mis comme un smiley

    Sinon en precision il s'agit d'un ADOQuery et le Query.ParamByName('param').asdatetime := Now; ne fonctionne pas
    quand à l'autre solution
    DM10.TabIndex.SQL.Add('Select * FROM Valeur Where DateValeur < '20150101' ORDER BY DateValeur Asc');
    ça ne passe pas non plus

    Merci quand même d'avoir bien voulu répondre, je pense ne pas en être loin mais débutant en SQL c'est pas évident

  6. #6
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 407
    Points : 3 027
    Points
    3 027
    Par défaut
    Depuis le temps que ça fonctionne pour tout le monde, il y forcément une coquille au niveau du code.
    Essayez uniquement par code (sans TADOQuery posé sur le Datamodule mais en le déclarant en variable dans une procédure) et postez le source ici pour qu'on puisse voir ce qui ne va pas.

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 064
    Points : 41 021
    Points
    41 021
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Laurent G
    Déjà je te remercie et m'excuse pour cette erreur de forum
    y a pas de quoi
    Comme le dit
    Citation Envoyé par Papy214
    ADO ? DBE ? DBXpress ? autre ?
    m'aurais permis d'indiquer la syntaxe pour le paramètre par exemple, si la requête est crée en mode design
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    //BDE 
    Query.ParamByName('nomparam').asDateTime:=Date;
    // ADOQuery
    ADoQuery.Params.ParamByName('nomparam').Value:=Date
    cela suffit

    Citation Envoyé par Papy214
    Si je ne me trompe pas, la plupart des SGCB comprennent n'importe quelle date écrite au format YYYYMMDD.
    Les SGCB peut être mais les SGBD je ne pense pas (en tout cas Firebird t'enverrai balader avec une erreur de conversion)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Papy214 Voir le message
    Depuis le temps que ça fonctionne pour tout le monde, il y forcément une coquille au niveau du code.
    Essayez uniquement par code (sans TADOQuery posé sur le Datamodule mais en le déclarant en variable dans une procédure) et postez le source ici pour qu'on puisse voir ce qui ne va pas.
    Là désolé tu m'as perdu je ne suis pas assez compétent pour une création dans le code
    je vais rechercher la création dans d'autre message puis je reviendrai en testant ce que tu m'as dit

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 407
    Points : 3 027
    Points
    3 027
    Par défaut
    un exemple tiré d'une application sur une base SQL Server

    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
     
    const
      Req = 'SELECT quantite FROM catalogue WHERE codebarre = :cb';
    begin
      with TADOQuery.Create(Self) do
      begin
        Connection := ADOConnection1;
        SQL.Text   := Req;
        ParamCheck;
        Parameters.ParamByName('cb').Value := CodeBarres;
        Open;
        if not Eof then
          Result := Fields[0].AsInteger
        else
          Result := 0;
        Close;
        Free;
      end;
    à adapter

  10. #10
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 407
    Points : 3 027
    Points
    3 027
    Par défaut
    Les SGCB peut être mais les SGBD je ne pense pas (en tout cas Firebird t'enverrai balader avec une erreur de conversion)
    Merci pour la précision !
    En tous cas, SQL Server l'accepte sans problème. Les autres, je ne sais pas, je pratique trop peu.
    Je vais tester avec FB par curiosité

  11. #11
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Voila ce que j'ai testé en Delphi 7

    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
    Var ADOQuery : TADOQuery;
        DataSrc : TDataSource;
        Param, Param1 : TParameter;
     
    procedure TForm1.Button1Click(Sender: TObject);
     
    begin
     ADOQuery := TADOQuery.Create(Self);
     ADOQuery.Connection:=ADOConnection1;
     ADOQuery.SQL.Add('Select * FROM Valeur Where DateValeur > :ParamDate1 and DateValeur < :ParamDate2 ORDER BY DateValeur Asc');
     Param:=ADOQuery.Parameters.ParamByName('ParamDate1');
     Param.DataType:=ftDateTime;
     Param.Value:=Now;
     Param1:=ADOQuery.Parameters.ParamByName('ParamDate2');
     Param1.DataType:=ftDateTime;
     Param1.Value:=Now+50;
     ADOQUery.Prepared := True;
     Try
      ADOQuery.Open();
     Except
     
     End;
     DataSrc := TDataSource.Create(Self);
     DataSrc.DataSet:=ADOQuery;
     DataSrc.Enabled:=True;
     DBGrid1.DataSource:=DataSRc
     
    end;
    ça fonctionne, j'espére que ça fonctionne aussi sous embarcadero

    Petite question :
    - pour modifier le champ de recherche par rapport au date, dois t-on fermer et réouvrir la base en ayant modifier la valeur des paramètres ou y a t'il une autre commande

    - qu'est ce qui est plus rapide passer par une requête SQL ou passer avec un filtered

    Encore un grand merci pour toute votre aide qui m'a permis de mieux comprendre l'adoquery , sql et les paramétres

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 064
    Points : 41 021
    Points
    41 021
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par Laurent G Voir le message
    Voila ce que j'ai testé en Delphi 7 ça fonctionne, j’espère que ça fonctionne aussi sous embarcadero
    si par Embarcadero tu entends les versions Delphi D2010 et plus, oui y a pas de raison

    Petite question :
    - pour modifier le champ de recherche par rapport au date, dois t-on fermer et réouvrir la base en ayant modifier la valeur des paramètres
    la Base(ADOConnection )non, la Requête (ADOQuery) oui
    - qu'est ce qui est plus rapide passer par une requête SQL ou passer avec un filtered
    vaste débat, je pense que pour Access (comme pour Paradox), contrairement aux SGBDR en Client/Serveur, le filtre est mieux
    encore faut-il exprimer la date sous le bon format (puisque le filtre est une string), rien d'insurmontable il faut simplement exprimé la date sous le format US
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filter:='DATE1 < '+FormatDateTime('mm/dd/yyyy',Date);
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  13. #13
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 407
    Points : 3 027
    Points
    3 027
    Par défaut
    Quelques remarques pour aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Param:=ADOQuery.Parameters.ParamByName('ParamDate1');
     Param.DataType:=ftDateTime;
     Param.Value:=Now;
    n'est pas utile.
    D'abord, on peut utiliser directement ADOQuery.Parameters.ParamByName('ParamDate1').
    Ensuite, utiliser ADOQuery.Parameters.ParamByName('ParamDate1').Value va forcer automatiquement le type en assignant une date.
    Ça évite du code superflu.

    Pour ajouter un nombre de jours à une date, même si le code utilisé ici est correct, il serait plus judicieux d'utiliser la fonction IncDay proposée par l'unité DateUtils.

    Enfin, il faut éviter d'utiliser Try..Except sans prendre en compte l'erreur éventuellement déclenchée.
    Si l'ouverture échoue, on essaiera quand même d'afficher des données sans même savoir que la requête n'a pas été effectuée.

    Bon w-e de corrections !

Discussions similaires

  1. requête sur le champ date
    Par bouba_95 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 10/01/2007, 15h10
  2. [Requête] Group by quand il y a un champ date
    Par Ithilien dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 03/01/2007, 16h14
  3. requêtes sur des champs date
    Par wiwi dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 03/02/2006, 14h14
  4. Requête sur champ DATE
    Par bud_gw dans le forum Langage SQL
    Réponses: 6
    Dernier message: 29/12/2005, 13h18
  5. [Delphi & DBExpress ] Mettre un champs date à null
    Par falcon dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/11/2004, 08h21

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