Das Notes Forum
Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Corty am 30.09.05 - 17:57:49
-
hallo liebe notesgemeinde,
ich habe folgendes problem. ich versuche scriptseitig systeminformationen eines rechner auszulesen.
das klappt auch soweit, doch leider wird immer nur ein wert gespeichert. folgendes script zeigt das am beispiel cd-laufwerk:
---------------
'lese manufacturer der cd-laufwerke
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_CDROMDrive", "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
Forall objItem In colItems
sCDROM = "" & objItem.Manufacturer
End Forall
If w.CurrentDocument.EditMode = False Then w.CurrentDocument.EditMode = True
Call w.CurrentDocument.FieldSetText("cd_rom", sCDROM)
----------------------------
es wird immer nur ein wert gespeichert (der letzte in der liste). nun habe ich zwei cd-laufwerke.
frage: wie schaffe ich, dass alle cd-laufwerke per script erfaßt werden.
vielen dank im voraus.
gruß christian
-
Multivalue Field
Und dann wie eine LIste behandeln.
P.S.:
Wäre schön, wenn Du Dich an die Forumsregeln halten könntest.
Die Frage wurde auch hier gestellt: http://www.dominoforum.de/modules/newbb/viewtopic.php?topic_id=9924&start=0#forumpost52509&
-
Ohne jetzt die WMI Function genau zu kennen; colItems enthält nach dem Aufruf bei dir vermutlich 2 Werte. Der Knackpunkt ist dei ForAll Konstrukt.
versuche einmal folgendes:
Dim i as integer
Forall objItem In colItems
Redim Preserve CDROM ( i ) As String
CDROM ( i -1 ) = objItem.Manufacturer
i = i +1
end forall
CDROM(0) liefert dann dein erstes und CDROM(1) dein zweites Laufwerk
-
hallo m3, ja du hast recht. ich habe in 2 foren geschrieben. wußte nicht das das net richtig ist. kommt aber nicht wieder vor. danke für deinen hinweis.
leider hat das nicht hingehauen. auch wenn ich "Call w.CurrrentDocument.FieldAppendText("...") eingebe.
hallo ulrich,
vielen dank für deine antwort. leider aktzeptiert notes das so leider nicht.
notes zeigt es als script fehler an. vielleicht hast du ja noch eine idee.
ps: war in den vergangenen tagen auf deiner webseite: eknori.
1.) wirklich tolle seite
2.) ich habe mir mal erlaubt deine helpdeskdatenbank herunterzuladen, da ich damals eine ähnliche geschrieben habe. ich muss sagen "dickes lob" die datenbank ist super.
-
vielen dank für deine antwort. leider aktzeptiert notes das so leider nicht.
notes zeigt es als script fehler an. vielleicht hast du ja noch eine idee.
hmm, wo zeigt Notes denn den Fehler ? Schon im Designer oder erst bei der Ausführung. Lass mal hören ...
ach ja, i muss natuerlich einen Startwert haben
i = 1
-
hallo ulrich,
er zeigt es schon im designer an. ich kanns quasi nicht apspeichern.
gruß
christian
-
:P und WAS zeigt er im Designer als Fehler an ??
-
ein fenster mit folgendem inhalt erscheint:
"data not saved due to script error(s)
mfg
christian
-
Ähm, normalerweise ist der Designer recht geschwätzig und sagt weiter unten, wo ihm de Schuh drückt.
Initialisier mal i mit i = 1; möglicherwese ist das schon des Rätsels Lösung
-
leider klappt es auch nicht init i.
weiterhin zeigt der designer an :"not a sub or function name: cdrom"
anscheinend hat er problem mit meiner variabel
mfg
christian
-
Kürze mal dein objItem nach o und passe das objItem innerhalb des ForAll entsprechend an.
Aber ich dachte, das hat vorher funktioniert ??
Also
Forall o In colItems
Redim Preserve CDROM ( i ) As String
CDROM ( i -1 ) = o.Manufacturer
i = i +1
end forall
-
und bitte schau im Designer nach, WAS er anmeckert; meine Glaskugel will momentan nicht so richtig. Der Designer schreibt klipp und klar, was nicht richtig ist. z.B.
-
das nimmt er nun,
doch er bringt jetzt einen weiteren fehler:
in der Zeile 82: "Call w.CurrentDocument.FieldSetText("cdrom", cdrom)
// illegal pass by value or missing Call keyword.
anscheinend hat er ein problem mit dem Wert in cdrom.
ich kann auch kein print | messagebox mit dieser var ausführen
gruß
christian
-
Logisch CDROM ist nach dem ForAll vom Typ Variant; die Werte holst du dir dann mit z.B.
For i = 0 To ( Ubound ( CDROM ) - 1 )
Msgbox CDROM ( i )
Next
Statt der msgbox musst du dein Feld jetzt mit FieldAppendText entsprechend füllen
-
Eleganter als ein simpler String wäre aber das Feld cd_rom als Multivalue-Feld zu definieren, oder?
-
hallo martin,
ich habe versucht es multivalue zu definieren. doch leider klappt es nicht.
hallo ulrich,
ich habe gerade wohl ein brett vorm kopf, vielleicht auch ein ganzen holzhaus.
kannst mir mal kurz scripten wie du das einbinden würdest???
mfg
christian
-
Hmm, irgendwie hatte sich Ulrich K. aus M. den Freitagabend anders vorgestellt ;D
doch leider klappt es nicht
Soll ich dir wirklich den Popel bröckchenweise aus der Nase ziehen ?
Schreibe doch bitte bei solchen Dingen gleich immer mit, WAS denn nicht funktioniert.
-
mit leider klappt es nicht bezog sich auf mulitvalue field.
trotz multivalue field bekomme ich nur eine cdlaufwerk angezeigt.
-----
ich probiere es mal mit deinem code. muss wohl noch ein wenig basteln.
vielen dank an euch.
gruß
christian
-
mit leider klappt es nicht bezog sich auf mulitvalue field.
trotz multivalue field bekomme ich nur eine cdlaufwerk angezeigt.
OK, das ist ja logisch ( siehe oben )
-----
ich probiere es mal mit deinem code. muss wohl noch ein wenig basteln.
vielen dank an euch.
Hatte gehofft, das hast du schon getan ::)
Ich krieg die Krise ...
-
selbstverständlich habe ich es schon die ganze zeit versucht es einzubinden. dank deines scripts bekomme ich nun keine fehler mehr, doch leider auch nicht den gewünschten erfolg (es wird kein laufwerk angezeigt). so hatte ich mir gedacht, bevor ich als lotus script neuling noch weitere, anscheinend dumme fragen stelle, mein script nochmals zu überarbeiten - zu prüfen ob ich nicht irgendwo anders einen gedankenfehler habe.
ich wollte weder ein krise heraufbeschwören noch dir den feierabend versauen.
-
Es wäre wirklich hilfreich, mal zu wissen, ob der WMI Kram denn in CDROM überhaupt irgendwelche Werte zurückliefert. Erst dann kann man einen Schritt weitergehen. Axel Janssen ( kennwort ) würde so etwas wahrscheinlich als Unit Test ( im weitesten Sinne ) bezeichnen.
Das ist übrigens auch meine Vorgehensweise. Solange ich nicht weiss, ob das Codefragment nicht das macht, was ich erwarte, denke ich nicht an den weiteren Verlauf des Scripts ... Bisher bin ich da immer gut mit gefahren.
Du verdirbst mir nicht den Feierabend, keine Sorge. Aber wir eiern hier seit gut 2 Stunden rum ..
Als ich dein Einstiegsposting gelesen habe, hatte ich echt mehr erwartet, was die Anwendung der einfachsten Mittel bei der Programmierung angeht ) z.B. EInsatz des Debuggers )
-
Hab das mal in ne vbs-Datei gepackt und ausgeführt.
' VB Script Document
option explicit
Dim WMIService, item, WMISettings, Computer
Computer = "."
Set WMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & Computer & "\root\cimv2")
Set WMISettings = WMIService.ExecQuery_
("SELECT * FROM Win32_CDROMDrive")
For Each item in WMISettings
WScript.Echo item.Manufacturer
Next
Das gibt bei mir eine Collection mit 1 Element zurück (Standard CD_ROM Laufwerke)
-
du hast aber 2 Laufwerke ? ( Popel bröckchenweise aus der Nase zieh ... )
-
wie gesagt, habe mir die Klasse nicht angeschaut, aber allein vom Aufruf her gesehen werden die Eigenschaften eines einzelnen Laufwerks zurückgegeben ( manufacturer ist vom Typ String ! )
Ist also irgendwie der völlig falsche Ansatz ...
Das kommt davon, wenn man einfach Code einsetzt, den man nicht versteht ...
Sorry, habe heute meinen FlameDay :)
-
nein, hab ein Laufwerk.
Jedes Element der Collection repräsentiert ein Laufwerk, denke ich.
Ich glaube, ich habe gerade den Fehler im ursprünglichen Script gesehen. Da steht:
Forall objItem In colItems
sCDROM = "" & objItem.Manufacturer
End Forall
Das ist ja ein Schmarrn. Da ist klar, dass du nur einen Wert am Schluss in sCDROM drinstehen hast.
Frag dich am besten, was du da in der Schleife tust und was du eigentlich tun willst, dann solltest du das selbst lösen können.
-
hatten wir das nicht schon bereits vor gut 3 Stunden herausgefunden http://www.atnotes.de/index.php?topic=26038.msg166308#msg166308? @Thomas : schaue dir den Fred mal von oben bis unten an
-
@All
so nun klappt es.
@Thomas
du hast recht, so kann die Schleife gar nicht funktionieren.
//New
DIM temp as Variant
Forall objltem In colltems
sCDROM = "" & objltem.manufacture
temp = sCDROM & ", "
Call w.CurrentDocument.FieldAppendText("cdrom", temp)
End Forall
Also ich habe einen kleinen Zwischenspeicher eingebaut.
Anschließend habe ich das Feld als multivalue dekl., und siehe da es läuft.
Nochmals Danke @ALL.
Gruß
Christian