OVH Cloud OVH Cloud

Pd sur procedure stockée

6 réponses
Avatar
Daniel Amaury
J'ai créé une procédure qui normalement devrait contrôler si le temps de
travail de la journée d'un utilisateur est supérieur à un jour. Mais voila
dés que l'ensemble de la base à atteint 1. La procédure me renvoi
systématiquement une valeur Null quelque soit la date au lieu du temps de
travail d'un utilisateur pour un jour donné. J'ai retourné le probléme dans
tout les sens rien a faire. Manuellement dans l'annalyseur de requette ca
marche en procedure stokée ça ne marche plus.



Vous trouverez ci-dessous mon script SQL.



Je vous remercie par avance de l'aide que vous pourriez m'apporter.



Cordialement,

ALTER Procedure spI_T_Saisie_Employes

(
@Jour [smalldatetime]
, @Temps_travail [float]
, @Id_Utilisateur [int]
, @Id_Affaire [int]
, @Id_Phase [int]
, @Id_Qualification [int]
, @Id_Secteur [int]
, @Id_Echelon [int]
)

As begin

Declare @Times float
set @Times=(SELECT SUM(Temps_travail) AS "Times"
FROM T_Saisie_Employes
WHERE (Jour = @jour) AND (Id_Utilisateur =
@Id_Utilisateur))

If @Times < 1
Begin
Insert Into [dbo].[T_Saisie_Employes]

(
[Jour]
, [Temps_travail]
, [Id_Utilisateur]
, [Id_Affaire]
, [Id_Phase]
, [Id_Qualification]
, [Id_Secteur]
, [Id_Echelon]
)

Values

(
@Jour
, @Temps_travail
, @Id_Utilisateur
, @Id_Affaire
, @Id_Phase
, @Id_Qualification
, @Id_Secteur
, @Id_Echelon
)


Declare @Id_Saisie_Employes [int]
Set @Id_Saisie_Employes = @@IDENTITY
Return @Id_Saisie_Employes

End Else Begin

Return 0

End
End

6 réponses

Avatar
Bonjour,

une question pourquoi faire un SUM(Temps_travail) je m'attendais plus à
trouver une soustraction entre une date de début et une data de fin de temps
de travail ensuite en extrayant la partie jours on aurait vu de suite si la
personne avait travaillé plus d'une journée d'après cette procédure stocké
le champs Temps _travail semble enregistrer sous forme d'un float le nombre
d'heure travaillé (ou un autre intervalle de temps minute seconde etc etc)
donc l'utilisateur saisie un truc du genre 1,50 pour dire qu'il a travaillé
un jour et une demie journée (soit 12 heures) j'avoue avoir un peu de mal à
saisir le mode de calcul cela étant pour ma part le

Declare @Id_Saisie_Employes [int]

je l'aurais placé avant le insert into afin d'être sur qu'au sein de la proc
stock cela ne soit pas considéré comme une instruction sql (même si on est
d'accord cela ne doit pas influencer le @@IDENTITY)

que voulez vous dire par "La procédure me renvoi systématiquement une valeur
Null " je m'attendrais plutot à voir un 0 puisque c'est la valeur du return
dans le else or si la base atteint 1 du fait de votre condition la proc
stock doit renvoyer 0 (cf <1 et non <=1)

Avec quelques précisions il serait plus évident de vous répondre je penses.

Sebastien


"Daniel Amaury" a écrit dans le
message de news:
J'ai créé une procédure qui normalement devrait contrôler si le temps de
travail de la journée d'un utilisateur est supérieur à un jour. Mais voila
dés que l'ensemble de la base à atteint 1. La procédure me renvoi
systématiquement une valeur Null quelque soit la date au lieu du temps de
travail d'un utilisateur pour un jour donné. J'ai retourné le probléme


dans
tout les sens rien a faire. Manuellement dans l'annalyseur de requette ca
marche en procedure stokée ça ne marche plus.



Vous trouverez ci-dessous mon script SQL.



Je vous remercie par avance de l'aide que vous pourriez m'apporter.



Cordialement,

ALTER Procedure spI_T_Saisie_Employes

(
@Jour [smalldatetime]
, @Temps_travail [float]
, @Id_Utilisateur [int]
, @Id_Affaire [int]
, @Id_Phase [int]
, @Id_Qualification [int]
, @Id_Secteur [int]
, @Id_Echelon [int]
)

As begin

Declare @Times float
set @Times=(SELECT SUM(Temps_travail) AS "Times"
FROM T_Saisie_Employes
WHERE (Jour = @jour) AND (Id_Utilisateur > @Id_Utilisateur))

If @Times < 1
Begin
Insert Into [dbo].[T_Saisie_Employes]

(
[Jour]
, [Temps_travail]
, [Id_Utilisateur]
, [Id_Affaire]
, [Id_Phase]
, [Id_Qualification]
, [Id_Secteur]
, [Id_Echelon]
)

Values

(
@Jour
, @Temps_travail
, @Id_Utilisateur
, @Id_Affaire
, @Id_Phase
, @Id_Qualification
, @Id_Secteur
, @Id_Echelon
)


Declare @Id_Saisie_Employes [int]
Set @Id_Saisie_Employes = @@IDENTITY
Return @Id_Saisie_Employes

End Else Begin

Return 0

End
End




Avatar
Daniel Amaury
En fait cette procédure contrôle au moment de la saisie les informations de
travail d'un utilisateur de sa journée. Il ne peus saisir qu'une journée à
la fois.



Il peut saisir le temps de travail avec uniquement c'est valeur 0,25 - 0,5 -
0,75 - 1

Si les valeur saisie dans la journée son supérieur à 1 (somme du temps de la
journée + le temps saisie), le système doit me retourné la valeur 0



Si la valeur saisie est inférieur à 1 (somme du temps de la journée + le
temps saisie), le système doit insérer le donnée et me renvoyer ID de
l'enregistrement.



La valeur retournée est vide le retur est égale soit à 0 soit à rien.



Je te remercie de te préoccuper de mon problème et je suis prés a refaire
complétement ma procédure si il y a une meilleur solution.



Cordialement,


a écrit dans le message de
news:e8i%
Bonjour,

une question pourquoi faire un SUM(Temps_travail) je m'attendais plus à
trouver une soustraction entre une date de début et une data de fin de


temps
de travail ensuite en extrayant la partie jours on aurait vu de suite si


la
personne avait travaillé plus d'une journée d'après cette procédure stocké
le champs Temps _travail semble enregistrer sous forme d'un float le


nombre
d'heure travaillé (ou un autre intervalle de temps minute seconde etc etc)
donc l'utilisateur saisie un truc du genre 1,50 pour dire qu'il a


travaillé
un jour et une demie journée (soit 12 heures) j'avoue avoir un peu de mal


à
saisir le mode de calcul cela étant pour ma part le

Declare @Id_Saisie_Employes [int]

je l'aurais placé avant le insert into afin d'être sur qu'au sein de la


proc
stock cela ne soit pas considéré comme une instruction sql (même si on est
d'accord cela ne doit pas influencer le @@IDENTITY)

que voulez vous dire par "La procédure me renvoi systématiquement une


valeur
Null " je m'attendrais plutot à voir un 0 puisque c'est la valeur du


return
dans le else or si la base atteint 1 du fait de votre condition la proc
stock doit renvoyer 0 (cf <1 et non <=1)

Avec quelques précisions il serait plus évident de vous répondre je


penses.

Sebastien


"Daniel Amaury" a écrit dans le
message de news:
> J'ai créé une procédure qui normalement devrait contrôler si le temps de
> travail de la journée d'un utilisateur est supérieur à un jour. Mais


voila
> dés que l'ensemble de la base à atteint 1. La procédure me renvoi
> systématiquement une valeur Null quelque soit la date au lieu du temps


de
> travail d'un utilisateur pour un jour donné. J'ai retourné le probléme
dans
> tout les sens rien a faire. Manuellement dans l'annalyseur de requette


ca
> marche en procedure stokée ça ne marche plus.
>
>
>
> Vous trouverez ci-dessous mon script SQL.
>
>
>
> Je vous remercie par avance de l'aide que vous pourriez m'apporter.
>
>
>
> Cordialement,
>
> ALTER Procedure spI_T_Saisie_Employes
>
> (
> @Jour [smalldatetime]
> , @Temps_travail [float]
> , @Id_Utilisateur [int]
> , @Id_Affaire [int]
> , @Id_Phase [int]
> , @Id_Qualification [int]
> , @Id_Secteur [int]
> , @Id_Echelon [int]
> )
>
> As begin
>
> Declare @Times float
> set @Times=(SELECT SUM(Temps_travail) AS "Times"
> FROM T_Saisie_Employes
> WHERE (Jour = @jour) AND (Id_Utilisateur > > @Id_Utilisateur))
>
> If @Times < 1
> Begin
> Insert Into [dbo].[T_Saisie_Employes]
>
> (
> [Jour]
> , [Temps_travail]
> , [Id_Utilisateur]
> , [Id_Affaire]
> , [Id_Phase]
> , [Id_Qualification]
> , [Id_Secteur]
> , [Id_Echelon]
> )
>
> Values
>
> (
> @Jour
> , @Temps_travail
> , @Id_Utilisateur
> , @Id_Affaire
> , @Id_Phase
> , @Id_Qualification
> , @Id_Secteur
> , @Id_Echelon
> )
>
>
> Declare @Id_Saisie_Employes [int]
> Set @Id_Saisie_Employes = @@IDENTITY
> Return @Id_Saisie_Employes
>
> End Else Begin
>
> Return 0
>
> End
> End
>
>




Avatar
Opère un test


Premier use case :

une somme des valeur saisie sur une journée inférieure à 1 cela devrait
renvoyer le @@IDENTITY donc normalement si j'ai bien compris ce doit être
un entier qui provient d'un auto incrément sur la colonne clef primaire de
la table dans laquelle tu fais l'insertion ( au passage vérifie que c'est
bien la colonne de clef primaire et qu'elle a bien un compteur automatique)

Deuxième use case

une somme des valeur saisie sur une journée supérieure à 1 cela doit
renvoyer 0

Troisième use case

une somme des valeur saisie sur une journée égale à 1 cela doit renvoyer 0

si le 2 et 3 sont bon et que c'est le 1 qui plante c'est que tu ne récupère
pas le @@identity dans ce cas comme dit dans le test

Vérifier que la clef primaire est bien défini dans la table , vérifier que
la clef primaire est bien un entier avec un compteur

J'ai aussi un peu réécrit la proc stock car certaine chose me choque


ALTER Procedure spI_T_Saisie_Employes

/* ( ici je supprime les parenthèses ) */
@Jour [smalldatetime]
, @Temps_travail [float]
, @Id_Utilisateur [int]
, @Id_Affaire [int]
, @Id_Phase [int]
, @Id_Qualification [int]
, @Id_Secteur [int]
, @Id_Echelon [int]
/* ) ici je supprime les parenthèses ) */

As /* begin suppression du begin */

Declare @Times float

Declare @Id_Saisie_Employes [int]
Declare @Erreur [int] /* variable utilisée pour tester une erreur
d'insertion*/

set @Erreur=-1
set @Id_Saisie_Employes=-1 /* initialisation de la variable avec une valeur
qui ne peut pas être retournée comme ça si on voit -1 c'est que @@IDENTITY
n'a rien renvoyé si la valeur est null le problème est ailleurs*/

set @Times=(SELECT SUM(Temps_travail) AS "Times"
FROM T_Saisie_Employes
WHERE (Jour = @jour) AND (Id_Utilisateur @Id_Utilisateur))

If (@Times < 1) /*ajout de parenthèses*/

Begin
Insert Into [dbo].[T_Saisie_Employes]
(
[Jour]
, [Temps_travail]
, [Id_Utilisateur]
, [Id_Affaire]
, [Id_Phase]
, [Id_Qualification]
, [Id_Secteur]
, [Id_Echelon]
)
Values
(
@Jour
, @Temps_travail
, @Id_Utilisateur
, @Id_Affaire
, @Id_Phase
, @Id_Qualification
, @Id_Secteur
, @Id_Echelon
)

Set @Erreur=@@ERROR /*récupère un numéro d'erreur ou 0 si pas d'erreur*/

Set @Id_Saisie_Employes = @@IDENTITY

if (@erreur<>0) /*test de la valeur d'erreur si différent de 0 et affiche
l'info*/
begin
select 'erreur n°: ' + @erreur + "Valeur @id_saisie_employes :
'+@id_saisie_employes
end


Return @Id_Saisie_Employes

End

Else

Begin
Return 0
End

GO /* ayant supprimé le begin au début il faut un GO */

Voilà ormis le test sur l'erreur mes autres modifications concernent plus le
fait que d'une habitude de méthode de travail (peut être mauvaise d'ailleur)
ça me parle plus comme ça

Sebastien

"Daniel Amaury" a écrit dans le
message de news:%
En fait cette procédure contrôle au moment de la saisie les informations


de
travail d'un utilisateur de sa journée. Il ne peus saisir qu'une journée à
la fois.



Il peut saisir le temps de travail avec uniquement c'est valeur 0,25 -


0,5 -
0,75 - 1

Si les valeur saisie dans la journée son supérieur à 1 (somme du temps de


la
journée + le temps saisie), le système doit me retourné la valeur 0



Si la valeur saisie est inférieur à 1 (somme du temps de la journée + le
temps saisie), le système doit insérer le donnée et me renvoyer ID de
l'enregistrement.



La valeur retournée est vide le retur est égale soit à 0 soit à rien.



Je te remercie de te préoccuper de mon problème et je suis prés a refaire
complétement ma procédure si il y a une meilleur solution.



Cordialement,


a écrit dans le message de
news:e8i%
> Bonjour,
>
> une question pourquoi faire un SUM(Temps_travail) je m'attendais plus à
> trouver une soustraction entre une date de début et une data de fin de
temps
> de travail ensuite en extrayant la partie jours on aurait vu de suite si
la
> personne avait travaillé plus d'une journée d'après cette procédure


stocké
> le champs Temps _travail semble enregistrer sous forme d'un float le
nombre
> d'heure travaillé (ou un autre intervalle de temps minute seconde etc


etc)
> donc l'utilisateur saisie un truc du genre 1,50 pour dire qu'il a
travaillé
> un jour et une demie journée (soit 12 heures) j'avoue avoir un peu de


