Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Alois am 07.12.06 - 07:12:17

Titel: Servername leer
Beitrag von: Alois am 07.12.06 - 07:12:17
Hallo, ich benötige wieder Mal Hilfe!

Ich benötige der Servername, allerdings bekomme immer eine leere Zeichenkette zurück wenn ich auf der aktuelle Server diese abfragen möchte.

Kann mir jemand sagen wie ich darauf kommen kann?

Danke Mal
Titel: Re: Servername leer
Beitrag von: m3 am 07.12.06 - 07:17:52
Indem Du Dein Script auf dem Server laufen lässt. Ein leerer Servernamen (bei welcher Funktion auch immer, meine Kristallkugel ist schon auf Weihnachtsferien) deutet darauf hin, dass das Script/die Formel lokal auf Deiner Wokstation läuft.
Titel: Re: Servername leer
Beitrag von: Alois am 07.12.06 - 07:26:29
Danke m3 soweit war ich schon.

Wie gesagt ich benötige diese String!
egal wie ich es mache (mit session.CurrentDatabase.Server oder mit der Environ Funktion) bekomme ich eine leer Zeichenkette.

Anders Formuliert:
Gibt es eine Funktion die mir auf den aktuellen Server der Servername zurückgibt?
Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 07:50:37
Zitat
mit session.CurrentDatabase.Server oder mit der Environ Funktion

Wo liegt denn die "CurrentDatabase" ???

Schau mal unter Datei - Datenbank - Eigenschaften.......

Leere Zeichenkette geben die Methoden/Properties nur zurück, wenn die DB lokal liegt !!
Titel: Re: Servername leer
Beitrag von: Alois am 07.12.06 - 08:54:35
Sicher liegt diese Mißverständnis an meine Erklärungen....


Ich bin auf den Server CN=Server4/O=MyDomain/C=COM in der names.nsf.
Da lasse ich ein Agent laufen der später auf andere Server laufen soll.
Der Agent durchsucht eine Ansicht, welche tausende Personendokument enthält. Für alle User (und nur die) deren Mailbox auf den aktuellen Server liegt, wird eine Designanpassung in der Mailbox durchgeführt.

Also ich muss für jeden Personendokument der doc.Mailserver vergleichen mit den aktuellen Server (wo ich mich mit der Agent befinde) Erst wenn diese 2 String gleich sind starte ich die Verarbeitung.

Beispiel: Herr Müller hat die Mailbox mail\mueller.nsf und diese liegt auf den CN=Server3/O=MyDomain/C=COM.
Mein Agent lauft momentan auf den CN=Server4/O=MyDomain/C=COM. Es heiß diese Mailbox soll nicht angefasst werden.

Später starte ich den Agent auf den CN=Server3/O=MyDomain/C=COM. Hier muss die Mailbox von Hern Müller angepackt werden.

Damit will ich den Traffic so klein wie möglich halten, weiß aber schon dass ich eine Mailbox auf ein andere Server direkt öffnen könnte, will es aber nicht!

Jetzt die Frage nochmal:
Wie bekomme ich den Servername von der names.nsf wo ich mich befinde?

(bisher habe ich nur die Variable session.CurrentDatabase.parent.username gefunden die den Wert enhält und nicht wie die andere mit eine leere Zeichenkette befühlt ist.
Das ist aber sehr unschön.....)


User in der Ansicht Also ich will eine Abfrage am Anfang machen um den aktuelle Server zu
Da heißt ich mache ein Abfrage am Anfang um zu wissen auf welche Server ich gerade bin
Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 09:04:30
Der Agent läuft aif dem Server CN=Server4/O=MyDomain/C=COM in der Datenbank names.nsf.  :)

Mit "session.CurrentDatabase.Server" sollte "CN=Server4/O=MyDomain/C=COM" zurückgegeben werden.  :-:

Aus der Hilfe:
Code
Read-only. The name of the server where a database resides.
Defined in
NotesDatabase
Data type
String
Syntax
To get: serverName$ = notesDatabase.Server
Usage
If the database is on a workstation, the property returns an empty string ("").
The database does not need to be open to use this property.

Titel: Re: Servername leer
Beitrag von: Alois am 07.12.06 - 09:12:14
danke Dirk aber:

"If the database is on a workstation, the property returns an empty string ("")."

und ich befinde mich in dieser Fall!
Titel: Re: Servername leer
Beitrag von: MadMetzger am 07.12.06 - 09:15:31
Dann arbeite entweder auf dem Server, oder simuliere den Servernamen durch eine Konstante. Wenn die DB dann auf dem Server kommen soll, kannst du ja das auf das Session.Current... anpassen.
Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 09:24:27
Zitat
Ich bin auf den Server CN=Server4/O=MyDomain/C=COM in der names.nsf.

