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:
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 sql : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Partager