mal
à
> saisir le mode de calcul cela étant pour ma part le
>
> Declare @Id_Saisie_Employes [int]
>
> je l'aurais placé avant le insert into afin d'être sur qu'au sein de la
proc
> stock cela ne soit pas considéré comme une instruction sql (même si on


est
> d'accord cela ne doit pas influencer le @@IDENTITY)
>
> que voulez vous dire par "La procédure me renvoi systématiquement une
valeur
> Null " je m'attendrais plutot à voir un 0 puisque c'est la valeur du
return
> dans le else or si la base atteint 1 du fait de votre condition la proc
> stock doit renvoyer 0 (cf <1 et non <=1)
>
> Avec quelques précisions il serait plus évident de vous répondre je
penses.
>
> Sebastien
>
>
> "Daniel Amaury" a écrit dans le
> message de news:
> > J'ai créé une procédure qui normalement devrait contrôler si le temps


de
> > travail de la journée d'un utilisateur est supérieur à un jour. Mais
voila
> > dés que l'ensemble de la base à atteint 1. La procédure me renvoi
> > systématiquement une valeur Null quelque soit la date au lieu du temps
de
> > travail d'un utilisateur pour un jour donné. J'ai retourné le probléme
> dans
> > tout les sens rien a faire. Manuellement dans l'annalyseur de requette
ca
> > marche en procedure stokée ça ne marche plus.
> >
> >
> >
> > Vous trouverez ci-dessous mon script SQL.
> >
> >
> >
> > Je vous remercie par avance de l'aide que vous pourriez m'apporter.
> >
> >
> >
> > Cordialement,
> >
> > ALTER Procedure spI_T_Saisie_Employes
> >
> > (
> > @Jour [smalldatetime]
> > , @Temps_travail [float]
> > , @Id_Utilisateur [int]
> > , @Id_Affaire [int]
> > , @Id_Phase [int]
> > , @Id_Qualification [int]
> > , @Id_Secteur [int]
> > , @Id_Echelon [int]
> > )
> >
> > As begin
> >
> > Declare @Times float
> > set @Times=(SELECT SUM(Temps_travail) AS "Times"
> > FROM T_Saisie_Employes
> > WHERE (Jour = @jour) AND (Id_Utilisateur > > > @Id_Utilisateur))
> >
> > If @Times < 1
> > Begin
> > Insert Into [dbo].[T_Saisie_Employes]
> >
> > (
> > [Jour]
> > , [Temps_travail]
> > , [Id_Utilisateur]
> > , [Id_Affaire]
> > , [Id_Phase]
> > , [Id_Qualification]
> > , [Id_Secteur]
> > , [Id_Echelon]
> > )
> >
> > Values
> >
> > (
> > @Jour
> > , @Temps_travail
> > , @Id_Utilisateur
> > , @Id_Affaire
> > , @Id_Phase
> > , @Id_Qualification
> > , @Id_Secteur
> > , @Id_Echelon
> > )
> >
> >
> > Declare @Id_Saisie_Employes [int]
> > Set @Id_Saisie_Employes = @@IDENTITY
> > Return @Id_Saisie_Employes
> >
> > End Else Begin
> >
> > Return 0
> >
> > End
> > End
> >
> >
>
>




Avatar
Sylvain Lafontaine
Votre procédure ne s'occupe pas du cas où le temps de travail égal à 1. De
plus, faites attentions aux erreurs de calcul d'arrondissement et de
conversion. Des choses comme 0.24999999999 ne sont pas égales à 0.25.
Comme vous ne donnez pas le détail de la structure de votre table, je ne
peux vous en dire plus ici mais il y a peut-être ici un problème de
conversionn avec [Temps_travail]. Je trouve également curieux que vous
écriviez "Times" au lieu de [Times].

Vous pouvez également utiliser SELECT @Times = SUM(Temps_travail) From ...
afin de simplifier votre code et return @@identity (faites attention à la
présence éventuelle d'un trigger, ce qui bousillerait la valeur fournie par
@@identity).

Finalement, décomposez votre procédure dans QueryAnalyser afin de voir ce
qui ne vas pas. Il y a également un débugger dans QueryAnalyser mais je ne
l'ai jamais utilisé.

S. L.

"Daniel Amaury" wrote in message
news:%
En fait cette procédure contrôle au moment de la saisie les informations


de
travail d'un utilisateur de sa journée. Il ne peus saisir qu'une journée à
la fois.



Il peut saisir le temps de travail avec uniquement c'est valeur 0,25 -


0,5 -
0,75 - 1

Si les valeur saisie dans la journée son supérieur à 1 (somme du temps de


la
journée + le temps saisie), le système doit me retourné la valeur 0



Si la valeur saisie est inférieur à 1 (somme du temps de la journée + le
temps saisie), le système doit insérer le donnée et me renvoyer ID de
l'enregistrement.



La valeur retournée est vide le retur est égale soit à 0 soit à rien.



Je te remercie de te préoccuper de mon problème et je suis prés a refaire
complétement ma procédure si il y a une meilleur solution.



Cordialement,


a écrit dans le message de
news:e8i%
> Bonjour,
>
> une question pourquoi faire un SUM(Temps_travail) je m'attendais plus à
> trouver une soustraction entre une date de début et une data de fin de
temps
> de travail ensuite en extrayant la partie jours on aurait vu de suite si
la
> personne avait travaillé plus d'une journée d'après cette procédure


stocké
> le champs Temps _travail semble enregistrer sous forme d'un float le
nombre
> d'heure travaillé (ou un autre intervalle de temps minute seconde etc


etc)
> donc l'utilisateur saisie un truc du genre 1,50 pour dire qu'il a
travaillé
> un jour et une demie journée (soit 12 heures) j'avoue avoir un peu de