Wenn ICH mit meinem Notes-Client eine Notes_Datenbank auf einem Server öffne und eine Aktion in einer Ansicht aufrufe, bekomme ich den SERVER-Namen zurück.

Hier der Test-Code:
Code
Sub Click(Source As Button)
	Dim sess As New NotesSession
	
	Msgbox sess.CurrentDatabase.Server , , "Test"
	
End Sub

Die Msgbox gibt mir den Servernamen zurück!!!
Titel: Re: Servername leer
Beitrag von: MadMetzger am 07.12.06 - 09:29:08
danke Dirk aber:

"If the database is on a workstation, the property returns an empty string ("")."

und ich befinde mich in dieser Fall!

Heißt das, du arbeitest lokal? Dann gilt mein Tipp:
Dann arbeite entweder auf dem Server, oder simuliere den Servernamen durch eine Konstante. Wenn die DB dann auf dem Server kommen soll, kannst du ja das auf das Session.Current... anpassen.
Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 09:32:59
@Markus

Er schreibt doch:
Zitat
Ich bin auf den Server CN=Server4/O=MyDomain/C=COM in der names.nsf.


??? Deshalb verstehe ich es nicht ???   :-:
Titel: Re: Servername leer
Beitrag von: m3 am 07.12.06 - 09:40:12
Poste mal mehr Code sowie den Datenbanknamen und Server, in dem dieser Code gespeichert ist.
Titel: Re: Servername leer
Beitrag von: MadMetzger am 07.12.06 - 09:59:23
Kann es vielleicht auch an dem Agenten liegen? Fiel mir gerade dabei ein...

Also, was für ein Agent ist das denn? Auslöser, Ziel?
Titel: Re: Servername leer
Beitrag von: Alois am 07.12.06 - 10:21:44
Hier mein Code:

Code
	
Dim session As New NotesSession
Dim Currentdb As NotesDatabase	
Dim db As NotesDatabase
Dim view As NotesView
Dim entry As NotesViewEntry
Dim vc As NotesViewEntryCollection
Dim doc As NotesDocument
Dim item As NotesItem
Dim item1 As NotesItem
	
'aktuelle Servername ermitteln
'	CurrentServer = session.CurrentDatabase.Server             'auskommentiert "" wird zurückgegeben
	CurrentServer = session.CurrentDatabase.parent.username        'Nothilfe
	
'log schreiben
	fileNumber% = Freefile
	Open "C:\temp\class.log" For Output As #1
	Print #1, "Agent Start: " + Now()
	Print #1, "CurrentServer: " + CurrentServer 

'Variablen setzen
	Set Currentdb = session.CurrentDatabase
	Set view = Currentdb.getView("vwUMSCheck")
	Set vc = view.AllEntries
	Set entry = vc.GetFirstEntry()
	
'Für alle Entries der Ansicht	
	While Not (entry Is Nothing)
		Set doc = entry.Document		
		If doc.Mailserver(0) = CurrentServer Then
			Set db =   New NotesDatabase("",doc.mailFile(0)+".nsf")
			If Not db.IsOpen Then
				On Error Goto fehler				
				Call db.open("",doc.mailFile(0)+".nsf")
			End If
			
			Set notesNoteCollection = db.CreateNoteCollection(False) 
			Call notesNoteCollection.SelectAllDesignElements( True ) 
			Call notesNoteCollection.BuildCollection
			
'log
			Print #1, "Scaning: " + doc.MailFile(0)
			Print #1, Cstr(notesNoteCollection.Count)  + " elements "

'Für alle DesignElements
			nid = notesNoteCollection.GetFirstNoteID( ) 
			For i = 1 To notesNoteCollection.Count 
				Set doc = db.GetDocumentByID(nid) 
				Set item =  doc.getfirstitem("$Class")
				If Not (item Is Nothing) Then

'log
					Set item1 =  doc.getfirstitem("$TITLE")
					strItem = item1.Text
					Print #1, "$Class found in: " + stritem

'HIER kommt später das Löschen der Inhalt von $Class
				End If
				
				
				nid = notesNoteCollection.GetNextNoteId(nid) 
			Next i 
		End If		
weiter:		
		Set entry = vc.GetNextEntry(entry)
		
	Wend	
	Close #1
	Exit Sub
	
fehler:
	Print #1, "FEHLER: " + doc.MailFile(0) + " könnte nicht geöffnet werden!"
	Goto weiter
	
End Sub

Wie schon geschrieben der Agent wird auf dem Server gestartet aus der Menü Aktionen in der Datenbank names.nsf.


Ihr könnt sehen dass ich momentan folgende Nothilfe benütze:
CurrentServer = session.CurrentDatabase.parent.username
"zufällig" ist mein CurrentUser der Server selbst aber ich hätte es lieber Wasserdicht

