Transformer des bouts de codes vb en fonctions ou procédures sql server
cs_Visso
Messages postés36Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention17 avril 2014
-
17 oct. 2007 à 18:23
cs_Visso
Messages postés36Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention17 avril 2014
-
30 oct. 2007 à 12:37
Je sais que vous n'avez pas le temps , mais j'ai un petit problème à vous poser , j'ai une fonction écrite en vb 6.0 que j'aimerai transformer en ps ou fonction sql server selon le cas le plus adapté.
J'ai lu l'article qui parlais d'éviter les curseurs , mais je me demande comment faire:
Je me permet de vous mettre ici le code vb que si vous avez le temps ou la patience vs regarderez, sinon ce n'est pas grave .
Je suis entrain d'essayer de le faire moi même petit à petit, mais un coup de mais serai le bien venu.
C'est une partie de fonction permettant de calculer le cump.
Merci pour votre compréhension et votre aide même minime.
Voici le bout de code:
Public Function CalculVeille(DateVeille As Date, Optional ArticleDeDebut As String, Optional ArticleDeFin As String) As Boolean
Dim DateFinVeille As Date
CalculVeille = False
ActiveBase.Execute "DELETE * FROM VALEUR"
If ArticleDeDebut = "" Then
Set RstM_Valeur = New ADODB.Recordset
RstM_Valeur.Open "select * from Valeur order by codprod,datemvt,typemvt", ActiveBase, adOpenDynamic, adLockOptimistic
If RstM_Valeur.EOF Then 'fo continuer le traitement meme s'il y a pas de mouvements pour la période de veille
End If
First = True
If Not RstM_Valeur.EOF Then RstM_Valeur.MoveFirst: Cdd = RstM_Valeur.Fields("codprod")
While Not RstM_Valeur.EOF
While RstM_Valeur.Fields("codprod") = Cdd
If Not First Then
If RstM_Valeur.Fields("typemvt") = "E" Then
Ccump = (LastQte * LastCump + (RstM_Valeur.Fields("prixunit") * RstM_Valeur.Fields("qte"))) / (LastQte + RstM_Valeur.Fields("qte"))
LastQte = LastQte + RstM_Valeur.Fields("qte")
LastCump = Ccump
Else
LastCump = Ccump
LastQte = LastQte - RstM_Valeur.Fields("qte")
End If
SET @NomTable='#TEMP_VALEUR'
IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME = @NomTable)
DROP TABLE #TEMP_VALEUR
ELSE
BEGIN --2
SELECT * , 0 AS OK
INTO #TEMP_VALEUR
FROM VALEUR ;
-- ALTER TABLE #TEMP_VALEUR ADD NBRE_LIGNE nvarchar(1000) ;
DELETE FROM #TEMP_VALEUR;
END --2
IF @ArticleDeDebut = ''
BEGIN --3
INSERT INTO #TEMP_VALEUR ( CODEMVT, CODPROD, QTE, PRIXUNIT, MONTANT, DEMANDEUR, DESTINATION, ORIGINE, UTILISATION,
NUMOBJET, NUMFABRIC, CODEMACH, CUMP, VALEUR, QTEDISP,TYPEMVT,DATEMVT,CODEFAMIL,
CODESFAM,BONENTRESORTIE,CLEF_INFO,OK) SELECT DETAILMOUVEMENTS.CODEMVT, DETAILMOUVEMENTS.CODPROD,
DETAILMOUVEMENTS.QTE, DETAILMOUVEMENTS.PRIXUNIT, DETAILMOUVEMENTS.MONTANT,
DETAILMOUVEMENTS.DEMANDEUR, DETAILMOUVEMENTS.DESTINATION, DETAILMOUVEMENTS.ORIGINE,
DETAILMOUVEMENTS.UTILISATION, DETAILMOUVEMENTS.NUMOBJET, DETAILMOUVEMENTS.NUMFABRIC,
DETAILMOUVEMENTS.CODEMACH, DETAILMOUVEMENTS.CUMP, DETAILMOUVEMENTS.VALEUR,
DETAILMOUVEMENTS.QTEDISP, MOUVEMENTS.TYPEMVT, MOUVEMENTS.DATEMVT, ARTICLES.CODEFAMIL,
ARTICLES.CODESFAM,MOUVEMENTS.BONENTRESORTIE,DETAILMOUVEMENTS.CLEF_INFO,0
FROM (MOUVEMENTS INNER JOIN DETAILMOUVEMENTS ON MOUVEMENTS.CODEMVT = DETAILMOUVEMENTS.CODEMVT)
INNER JOIN ARTICLES ON DETAILMOUVEMENTS.CODPROD = ARTICLES.CODPROD
WHERE (MOUVEMENTS.DATEMVT)>=@DebutExo And (MOUVEMENTS.DATEMVT)<@DateVeille ORDER BY DETAILMOUVEMENTS.CODPROD,MOUVEMENTS.DATEMVT,MOUVEMENTS.TYPEMVT
END --3
Else
BEGIN --4
INSERT INTO #TEMP_VALEUR ( CODEMVT, CODPROD, QTE, PRIXUNIT, MONTANT, DEMANDEUR, DESTINATION, ORIGINE, UTILISATION,
NUMOBJET, NUMFABRIC, CODEMACH, CUMP, VALEUR, QTEDISP,TYPEMVT,DATEMVT,CODEFAMIL,
CODESFAM,BONENTRESORTIE,CLEF_INFO,OK) SELECT DETAILMOUVEMENTS.CODEMVT, DETAILMOUVEMENTS.CODPROD,
DETAILMOUVEMENTS.QTE, DETAILMOUVEMENTS.PRIXUNIT, DETAILMOUVEMENTS.MONTANT,
DETAILMOUVEMENTS.DEMANDEUR, DETAILMOUVEMENTS.DESTINATION, DETAILMOUVEMENTS.ORIGINE,
DETAILMOUVEMENTS.UTILISATION, DETAILMOUVEMENTS.NUMOBJET, DETAILMOUVEMENTS.NUMFABRIC,
DETAILMOUVEMENTS.CODEMACH, DETAILMOUVEMENTS.CUMP, DETAILMOUVEMENTS.VALEUR,
DETAILMOUVEMENTS.QTEDISP, MOUVEMENTS.TYPEMVT, MOUVEMENTS.DATEMVT, ARTICLES.CODEFAMIL,
ARTICLES.CODESFAM,MOUVEMENTS.BONENTRESORTIE ,DETAILMOUVEMENTS.CLEF_INFO,0
FROM (MOUVEMENTS INNER JOIN DETAILMOUVEMENTS ON MOUVEMENTS.CODEMVT = DETAILMOUVEMENTS.CODEMVT)
INNER JOIN ARTICLES ON DETAILMOUVEMENTS.CODPROD = ARTICLES.CODPROD
WHERE (MOUVEMENTS.DATEMVT)>=@DebutExo And (MOUVEMENTS.DATEMVT)< @DateVeille and
DETAILMOUVEMENTS.CODPROD>=@ArticleDeDebut and DETAILMOUVEMENTS.CODPROD<[mailto:=@ArticleDeFin =@ArticleDeFin] ORDER BY DETAILMOUVEMENTS.CODPROD,MOUVEMENTS.DATEMVT,MOUVEMENTS.TYPEMVT
END --4
SET @LastQte=0
SET @Ccump=0
SET @LastCump=0
SET @First=1
WHILE EXISTS ( SELECT TOP 100 PERCENT * FROM #TEMP_VALEUR WHERE OK = 0 ORDER BY CODPROD,DATEMVT,TYPEMVT)
BEGIN --5 SET @Cdd(SELECT TOP 1 CODPROD FROM #TEMP_VALEUR WHERE OK 0 ORDER BY CODPROD,DATEMVT,TYPEMVT)
WHILE EXISTS(SELECT TOP 100 PERCENT * FROM #TEMP_VALEUR WHERE OK = 0 AND [mailto:CODPROD=@Cdd CODPROD=@Cdd] ORDER BY CODPROD,DATEMVT,TYPEMVT)
BEGIN --6
IF @First=0
BEGIN --7 SET @TypMvt(SELECT TOP 1 TYPEMVT FROM #TEMP_VALEUR WHERE OK 0 ORDER BY CODPROD,DATEMVT,TYPEMVT) SET @LaQte(SELECT TOP 1 QTE FROM #TEMP_VALEUR WHERE OK 0 ORDER BY CODPROD,DATEMVT,TYPEMVT) SET @PrixUnit(SELECT TOP 1 PRIXUNIT FROM #TEMP_VALEUR WHERE OK 0 ORDER BY CODPROD,DATEMVT,TYPEMVT)
IF @TypMvt='E'
BEGIN --8
SET @Ccump= (@LastQte * @LastCump + (@PrixUnit * @LaQte)) / (@LastQte + @LaQte)
SET @LastQte=@LastQte + @LaQte
SET @LastCump=@Ccump
END --8
ELSE
BEGIN --9
SET @LastCump=@Ccump
SET @LastQte=@LastQte - @LaQte
END --9
BEGIN
SET @Row_Id= (SELECT TOP 1 CLEF_INFO
FROM #TEMP_VALEUR WHERE OK = 0
ORDER BY CODPROD,DATEMVT,TYPEMVT)
UPDATE #TEMP_VALEUR
SET Cump= Round(@LastCump, 2), [mailto:QteDisp=@LastQte,OK=1 QteDisp=@LastQte,OK=1]
Where [mailto:CLEF_INFO=@Row_Id CLEF_INFO=@Row_Id]
END
END --7
ELSE
BEGIN --10
SET @First=0
SET @PrixUnitArt= (SELECT PRIXUNIT FROM ARTICLES WHERE [mailto:CODPROD=@cdd CODPROD=@cdd])
SET @LaQteIni = (SELECT QTEINI FROM ARTICLES WHERE [mailto:CODPROD=@cdd CODPROD=@cdd])
IF (@LaQteIni + @LaQte) <> 0
BEGIN --11
IF @TypMvt='S'
BEGIN --12
SET @Ccump = @PrixUnitArt
SET @LastQte = @LaQteIni - @LaQte
END --12
ELSE
BEGIN --13
SET @Ccump = ((@PrixUnitArt * @LaQteIni) + (@PrixUnit * @LaQte)) / (@LaQteIni + @LaQte)
SET @LastQte = @LaQteIni + @LaQte
END --13
END --11
ELSE
SET @Ccump = 0
END --10
SET @LastCump = @Ccump
SET @Row_Id= (SELECT TOP 1 CLEF_INFO
FROM #TEMP_VALEUR WHERE OK = 0
ORDER BY CODPROD,DATEMVT,TYPEMVT)
UPDATE #TEMP_VALEUR
SET Cump= Round(@LastCump, 2), [mailto:QteDisp=@LastQte,OK=1 QteDisp=@LastQte,OK=1]
Where [mailto:CLEF_INFO=@Row_Id CLEF_INFO=@Row_Id]
END --6
END --5
SELECT * FROM #TEMP_VALEUR
END --1
GO
Merci et je suis disponible pour plus d'explication.