mal
à
> saisir le mode de calcul cela étant pour ma part le
>
> Declare @Id_Saisie_Employes [int]
>
> je l'aurais placé avant le insert into afin d'être sur qu'au sein de la
proc
> stock cela ne soit pas considéré comme une instruction sql (même si on


est
> d'accord cela ne doit pas influencer le @@IDENTITY)
>
> que voulez vous dire par "La procédure me renvoi systématiquement une
valeur
> Null " je m'attendrais plutot à voir un 0 puisque c'est la valeur du
return
> dans le else or si la base atteint 1 du fait de votre condition la proc
> stock doit renvoyer 0 (cf <1 et non <=1)
>
> Avec quelques précisions il serait plus évident de vous répondre je
penses.
>
> Sebastien
>
>
> "Daniel Amaury" a écrit dans le
> message de news:
> > J'ai créé une procédure qui normalement devrait contrôler si le temps


de
> > travail de la journée d'un utilisateur est supérieur à un jour. Mais
voila
> > dés que l'ensemble de la base à atteint 1. La procédure me renvoi
> > systématiquement une valeur Null quelque soit la date au lieu du temps
de
> > travail d'un utilisateur pour un jour donné. J'ai retourné le probléme
> dans
> > tout les sens rien a faire. Manuellement dans l'annalyseur de requette
ca
> > marche en procedure stokée ça ne marche plus.
> >
> >
> >
> > Vous trouverez ci-dessous mon script SQL.
> >
> >
> >
> > Je vous remercie par avance de l'aide que vous pourriez m'apporter.
> >
> >
> >
> > Cordialement,
> >
> > ALTER Procedure spI_T_Saisie_Employes
> >
> > (
> > @Jour [smalldatetime]
> > , @Temps_travail [float]
> > , @Id_Utilisateur [int]
> > , @Id_Affaire [int]
> > , @Id_Phase [int]
> > , @Id_Qualification [int]
> > , @Id_Secteur [int]
> > , @Id_Echelon [int]
> > )
> >
> > As begin
> >
> > Declare @Times float
> > set @Times=(SELECT SUM(Temps_travail) AS "Times"
> > FROM T_Saisie_Employes
> > WHERE (Jour = @jour) AND (Id_Utilisateur > > > @Id_Utilisateur))
> >
> > If @Times < 1
> > Begin
> > Insert Into [dbo].[T_Saisie_Employes]
> >
> > (
> > [Jour]
> > , [Temps_travail]
> > , [Id_Utilisateur]
> > , [Id_Affaire]
> > , [Id_Phase]
> > , [Id_Qualification]
> > , [Id_Secteur]
> > , [Id_Echelon]
> > )
> >
> > Values
> >
> > (
> > @Jour
> > , @Temps_travail
> > , @Id_Utilisateur
> > , @Id_Affaire
> > , @Id_Phase
> > , @Id_Qualification
> > , @Id_Secteur
> > , @Id_Echelon
> > )
> >
> >
> > Declare @Id_Saisie_Employes [int]
> > Set @Id_Saisie_Employes = @@IDENTITY
> > Return @Id_Saisie_Employes
> >
> > End Else Begin
> >
> > Return 0
> >
> > End
> > End
> >
> >
>
>




Avatar
Daniel Amaury
J'ai testé, mais malgré vos judicieux conseils ca ne fonctionne toujour pas.
Si je vide la base ca ne fonctionne que sur la date du jour.
Je vais redemarer ma machine, voir si.

Merci

a écrit dans le message de
news:
Opère un test


Premier use case :

une somme des valeur saisie sur une journée inférieure à 1 cela devrait
renvoyer le @@IDENTITY donc normalement si j'ai bien compris ce doit être
un entier qui provient d'un auto incrément sur la colonne clef primaire de
la table dans laquelle tu fais l'insertion ( au passage vérifie que c'est
bien la colonne de clef primaire et qu'elle a bien un compteur


automatique)

