OVH Cloud OVH Cloud

[Aide]fonction et requête

1 réponse
Avatar
404 found
bonjour,
je demande votre aide pour réaliser une requête : En effet, j'ai rélisé ma
requête à l'aide d'une fonction et ça marche avec l'analyseur de requête mais
ma requête me génère l'erreur "délai de connexion" si je la lance à partir de
mon programme Dot net.

Définition de la fonction : Pour chaque compte général (j'en ai 4000), on
somme les montants de tous les mouvements (montant) qu’il y a eu au sur une
période comptable et on prend le mouvement le plus récent.

Ma fonction est implémenté comme ça :

DECLARE @CG varchar(50)
DECLARE @Debit float
DECLARE @DebitBalance float

set @DebitBalance = 0
--je sélectionne mes 4000 comptes généraux
DECLARE MYCURSOR1 CURSOR LOCAL
FOR
SELECT DISTINCT(CG_SOLD_CG) FROM TSMCG_SOLDES

OPEN MYCURSOR1

--Première récupération
FETCH NEXT FROM MYCURSOR1
INTO @CG

WHILE @@FETCH_STATUS=0
BEGIN
set @Debit = 0

select @Debit = CG_SOLD_SOLDE_DEBIT from TSMCG_SOLDES,TSMCG_ECRITURE
where CG_SOLD_CG = @CG and
CG_SOLD_DATE_SOLDE =(select Max(CG_SOLD_DATE_SOLDE) from
TSMCG_SOLDES,TSMCG_ECRITURE
where CG_SOLD_DATE_SOLDE < @DebutPeriode and CG_SOLD_CG = @CG
--Ajouter le débit/crédit à la balance
set @DebitBalance = @DebitBalance + @Debit
--suivant
FETCH NEXT FROM MYCURSOR1
INTO @CG

END

Close MYCURSOR1
DEALLOCATE MYCURSOR1

RETURN @DebitBalance

==> Donc l'idée est de récupérer le montant pour la date le plus récente
(pour cela je fait le Max de date). Y a t il plus simple ? surtout comment
éviter cette boucle et faire une jointure des tables comptes généraux et
soldes ??

Merci de votre aide.

1 réponse

Avatar
Med Bouchenafa
Tu peux effectivement eviter l'utilisation du curseur avec ces requetes
A)Pour avoir la somme
SELECT SUM(CG_SOLD_SOLDE_DEBIT)
FROM TSMCG_SOLDES, TSMCG_ECRITURE
WHERE CG_SOLD_DATE_SOLDE < @DebutPeriode AND CG_SOLD_CG = @CG

B) Pour avoir le dernier debit
SELECT CG_SOLD_SOLDE_DEBIT, MAX(CG_SOLD_DATE_SOLDE)
FROM TSMCG_SOLDES, TSMCG_ECRITURE
WHERE CG_SOLD_DATE_SOLDE < @DebutPeriode AND CG_SOLD_CG = @CG
GROUP BY CG_SOLD_SOLDE_DEBIT

Dans les deux cas, il faut cependant specifier la colonne de jointure entre
tes deux tables

--
Bien cordialement
Med Bouchenafa


"404 found" wrote in message
news:
bonjour,
je demande votre aide pour réaliser une requête : En effet, j'ai rélisé ma
requête à l'aide d'une fonction et ça marche avec l'analyseur de requête
mais
ma requête me génère l'erreur "délai de connexion" si je la lance à partir
de
mon programme Dot net.

Définition de la fonction : Pour chaque compte général (j'en ai 4000), on
somme les montants de tous les mouvements (montant) qu'il y a eu au sur
une
période comptable et on prend le mouvement le plus récent.

Ma fonction est implémenté comme ça :

DECLARE @CG varchar(50)
DECLARE @Debit float
DECLARE @DebitBalance float

set @DebitBalance = 0
--je sélectionne mes 4000 comptes généraux
DECLARE MYCURSOR1 CURSOR LOCAL
FOR
SELECT DISTINCT(CG_SOLD_CG) FROM TSMCG_SOLDES

OPEN MYCURSOR1

--Première récupération
FETCH NEXT FROM MYCURSOR1
INTO @CG

WHILE @@FETCH_STATUS=0
BEGIN
set @Debit = 0

select @Debit = CG_SOLD_SOLDE_DEBIT from TSMCG_SOLDES,TSMCG_ECRITURE
where CG_SOLD_CG = @CG and
CG_SOLD_DATE_SOLDE =(select Max(CG_SOLD_DATE_SOLDE) from
TSMCG_SOLDES,TSMCG_ECRITURE
where CG_SOLD_DATE_SOLDE < @DebutPeriode and CG_SOLD_CG = @CG
--Ajouter le débit/crédit à la balance
set @DebitBalance = @DebitBalance + @Debit
--suivant
FETCH NEXT FROM MYCURSOR1
INTO @CG

END

Close MYCURSOR1
DEALLOCATE MYCURSOR1

RETURN @DebitBalance

==> Donc l'idée est de récupérer le montant pour la date le plus récente
(pour cela je fait le Max de date). Y a t il plus simple ? surtout comment
éviter cette boucle et faire une jointure des tables comptes généraux et
soldes ??

Merci de votre aide.