OVH Cloud OVH Cloud

Utilisation d'un dictionnaire

7 réponses
Avatar
Géo
Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente
de me mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo

7 réponses

Avatar
Quasimodo
Géo has brought this to us :
Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente de me
mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo



Bonjour,
Voici la référence :
Microsoft Scripting Runtime (Library Scripting scrrun.dll)
Exemples et doc :
http://www.kamath.com/tutorials/tut009_dictionary.asp

http://forums.devshed.com/showthread.php?sfddb72dd5099f1d08f8c4b9e826107&p"0054#post220054
http://www.vbwm.com/art_1999/whatsnew/Dictionary.asp
http://brucem.mystarband.net/mckinney2b.htm


@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Géo
Quasimodo a écrit:
Géo has brought this to us :

Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente
de me mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo




Bonjour,
Voici la référence :
Microsoft Scripting Runtime (Library Scripting scrrun.dll)




J'ai bien mis une reference a library scripting, et coller ce code
(exemple de msdn sur l'objet Dictionary)
'****************************************************
Dim d 'Crée une variable
Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athènes" 'Ajoute des clés et des éléments
d.Add "b", "Belgrade"
d.Add "c", "Le Caire"
'******************************************************

j'ai mis ce code dans une clic de bouton et j'ai une erreur sur le
"dictionary" de la ligne Set d = CreateObject(Scripting.Dictionary)
erreur : erreur de compilation - erreur ou membre de donnees introuvable.

Géo
Avatar
Quasimodo
Géo laid this down on his screen :
Quasimodo a écrit:
Géo has brought this to us :

Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente de
me mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo




Bonjour,
Voici la référence :
Microsoft Scripting Runtime (Library Scripting scrrun.dll)




J'ai bien mis une reference a library scripting, et coller ce code (exemple
de msdn sur l'objet Dictionary)
'****************************************************
Dim d 'Crée une variable
Set d = CreateObject(Scripting.Dictionary)
d.Add "a", "Athènes" 'Ajoute des clés et des éléments
d.Add "b", "Belgrade"
d.Add "c", "Le Caire"
'******************************************************

j'ai mis ce code dans une clic de bouton et j'ai une erreur sur le
"dictionary" de la ligne Set d = CreateObject(Scripting.Dictionary)
erreur : erreur de compilation - erreur ou membre de donnees introuvable.

Géo



re,
entre parenthèses qu'est ce que cela donne :o)
--> Set d = CreateObject("Scripting.Dictionary")

@+Quaz

--
This is an automatic signature of MesNews.
Site : http://mesnews.no-ip.com
Avatar
Hervé
Salut Géo,
Tu peux aussi utiliser une collection c'est pratiquement similaire. Comme
les clé doivent être unique, c'est très pratique pour supprimer les
doublons, d'où la présence du gestionnaire d'erreurs.
Un exemple pour chacun :

Private Sub Form_Load()
'maCollection
monDico
End Sub

Sub maCollection()
Dim Col As New Collection
Dim I As Integer

On Error Resume Next
For I = 65 To 90
Col.Add Chr(I), CStr(I)
Next
On Error GoTo 0

For I = 1 To Col.Count
Combo1.AddItem Col(I)
Next

'récup d'un item particulier
'par rapport à sa position ordinale
'dans la collection (B)
MsgBox Col(2)

Set Col = Nothing

End Sub
'------------------------------------------------
Sub monDico()
Dim Dic
Dim Element
Dim I As Integer

Set Dic = CreateObject("Scripting.Dictionary")
With Dic
.Add "01", "Ain"
.Add "02", "Aisne"
.Add "03", "Allier"
.Add "04", "Alpes de Hte provence"
.Add "05", "Hautes Alpes"
.Add "06", "Alpes maritimes"
End With

For Each Element In Dic
Combo1.AddItem Dic(Element)
Next

'récup d'un item particulier
'par rapport à sa clé
MsgBox Dic("03")

Set Element = Nothing
Set Dic = Nothing
End Sub

Hervé.

"Géo" a écrit dans le message news:

Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente
de me mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo



Avatar
Géo
je vous remercie pour toutes ces reponses !
Hervé , merci pour ton exemple "collection/dictionnaire",c'est hyper
explicite.

Ok bon alors j'ai 2 solutions :

Dictionnaire :
-------------------
si j'en crois un tread trouve sur ce forum il y a qque temps, il semble
que les dictionnaires soient + rapide que les collections.
voir ici :
http://groups.google.fr/groups?q=collection+dictionary&hl=fr&lr=&group=microsoft.public.fr.vb&selm=eijXVDXyCHA.2696%40TK2MSFTNGP11&rnum=1

Collection :
-------------------
N'emploie pas le Scripting Runtime (dont certain en font un point
d'honneur de ne pas les utiliser ...)


Je veut employer les collections ou dictionanire pour avoir un moyen
simple de faire correspondre les noms des champs de ma base de donnee
(pas tjrs tres explicites ) et des noms plus digerables pour les
affichages dans des tableaux / graphes / etc ...

exemple : "select RQ_MPE1852C as [" & monDico("RQ_MPE1852C") & "] from
table where ...."

en verite je veut construire la requete sur une boucle sur les noms des
champs du recordset retourne par ma requete :
'**************************************************************
for i = 1 to mon_recordset.fields.count

txt = txt & "," & monrecordset.field(i).name & " as [" & _
mondico(rs.fields(i).name) & "]"

next
'**************************************************************

le dico / collection devrait avoir + ou - entre 150 et 200 entrees.
D'apres vous, la recreer a chaque fois , ou la charger une fois et la
garder en public pour y avoir acces tout le temps (mais j'aime moins) ?


Géo
Avatar
Gloops
Bonjour,

Eh bien cette intervention a du succès !
Je me pointe un jour et demi plus tard, et le premier lien ci-dessous
donne la réponse "HTTP/1.1 Server Too Busy"
________________________________________
Quasimodo a écrit, le 13/10/2004 12:12 :

Bonjour,
Voici la référence :
Microsoft Scripting Runtime (Library Scripting scrrun.dll)
Exemples et doc :
http://www.kamath.com/tutorials/tut009_dictionary.asp

http://forums.devshed.com/showthread.php?sfddb72dd5099f1d08f8c4b9e826107&p"0054#post220054

http://www.vbwm.com/art_1999/whatsnew/Dictionary.asp
http://brucem.mystarband.net/mckinney2b.htm


@+Quaz



Avatar
ng
Salut,

Inutile de s'encombrer avec des reférences inutiles alors qu'on peut
facilement faire sa propre classe Dictionnary :

'//Module de classe cDictionnary.cls :

Option Explicit
Option Compare Text

Private Type tcData
strID As String
vData As Variant
End Type

Private m_tblData() As tcData

Public Sub Add(ID As String, vData As Variant)
Dim tLigne As tcData
tLigne.vData = vData
tLigne.strID = ID
Call AjoutTableauLigne(tLigne, m_tblData)
End Sub

Public Sub Remove(ID As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
Call SupprimeTableauLigne(CInt(ID) - 1, m_tblData)
Case vbString
Call SupprimeTableauLigne(GetIndexFromID(CStr(ID)), m_tblData)
End Select
End Sub

Public Property Get Count() As Integer
Count = TableauCount(m_tblData)
End Property

Public Property Get Item(ID As Variant) As Variant
Select Case VarType(ID)
Case vbInteger, vbLong
Item = m_tblData(CInt(ID) - 1).vData
Case vbString
Item = m_tblData(GetIndexFromID(CStr(ID))).vData
End Select
End Property

Public Property Let Item(ID As Variant, ByVal vNewValue As Variant)
Select Case VarType(ID)
Case vbInteger, vbLong
m_tblData(CInt(ID) - 1).vData = vNewValue
Case vbString
m_tblData(GetIndexFromID(CStr(ID))).vData = vNewValue
End Select
End Property


Private Function GetIndexFromID(ID As String) As Integer
If EstTableauValide(m_tblData) Then
Dim i As Integer
For i = 0 To UBound(m_tblData)
If m_tblData(i).strID = ID Then
GetIndexFromID = i
Exit For '//BREAK
End If
Next
End If
End Function

Private Sub Class_Terminate()
Erase m_tblData
End Sub

Private Sub AjoutTableauLigne(tLigne As tcData, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
Dim nInd As Integer
nInd = UBound(tblTableau) + 1
ReDim Preserve tblTableau(nInd)
tblTableau(nInd) = tLigne
Else
ReDim tblTableau(0)
tblTableau(0) = tLigne
End If
End Sub

Private Function EstTableauValide(tblTableau() As tcData) As Boolean
On Error Resume Next
Err.Clear
Dim lTest As Long
lTest = UBound(tblTableau)
EstTableauValide = (Err.Number = 0)
On Error GoTo 0
End Function

Private Sub SupprimeTableauLigne(Index As Integer, tblTableau() As tcData)
If EstTableauValide(tblTableau) Then
If Index <= UBound(tblTableau) Then
Dim tblTmp() As tcData, i As Integer
For i = 0 To UBound(tblTableau)
If i <> Index Then
Call AjoutTableauLigne(tblTableau(i), tblTmp)
End If
Next
tblTableau = tblTmp
Erase tblTmp
End If
End If
End Sub

Private Function TableauCount(tblTableau() As tcData) As Integer
If EstTableauValide(tblTableau) Then
TableauCount = UBound(tblTableau) + 1
Else
TableauCount = 0
End If
End Function



'//Formulaire Form1.frm, exemple de code :

Private Sub Form_Load()
Dim cTest As cDictionary, i As Integer
Set cTest = New cDictionary
'//Ajout
Call cTest.Add("fr", "salut")
Call cTest.Add("en", "hi")
Call cTest.Add("de", "hallo")

'//Listage standard
For i = 1 To cTest.Count
MsgBox "Liste : " & cTest.Item(i)
Next

'//Appel par nom
MsgBox "Par nom : " & cTest.Item("de")
MsgBox "Par nom : " & cTest("fr") '//prop par défaut
MsgBox "Par nom : " & cTest("en")

'//Suppresion
Call cTest.Remove(2) '//Enlève "en"

For i = 1 To cTest.Count
MsgBox "Liste : " & cTest.Item(i)
Next

Call cTest.Remove("de")

For i = 1 To cTest.Count
MsgBox "Liste 2 : " & cTest.Item(i)
Next

Set cTest = Nothing
End Sub




Cette classe peut bien sur être améliorée.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Géo wrote:
Apres un judicieux conseil d'il y a 2 - 3 jours sur ce forum, je tente
de me mettre aux "dictionary"

mai pour l'instant mes resultats sont seulement :

- Type utilisateur non defini
- impossible de creer l'objet
- et les autre !!

quelle est la reference a utiliser pour employer ces dictionary ?
(et y'a t'il des contre-indications a leur utilisation ?)

Amicalement


Géo