@MadMetzger: ich will kein Eintrag in der Form: CurrentServer = "CN=Server4/O=MyDomain/C=COM"

@dirk_2909: ich bin local so dass dein code gibt ein "" zurück

@alle: danke für die mithilfe

Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 11:16:14

Zitat
@dirk_2909: ich bin local so dass dein code gibt ein "" zurück

 ???  ::)  Und warum dann:

Zitat
Sicher liegt diese Mißverständnis an meine Erklärungen....


Ich bin auf den Server CN=Server4/O=MyDomain/C=COM in der names.nsf.
Da lasse ich ein Agent laufen der später auf andere Server laufen soll.

Was denn jetzt "Lokal" oder Server.....  ???
Titel: Re: Servername leer
Beitrag von: Driri am 07.12.06 - 11:21:03
Zitat
aktuelle Servername ermitteln
' CurrentServer = session.CurrentDatabase.Server             'auskommentiert "" wird zurückgegeben
CurrentServer = session.CurrentDatabase.parent.username        'Nothilfe

Warum machst Du das so kompliziert ?

CurrentServer = session.ServerName wäre der direkte Weg.


Btw : CurrentServer ist nicht deklariert.

Titel: Re: Servername leer
Beitrag von: MadMetzger am 07.12.06 - 11:24:14
@Dirk2909: Genau das frage ich mich auch.

Und dass Alois das im Einsatz dann nicht mit der Konstante haben will ist mir auch klar, weil er das ja auch auf verschiedenen Servern laufen lassen will.

Aber wenn er sagt, er arbeitet lokal, dann geht das eben so nicht außer mit Konstante oder über die Userkrücke, die er gerade verwendet. Läuft der Code dann wirklich auf einem Server und nicht in lokalem Kontext, dann zieht er auch den Servernamen.
Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 11:25:34
So...

Habe auf einem SERVER eine Test-DB erstellt. Dort ist ein Agent ( "Manuell aus dem Menü Aktionen" - Laufziel keins) erstellt. Code s.o. .....

Dort bekomme ich den Servernamen zurück........

Wenn Du in einer LOKALEN DB den Agenten startest,  ist Server = "" ( logisch ).

Du willst in Deinem Script den Wert im Feld "MailServer" mit dem Namen des Servers vergleichen, auf den Dein Agent aufgerufen wird.....

Das kannst Du mit session.CurrentDataBase.Server und/oder

Code
Dim session As New NotesSession
Dim agent As NotesAgent
Dim server As String
Set agent = session.CurrentAgent
server = agent.ServerName

Gem. Deinen wiedersprüchlichen Angaben gibt es den SERVER-Namen zurück...

Zitat
Wie schon geschrieben der Agent wird auf dem Server gestartet  aus der Menü Aktionen in der Datenbank names.nsf.


Titel: Re: Servername leer
Beitrag von: dirk_2909 am 07.12.06 - 11:27:43
@Markus

..es muss ja keine Konstante sein?!

Wenn er den Process sowieso über das Menü "Aktionen" startet, kann man ja den gewünschten Server abfragen, mit dem dann verglichen werden soll......
Titel: Re: Servername leer
Beitrag von: koehlerbv am 07.12.06 - 11:28:28
Ingo, NotesSession.ServerName ist "COM only".

Bernhard
Titel: Re: Servername leer
Beitrag von: Glombi am 07.12.06 - 11:41:07
Read-only. The current user's name.

For a script running on a workstation, this is the name of the current user.
For a script running on a server, this is the name of the server.
Defined in
NotesSession
Data type
String

Syntax
To get: name$ = notesSession.UserName


Andreas
Titel: Re: Servername leer
Beitrag von: Driri am 07.12.06 - 11:45:13
Zitat
Ingo, NotesSession.ServerName ist "COM only".

Merde, da waren die Finger wieder schneller als das Gehirn  :-[
Titel: Re: Servername leer
Beitrag von: Tode am 07.12.06 - 15:35:06
ich mische mich auch mal ein...

Nach allem was ich gelesen habe, schliesse ich mal folgendes:

Der Fragende geht Remote auf den Server (oder direkt an die Konsole) und startet dort die nlnotes.exe des Servers. (das meinte ich mit "unsupportet": Ist zwar nicht weiter schlimm - auch wenn dieser Client schon seit R5 nicht mehr offiziell supportet wird - nur dass er mir schon das ein oder andere mal den Client gekillt hat)

Und hier hilft einzig und allein der ses.Username, alle anderen Funktionen liefern "" zurück.
Warum derjenige den Agenten nicht direkt auf dem Server laufen lässt (per schedule oder tell amgr run), und das Risiko eines Server- Crashs wegen der Verwendung des nlnotes- Clients eingeht, erschliesst sich mir zwar nicht ganz, aber ich muss ja auch nicht alles verstehen...

Tode