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 :

Champ Date à '01/01/0001' -> Pb conversion de variant !!!


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 34
    Points : 22
    Points
    22
    Par défaut Champ Date à '01/01/0001' -> Pb conversion de variant !!!
    Dans certaines de mes tables, il y a des dates à '01/01/0001'...
    J'ai besoin de tranférer des données d'un TDataSet à un autre... Pour cela, je fais donc une boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        For i:= 0 to FieldCount -1 Do
              Tb.Fields[i] := Fields[i];
    Là, erreur lorsque l'on passe sur une date à '01/01/0001'. Le message est le suivant :
    Le projet a provoqué une classe d'exception EVariantOverFlowError avec le message 'Débordement lors de la conversion du variant de type (date)'
    puis
    Valeur incorrecte pour le champ DATE
    Pour isoler mon cas, j'ai créé un projet avec une zone de saisie DBEdit sur une table créé pour l'occasion, ne contenant qu'une zone date.
    Et effectivement, lorsque je saisie '01/01/0001' et que je tente d'alimenter la table, même plantage...
    Pour une meilleure compréhension, 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
     
    type
      TForm1 = class(TForm)
        BtnOpenInsert: TButton;
        BtnPost: TButton;
        DataSource1: TDataSource;
        DBEdit1: TDBEdit;
        Table1: TTable;
        procedure BtnPostClick(Sender: TObject);
        procedure BtnOpenInsertClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.BtnPostClick(Sender: TObject);
    begin
      with Table1 do
        begin
          Fields[1] := DBEdit1.Field;           // ****PLANTAGE ICI !!!!!!!! ****
          Post;
          Close;
        end;
    end;
     
    procedure TForm1.BtnOpenInsertClick(Sender: TObject);
    begin
      with Table1 do
        begin
          Open;
          Insert;
        end;
    end;
    Y'aurait-il un paramêtrage à faire ou autre pour palier à ce problème ?
    Merci d'avance pour votre aide !!!

  2. #2
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Salut,

    Je suppose que tu veux assigner la valeur du champ d'une table à une autre.

    Alors il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    For i:= 0 to FieldCount -1 Do 
              Tb.Fields[i].Value := Fields[i].Value;
     
    ou
     
    with Table1 do 
        begin 
          Fields[1].Value := DBEdit1.Field.Value;
          Post; 
          Close; 
        end;
    A+
    On ne me la fait pas à moi !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Oui, merci !
    Bin même plantage au même endroit !

    Par contre, je pense que c'est un pb Delphi voir Windows car une telle date n'est pas envisageable apparement.
    Rien que si je veux rentrer '01/01/0001' dans un TDateTimePicker, ce n'est pas possible !

  4. #4
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Normalement cette date doit fonctionner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StrToDate('01/01/0001') renvoi -693593
    Il faut peut-être spécifier AsDateTime au lieu de Value.

    A+
    On ne me la fait pas à moi !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Effectivement, lorsque je fais du pas à pas, il fait bien la conversion qui donne le -693593 mais j'ai cru comprendre que c'est la valeur négative qui ne lui plait pas.

    Dans l'unité Variant, on a la fonction :

    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
     
    function _VarToDate(const V: TVarData): TDateTime;
    var
      LValue: Extended;
    begin
      case V.VType of
        varEmpty:    LValue := 0;
        varSmallInt: LValue := V.VSmallInt;
        varInteger:  LValue := V.VInteger;
        varSingle:   LValue := V.VSingle;
        varDouble:   LValue := V.VDouble;
        varCurrency: LValue := V.VCurrency;
        varDate:     LValue := V.VDate;
    ...
    ...
    Et je crois que c'est à ce niveau là que ça plante car LValue est un Extended alors que V.VDate = -693593 d'où plantage ! Car à moins que je ne me trompe mais le type Extended est un nombre POSITIF !

  6. #6
    Membre régulier Avatar de fs999
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 62
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 99
    Points : 111
    Points
    111
    Par défaut
    Normalement l'Extended accepte aussi les nombres négatifs. C'est peut-être une question de "range". Il faut essayer avec AsDateTime à la place de Value, comme ça pas de transformation Variant.

    A+
    On ne me la fait pas à moi !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 34
    Points : 22
    Points
    22
    Par défaut
    Merci pour tous ces éléments de réponse !
    Effectivement, avec AsDateTime, ça marche !
    J'y avais pensé seulement, les tables gérées et leur contenu ne sont pas fixes mais maintenant que j'y pense, il y a un moyen pour connaitre le type du field...
    Suis-je bête !!!!!!!!!!!!!

    Merci beaucoup !!!!

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

Discussions similaires

  1. [NETEZZA] : conversion d'oracle à netezza pour un champ date
    Par StéphanieB. dans le forum Autres SGBD
    Réponses: 0
    Dernier message: 09/07/2013, 10h07
  2. Réponses: 0
    Dernier message: 21/06/2010, 16h58
  3. Réponses: 5
    Dernier message: 28/08/2009, 18h42
  4. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  5. procedure stockée champ date
    Par tripper.dim dans le forum SQL
    Réponses: 5
    Dernier message: 25/04/2003, 09h47

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