IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Migration d'un jeu d'enregistrements (RecordSet) vers T-SQL


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut 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 : 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

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Désolé vous vous y prenez très mal.

    Vous reprenez votre code VBA et vous le traduisez en T-SQL, c'est la meilleure façon de produire une très mauvaise procédure.

    SQL est un langage ensembliste mais pas le VBA. On raisonne différemment.
    Il faut repartir de votre besoin initial et tout coder de là.

    Si vous êtes en SQL-Server 2008, une seule instruction (MERGE) doit suffire à répondre à votre besoin.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    923
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 923
    Points : 760
    Points
    760
    Par défaut
    Merci de votre réponse Waldar.

    En fait j'ai le SQL 2005, et il ne reconnaît pas le mot USING...
    J'ai trouvé donc cette page avec une option pour faire le MERGE sans le MERGE, je vais essayer et je posterai après...


Discussions similaires

  1. taille d'un jeu d'enregistrement
    Par azopei dans le forum Access
    Réponses: 2
    Dernier message: 03/04/2006, 18h03
  2. [VBA] Pourquoi mon jeu d'enregistrement est vide ?
    Par gyzmo5 dans le forum Access
    Réponses: 2
    Dernier message: 09/02/2006, 14h15
  3. migration d'une base de données access vers oracle
    Par narjisovish dans le forum Migration
    Réponses: 2
    Dernier message: 08/09/2005, 10h27
  4. migration d'une base de mssql vers postgre sql
    Par dim_italia dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 06/08/2004, 22h56
  5. Migration de MS SQL 7 vers MS SQL server 2000
    Par jfphan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/10/2003, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo