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

Access Discussion :

Créer une fonction SQL avec variable


Sujet :

Access

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 151
    Points : 89
    Points
    89
    Par défaut Créer une fonction SQL avec variable
    Bonjour,
    Voila ce que j'aimerais faire ...
    J'ai une grosse requette SQL qui fait pas loin de 15 lignes et je doit réaliser cette fonction 36 fois .... Je vouderais crée en VB une fonction de type

    Fonction(Lettre) et il me change dans mon SQL la variable ... C'est possible ???

    Voici le code en question ...
    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
    SELECT Sum(A) AS AA, FK_Prefab
    FROM (SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Left(Repere1,1) like 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    UNION ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,2,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,3,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,4,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,5,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,6,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere1,7,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Left(Repere2,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    UNION ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,2,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,3,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,4,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,5,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,6,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    Union ALL
    SELECT Count(*) AS A, FK_Prefab FROM LignePrefab WHERE Mid(Repere2,7,1) LIKE 'A' AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab
    )
    GROUP BY FK_Prefab;
    La lettre A est ma variable que j'aimerais changer ....

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Il suffit de remplacer 'A' par x et il demandera la valeur de x à chaque exécution

    Par ailleurs les joies du français font que requête s'écrit différemment de quéquette quelqu'en soit la taille

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    comment je declare ca ?? au final il me fauderait un tableau avec toute les lettres et tous les chiffres ...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut
    Citation Envoyé par theuma Voir le message
    comment je declare ca ?? au final il me fauderait un tableau avec toute les lettres et tous les chiffres ...
    Pour ton besoin en l'état actuel, tu n'as pas besoin de déclarer un tableau de lettre et de chiffres.

    Il te faut juste une fonctions qui recoit des variables pour faire ta requête.
    De plus dans ta requête SQL, il n'y a pas que la lettre qui change, il ya aussi deux autres varaibles dans Mid(Repere1,3,1); repere1 et le premier chiffre changent.

    Ta fonctions doit être déclarer de la facon suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Public Function mafonction(vlettre as String; vindicerepere as integer; vindice as integer)
     
    end function
    Dans la fonction, tu boucle sur vindicerepere (pour repere1 et repere2) et sur vindice pour construire ta requête.

    A l'appel tu aura mafonction('A', 2, 7)

    Si tu as plusieurs lettre, tu fais plusieurs appel

    Voila.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    Merci de ton aide ...
    voila ce que j'ai fait ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Function Recherche(vlettre As String, vindicerepere As Integer, vindice As Integer)
        For vindicerepere = vindicerepere To i < vindice Step 1
            Dim SQL As String
            SQL = "SELECT Count(*) AS B10, FK_Prefab,Nb, B10*Nb AS vlettre FROM LignePrefab WHERE Mid(Repere1,vindicerepere,1) LIKE vlettre AND FK_Prefab in (Select FK_Prefab From LignePrefab) Group BY FK_Prefab,Nb"
            DoCmd.RunSQL SQL
      End Function
    Mais il doit y avoir un return quelqupart pour lui dire quoi retourner nan ??

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Localisation : Sénégal

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 229
    Points : 1 579
    Points
    1 579
    Par défaut


    aïe

    Tu est très mal parti.

    Ce que tu veux faire n'est vraiment pas simple du tout.
    Tu doit construire ta requête UNION dans une boucle.

    Cherche dans la FAQ comment faire une boucle avec for ... next.
    Mais surtout arrête toi une minute pour coucher sur du papier une logique de ton problème.

    Je suis désolé, mais d'après ce que j'ai vu, tu est mal parti.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 151
    Points : 89
    Points
    89
    Par défaut
    Voila la fonction que j'ai ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Function Recherche(vlettre As String, vindice As Integer)
        For i = 1 To vindice
            Dim SQL As String
     
            Dim rst As DAO.Recordset
            Dim resultat As Integer
            SQL = "Select SUM(Nbr)AS Resultat, Prefab FROM(SELECT Count(*) AS Compteur,Prefab,Compteur*Nb AS nbr FROM RepereConcat WHERE MID(Repere," & i & ",1) LIKE '" & vlettre & "' AND Prefab = Prefab GROUP BY Prefab, Nb)WHERE Prefab=Prefab GROUP By Prefab;"
            Set rst = CurrentDb.OpenRecordset(SQL, dbOpenForwardOnly, dbReadOnly)
            rst.Close
        Next
     
    End Function
    Mais ca ne me retourne rien ... Commenbt faire pour que ca me retourne une table avec resultat et prefab ??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer une connexion SQL avec le transat ?
    Par chaima23000 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/01/2014, 15h23
  2. Créer une fonction SQL SERVER
    Par ghir_ana dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/06/2012, 05h49
  3. Peut-on créer une table SQL avec Pentaho ?
    Par ToniConti dans le forum Pentaho
    Réponses: 1
    Dernier message: 29/11/2010, 18h40
  4. Réponses: 11
    Dernier message: 20/11/2010, 13h08
  5. Réponses: 3
    Dernier message: 13/04/2010, 16h13

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