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

SQL Firebird Discussion :

[TDataSet]Problème de requête dans SelectSQL


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut [TDataSet]Problème de requête dans SelectSQL
    Salut !

    J'ai un petit problème pour concevoir ma requête afin de compléter la propriété SelectSQL de mon IBDataSet .
    Je souhaite effectuer des insertions dans mon entité ABSENCE, qui est relié directement à une autre entité SALARIE ainsi qu'a une entité TYPE_ABS (ici par l'intermédaire de l'association DE).
    Mes entités sont les suivantes:

    ABSENCE (num_enreg, date_deb, date_fin)
    SALARIE (id_sal, nom_sal, pren_sal)
    TYPE_ABSENCE (id_abs, lib_abs)

    L'association DE:
    DE (durée, unité)

    Au niveau physique, ABSENCE reçoit id_sal en clef étrangère et DE devient une table avec num_enreg et id_abs en clef étrangère.

    Comment écrire ma requête pour pouvoir faire des insertions dans ma tables ABSENCE?
    ex: insérer une absence le 10/12/02 (date_deb) de Mr BOB (id_sal) pour une raison de maladie (id_abs)

    J'ai écris déjà ceci:
    select
    DATE_HEURE_DEBUT, DATE_HEURE_FIN, ID_SAL, NUM_ENREGISTREMENT
    from ABSENCE
    join SALARIE on SALARIE.ID_SAL = ABSENCE.ID_SAL
    Mais il me manque le code pour faire le lien avec TYPE_ABSENCE. Dois-je passer par DE ?

    Quelqu'un aurait une idée pour écrire une requête me permettant de lier mes 3 tables (ABSENCE, SALARIE, et TYPE_ABSENCE) afin d'harmoniser mes insertions.

    Merci d'avance
    Seb
    El Che vive ! His spirit will never die !

  2. #2
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Oui, tu dois passer par DE (enfin, je ne connais pas d'autre moyen )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select DATE_HEURE_DEBUT, 
              DATE_HEURE_FIN, 
              ID_SAL, 
              NUM_ENREGISTREMENT 
      from ABSENCE ab 
      inner join SALARIE sal on (sal.ID_SAL = ab.ID_SAL)
      inner join DE on (DE.num_enreg = ab.num_enreg)
      inner join TYPE_ABSENCE ta on (ta.id_abs = DE.id_abs)
    le inner n'est pas obligatoire, mais je préfère le mettre (choix personnel). J'ai renommé tes champs aussi, type_absence c'est long à écrire
    LE dernier join TYPE_ABSENCE, n'est pas obligatoire vu que tu ne fais pas de sélection dans cette table.

    Au lieu de faire ça, tu peux faire aussi une vue.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Dihap a dit:
    Oui, tu dois passer par DE (enfin, je ne connais pas d'autre moyen )
    Merci bien pour ton code (il fonctionne) et c'est vrai que cela semblait évident (du moins en le voyant), j'aurai du y penser .
    le inner n'est pas obligatoire, mais je préfère le mettre (choix personnel).
    Cela fait quoi en plus exactement ?
    Au lieu de faire ça, tu peux faire aussi une vue.
    C'est à dire ? Cela m'intéresse car en fonctionnement simple (insertion dans date_deb et id_sal) tout s'enregistre bien mais dès que je veux relier ma date à un type d'absence (id_abs), par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DM.IB_ABS2.FieldByName('ID_ABS').AsInteger         :=  3;
    J'ai l'erreur suivante:
    Le projet Pointeuse.exe a provoqué une classe d'exception EDatabaseError avec le message 'IBDataSet_ABS2: Champ 'ID_ABS' non trouvé'. Processus stoppé.
    Logiquement, en passant par NUM_ENREG il devrait retrouver ID_ABS ?!?
    Je suis allé jeter un oeil sur le code généré automatiquement par IBDataSet ('Editeur d'ensemble de données...') qui permet par l'intermédiare de la touche 'Générer le SQL' d'avoir les requête appropriées pour l'insertion, les modif...etc
    Mais cela ne m'inspire pas trop
    Une idée

    Merci
    Seb
    El Che vive ! His spirit will never die !

  4. #4
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Citation:
    le inner n'est pas obligatoire, mais je préfère le mettre (choix personnel).

    Cela fait quoi en plus exactement ?
    Cela fait rien de plus. Quand tu écris join, c'est la même chose qu'inner join. Le "inner" est facultatif.

    Pour la vue, tu fais un create view et tu inscris ton select que tu as écrit. Quand tu fais une requête, au lieu d'écrire tous tes join, tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select DATE_HEURE_DEBUT, 
              DATE_HEURE_FIN, 
              ID_SAL, 
              NUM_ENREGISTREMENT 
      from V_VUE  // Tu mets le nom que tu veux  :wink:
    La je ne suis pas sûr, mais je crois qu'on ne peut pas modifier une vue s'il y a des jointures.

    Tu peux utiliser le générateur SQL, je n'ai jamais eu de problème avec ce générateur.

    Pour ton erreur, c'est que ton champs ne s'est pas rajouté dans ton dataset. Vérifies que ton champ fait partie de ton dataset. C'est possible aussi, que ce soit Delphi qui fait des erreurs. Juste à le fermer et à le réouvrir.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Merci pour tout ces renseignements Dihap, j'en apprends touts les jours
    Pour ton erreur, c'est que ton champs ne s'est pas rajouté dans ton dataset. Vérifies que ton champ fait partie de ton dataset. C'est possible aussi, que ce soit Delphi qui fait des erreurs. Juste à le fermer et à le réouvrir.
    J'ai ouvert et refermé Delphi mais rien de plus .
    Par contre je suis pas bien sur d'avoir compris ce que tu entends par "Vérifies que ton champ fait partie de ton dataset"; tu veux dire, contrôler dans la requête SQL ? Si c'est le cas, il apparait ici:
    inner join TYPE_ABSENCE ta on (ta.ID_ABS = DE.ID_ABS)
    Je suis allé chercher le code généré pour l'insertion dans le DataSet, il semble bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into ABSENCE
      (DATE_HEURE_DEBUT, DATE_HEURE_FIN, ID_SAL, NUM_ENREGISTREMENT)
    values (:DATE_HEURE_DEBUT, :DATE_HEURE_FIN, :ID_SAL, :NUM_ENREGISTREMENT)
    Si le lien entre ABSENCE et DE est respecté , sinon le prob vient de mes clefs étrangères
    Je continue à chercher...
    Merci
    Seb
    El Che vive ! His spirit will never die !

  6. #6
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Non, pas dans ta requête SQL

    Si tu double-clique sur ton dataset, tu vas avoir une fenêtre avec les champs de ta requête. Vérifie que id-abs est bien là. Si tu n'as jamais été là, tu n'auras aucun champs et c'est correct.

    Après réflexion.... Tu ne sélectionnes pas ton champs id_abs dans ta requête... C'est normal que tu aies une erreur

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Si tu double-clique sur ton dataset, tu vas avoir une fenêtre avec les champs de ta requête. Vérifie que id-abs est bien là. Si tu n'as jamais été là, tu n'auras aucun champs et c'est correct.
    Ok je vois, excuse moi mais c'est mon premier projet développé sous Delphi alors j'ai encore quelques lacunes . Par contre, dans ma fenêtre je n'ai en effet aucun champs qui apparait !?! Pourquoi ? J'avais déjà créé un DataSet pour une autre partie de mon projet (qui marche elle ), je suis allé vérifier sa fenêtre, et là, tous les champs y sont . Je ne comprends pas, je ne vois pas ce que j'ai fait de plus en créant mon premier DataSet ? Pourquoi les champs n'apparaissent pas dans mon 2eme DataSet ?

    Après réflexion.... Tu ne sélectionnes pas ton champs id_abs dans ta requête... C'est normal que tu aies une erreur
    Heuuuuu... Là je te suis plus, tu veux dire que cette partie est mauvaise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inner join TYPE_ABSENCE ta on (ta.id_abs = DE.id_abs)
    Je ne sais plus trop ou j'en suis
    El Che vive ! His spirit will never die !

  8. #8
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Décourage toi pas

    Non ta requête est bonne,

    Mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select DATE_HEURE_DEBUT, 
              DATE_HEURE_FIN, 
              ID_SAL, 
              NUM_ENREGISTREMENT,
              ta.id_abs    // Il te manque cette ligne
      from ABSENCE ab 
      inner join SALARIE sal on (sal.ID_SAL = ab.ID_SAL) 
      inner join DE on (DE.num_enreg = ab.num_enreg) 
      inner join TYPE_ABSENCE ta on (ta.id_abs = DE.id_abs)
    Si tu as copié la requête directement, tu n'auras pas le champ id_abs. Donc, tu rajoutes cette ligne et ça devrais résoudre ton problème.

    Ne t'inquiète pas pour les champs de ton datatset. S'il n'y a aucun champ, cela veut dire que tous tes champs sont pris en compte, donc c'est ok.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Décourage toi pas
    Non, t'inquiète, c'est juste que pour mon 1er projet sous Delphi j'ai eu la tête plus grosse que le ventre . J'ai différents modules à développer et j'ai tendance à m'éparpiller; d'ou parfois mes oublis ou grossière erreur, enfin je vais y arriver...

    Ne t'inquiète pas pour les champs de ton datatset. S'il n'y a aucun champ, cela veut dire que tous tes champs sont pris en compte, donc c'est ok.
    Ha oui, c'est byzarre ça car mon autre DataSet a tous ses champs affichés et pourtant il fonctionne très bien .

    Si tu as copié la requête directement, tu n'auras pas le champ id_abs. Donc, tu rajoutes cette ligne et ça devrais résoudre ton problème.
    Ok, l'erreur est réparée mais par contre une autre interrogation subsiste:
    Si je regénère le SQL (par 'Editeur d'ensemble de données...') en sélectionnant 'Valeur du DataSet'; à l'exécution j'ai ceci:
    Le projet Pointeuse.exe a provoqué une classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error
    SQL error code = -206
    Column unknown
    ID_ABS'. Processus stoppé.
    En revanche, si je prends 'Champs de la table', la saisie se passe bien mais si je vais ensuite vérifier dans ma BDD, la table DE ne comporte aucun enregistrement ?!?
    J'utilise le code suivant:
    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
    procedure TFrm_Calendrier.Ajouter_Abs;
    begin
      if Not DM.IB_ABS2.Active then DM.IB_ABS2.Open;
      DM.IB_ABS2.Append; //Met le Dataset en mode ajout s'il n'est pas en mode append
      Try
        try
          IB_PROC.ExecProc; // On execute la procedure
          DM.IB_ABS2.FieldByName('NUM_ENREGISTREMENT').AsInteger := IB_PROC.ParamByName('ID').AsInteger; // On affecte à NUM_ENREG... le nombre retourné par IB_PROC qui pointe sur GET_ABSENCE_ID du BDD
          IB_PROC.Close; //
          DM.IB_ABS2.FieldByName('DATE_HEURE_DEBUT').Value   :=  Temp_day;
          DM.IB_ABS2.FieldByName('DATE_HEURE_FIN').Value     :=  '12/05/03 08:00';
          DM.IB_ABS2.FieldByName('ID_SAL').Value             :=  2;
          DM.IB_ABS2.FieldByName('ID_ABS').AsInteger         :=  3;
          DM.IB_ABS2.Post; // Valide l'édition dans la base de données
          DM.IBTrans.CommitRetaining;
          DM.IB_ABS2.Refresh     //Raffraichissement de la grille
        except
          DM.IBTrans.RollbackRetaining;
          MessageDlg('Erreur d''ajout d''absence', mtError, [mbOK], 0);
        end;
        //  DM.IB_SALARIE.Refresh;
      finally
        DM.IB_ABS2.Close;
        ds_state  := 'dsbrowse';  // on remet notre flag à parcours
      end;
    end; {Ajouter_Abs}
    PS: IB_PROC = TIBStoredProc et IB_ABS2 = TIBDataSet
    Mon prob vient-il de ma base ou de mon code ?
    El Che vive ! His spirit will never die !

  10. #10
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Ok, si tu utilsies le générateur de code SQl, vérifie que ton champ id_abs est bien dans la liste avant de générer le code. On sait jamais.



    Non, t'inquiète, c'est juste que pour mon 1er projet sous Delphi j'ai eu la tête plus grosse que le ventre . J'ai différents modules à développer et j'ai tendance à m'éparpiller; d'ou parfois mes oublis ou grossière erreur, enfin je vais y arriver...
    Utilises-tu les datamodules ? Pratique pour mettre tes datasets et tout le tralala.

    Tu peux mettre ton code plus clair, c'est plus facile à corriger Évite d'utiliser value, ça prends plus de ressource inutilements.

    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
     
    procedure TFrm_Calendrier.Ajouter_Abs; 
    begin 
       if Not DM.IB_ABS2.Active then 
          DM.IB_ABS2.Open; 
     
       DM.IB_ABS2.Append; 
       Try 
          try 
             IB_PROC.ExecProc;  
             with DM_IB_ABS2 do
             begin         
                FieldByName('NUM_ENREGISTREMENT').AsInteger :=   
                IB_PROC.ParamByName('ID').AsInteger; 
                IB_PROC.Close; // 
     
                FieldByName('DATE_HEURE_DEBUT').asdatetime:= Temp_day; 
                FieldByName('DATE_HEURE_FIN').asdatetime  := '12/05/03  
                     08:00'; 
                FieldByName('ID_SAL').asinteger :=  2; 
                FieldByName('ID_ABS').AsInteger :=  3; 
                Post; 
                DM.IBTrans.CommitRetaining; 
     
                Close;   // Fait un close, open pour rafraichir tes données. 
                Open;              
             end;   
        except 
          DM.IBTrans.RollbackRetaining; 
          MessageDlg('Erreur d''ajout d''absence', mtError, [mbOK], 0); 
        end; 
        //  DM.IB_SALARIE.Refresh; 
      finally 
        DM.IB_ABS2.Close;  // Pourquoi tu fermes ton dataset ?
        ds_state  := 'dsbrowse'; // Pourquoi tu fais ça ici ?????
      end; 
    end; {Ajouter_Abs}
    Pourquoi tu n'utilises pas insert comme méthode au lieu de append ? À la limite, tu peux utiliser TIBSql pour faire un insert.

    Si ton dataset sert seulement pour faire des ajouts, je te conseille fortement TIBSql.

    Quelque chose du genre.

    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
     
       with TIBSql.create(self) do
       try
          try
             Database := <ton IBDatabase>;
             with sql do
             begin
                Add('Insert into...');
             end; 
             ExecQuery;
             transaction.commitretaining;
          except;
             transaction.rollback;
          end;     
       finally
          free;   
       end;

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Ok, si tu utilsies le générateur de code SQl, vérifie que ton champ id_abs est bien dans la liste avant de générer le code. On sait jamais.
    D'accord, je clique donc sur le bouton 'Valeurs du DataSet' (dans 'Editeur d'ensemble de données...') ainsi id_abs est pris en compte. Le prob, c'est que dans ce cas, ile me génère l'erreur de tout à l'heure:
    Le projet Pointeuse.exe a provoqué une classe d'exception EIBInterBaseError avec le message 'Dynamic SQL Error
    SQL error code = -206
    Column unknown
    ID_ABS'. Processus stoppé.
    Je cherche en vain, car sauf mauvaise appréciation, ma Bdd semble correcte. Je ne vois donc que la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldByName('ID_ABS').AsInteger :=  3;
    qui pourrait poser problème... Le truc, c'est que j'utilise cette ligne pour faire le lien entre ABSENCE et TYPE_ABSENCE, je n'insère rien dans id_abs. Mais comme je fais la même manip pour id_sal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldByName('ID_SAL').asinteger :=  2;
    Qui marche et qui sert aussi de lien, je vois pas ou est le souci

    Utilises-tu les datamodules ? Pratique pour mettre tes datasets et tout le tralala.
    Oui bien sur, d'ou le DM. dans mon code (DataModule)

    Tu peux mettre ton code plus clair, c'est plus facile à corriger Évite d'utiliser value, ça prends plus de ressource inutilements.
    Cool ! Merci pour l'info (connaissais pas) et l'optimisation du code .

    Pourquoi tu n'utilises pas insert comme méthode au lieu de append ? À la limite, tu peux utiliser TIBSql pour faire un insert.

    Si ton dataset sert seulement pour faire des ajouts, je te conseille fortement TIBSql.
    En fait non, là, je fais des essais en insertion, mais par la suite, la modification et la suppression des infos sont prévues; C'est pourquoi j'utilise un DataSet.
    Du coup, ça explique mon ds_state := 'dsbrowse', c'est une variable que j'initialise au départ et qui me sert par la suite à lancer tel ou tel procédure (ajout, suppression, modif) en fonction de son état (dsbrowse, dsinsert, dsedit).
    ds_state := 'dsbrowse'; // Pourquoi tu fais ça ici ?????
    Bah, par sécurité, quand tu fermes, tu vide le buffer alloué au IBDataset .
    J'ai testé ton code et j'ai un conflit à l'exécution:
    [Erreur] UnitCal.pas(635): Types incompatibles : 'TDateTime' et 'String'
    Je vais regarder ça, sinon, je continue à chercher
    A+
    El Che vive ! His spirit will never die !

  12. #12
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    D'habitude, j'utilise un IBDataset avec les DBgrids et TIBSql pour mes isnert, delete, update.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FieldByName('DATE_HEURE_FIN').asdatetime  := '12/05/03  
                     08:00';
    Ton erreur se situe la. J'ai oublié de faire la modification

    Essais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FieldByName('DATE_HEURE_FIN').asdatetime  := strtodatetime('12/05/03 08:00');
    Tu dois convertir ta chaîne de caractères en format date.

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Tu dois convertir ta chaîne de caractères en format date.
    Oui, c'est ce que je cherchais à faire mais je n'utilisais pas la bonne commande, maintenant c'est bon .

    D'habitude, j'utilise un IBDataset avec les DBgrids et TIBSql pour mes isnert, delete, update.
    Tu veux dire que tu n'utilises le IBDataSet que pour l'affichage dans tes DBGrids ou tu fais aussi toutes les motifs avec ? Tu conserves le TIBSQL pour tous les accès à ta Bdd qui ne consernent pas un DBGrid ?

    Pour ma part, je n'ai pas vraiment de préférence (du moment que ça marche ) et si mon prob 'Dynamic SQL Error ' peut être résolu en passant par un TIBSql alors je veux bien tester avec ce composant .

    Je vais faire les tests et je vais voir ce que ça donne .
    El Che vive ! His spirit will never die !

  14. #14
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Oui c'est ça, j'utilise seulement le IBDataset pour le DBGrid, à moins de faire une modification à partir du DBGrid en utilisant les méthodes (edit,insert,post)

    J'utilise le TIBSql pour les autres traitements qui ne sont pas en lien direct avec le DBGrid. Ce n'est peut-être pas la meilleur façon, mais c'est comme ça que je fais.

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Ok j'ai compris, c'est pas plus mal, j'ai d'ailleurs essayé de mettre en place un TIBSql pour l'insertion d'absence dans ma Bdd mais j'ai toujours la même erreur .
    Je me suis renseigné et apparemment, ça serait plutôt une erreur de code mais ça m'inspire pas + que ça... J'ai fais ceci:
    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 TFrm_Calendrier.Ajouter_Abs;
    begin
       with TIBSql.create(self) do 
       try 
          try 
             Database := DM.IBDB;
             with sql do 
             begin 
                Add('Insert into ABSENCE (DATE_HEURE_DEBUT, DATE_HEURE_FIN, ID_SAL, NUM_ENREGISTREMENT, ID_ABS) values(:DATE_HEURE_DEBUT, :DATE_HEURE_FIN, :ID_SAL, :NUM_ENREGISTREMENT, :ID_ABS)');
             end;
             ExecQuery;
             transaction.commitretaining;
          except; 
             transaction.rollback; 
          end;      
       finally 
          free;    
       end;
    end; {Ajouter_Abs}
    Par rapport à l'utilisation du DataSet, ça génére le même style d'erreur alors j'essaie de développer d'autre trucs à côté voir si je retombe sur les mêmes erreurs.
    A+
    Seb
    El Che vive ! His spirit will never die !

  16. #16
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Add('Insert into ABSENCE (DATE_HEURE_DEBUT, DATE_HEURE_FIN, ID_SAL, NUM_ENREGISTREMENT, ID_ABS) values(:DATE_HEURE_DEBUT, :DATE_HEURE_FIN, :ID_SAL, :NUM_ENREGISTREMENT, :ID_ABS)');
    Tu dois mettre des valeurs. les ATE_HEURE_DEBUT, LDATE_HEURE_FIN, etc. ça veut rien dire pour Interbase. Mets des valeurs ça va aller mieux

  17. #17
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Tu dois mettre des valeurs. les ATE_HEURE_DEBUT, LDATE_HEURE_FIN, etc. ça veut rien dire pour Interbase. Mets des valeurs ça va aller mieux
    Oups ! Quelle honte, j'avais même pas fait attention , j'ai copier/coller la requête du DataSet, et d'une chose à l'autre (comme je t'ai expliqué, je gère plusieurs trucs en même temps, j'ai donc tendance à me dispercer ), j'ai oublié d'appliquer les valeurs (en + je voyais pas la totalité de ma requête, ça rentrer pas dans le cadre sous Delphi). Enfin, j'ai aucune excuse pour le post .

    Par contre, sous Interbase comment on fait une requête permettant de saisir une date ?
    J'ai mon champs DATE_HEURE_DEBUT en format DATE et le champs DATE_HEURE_FIN en format TIMESTAMP, je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Add('Insert into ABSENCE (DATE_HEURE_DEBUT, DATE_HEURE_FIN, ID_SAL, NUM_ENREGISTREMENT, ID_ABS) values('2003/05/03', '12/05/03 08:00', 3, 62, 4)');
    Mais ça passe pas , j'ai essayé aussi '05/03/03' et '05.06.03' etc... Sans succès. J'ai même essayé de lui passer une variable en paramètre mais c'est pareil il me faudrait le format. Tu peux m'éclairer ?

    Merci d'avance
    El Che vive ! His spirit will never die !

  18. #18
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Tout le monde fait des erreurs, alors il n'y a pas de problème.

    Pour les dates, tu dois respecter le format des dates d'Interbase.

    Aussi, tu as un problèmes dans ton insert. Il te manque des apostrophes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Add('Insert into ABSENCE (DATE_HEURE_DEBUT, DATE_HEURE_FIN,');
    add(' ID_SAL, NUM_ENREGISTREMENT, ID_ABS)');
    add(' values(' + quotedstr('2003/05/03'));
    add(', ' + quotedstr('12/05/03 08:00');
    add(', 3, 62, 4)');
    QuotedStr mets des guillemets là où c'est nécessaire.

    Tes dates tu les prends où au juste ? D'un TEDit ? Si jamais tu veux avoir la date actuelle de l'OS, utilise la fct now.

    Tu peux aussi faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShortDateFormat:= 'yyyy/MM/dd';
    Çava te permettre de formatter la date selon que tu veux.


    par exemple pour configurer le format de la date. Tu peux regarder ce post aussi http://www.developpez.net/forums/viewtopic.php?t=109554

  19. #19
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Salut!

    Merci Dihap pour toutes ces informations, cela va me permettre de faire des tests pour la saisie de mes absences .

    J'ai mis un peu de temps à répondre car en ce moment je suis très occupé au boulot. J'ai quand même eut le temps de regarder ce problème de Bdd et après réflexion (on s'y est mis à 2 ) il s'est avéré qu'il était possible de moduler cette partie de la Bdd.
    J'ai donc supprimé la table DE et rajouté quelques champs, c'est de suite plus abordable (fini les messages d'erreurs dans tous les sens).
    Enfin, c'est loin d'être fini...

    Je te remercie beaucoup pour ton aide, je te suis reconnaissant de toutes les solutions que tu m'as apporté .

    A bientôt.
    Seb
    El Che vive ! His spirit will never die !

  20. #20
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 70
    Points : 84
    Points
    84
    Par défaut
    Fait plaisir

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

Discussions similaires

  1. Problème de requête dans une boucle avec ADOQuery
    Par Ekik dans le forum Bases de données
    Réponses: 8
    Dernier message: 14/05/2007, 16h07
  2. Problème de requête dans Access 2003
    Par charleshbo dans le forum Access
    Réponses: 2
    Dernier message: 14/02/2006, 19h47
  3. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  4. [Debutant]Problème Insertion Requête dans un StringGrid
    Par ghan77 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 07/12/2005, 14h25
  5. problème de requête dans crystal reports
    Par rcs dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 05/08/2005, 16h45

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