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

Macros et VBA Excel Discussion :

Exécution requête sql sans fin


Sujet :

Macros et VBA Excel

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 825
    Par défaut Exécution requête sql sans fin
    Bonsoir à tous,

    je me permet de venir vers vous pour une aide.

    Je n'arrive pas à savior si le problème est dans Excel ou Sql.

    j'ai un fichier excel avec cette VBA qui interroge notre serveur sql serveur 2017. (je suis repartie à 0 en essayant un autre code, mais toujours le problème)
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    Sub try()
     
    'Microsoft ActiveX Data Objects 6.1 Library
     
    Application.ScreenUpdating = False
     
    Worksheets("stockpr").[A3].CurrentRegion.ClearContents
     
    'Configuration de la connexion
    Dim cnn As ADODB.Connection
    Set cnn = New ADODB.Connection
    'Configuration de la methode de mise a jour (add/update/delete)
    Dim cmd As ADODB.Command
    Set cmd = New ADODB.Command
    'Configuration du recorset pour l'affichage des resultats
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
     
    Dim aa As Variant
     
    Dim myStringChange As String 'valeur de modification
    myStringChange = Range("A1").Value
     
    'String de la connexion (ConnectionString est une methode de cnn)
    'ici pas de login et mdp car authentification de sql server configuré en mode "authentification windows"
    'DESKTOP-4XXXXXX\MONSQL - nom du serveur
    'myDBB est la bdd choisie dans sql server
    cnn.ConnectionString = "Provider=SQLNCLI11;Server=.....................;"
     
    'établissement de la connexion
    cnn.Open
     
     
    '*************************************************
    '*** AFFICHAGE DES RESULTATS DE LA MISE A JOUR ***
    '*************************************************
     
    'curseur côté client, permet de compter le nombre de lignes dans le recordset
    'si curseur côté serveur, renvoie -1
    rs.CursorLocation = adUseClient
     
    'requete d'affichage
    chemin = ActiveWorkbook.Path
    Set fso = CreateObject("Scripting.FileSystemObject")
    Const ForReading = 1, ForWriting = 2
    Set f0000 = fso.OpenTextFile(chemin & "\stock-pr-mort-222-.txt", ForReading)
            une_variable0000 = f0000.ReadAll
            f0000.Close
    myQuery = une_variable0000
     
    'enregistrement des resultats de la requete dans le recordset
    rs.Open myQuery, cnn
     
    ''on recopie les titres des colonnes
    For i = 0 To rs.Fields.Count - 1
        Worksheets("stockpr").Cells(3, i + 1) = rs.Fields(i).Name
    Next i
     
    ''si une requête n'a pas de résultat, la transposition d'une string provoque une erreur, donc on place notre string dans un tablo
    If rs.RecordCount = 0 Then
        Dim tablo(1, 1) As Variant
        tablo(0, 0) = "No info available"
        aa = tablo
        MsgBox ("ok")
    Else
    MsgBox (rs.RecordCount)
        'aa = rs.GetRows
        'MsgBox (aa)
    End If
    En fait cela récupère une requete sql présent dans un fichier que voici:

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    SELECT top 100 ltrim(trim(tgEmpresa.Razon)) AS societe,
              SUM(taHistorico.PrecioCosteMedio*(CASE
                                                    WHEN taHistorico.StockFinal <= 0 THEN 0.00
                                                    ELSE COALESCE(taHistorico.StockFinal, 0.00)
                                                END)) AS valeur,
              SUM(CASE
                      WHEN taHistorico.StockFinal <= 0 THEN 0.00
                      ELSE COALESCE(taHistorico.StockFinal, 0.00)
                  END) AS qte,
              CASE
                  WHEN dbo.fn_ICarDMS_dateDiff ('MONTH2',(COALESCE (dbo.fn_ICarDMS_GetLastHistMov ('002', taArticulo.NumInterno, '23/02/2021 00:00:00.000', 2), taArticuloalma.FechaAlta)) ,'23/02/2021 00:00:00.000') < 12 THEN 'vivant'
                  WHEN dbo.fn_ICarDMS_dateDiff ('MONTH2',(COALESCE (dbo.fn_ICarDMS_GetLastHistMov ('002', taArticulo.NumInterno, '23/02/2021 00:00:00.000', 2), taArticuloalma.FechaAlta)) ,'23/02/2021 00:00:00.000') < 24 THEN 'dormant'
                  ELSE 'mort'
              END AS Rango
       FROM taHistorico
       LEFT OUTER JOIN tgGrupoCont ON taHistorico.GrupoCont = tgGrupoCont.GrupoCont
       LEFT OUTER JOIN taFamProveedor ON taHistorico.Marca = taFamProveedor.Marca
       AND taHistorico.FamiliaProv = taFamProveedor.Codigo
       LEFT OUTER JOIN taFamInterna ON taHistorico.Marca = taFamInterna.Marca
       AND taHistorico.FamiliaInt = taFamInterna.Codigo
       LEFT OUTER JOIN taCategoriaStock ON taHistorico.Emp = taCategoriaStock.Emp
       AND taHistorico.Marca = taCategoriaStock.Marca
       AND taHistorico.CategoriaStock = taCategoriaStock.Codigo
       LEFT OUTER JOIN taclaseproducto ON taHistorico.Marca = taclaseproducto.Marca
       AND taHistorico.claseproducto = taclaseproducto.Codigo
       LEFT OUTER JOIN taCategoriaPieza ON taHistorico.Marca = taCategoriaPieza.Marca
       AND taHistorico.CodigoCategoria = taCategoriaPieza.Codigo,
           taArticuloAlma
       LEFT OUTER JOIN taArticuloPrecio ON (taArticuloAlma.NumInterno = taArticuloPrecio.NumInterno
                                            AND taArticuloAlma.Emp = taArticuloPrecio.Emp
                                            AND taArticuloAlma.Almacen = taArticuloPrecio.Almacen) , taArticulo
       LEFT OUTER JOIN taDctoCompra ON taArticulo.Marca = taDctoCompra.Marca
       AND taArticulo.Proveedor = taDctoCompra.Proveedor
       AND taArticulo.GrupoDctoCompra = taDctoCompra.GrupDctoComp
       AND taDctoCompra.TipoPedido IN
         (SELECT tipopedido
          FROM tgalma
          WHERE emp = '002'
            AND almacen = '20' ), tgEmpresa,
                                   tgAlma,
                                   tgMarca
       WHERE taArticuloAlma.Emp = '002'
         AND taArticuloAlma.Almacen = '20'
         AND taHistorico.Emp = taArticuloAlma.Emp
         AND taHistorico.Almacen = taArticuloAlma.Almacen
         AND taHistorico.NumIntArticulo = taArticuloAlma.NumInterno
         AND taHistorico.NumIntHistorico = dbo.fn_ICarDMS_LastHistArt ('002', '20', taArticuloAlma.NumInterno, '23/02/2021 00:00:00.000')
         AND taHistorico.StockFinal <> 0
         AND taArticuloAlma.NumInterno = taArticulo.NumInterno
         AND taArticulo.EsConsigna = 0
         AND taArticulo.NoAlmacenada = 0
         AND taArticuloAlma.Emp = tgEmpresa.Emp
         AND taArticuloAlma.Emp = tgAlma.Emp
         AND taArticuloAlma.Almacen = tgAlma.Almacen
         AND taArticulo.Marca = tgMarca.Marca
       GROUP BY tgEmpresa.Razon,
                taArticulo.NumInterno,
                taArticuloalma.FechaAlta
    Le problème c'est que l’exécution du VBA ne se finit jamais, il reste toujours sur étape de l’exécution de la requête SQL.

    - J'ai rajouté le timeout à 0 dans le VBA, >> j'ai été obligé de kill le fichier excel après 30 minutes exécution car il avait toujours pas fini (et sans erreur).
    - si je copie et colle la requête dans SQL manager studio, elle s’exécute sans probleme (10 secondes).
    - si je change ma requête pour avoir aucun résultat (je remplace le 20 par 30) ou bien par une autre requête simple, cela fonctionne la requête/vba se termine correctement.

    je n'arrive pas a comprendre ou est le problème.

    si quelqu'un pourrais m aiguiller sur des éléments à vérifier, je suis preneur

    guigui69

  2. #2
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 562
    Par défaut
    Bonjour,
    rassure moi fn_ICarDMS_dateDiff ,fn_ICarDMS_GetLastHistMov ce sont pas des fonctions personnalisés crée dans SQL Serveur?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 825
    Par défaut
    Bonjour Thumb Down,

    Je ne sais pas ( c'est une requête extrait de notre outil métier), comment vérifier ?

    pour information je test mais en changeant ceci "Provider=SQLNCLI11;" en Drivers SQL cela fonctionne et beaucoup plus rapide.

Discussions similaires

  1. exécuter requête sql en tâche planifiée
    Par paupiau dans le forum Développement
    Réponses: 2
    Dernier message: 20/03/2008, 16h34
  2. Exécution requête SQL
    Par ekke dans le forum VB.NET
    Réponses: 2
    Dernier message: 08/02/2008, 15h30
  3. [Requête] Exécution requête SQL.
    Par ptisinge dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/10/2006, 08h17
  4. Exécution requête SQL + easyphp1.8
    Par Chengj dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/05/2006, 16h39
  5. Réponses: 2
    Dernier message: 04/04/2006, 11h46

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