willyboy73 | Bonjour à tous, je me tourne vers ce forum car dans le cadre d'un projet sur une ligne 100 V15.5 SQL je dois effectuer des modifications sur la table F_DOCLIGNE sur des devis flagués .
J'ai essayé beaucoup beaucoup de choses mais je suis hélas en panne d'idée pour résoudre mon problème. Voici mon soucis :
Je dois modifier les lignes dans la table F_DOCLIGNE de certains devis dont l'entête est stockée dans la table F_DOCENTETE et flaguée grace a un champ crmsync qui est à 'LinesNotOk' quand le devis est à traiter et à LinesOk quand il est traité.
Suite à divers tests en trigger exécutés quand je flag l'entête se révélant infructueux j'ai décidé de faire passer un job SQL avec le SQL agent toutes les deux minutes pour aller traiter mes devis flaggés.
J'ai donc commencé par des update simples avec jointure entre les deux tables mais j'ai eu des gros soucis mon traitement se bloquant complètement et rendant la gescom inutilisable à priori a cause des verrous posés sur les devis en cours d'utilisation.
J'ai donc réécris mon Job pour traiter un par un les devis et pouvoir tester s'ils sont en cours d'utilisation : mais mon job est extrêmement long à s'exécuter et bloque complètement la ges com et là je ne maîtrise plus du tout la raison. C'est pourquoi j'en appelle à vous pour éclairer ma lanterne si vous pouvez jeter un oeil à mon script et détecter une erreur SQL ? Ou s'il y a des connaisseurs de la ligne 100 qui identifient une mauvaise façon de procéder ? Je vous remercie grandement d'avance. Je suis a votre disposition pour toute question.
Bonne journée à tous !
Voici mon job :
Code :
- SET NOCOUNT ON
- DECLARE @DO_PIECE varchar(9)
- DECLARE @DO_TYPE smallint
- DECLARE @DO_DOMAINE smallint
- DECLARE @DO_cbMarq int
- DECLARE @DO_Dure_Contrat numeric
- DECLARE @DO_majorachat numeric
- DECLARE @lock int
- DECLARE MyCursor CURSOR FOR
- SELECT DO_PIECE,DO_TYPE,DO_DOMAINE,cbMarq,Dure_Contrat,majorachat FROM F_DOCENTETE
- WHERE crmsync='linesnotok' and DO_Ref = 'QT-298/4'
- ORDER BY cbMarq
- OPEN MyCursor -- j'initialise mon curseur
- -- je le rempli avec la première ligne retournée par la requête
- FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_TYPE, @DO_DOMAINE, @DO_cbMarq,@DO_Dure_Contrat,@DO_majorachat
- -- Tant que je n'ai pas traité tous les enregistrements de le requête
- WHILE @@FETCH_STATUS = 0
- BEGIN
- exec CB_IsRecordLock 'F_DOCENTETE', @DO_cbMarq, @lock OUTPUT --Test si l'enregistrement est locké
- IF @lock > 0
- RAISERROR('Enregistrement Verrouillé',10,1)
- ELSE
- BEGIN
-
- if((@DO_majorachat<>0) AND (@DO_majorachat is not null))
- BEGIN
- -- 1- Majoration des Lignes de Rachat
- UPDATE F_DOCLIGNE
- SET F_DOCLIGNE.DL_QteBC = DL_Qte*1.1,
- F_DOCLIGNE.DL_QteBL = DL_Qte*1.1,
- F_DOCLIGNE.EU_Qte = DL_Qte*1.1,
- F_DOCLIGNE.DL_MontantHT = DL_Qte*1.1,
- F_DOCLIGNE.DL_MontantTTC = ROUND(DL_Qte*1.1*(1+(DL_Taxe1/100)),2),
- F_DOCLIGNE.DL_Qte = DL_Qte*1.1
- WHERE F_DOCLIGNE.DO_PIECE = @DO_PIECE AND F_DOCLIGNE.DO_TYPE = @DO_TYPE AND F_DOCLIGNE.DO_DOMAINE = @DO_DOMAINE
- AND F_DOCLIGNE.AR_Ref = 'RACHVIDCST'
-
- -- 2- Majoration Remise
- UPDATE F_DOCLIGNE
- SET F_DOCLIGNE.DL_MontantHT = F_DOCLIGNE.DL_MontantHT-@DO_majorachat,
- F_DOCLIGNE.DL_MontantTTC = F_DOCLIGNE.DL_MontantTTC-ROUND(@DO_majorachat*(1+(DL_Taxe1/100)),2)
- WHERE F_DOCLIGNE.DO_PIECE = @DO_PIECE AND F_DOCLIGNE.DO_TYPE = @DO_TYPE AND F_DOCLIGNE.DO_DOMAINE = @DO_DOMAINE
- AND F_DOCLIGNE.AR_Ref = 'REM_VI'
- END
- -- 3- Valorisation Loyer
- UPDATE F_DOCLIGNE
- SET F_DOCLIGNE.DL_PoidsBrut = ROUND(((F_DOCLIGNE.DL_MontantHT/(@DO_Dure_Contrat/1.2))*1000),2)
- WHERE F_DOCLIGNE.DO_PIECE = @DO_PIECE AND F_DOCLIGNE.DO_TYPE = @DO_TYPE AND F_DOCLIGNE.DO_DOMAINE = @DO_DOMAINE
-
- -- 4 ReFlag de l'entête
- UPDATE F_DOCENTETE
- SET crmsync='linesok', majorachat = 0
- WHERE F_DOCENTETE.DO_PIECE = @DO_PIECE AND F_DOCENTETE.DO_TYPE = @DO_TYPE AND F_DOCENTETE.DO_DOMAINE = @DO_DOMAINE
-
- END
- FETCH NEXT FROM MyCursor INTO @DO_PIECE, @DO_TYPE, @DO_DOMAINE, @DO_cbMarq,@DO_Dure_Contrat,@DO_majorachat
- END
- CLOSE myCursor -- je ferme mon curseur
- DEALLOCATE myCursor -- je libère la mémoire allouée à ce curseur
|
|