Insertion dans F_ECRITUREC - erreur 41149
Posté: Dim 22 Nov 2015 13:17
Bonjour,
Je me suis créée une procédure stockée qui permet de générer de nouvelles écritures comptables, tout cela est fait dans une transaction, je rencontre l'erreur 41149 et je ne trouve aucune explication au problème que je rencontre, et de plus, j'ai SQL Server 2008 R2 qui plante à chaque fois
Le but est de générer de nouvelles écritures, permettant de payer des fournisseurs, pour cela, je dois générer une remise bancaire. Le contenu de ma procédure stockée:
Dans mes tests , je sélectionne comme numéro de remise (paramètre de ma procédure stockée) N34L100177.
En PJ, je vous met le script permettant de créer et d'initialiser ma table ZIMPORTECRITURES.
Je n'envoie rien concernant la table ZSESSIONIMPORTECRITURES car c'est une juste une table décrivant l'en-tête de la remise, elle n'est pas très importante.
Le problème que je rencontre survient à la 3eme itération dans ma boucle, en faisant l'insertion dans mon 1er bloc.
Merci
PS: version 16.05 en comptabilité
Je me suis créée une procédure stockée qui permet de générer de nouvelles écritures comptables, tout cela est fait dans une transaction, je rencontre l'erreur 41149 et je ne trouve aucune explication au problème que je rencontre, et de plus, j'ai SQL Server 2008 R2 qui plante à chaque fois
Le but est de générer de nouvelles écritures, permettant de payer des fournisseurs, pour cela, je dois générer une remise bancaire. Le contenu de ma procédure stockée:
- Code: Tout sélectionner
ALTER PROCEDURE [dbo].[Z_PS_GenererEcrituresComptables2](@idSession varchar(50))
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if @idSession is null
raiserror('Null values not allowed for Z_PS_GenererEcrituresComptables', 16, 1)
declare @lettrage varchar(3)
declare @num int=1
declare @ct_num varchar(17)
declare @ct_numOLD varchar(17)=''
declare @ct_numEnCours varchar(17)=''
declare @jm_date smalldatetime
declare @nbLigne int
declare @annee int
declare @listeECNO varchar(max)
declare @req varchar(max)
declare @DernierEcNo int
declare @idTypePaiement numeric(18,0)
declare @AnalytiqueEcartChange varchar(20)
declare @Montant numeric(24,6)
declare @TotalCredit numeric(38,6)
declare @TotalDebit numeric(38,6)
declare @CompteAnalytique varchar(13)
declare @EC_LETTRE smallint
declare @itermax int=(select max(numero) from ZIMPORTECRITURES where idSession=@idSession)
begin try
begin tran
while @num<=@itermax
begin
SELECT @CompteAnalytique=CompteAnalytique, @EC_LETTRE=EC_Lettre,
@ct_num=ct_num, @annee=anneeRemise, @listeECNO=EC_NoOrigine
from ZIMPORTECRITURES
where idsession=@idSession and numero=@num
if @EC_LETTRE=0 --cette écriture ne doit pas être lettrée
begin
INSERT INTO F_ECRITUREC (JO_Num,EC_No,CG_Num,CT_Num,EC_Intitule,EC_Sens,EC_Montant,JM_Date,EC_Jour,EC_Date,EC_Echeance,
EC_RefPiece,remise_bancaire,EC_Piece,N_Devise,EC_Devise,
EC_NoLink,EC_TresoPiece,N_Reglement,EC_Parite,EC_Quantite,EC_Point,EC_Pointage,EC_Impression,
EC_Cloture,EC_CType,EC_Rappel,EC_LettreQ,EC_LettrageQ,EC_ANType,EC_RType,EC_Remise,EC_ExportExpert,
EC_Norme,TA_Provenance,EC_PenalType,EC_DatePenal,EC_DateRelance,EC_DateRappro,
EC_Reference,EC_StatusRegle,EC_MontantRegle,EC_DateRegle,EC_RIB,EC_DateOp,EC_NoCloture,EC_Lettre,EC_Lettrage)
select JO_Num,0,CG_Num,CT_Num,EC_Intitule,EC_Sens,EC_Montant,JM_Date,EC_Jour,EC_Date,EC_Echeance,
EC_RefPiece,remise_bancaire,EC_Piece,N_Devise,EC_Devise,
EC_NoLink,EC_TresoPiece,N_Reglement,EC_Parite,EC_Quantite,EC_Point,EC_Pointage,EC_Impression,
EC_Cloture,EC_CType,EC_Rappel,EC_LettreQ,EC_LettrageQ,EC_ANType,EC_RType,EC_Remise,EC_ExportExpert,
EC_Norme,TA_Provenance,EC_PenalType,EC_DatePenal,EC_DateRelance,EC_DateRappro,
EC_Reference,EC_StatusRegle,EC_MontantRegle,EC_DateRegle,EC_RIB,EC_DateOp,EC_NoCloture,0,''
FROM ZIMPORTECRITURES
where idsession=@idSession and numero=@num
end
else
begin
set @ct_numEnCours=@ct_num
--on met à jour les infos libre SAGE des écritures comptables
set @req='UPDATE F_ECRITUREC SET Remise_bancaire=''@idsession@'', ecritureOrigine=1.0 WHERE EC_NO IN (@ecno@)'
set @req=replace(@req,'@idsession@',@idSession)
set @req=replace(@req,'@ecno@',@listeECNO)
exec(@req)
--on met à jour le lettrage si on change de tiers
if @ct_numOLD<>@ct_numEnCours
begin
set @ct_numOLD=@ct_numEnCours
set @lettrage=[dbo].[z_nouveauLettrage](@ct_numEnCours,@annee)
end
--mise à jour des codes de lettrages SAGE
update F_ECRITUREC set ec_lettre=1, ec_lettrage=@lettrage
where Remise_bancaire=@idSession and ct_num=@ct_numEnCours
--inserer la nouvelle ligne dans SAGE
INSERT INTO F_ECRITUREC (JO_Num,EC_No,CG_Num,CT_Num,EC_Intitule,EC_Sens,EC_Montant,JM_Date,EC_Jour,EC_Date,EC_Echeance,
EC_RefPiece,remise_bancaire,EC_Piece,N_Devise,EC_Devise,
EC_NoLink,EC_TresoPiece,N_Reglement,EC_Parite,EC_Quantite,EC_Point,EC_Pointage,EC_Impression,
EC_Cloture,EC_CType,EC_Rappel,EC_LettreQ,EC_LettrageQ,EC_ANType,EC_RType,EC_Remise,EC_ExportExpert,
EC_Norme,TA_Provenance,EC_PenalType,EC_DatePenal,EC_DateRelance,EC_DateRappro,
EC_Reference,EC_StatusRegle,EC_MontantRegle,EC_DateRegle,EC_RIB,EC_DateOp,EC_NoCloture,EC_Lettre,EC_Lettrage)
select JO_Num,0,CG_Num,CT_Num,EC_Intitule,EC_Sens,EC_Montant,JM_Date,EC_Jour,EC_Date,EC_Echeance,
EC_RefPiece,remise_bancaire,EC_Piece,N_Devise,EC_Devise,
EC_NoLink,EC_TresoPiece,N_Reglement,EC_Parite,EC_Quantite,EC_Point,EC_Pointage,EC_Impression,
EC_Cloture,EC_CType,EC_Rappel,EC_LettreQ,EC_LettrageQ,EC_ANType,EC_RType,EC_Remise,EC_ExportExpert,
EC_Norme,TA_Provenance,EC_PenalType,EC_DatePenal,EC_DateRelance,EC_DateRappro,
EC_Reference,EC_StatusRegle,EC_MontantRegle,EC_DateRegle,EC_RIB,EC_DateOp,EC_NoCloture,1,@lettrage
FROM ZIMPORTECRITURES
where idsession=@idSession and numero=@num
end --if
set @num=@num+1
end --while
--statut:
--0 : non traité
--1 : traité
--2 : echec
--3 : Supprimé
update ZSESSIONIMPORTECRITURES set statut=1 where idSession=@idSession
--test de cohérence : on doit avoit Total débit = Total crédit
set @TotalDebit=(
select sum(convert(numeric(38,6),ec_montant))
from F_ECRITUREC
where Remise_bancaire=@idSession
and ec_sens=0
)
set @TotalCredit=(
select sum(convert(numeric(38,6),ec_montant))
from F_ECRITUREC
where Remise_bancaire=@idSession
and ec_sens=1
)
if @TotalDebit=@TotalCredit --la remise a été correctement générée
begin
commit
select 0,'ok'
end
else
begin
declare @Message varchar(max)
set @Message='An error occured in the generation of your delivery, total debit amount=@1, total credit amount=@2'
set @Message=replace(@Message,'@1',@TotalDebit)
set @Message=replace(@Message,'@2',@TotalCredit)
raiserror(@Message, 16, 1)
end
end try
begin catch
select 99, ERROR_MESSAGE();
rollback
update ZSESSIONIMPORTECRITURES set statut=2 where idSession=@idSession
end catch
END
Dans mes tests , je sélectionne comme numéro de remise (paramètre de ma procédure stockée) N34L100177.
En PJ, je vous met le script permettant de créer et d'initialiser ma table ZIMPORTECRITURES.
Je n'envoie rien concernant la table ZSESSIONIMPORTECRITURES car c'est une juste une table décrivant l'en-tête de la remise, elle n'est pas très importante.
Le problème que je rencontre survient à la 3eme itération dans ma boucle, en faisant l'insertion dans mon 1er bloc.
Merci
PS: version 16.05 en comptabilité