Deuxième use case

une somme des valeur saisie sur une journée supérieure à 1 cela doit
renvoyer 0

Troisième use case

une somme des valeur saisie sur une journée égale à 1 cela doit renvoyer 0

si le 2 et 3 sont bon et que c'est le 1 qui plante c'est que tu ne


récupère
pas le @@identity dans ce cas comme dit dans le test

Vérifier que la clef primaire est bien défini dans la table , vérifier que
la clef primaire est bien un entier avec un compteur

J'ai aussi un peu réécrit la proc stock car certaine chose me choque


ALTER Procedure spI_T_Saisie_Employes

/* ( ici je supprime les parenthèses ) */
@Jour [smalldatetime]
, @Temps_travail [float]
, @Id_Utilisateur [int]
, @Id_Affaire [int]
, @Id_Phase [int]
, @Id_Qualification [int]
, @Id_Secteur [int]
, @Id_Echelon [int]
/* ) ici je supprime les parenthèses ) */

As /* begin suppression du begin */

Declare @Times float

Declare @Id_Saisie_Employes [int]
Declare @Erreur [int] /* variable utilisée pour tester une erreur
d'insertion*/

set @Erreur=-1
set @Id_Saisie_Employes=-1 /* initialisation de la variable avec une


valeur
qui ne peut pas être retournée comme ça si on voit -1 c'est que @@IDENTITY
n'a rien renvoyé si la valeur est null le problème est ailleurs*/

set @Times=(SELECT SUM(Temps_travail) AS "Times"
FROM T_Saisie_Employes
WHERE (Jour = @jour) AND (Id_Utilisateur > @Id_Utilisateur))

If (@Times < 1) /*ajout de parenthèses*/

Begin
Insert Into [dbo].[T_Saisie_Employes]
(
[Jour]
, [Temps_travail]
, [Id_Utilisateur]
, [Id_Affaire]
, [Id_Phase]
, [Id_Qualification]
, [Id_Secteur]
, [Id_Echelon]
)
Values
(
@Jour
, @Temps_travail
, @Id_Utilisateur
, @Id_Affaire
, @Id_Phase
, @Id_Qualification
, @Id_Secteur
, @Id_Echelon
)

Set @Erreur=@@ERROR /*récupère un numéro d'erreur ou 0 si pas d'erreur*/

Set @Id_Saisie_Employes = @@IDENTITY

if (@erreur<>0) /*test de la valeur d'erreur si différent de 0 et affiche
l'info*/
begin
select 'erreur n°: ' + @erreur + "Valeur @id_saisie_employes :
'+@id_saisie_employes
end


Return @Id_Saisie_Employes

End

Else

Begin
Return 0
End

GO /* ayant supprimé le begin au début il faut un GO */

Voilà ormis le test sur l'erreur mes autres modifications concernent plus


le
fait que d'une habitude de méthode de travail (peut être mauvaise


d'ailleur)
ça me parle plus comme ça

Sebastien

"Daniel Amaury" a écrit dans le
message de news:%
> En fait cette procédure contrôle au moment de la saisie les informations
de
> travail d'un utilisateur de sa journée. Il ne peus saisir qu'une journée


