DIAdem

cancel
Showing results for 
Search instead for 
Did you mean: 

Dictionary-Object mit einem key und mehreren items

Hallo VBS-Spezialisten,
 
ich muss eine größere ASCII-Datei nach Rechnernamen durchsuchen und diese Namen mit der Häufigkeit ihres Auftretens in DIAdem-Kanäle übertragen.
Da es in DIAdem ja noch keine "Pivot-Tabelle" gibt, verwende ich ein Dictionary-Objekt mit dem Rechnernamen als Schlüssel und dem Zählwert als Element.
Das funktioniert soweit ganz gut.
 
Auszug aus dem Script:

Set IP = CreateObject("Scripting.Dictionary")  'Dictionary Objekt anlegen
:
:
 if IP.Exists(Computername) then  'Abfrage ob aktueller Computername schon als Key voliegt
          help = IP.Item(Computername) 'Element auslesen
          help = help +1  'Anzahl incrementieren
          IP.Item(Computername) = help 'Element zurückschreiben
         else
          IP.Add Computername, 1 'Neuen Schlüssel mit Item=1 anlegen
        end if 'IP.Exists
:
:
 
Inzwischen ergibt sich die Anforderung, neben dem Häufigkeitszähler, weitere Elemente an den Schlüssel zu hängen (z.B. Zeitpunkt des ersten Eintrags). Laut VBS-Hilfe sind jedoch keine Datenfelder oder mehrere Elemente möglich.
Wie lässt sich das elegant in VBS lösen, ohne weitere Dictionary-Objekte mit eigenen Schlüsseln anzulegen?
 
Gruß
Martin
 
0 Kudos
Message 1 of 10
(7,934 Views)
Hallo Martin!

Das Dictionary Objekt kann als Wert für einen Eintrag einen Variant aufnehmen. Man kann also problemlos ein Array reinstecken. Besser und wartbarer finde ich aber da ein Klassenobjekt reinzustecken. Die Klasse selber ist dann im Prinzip nur eine Struktur wie man sie aus C kennt.

Die Klasse würde ich so definieren:
Class CValues
Public nCounter
 
Sub Class_Initialize
nCounter =
1
End Sub
End Class
Einziger 'Trick' ist es die Initialisierung des Zählers in die Klasse zu packen.

Dein Code müsste dann so angepasst werden:
Set IP = CreateObject("Scripting.Dictionary")  'Dictionary Objekt anlegen
 
if IP.Exists(Computername) then 'Abfrage ob aktueller Computername schon als Key voliegt
Set help = IP.Item(Computername) 'Element auslesen
help.nCounter = help.nCounter +1 'Anzahl incrementieren
else
IP.Add Computername, new CValues
end if
'IP.Exists
 

Das zurückschreiben ist dann nach dem inkrementieren nicht mehr nötig da man mit einem Zeiger arbeitet. Die Klasse kannst du nun um deine zusätzlichen Werte erweitern.

Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
Message 2 of 10
(7,924 Views)

Hallo Matthias,

vielen Dank für die schnelle Antwort. Das sieht ja unheimlich vielseitig aus. Allerdings bin ich im Reich der Objekte und Klassen nicht ganz zuhause.

Bisher habe ich aus den Zählwerten folgendermaßen in DIAdem-Kanäle angelegt:

helparray = IP.Items 'Alle Elemente in ein Array übertragen
for i = 0 to IP.count - 1
 chd(i+1,"Verbindungsdauer") = helparray(i)
next

 

Wie bekomme ich nun die Strukturelemente in jeweils einen Kanal?    "helparray(i).nCounter" wirds wohl nicht tun

Gruß

Martin

 

0 Kudos
Message 3 of 10
(7,922 Views)
Hallo Martin!

Ja die Klassen sehen im ersten Moment wie Teufelswerk aus man kann sich aber dran gewöhnen 😉 Deine Problemstellung ist eine schön einfache Aufgabe damit man mal damit anfangen kann.

Nun zur Frage: Doch es ist so einfach! Also
chd(i+1,"Verbindungsdauer") = helparray(i).nCounter
Ist das nicht schön?

Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
Message 4 of 10
(7,916 Views)

Klasse Klassen!

Funktioniert!   --> Bin begeistert und infiziert 😉

Nochmal Merci

Martin

0 Kudos
Message 5 of 10
(7,915 Views)
Hallo Martin!

Wenn ich das so richtig sehe kannst du die Infizierung bei einer In House Schulung bei einem von unseren kompetenten Kollegen vertiefen 😉

Ein schöne Wochenende

Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 6 of 10
(7,911 Views)

Hallo Matthias und alle anderen VBS-Spezialisten,

ich stehe vor dem Problem obiges Objekt mit Keys und gefüllter Struktur nach dem Beenden des Scriptes zur Verwendung bei folgenden Durchläufen "aufzuheben".
Ich vermute mal, dass "GlobalDim" in diesem Fall nicht direkt weiterhilft.
Das Script wird per OLE von einer Fremdapplikation mehrfach aufgerufen, daher habe ich kein "umhüllendes" Hauptscript.

Gruß

Martin 

0 Kudos
Message 7 of 10
(7,507 Views)

Hallo Martin!

Auch da hast du wieder die richtige Idee! Solange DIAdem läuft und die globale Script Engine nicht zurückgesetzt wird, was nur bei der Anmeldung neuer Anwenderbefehlsskripte passiert, kannst du die Aufgabe mit GlobalDim lösen. Das Problem ist nur das die Variable nur beim ersten mal angelegt wird. Man muss also erkennen ob es sie schon gibt oder nicht. Nachfolgender Code zeigt wie man das machen kann:

Option Explicit
 
Dim oDummy
 
On Error Resume Next
  Set oDummy = GlobalIP
On Error Goto 0
 
If not IsObject(oDummy) Then
  Call GlobalDim("GlobalIP")
 
  Set GlobalIP = CreateObject("Scripting.Dictionary")  
End If

Einfach an den Anfang deines Script setzen und den Variablennamen anpassen.

Matthias

Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 8 of 10
(7,498 Views)

Hallo Matthias,

vielen Dank für prompte Antwort.

Bei den möglichen Datentypen für die globalen Variablen bin ich leider immer unsicher was möglich ist.

Ist dieser Ansatz etwas zu einfach gedacht, oder reicht das:
 
If not Iteminfoget("GlobalIP") then
 
  Call GlobalDim("GlobalIP")
  Set GlobalIP = CreateObject("Scripting.Dictionary"
End If

Ich nehme an, das Anlegen der Klasse und ggf. eine Initialisierung (s.o.) muss auch innerhalb der If-Abfrage erfolgen?

Wann gibt´s in Stuttgart eine DIAdem-VBS-Schulung mit dem Dozenten Alleweldt?

Gruß Martin

0 Kudos
Message 9 of 10
(7,492 Views)
Hallo Martin!
 
Jetzt habe ich auch noch etwas neues gelernt! ItemInfoGet kannte ich noch nicht. Das macht den Code noch hübscher. Die ganze Initialisierung muss dann in den if-Zweig.
 
Deine Frage freut mich! Ich bin mir aber sicher das alle unsere Schulungsdozenten mindestens mein Niveau haben!!! Alles andere solltest du mit meinen Chef's klären.
 
Frohes Skripten
 
Matthias
Matthias Alleweldt
Project Engineer / Projektingenieur
Twigeater?  
0 Kudos
Message 10 of 10
(7,487 Views)