HTA (VBS) syntaxe SQL [Résolu]

Signaler
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
-
 Bonjour le Forum,


Dans un HTA, je parcours un fichier Excel pour créer une ListBox dynamique avec DISTINCT sur le nom des clients.

    ' Ouverture ADODB Connection
    objConn.Open ("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" & strPlanProdFile &_
                  ";Extended Properties=""Excel 8.0;HDR=YES;""") 

    ' Initialisation objet ADODB Recordset
    Set objRs = CreateObject("ADODB.Recordset")

    ' Exécution Query [1=adOpenKeyset, 3=adLockOptimistic]
    objRs.Open "Select DISTINCT [Client] from [Jobs$]" , objConn, 1, 3   

    ' Création ListBox dynamique
    Do Until objRs.EOF
       Set objOption = Document.CreateElement("OPTION")
       objOption.Text = Trim(objRs.Fields(0))
       objOption.Value = Trim(objRs.Fields(0))            
       lstSAVE.Add(objOption)       
       objRs.MoveNext
    Loop
    objRs.Close




La ListBox m'affiche correctement le nom des clients.

Question:
Est-il possible dans objOption.Text d'afficher le nom des clients et le nombre de lignes du client ???
Exemple:
TITI (20)
TATA (150)
....




jean-marc

7 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut

Non, si tu utilises Dictinct dans une syntaxe, tu demandes au moteur SQL de ne renvoyer que les données uniques, donc une seule ligne renvoyée par "Client".
Essaye ça :
Select [Client], Count([Client]) Qté
  From [Jobs$]
 Group By [Client]
Cette requète te renverra 2 colonnes : L'une avec le nom et la seconde, appelée ici "Qté" pour le nombre

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Oui, mais ne passe pas par SQL pour cela : Comme tu passes en revue toutes les données fournies par ton RecordSet, profites-en pour faire toi même le total et, en fin de boucle, tu ajoutes ton Item "(tous les clients)" accompagné de la somme calculée.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonjour Jack,

Je te remercie pour ton intention.

Syntaxe ok

objRs.Open "Select [Client], Count([Client]) from [Jobs$] GROUP BY [Client]" , objConn, 1, 3

    Do Until objRs.EOF

msgbox objRs.Fields(0) &vbcrlf& objRs.Fields(1)


Bon week.

jean-marc
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Jack,

Puis-je profiter de ton savoir !!!!

Dans la ListBox, j'affiche comme choix

* (Tous les clients)
client x (nombre de ligne pour ce client)
client y (nombre de ligne pour ce client)
....

Donc, ta proposition pour client et nombre est ok.
Est-ce possible d'ajouter * (Tous les clients) (nbre total de lignes) ????





jean-marc
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
Effectivement Jack,

J'ai opté pour

    ' Initialisation objet ADODB Recordset
    Set objRs = CreateObject("ADODB.Recordset")

    ' Exécution Query [1=adOpenKeyset, 3=adLockOptimistic]
    objRs.Open "Select [Client], Count([Client]) from [Jobs$] GROUP BY [Client]", objConn, 1, 3

    ' Création ListBox dynamique
    Do Until objRs.EOF
       Set objOption = Document.CreateElement("OPTION")
       objOption.Text = objRs.Fields(0) & " [" & objRs.Fields(1) & "]"
       objOption.Value = Trim(objRs.Fields(0))            
       lstSAVE.Add(objOption)  
       strSumClient = strSumClient + objRs.Fields(1)     
       objRs.MoveNext
    Loop
    objRs.Close

    ' Ajout dans la ListBox de la sélection "*"
    Set objOption = Document.CreateElement("OPTION")
    objOption.Text = "* (Tous les Clients)" & " [" & strSumClient & "]"
    objOption.Value = "*"
    lstSAVE.Add(objOption)


Par contre, le choix de sélectionner "* (Tous les clients)" se retrouve en dernière position dans ma ListBox, mais ce n'est pas grave.

Encore, merci Jack.

jean-marc
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Dans les objets ListBox et leur méthode Add, il y a des options pour choisir l'emplacement de l'item que l'on insère.
Messages postés
1854
Date d'inscription
jeudi 23 mai 2002
Statut
Membre
Dernière intervention
24 juin 2018
26
 Bonsoir,

N'ayant pas réussi à positionner mon item, j'ai utilisé la méthode suivante:

    'Initialisation header de la ListBox dynamique:
    Set objOption = Document.CreateElement("OPTION")
    objOption.Text = "Choix de la sauvegarde mutualisée" & Space(21)
    lstSAVE.Add(objOption)

    ' Ajout dans la ListBox de la sélection "*"
    Set objOption = Document.CreateElement("OPTION")
    objOption.Text = "* (Tous les Clients)" 
    objOption.Value = "*"
    lstSAVE.Add(objOption) 

    ' Initialisation à vide de la ListBox Client
    Set objOption = Document.CreateElement("OPTION")
    objOption.Text = vbNullString
    objOption.Value = vbNullString
    lstClient.Add(objOption)

    ' Initialisation objet ADODB Connection
    Set objConn = CreateObject("ADODB.Connection")

    ' Ouverture connection ADODB
    objConn.Open ("Provider=Microsoft.Jet.OLEDB.4.0; " & "Data Source=" &_
                  strPlanProdFile &_
                  ";Extended Properties=""Excel 8.0;HDR=YES;""") 

    ' Initialisation objet ADODB Recordset
    Set objRs = CreateObject("ADODB.Recordset")

    ' Exécution Query [1=adOpenKeyset, 3=adLockOptimistic]
    objRs.Open "Select [Client], Count([Client]) from [Jobs$] GROUP BY [Client]", objConn, 1, 3

    ' Création ListBox dynamique
    Do Until objRs.EOF
       Set objOption = Document.CreateElement("OPTION")
       objOption.Text = objRs.Fields(0) & " [" & objRs.Fields(1) & "]"
       objOption.Value = Trim(objRs.Fields(0))            
       lstSAVE.Add(objOption)  
       strSumClient = strSumClient + objRs.Fields(1)     
       objRs.MoveNext
    Loop
    objRs.Close

    ' Modification ListBox
    lstSAVE(1).Text = lstSAVE(1).Text & " [" & strSumClient & "]" 





jean-marc