à
> la fois.
>
>
>
> Il peut saisir le temps de travail avec uniquement c'est valeur 0,25 -
0,5 -
> 0,75 - 1
>
> Si les valeur saisie dans la journée son supérieur à 1 (somme du temps


de
la
> journée + le temps saisie), le système doit me retourné la valeur 0
>
>
>
> Si la valeur saisie est inférieur à 1 (somme du temps de la journée + le
> temps saisie), le système doit insérer le donnée et me renvoyer ID de
> l'enregistrement.
>
>
>
> La valeur retournée est vide le retur est égale soit à 0 soit à rien.
>
>
>
> Je te remercie de te préoccuper de mon problème et je suis prés a


refaire
> complétement ma procédure si il y a une meilleur solution.
>
>
>
> Cordialement,
>
>
> a écrit dans le message de
> news:e8i%
> > Bonjour,
> >
> > une question pourquoi faire un SUM(Temps_travail) je m'attendais plus


à
> > trouver une soustraction entre une date de début et une data de fin de
> temps
> > de travail ensuite en extrayant la partie jours on aurait vu de suite


si
> la
> > personne avait travaillé plus d'une journée d'après cette procédure
stocké
> > le champs Temps _travail semble enregistrer sous forme d'un float le
> nombre
> > d'heure travaillé (ou un autre intervalle de temps minute seconde etc
etc)
> > donc l'utilisateur saisie un truc du genre 1,50 pour dire qu'il a
> travaillé
> > un jour et une demie journée (soit 12 heures) j'avoue avoir un peu de
mal
> à
> > saisir le mode de calcul cela étant pour ma part le
> >
> > Declare @Id_Saisie_Employes [int]
> >
> > je l'aurais placé avant le insert into afin d'être sur qu'au sein de


la
> proc
> > stock cela ne soit pas considéré comme une instruction sql (même si on
est
> > d'accord cela ne doit pas influencer le @@IDENTITY)
> >
> > que voulez vous dire par "La procédure me renvoi systématiquement une
> valeur
> > Null " je m'attendrais plutot à voir un 0 puisque c'est la valeur du
> return
> > dans le else or si la base atteint 1 du fait de votre condition la


proc
> > stock doit renvoyer 0 (cf <1 et non <=1)
> >
> > Avec quelques précisions il serait plus évident de vous répondre je
> penses.
> >
> > Sebastien
> >
> >
> > "Daniel Amaury" a écrit dans le
> > message de news:
> > > J'ai créé une procédure qui normalement devrait contrôler si le


temps
de
> > > travail de la journée d'un utilisateur est supérieur à un jour. Mais
> voila
> > > dés que l'ensemble de la base à atteint 1. La procédure me renvoi
> > > systématiquement une valeur Null quelque soit la date au lieu du


temps
> de
> > > travail d'un utilisateur pour un jour donné. J'ai retourné le


probléme
> > dans
> > > tout les sens rien a faire. Manuellement dans l'annalyseur de


requette
> ca
> > > marche en procedure stokée ça ne marche plus.
> > >
> > >
> > >
> > > Vous trouverez ci-dessous mon script SQL.
> > >
> > >
> > >
> > > Je vous remercie par avance de l'aide que vous pourriez m'apporter.
> > >
> > >
> > >
> > > Cordialement,
> > >
> > > ALTER Procedure spI_T_Saisie_Employes
> > >
> > > (
> > > @Jour [smalldatetime]
> > > , @Temps_travail [float]
> > > , @Id_Utilisateur [int]
> > > , @Id_Affaire [int]
> > > , @Id_Phase [int]
> > > , @Id_Qualification [int]
> > > , @Id_Secteur [int]
> > > , @Id_Echelon [int]
> > > )
> > >
> > > As begin
> > >
> > > Declare @Times float
> > > set @Times=(SELECT SUM(Temps_travail) AS "Times"
> > > FROM T_Saisie_Employes
> > > WHERE (Jour = @jour) AND (Id_Utilisateur > > > > @Id_Utilisateur))
> > >
> > > If @Times < 1
> > > Begin
> > > Insert Into [dbo].[T_Saisie_Employes]
> > >
> > > (
> > > [Jour]
> > > , [Temps_travail]
> > > , [Id_Utilisateur]
> > > , [Id_Affaire]
> > > , [Id_Phase]
> > > , [Id_Qualification]
> > > , [Id_Secteur]
> > > , [Id_Echelon]
> > > )
> > >
> > > Values
> > >
> > > (
> > > @Jour
> > > , @Temps_travail
> > > , @Id_Utilisateur
> > > , @Id_Affaire
> > > , @Id_Phase
> > > , @Id_Qualification
> > > , @Id_Secteur
> > > , @Id_Echelon
> > > )
> > >
> > >
> > > Declare @Id_Saisie_Employes [int]
> > > Set @Id_Saisie_Employes = @@IDENTITY
> > > Return @Id_Saisie_Employes
> > >
> > > End Else Begin
> > >
> > > Return 0
> > >
> > > End
> > > End
> > >
> > >
> >
> >
>
>




Avatar
Daniel Amaury
Après plusieurs heures de debugage hier et ce matin voici
la solution.

Je remercie encore ceux qui m'ont apporté leur aide.

Cordialement,


ALTER Procedure spI_T_Saisie_Employes_Temps
(
@Jour [smalldatetime]
, @Temps_travail [float]
, @Id_Utilisateur [int]
, @Id_Affaire [int]
, @Id_Phase [int]
, @Id_Qualification [int]
, @Id_Secteur [int]
, @Id_Echelon [int]
)

As

Declare @Times [float]

set @Times=(SELECT SUM(Temps_travail) AS [Times]
FROM T_Saisie_Employes
WHERE (Jour = @Jour) AND
(Id_Utilisateur = @Id_Utilisateur))

If ((@Times + @Temps_travail)<= 1) or (@Times is null)

Begin

Insert Into [dbo].[T_Saisie_Employes]
(
[Jour]
, [Temps_travail]
, [Id_Utilisateur]
, [Id_Affaire]
, [Id_Phase]
, [Id_Qualification]
, [Id_Secteur]
, [Id_Echelon]
)

Values
(
@Jour
, @Temps_travail
, @Id_Utilisateur
, @Id_Affaire
, @Id_Phase
, @Id_Qualification
, @Id_Secteur
, @Id_Echelon
)

return @@IDENTITY

End

else

Begin

Return(0)

end

-----Message d'origine-----
je ne comprend pas.
Elle me retour maintenant systématiquement 0, je n'ai


pas de triger. Et vous
trouverez ci-joint le format de ma table.

je vais refaire compétement ma procédure et vos


informations seront
bienvenue.

Encore merci

Daniel

"Daniel Amaury" a


écrit dans le
message de news:%



J'ai testé, mais malgré vos judicieux conseils ca ne




fonctionne toujour
pas.
Si je vide la base ca ne fonctionne que sur la date du




jour.
Je vais redemarer ma machine, voir si.

Merci

a écrit dans le




message de
news:
> Opère un test
>
>
> Premier use case :
>
> une somme des valeur saisie sur une journée




inférieure à 1 cela devrait
> renvoyer le @@IDENTITY donc normalement si j'ai




bien compris ce doit
être
> un entier qui provient d'un auto incrément sur la




colonne clef primaire
de
> la table dans laquelle tu fais l'insertion ( au




passage vérifie que
c'est
> bien la colonne de clef primaire et qu'elle a bien




un compteur
automatique)
>
> Deuxième use case
>
> une somme des valeur saisie sur une journée




