Migration d'un jeu d'enregistrements (RecordSet) vers T-SQL
Bonjour à tous,
Dans le cas d'une migration Accès - SQL Server qui je suis en train d'effectuer dans mon entreprise, j'aurais besoin de convertir un RecordSet qui était écrit en VBA vers une procédure estoquée dans ma base SQL Server.
Je m'explique:
Pour faire la MAJ de quelques donnés d'une table, j'utilise le code VBA suivant:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 20 Set rs = New ADODB.Recordset
30 rs.ActiveConnection = CurrentProject.Connection
40 rs.Source = "SELECT AG, COMPTE, SOLDE, AUTO, D_OUV FROM T_comptes_complet " & _
"WHERE SOLDE<0 AND D_CLOT IS NULL"
50 rs.CursorType = adOpenDynamic
60 rs.LockType = adLockOptimistic
70 rs.Open
80 If Not rs.EOF Then
90 rs.MoveFirst
While Not rs.EOF
100 Set rs2 = New ADODB.Recordset
110 rs2.ActiveConnection = CurrentProject.Connection
120 rs2.Source = "SELECT * FROM T_solde WHERE ymcompte='" & Format(Year(Date), "0000") & Format(Month(Date), "00") & Format(rs![COMPTE], "&&&&&&&&&&&") & "'"
130 rs2.CursorType = adOpenDynamic
140 rs2.LockType = adLockOptimistic
150 rs2.Open
160 If rs2.EOF Then
170 rs2.AddNew
180 rs2![ymcompte] = Format(Year(Date), "0000") & Format(Month(Date), "00") & Format(rs![COMPTE], "&&&&&&&&&&&")
190 rs2![SOLDE] = rs![SOLDE]
210 rs2![jours] = 1
215 rs2![max] = IIf(Nz(rs![auto]) + Nz(rs![SOLDE]) <= 0, 0, Nz(rs![auto]) + Nz(rs![SOLDE]))
216 rs2![jours_mois] = IIf((Month(rs![D_OUV]) = Month(Date)) And (Day(rs![D_OUV]) > 1), jours_mois - Day(rs![D_OUV]) + 1, jours_mois)
217 rs2![agence] = rs![AG]
218 rs2![COMPTE] = rs![COMPTE]
219 rs2![jour_ini] = IIf((Month(rs![D_OUV]) = Month(Date)) And (Day(rs![D_OUV]) > 1), Day(rs![D_OUV]), 1)
rs2![auto] = Nz(rs![auto])
220 rs2.Update
230 Else
240 rs2![SOLDE] = Nz(rs2![SOLDE]) + Nz(rs![SOLDE])
260 rs2![jours] = rs2![jours] + 1
265 rs2![max] = IIf(Nz(rs![auto]) + Nz(rs![SOLDE]) <= rs2![max], rs2![max], Nz(rs![auto]) + Nz(rs![SOLDE]))
270 rs2.Update
280 End If
290 rs2.Close
300 rs.MoveNext
Wend
End If
400 rs.Close |
C'est-à-dire, pour chaque compte de la table T_comptes_complet je cherche le compte correspondent dans la table T_solde et je fais soit un ajout soit une MAJ.
Pour le SQL Server, j'ai pensé en faire dans 2 temps, une MAJ des comptes existants et après l'ajout des nouveaux comptes.
Je mets ensuite ce qui j'ai réussi à faire dans SQL Server qui j'essaye de créer pour la MAJ:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| DECLARE @MyMois varchar
DECLARE @MyCompte varchar
DECLARE @MyConector varchar
if len(cast(Month(getDate()) as varchar))=2
set @MyMois=cast(Month(getDate()) as varchar)
else
set @MyMois=cast('0' as varchar)+cast(Month(getDate()) as varchar)
if len(compte)=3
set @MyCompte=cast('00000000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=4
set @MyCompte=cast('0000000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=5
set @MyCompte=cast('000000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=6
set @MyCompte=cast('00000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=7
set @MyCompte=cast('0000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=8
set @MyCompte=cast('000' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=9
set @MyCompte=cast('00' as varchar)+ cast(compte as varchar)
else
begin
if len(compte)=10
set @MyCompte=cast('0' as varchar)+ cast(compte as varchar)
else
set @MyCompte=cast(compte as varchar)
end
end
end
end
end
end
end
set @MyConector=cast(Year(getDate()) as varchar)+ @MyMois + @MyCompte
UPDATE BO_T_solde
SET BO_T_solde.SOLDE=GC_T_comptes_complet.SOLDE,
BO_T_solde.jours_deb=cast(jours_deb as int)+1,
BO_T_solde.[max]=case
when cast(coalesce(GC_T_comptes_complet.[auto_dec], 0) as decimal(18,2))+ cast(coalesce(GC_T_comptes_complet.[SOLDE], 0) as decimal(18,2)) <= cast(BO_T_solde.[max] as decimal(18,2)) then BO_T_solde.[max]
else cast(coalesce(GC_T_comptes_complet.[auto_dec], 0) as decimal(18,2))+ cast(coalesce(GC_T_comptes_complet.[SOLDE], 0) as decimal(18,2))
end
FROM GC_T_comptes_complet LEFT JOIN BO_T_solde ON @MyConector=BO_T_solde.ymcompte |
Mes problèmes sont donc (pour le moment):
- la variable @MyCompte, qu'est définie en fonction d'une donnée de la table T_comptes_complet - qui je n'ai pas encore lu et que depend de la jointure de la requête de MAJ
- le fait que la jonction c'est fait par une variable qui n'existe pas dans T_comptes_complet...
- et le principale, c'est ma connaissance très limité de t-sql :oops:
:arf:
Je suis un peu perdu, j'aurais vraiment besoin d'un peu de lumière et je viens donc vous demander un peu d'aide...
Merci d'avance pour vos réponses,
Marc
:ccool: