Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/08/2003, 16h22   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
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:
Citation:
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2003, 16h46   #2
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Oui, tu dois passer par DE (enfin, je ne connais pas d'autre moyen )

Code :
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.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2003, 17h10   #3
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Dihap a dit:
Citation:
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 .
Citation:
le inner n'est pas obligatoire, mais je préfère le mettre (choix personnel).
Cela fait quoi en plus exactement ?
Citation:
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 :
DM.IB_ABS2.FieldByName('ID_ABS').AsInteger         :=  3;
J'ai l'erreur suivante:
Citation:
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2003, 17h23   #4
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Citation:
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 :
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.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2003, 17h37   #5
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Merci pour tout ces renseignements Dihap, j'en apprends touts les jours
Citation:
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:
Citation:
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 :
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2003, 18h48   #6
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
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
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 09h24   #7
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Citation:
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 ?

Citation:
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 :
INNER JOIN TYPE_ABSENCE ta ON (ta.id_abs = DE.id_abs)
Je ne sais plus trop ou j'en suis
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 14h20   #8
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Décourage toi pas

Non ta requête est bonne,

Mais

Code :
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.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 15h22   #9
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Citation:
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...

Citation:
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 .

Citation:
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:
Citation:
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 :
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 ?
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 16h37   #10
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
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.



Citation:
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 :
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 :
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;
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 17h24   #11
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Citation:
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:
Citation:
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 :
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 :
FieldByName('ID_SAL').asinteger :=  2;
Qui marche et qui sert aussi de lien, je vois pas ou est le souci

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

Citation:
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 .

Citation:
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).
Citation:
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:
Citation:
[Erreur] UnitCal.pas(635): Types incompatibles : 'TDateTime' et 'String'
Je vais regarder ça, sinon, je continue à chercher
A+
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/08/2003, 18h51   #12
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
D'habitude, j'utilise un IBDataset avec les DBgrids et TIBSql pour mes isnert, delete, update.

Code :
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 :
FieldByName('DATE_HEURE_FIN').asdatetime  := strtodatetime('12/05/03 08:00');
Tu dois convertir ta chaîne de caractères en format date.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 10h03   #13
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Citation:
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 .

Citation:
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 .
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 13h59   #14
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
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.
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 15h04   #15
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
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 :
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 15h12   #16
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Code :
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
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 15h52   #17
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
Citation:
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 :
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/08/2003, 16h10   #18
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
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 :
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 :
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
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2003, 14h50   #19
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 49
Points : 14
Points : 14
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
Seb7 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2003, 15h32   #20
Membre régulier
 
Inscription : avril 2002
Messages : 70
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 70
Points : 77
Points : 77
Fait plaisir
Dihap est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h04.


 
 
 
 
Partenaires

Hébergement Web