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 : 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
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 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