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 :

Synthaxe VBA-SQL variable NULL store procedure


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut Synthaxe VBA-SQL variable NULL store procedure
    Bonjour Forum,

    J´ai une procédure SQL enregistré, lorsqe je l´éxécute depuis SQL Serveur avec le parametre null ou ' ', cela sous entends toutes les valeurs possible, je cherche a exécuter la meme chose depuis VBA avec le parametre null.

    Mon parametre sous vba est de type adVarChar

    J´ai donc essayé l´écriture "NULL", mais fonctionne pas. Je ne vais pas énumérer tous mes tests mais je n´ai pas trouvé la convention d´écriture pour envoyer une variable null a SQL depuis VBA.

    Merci d´avance pour l´aide.

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Je vais probablement dire une bêtise mais as-tu essayé avec la constante vbNullString ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Tout simplement Nothing! Mais vue que le paramètre value de la fonction param est un string il faut la passer en variant!

    Édite:

    Code ADODBRD : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Function Param(Champs As String, AdType As AdodbTypeChamps, Direction As ParameterDirection, size As Integer, Value As Variant) As Object
    Set Param = CreateObject("ADODB.Command").CreateParameter(Champs, AdType, Direction, size, Value)
    End Function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Sub test()
    Dim cn As New ADODBRD
    Dim prm(0) As Object
    Set prm(0) = cn.Param("toto", adChar, adParamInputOutput, 10, Null)
    End Sub
    Dernière modification par Invité ; 18/05/2017 à 09h09.

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    ceci est l'avis d'un débutant en VBA mais j'avais également des problèmes avec les valeurs null entre ma BDD et mon application VBA. J'ai donc une solution pas hyper propre mais qui peut éventuellement aider. Lorsque je récupère des valeurs dans ma BDD ou que je les envoie, je fais passer mes variables dans une fonction qui remplace les valeurs null par du vide "". Ma fonction a déjà été critiquée par certains membres bien plus experimentés que moi sur le forum, mais cela marche très bien pour moi alors je la partage au cas où.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Public Function FCT_STR_NVL(PAR_SRT_Valeur As Variant) As String
     
       If IsNull(PAR_SRT_Valeur) Then
            FCT_STR_NVL = ""
       Else
            FCT_STR_NVL = PAR_SRT_Valeur
       End If
     
     
    End Function

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour JahExodus,

    oui mais là on appel une procédure stocké via l'objet ADO commande! et même pour une requête paramétrée ce n'est pas le développeur qui décide! mais l'administrateur de la base de données (DBA) dans sa vue!

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 66
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    D'accord je vois, ma "solution" ne s'applique donc probablement pas pour le problème posé ici

  7. #7
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Bonjour a tous,

    Merci a tous les deux pour m´aider.

    Dysorthographie, je passe au travers d´une fonction pour faire appel a ta fonction du module de classe:

    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
    Function ConectReporte(Feuille As Worksheet, Vfilas As Integer, Optional FechaC As String, Optional FechaV As String, _
        Optional CodCli As String, Optional Cuentas As String, Optional GroupCli As String, Optional Vendedor As String, Optional TpoDoc As String)
    Dim Con As New ADODBRD, Sql As String
     
    Con.TYPEBASE = SQLSERVER2005
    Con.Server = "BLADELAB01"
    Con.Base = "SBO_PORTUGAL_PRODUCCION"
    Con.User = "etiquetas"
    Con.PassWord = "francia"
     
    Dim prm(7) As Object
    Con.OpenConnetion
    Set prm(0) = Con.Param("FechaC", 200, 1, 15, FechaC)
    Set prm(1) = Con.Param("FechaV", 200, 1, 15, FechaV)
    Set prm(2) = Con.Param("CodCli", 200, 1, 20, CodCli)
    Set prm(3) = Con.Param("Cuentas", 200, 1, 30000, Cuentas)
    Set prm(4) = Con.Param("Cuentas", 200, 1, 30000, Cuentas2)
    Set prm(5) = Con.Param("GroupCli", 200, 1, 10, GroupCli)
    Set prm(6) = Con.Param("Vendedor", 200, 1, 5, Vendedor)
    Set prm(7) = Con.Param("TpoDoc", 200, 1, 15, TpoDoc)
    Sql = "SBO_SP_LP_CuentaCorrienteClientesCon"
    '.....
    Et ensuite j´appel la fonction depuis un usf en définissant les parametres de la facon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConectReporte Feuille, 2, "20170517", "30000101", "C00000509628", "_SYS00000002065", "128", "137", "NULL"
    J´ai essayé de mettre le null sans guillemet mais il ne m´accepte la synthaxe.

    Ayant révé de mon probleme toute la nuit je me dit que je dois certainement changé mon code SQL et non pas vba, un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    case when @var = '' then @var='null'
    Mais vu que je ne suis pas spécialiste en sql je en sais pas si je ne vais pas avoir des probleme par la suite quand j´appel mes variables, et je ne sais pas si c´est la bonne facon de faire non plus ...

    JahExodus, j´ai bel et bien essayé d´envoyer vide a ma variable mais fonctionne pas; d´autant plus pour ca que je pensais changer mon SQL comme dit ci-dessus. Je vais continuer mes tests...

    Merci pour l´entraide!

  8. #8
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Je tiens a préciser qu' il y a une erreur dans le code ci-dessus avec mon nombre de variables définit dans la fonction mais je suis en train de faire des tests...

    Je suis prenneur de toute forme d´idée!

    Merci

  9. #9
    Invité
    Invité(e)
    Par défaut
    String =null c'est pas bon les String ont peur pas le vide!

    variant=null !

  10. #10
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    J´alimente la discussion:

    Dysorthographie, j´ai testé d´envoyer en dur la variable de la facon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set prm(6) = Con.Param("TpoDoc", 200, 1, 15, Null)
    Et le message d´erreur 94: utilisation non valide de null.

    Du coup je me demande si je e dois pas rajouté un parametre a la fonction commandexecut lorsque la valeur du parametre est null ou vide, un truc du genre (ne fonctionne pas), mais en test:

    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
    Public Function CommadExecute(adCm As CommAdo, Parameters As Variant, Sql As String) As Object
    Dim i As Integer
      With CreateObject("ADODB.Command")
        .ActiveConnection = Connexion
        .CommandType = adCm
        .CommandTimeout = 500
        For i = 0 To UBound(Parameters)
            .Parameters.Append Parameters(i)
    '        If .Parameters(i) = "" Then
    '            .Parameters.Attributes = adParamNullable
    '            .Parameters.Append Parameters(i)
    '        End If
        Next
        .CommandText = Sql
        Set CommadExecute = .Execute
      End With
    End Function
    Merci

    Test Dysorthographie:
    variable dans ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Optional TpoDoc As Variant
    parametre dans la fonction de string a variant (200 -> 12)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set prm(6) = Con.Param("TpoDoc", 12, 1, 15, Null)
    Meme message d´erreur utilisation variable null

  11. #11
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut Missing Param
    Vu que ton parametre est "OPTIONAL", as tu essayé quelquechose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     If Not IsMissing(TpoDoc) Then 
    Set prm(7) = Con.Param("TpoDoc", 200, 1, 15, TpoDoc)
     Else
    Set Prm(7) = Null
    en passant comme le disent mes éminents collègues le parameter TpoDoc en type Variant.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  12. #12
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Godzestla, j´ai donc essayé et ili me dit ue le type d´argument byRef ne coincide pas...
    Alors je l´ai passé en byval pour essayer mais j´ai le meme message d´erreur que je ne comprends pas trop le sens...

    Mais merci pour l´idée!

  13. #13
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Assure moi que tu as bien un code qui ressemble à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function ConectReporte(Feuille As Worksheet, Vfilas As Integer, Optional FechaC As Variant, Optional FechaV As Variant,  _
        Optional CodCli As Variant,  Optional Cuentas AsVariant,  Optional GroupCli As Variant,  Optional Vendedor As Variant,  Optional TpoDoc As Variant)
    et que ton appel n'est plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConectReporte Feuille, 2, "20170517", "30000101", "C00000509628", "_SYS00000002065", "128", "137", "NULL"
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConectReporte Feuille, 2, "20170517", "30000101", "C00000509628", "_SYS00000002065", "128", "137"
    car sinon tu dois un peu repotasser la gestion des parametres optional.
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  14. #14
    Invité
    Invité(e)
    Par défaut
    il faut initialiser les optionnels!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Function ConectReporte(Feuille As Worksheet, Vfilas As Integer, Optional FechaC As Variant, Optional FechaV As Variant=null,  _
        Optional CodCli As Variant=null,  Optional Cuentas As Variant=null,  Optional GroupCli As Variant=null,  Optional Vendedor As Variant=null,  Optional TpoDoc As Variant=null)
    voila le test que jai fait et qui fonctionne!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sql = "SELECT     * FROM T_Job WHERE (Job = ?)"
    Set Prm(0) = cn.Param("Job", adInteger, adParamInput, 4, Null)
    ActiveCell.CopyFromRecordset cn.CommadExecute(adCmdText, Prm, Sql)
    par défaut le paramètres sont ByVal vue qui'ils sont en append un passage par valeurs suffi!

    maintenant il m'arrive de ne pas être le meilleur dans un domaine et en Proc Stoc c'est le cas
    Dernière modification par Invité ; 18/05/2017 à 16h11.

  15. #15
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Godzestla,

    J´ai essayé vide ("") ou sans valeur et meme message d´erreur: le type d´argument byRef ne coincide pas

    Dysorthorgaphie,

    J´ai donc fais plusieurs essayes avant de dire des bétises,
    mon code avec optionalisation a l´initiation
    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
    Function ConectReporte(Feuille As Worksheet, Vfilas As Integer, Optional FechaC As Variant = Null, Optional FechaV As Variant = Null, _
        Optional CodCli As Variant = Null, Optional Cuentas As Variant = Null, Optional GroupCli As Variant = Null, Optional Vendedor As Variant = Null, Optional TpoDoc As Variant = Null)
    Dim Con As New ADODBRD, Sql As String
     
    Con.TYPEBASE = SQLSERVER2005
    Con.Server = "BLADELAB01"
    Con.Base = "SBO_PORTUGAL_PRODUCCION"
    Con.User = "etiquetas"
    Con.PassWord = "francia"
     
    Dim prm(6) As Object
    Con.OpenConnetion
    Set prm(0) = Con.Param("FechaC", 12, 1, 15, FechaC)
    Set prm(1) = Con.Param("FechaV", 12, 1, 15, FechaV)
    Set prm(2) = Con.Param("CodCli", 12, 1, 20, CodCli)
    Set prm(3) = Con.Param("Cuentas", 12, 1, 30000, Cuentas)
    Set prm(4) = Con.Param("GroupCli", 12, 1, 10, GroupCli)
    Set prm(5) = Con.Param("Vendedor", 12, 1, 5, Vendedor)
    Set prm(6) = Con.Param("TpoDoc", 12, 1, 15, TpoDoc)
    Sql = "SBO_SP_LP_CuentaCorrienteClientesCon"
    et code de l´usf appelant la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ConectReporte Feuille, 2, Null, Null, Null, Null, Null, Null, Null
    Ne fonctionne pas msg d´erreur le type d´argument byRef ne coincide pas

    Et lorsque je procede avec ton écriture:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Set prm(0) = Con.Param("FechaC", 12, 1, 15, Null)
    Set prm(1) = Con.Param("FechaV", 12, 1, 15, Null)
    Set prm(2) = Con.Param("CodCli", 12, 1, 20, Null)
    Set prm(3) = Con.Param("Cuentas", 12, 1, 30000, Null)
    Set prm(4) = Con.Param("GroupCli", 12, 1, 10, Null)
    Set prm(5) = Con.Param("Vendedor", 12, 1, 5, Null)
    Set prm(6) = Con.Param("TpoDoc", 12, 1, 15, Null)
    Le message d´erreur est : utilisation non valide null...

  16. #16
    Invité
    Invité(e)
    Par défaut
    relis le poste #3!

  17. #17
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Je tiens a préciser que j´aitesté avec les parametre de mon command en teste ou type variant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set prm(0) = Con.Param("FechaC", 200, 1, 15, Null)
    Sans succes

  18. #18
    Invité
    Invité(e)
    Par défaut
    je vais continuer à chercher!

    on est pas toujours à l'origine d'une procédure stocké et le DBA nous enverra sur le roses si on lui demande d'intervenir sur sa copie!

  19. #19
    Membre à l'essai
    Homme Profil pro
    pharmacien
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Pérou

    Informations professionnelles :
    Activité : pharmacien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 21
    Points
    21
    Par défaut
    Donc j´ai passé la value de la fonction du post 3, de string a variant

    optionaliser les variables a l´initialisation et définit les valeurs a null,
    Ce qui me regle 2 pb:
    -je peux laisser champs vide
    -mettre valeur null

    Je rectifie:
    Donc je n´ai plus de message d´erreur sur les type de variables mais mon code vba ne se comporte pas comme sql, cad que lorsque je mets null, cela ne le traduit pas comme toute valeur possible, j´y ai cru et me suis un peu emballé meme...

    J´alimente la discussion....

    J´ai changé mon SQL

    if @cuenta = ' '
    begin
    set @cuenta = null
    end

    pas fonctionner non plus...
    C´est ma derniere idée du moment...

  20. #20
    Invité
    Invité(e)
    Par défaut
    Null c'est pas de Valeur possible! Toutes c'est %

    %toto c'est finissant par toto
    Toto% commençant
    %toto% contenant

    Dans un vue par exemple il est associé a like!

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. sous VBA requete variable nulle
    Par Chris 81 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/08/2008, 12h57
  2. [sql 200] Problème avec une stored procedure
    Par marc_dd dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 01/12/2006, 15h11
  3. SQL injection, stored procedures
    Par badjoe dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 03/08/2006, 12h26
  4. [SQL] stored procedure
    Par gregorian dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/11/2005, 14h08
  5. [Stored Procedure]Only constants, expressions, or variables
    Par nmerydem dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 20/10/2004, 18h29

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