supérieure à 1 cela doit
> renvoyer 0
>
> Troisième use case
>
> une somme des valeur saisie sur une journée égale à




1 cela doit renvoyer
0
>
> si le 2 et 3 sont bon et que c'est le 1 qui plante




c'est que tu ne
récupère
> pas le @@identity dans ce cas comme dit dans le test
>
> Vérifier que la clef primaire est bien défini dans




la table , vérifier
que
> la clef primaire est bien un entier avec un compteur
>
> J'ai aussi un peu réécrit la proc stock car certaine




chose me choque
>
>
> ALTER Procedure spI_T_Saisie_Employes
>
> /* ( ici je supprime les parenthèses ) */
> @Jour [smalldatetime]
> , @Temps_travail [float]
> , @Id_Utilisateur [int]
> , @Id_Affaire [int]
> , @Id_Phase [int]
> , @Id_Qualification [int]
> , @Id_Secteur [int]
> , @Id_Echelon [int]
> /* ) ici je supprime les parenthèses ) */
>
> As /* begin suppression du begin */
>
> Declare @Times float
>
> Declare @Id_Saisie_Employes [int]
> Declare @Erreur [int] /* variable utilisée pour




tester une erreur
> d'insertion*/
>
> set @Erreur=-1
> set @Id_Saisie_Employes=-1 /* initialisation de la




variable avec une
valeur
> qui ne peut pas être retournée comme ça si on voit -




1 c'est que
@@IDENTITY
> n'a rien renvoyé si la valeur est null le problème




est ailleurs*/
>
> set @Times=(SELECT SUM(Temps_travail) AS "Times"
> FROM T_Saisie_Employes
> WHERE (Jour = @jour) AND




(Id_Utilisateur =
> @Id_Utilisateur))
>
> If (@Times < 1) /*ajout de parenthèses*/
>
> Begin
> Insert Into [dbo].[T_Saisie_Employes]
> (
> [Jour]
> , [Temps_travail]
> , [Id_Utilisateur]
> , [Id_Affaire]
> , [Id_Phase]
> , [Id_Qualification]
> , [Id_Secteur]
> , [Id_Echelon]
> )
> Values
> (
> @Jour
> , @Temps_travail
> , @Id_Utilisateur
> , @Id_Affaire
> , @Id_Phase
> , @Id_Qualification
> , @Id_Secteur
> , @Id_Echelon
> )
>
> Set @Erreur=@@ERROR /*récupère un numéro d'erreur ou




0 si pas d'erreur*/
>
> Set @Id_Saisie_Employes = @@IDENTITY
>
> if (@erreur<>0) /*test de la valeur d'erreur si




différent de 0 et
affiche
> l'info*/
> begin
> select 'erreur n°: ' + @erreur + "Valeur




@id_saisie_employes :
> '+@id_saisie_employes
> end
>
>
> Return @Id_Saisie_Employes
>
> End
>
> Else
>
> Begin
> Return 0
> End
>
> GO /* ayant supprimé le begin au début il faut un GO




*/
>
> Voilà ormis le test sur l'erreur mes autres




modifications concernent
plus
le
> fait que d'une habitude de méthode de travail (peut




être mauvaise
d'ailleur)
> ça me parle plus comme ça
>
> Sebastien
>
> "Daniel Amaury"




a écrit dans le
> message de news:%





> > En fait cette procédure contrôle au moment de la




saisie les
informations
> de
> > travail d'un utilisateur de sa journée. Il ne peus




saisir qu'une
journée
à
> > la fois.
> >
> >
> >
> > Il peut saisir le temps de travail avec uniquement




c'est valeur 0,25 -
> 0,5 -
> > 0,75 - 1
> >
> > Si les valeur saisie dans la journée son supérieur




à 1 (somme du temps
de
> la
> > journée + le temps saisie), le système doit me




retourné la valeur 0
> >
> >
> >
> > Si la valeur saisie est inférieur à 1 (somme du




temps de la journée +
le
> > temps saisie), le système doit insérer le donnée




et me renvoyer ID de
> > l'enregistrement.
> >
> >
> >
> > La valeur retournée est vide le retur est égale




soit à 0 soit à rien.
> >
> >
> >
> > Je te remercie de te préoccuper de mon problème et




je suis prés a
refaire
> > complétement ma procédure si il y a une meilleur




solution.
> >
> >
> >
> > Cordialement,
> >
> >
> > a écrit dans le




message de
> > news:e8i%
> > > Bonjour,
> > >
> > > une question pourquoi faire un SUM




(Temps_travail) je m'attendais
plus
à
> > > trouver une soustraction entre une date de début




et une data de fin
de
> > temps
> > > de travail ensuite en extrayant la partie jours




on aurait vu de
suite
si
> > la
> > > personne avait travaillé plus d'une journée




d'après cette procédure
> stocké
> > > le champs Temps _travail semble enregistrer sous




forme d'un float le
> > nombre
> > > d'heure travaillé (ou un autre intervalle de




temps minute seconde
etc
> etc)
> > > donc l'utilisateur saisie un truc du genre 1,50




pour dire qu'il a
> > travaillé
> > > un jour et une demie journée (soit 12 heures)




j'avoue avoir un peu
de
> mal
> > à
> > > saisir le mode de calcul cela étant pour ma part




le
> > >
> > > Declare @Id_Saisie_Employes [int]
> > >
> > > je l'aurais placé avant le insert into afin




d'être sur qu'au sein de
la
> > proc
> > > stock cela ne soit pas considéré comme une




instruction sql (même si
on
> est
> > > d'accord cela ne doit pas influencer le




@@IDENTITY)
> > >
> > > que voulez vous dire par "La procédure me renvoi




systématiquement
une
> > valeur
> > > Null " je m'attendrais plutot à voir un 0




puisque c'est la valeur du
> > return
> > > dans le else or si la base atteint 1 du fait de




votre condition la
proc
> > > stock doit renvoyer 0 (cf <1 et non <=1)
> > >
> > > Avec quelques précisions il serait plus évident




de vous répondre je
> > penses.
> > >
> > > Sebastien
> > >
> > >
> > > "Daniel Amaury"




a écrit dans
le
> > > message de




news:
> > > > J'ai créé une procédure qui normalement




devrait contrôler si le
temps
> de
> > > > travail de la journée d'un utilisateur est




supérieur à un jour.
Mais
> > voila
> > > > dés que l'ensemble de la base à atteint 1. La




procédure me renvoi
> > > > systématiquement une valeur Null quelque soit




la date au lieu du
temps
> > de
> > > > travail d'un utilisateur pour un jour donné.




J'ai retourné le
probléme
> > > dans
> > > > tout les sens rien a faire. Manuellement dans




l'annalyseur de
requette
> > ca
> > > > marche en procedure stokée ça ne marche plus.
> > > >
> > > >
> > > >
> > > > Vous trouverez ci-dessous mon script SQL.
> > > >
> > > >
> > > >
> > > > Je vous remercie par avance de l'aide que vous




pourriez
m'apporter.
> > > >
> > > >
> > > >
> > > > Cordialement,
> > > >
> > > > ALTER Procedure spI_T_Saisie_Employes
> > > >
> > > > (
> > > > @Jour [smalldatetime]
> > > > , @Temps_travail [float]
> > > > , @Id_Utilisateur [int]
> > > > , @Id_Affaire [int]
> > > > , @Id_Phase [int]
> > > > , @Id_Qualification [int]
> > > > , @Id_Secteur [int]
> > > > , @Id_Echelon [int]
> > > > )
> > > >
> > > > As begin
> > > >
> > > > Declare @Times float
> > > > set @Times=(SELECT SUM(Temps_travail)




AS "Times"
> > > > FROM T_Saisie_Employes
> > > > WHERE (Jour = @jour)




AND (Id_Utilisateur =
> > > > @Id_Utilisateur))
> > > >
> > > > If @Times < 1
> > > > Begin
> > > > Insert Into [dbo].[T_Saisie_Employes]
> > > >
> > > > (
> > > > [Jour]
> > > > , [Temps_travail]
> > > > , [Id_Utilisateur]
> > > > , [Id_Affaire]
> > > > , [Id_Phase]
> > > > , [Id_Qualification]
> > > > , [Id_Secteur]
> > > > , [Id_Echelon]
> > > > )
> > > >
> > > > Values
> > > >
> > > > (
> > > > @Jour
> > > > , @Temps_travail
> > > > , @Id_Utilisateur
> > > > , @Id_Affaire
> > > > , @Id_Phase
> > > > , @Id_Qualification
> > > > , @Id_Secteur
> > > > , @Id_Echelon
> > > > )
> > > >
> > > >
> > > > Declare @Id_Saisie_Employes [int]
> > > > Set @Id_Saisie_Employes = @@IDENTITY
> > > > Return @Id_Saisie_Employes
> > > >
> > > > End Else Begin
> > > >
> > > > Return 0
> > > >
> > > > End
> > > > End
> > > >
> > > >
> > >
> > >
> >
> >
>
>