Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: headshrinker am 09.11.06 - 10:37:58

Titel: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 09.11.06 - 10:37:58
Hallo,

irgendwie steh ich aber so was von aufn Schlauch!
Habe ein Aktion mit folgenden Script drinne

Code
Sub Click(Source As Button)
	
	If Not uidoc.editmode Then uidoc.editmode = True
	uidoc.document.Number = GenerateSequentialNumber( profileNumberForm_Main$ )
	Call uidoc.save
	
	End Sub

Ich möchte gerne das nach dem Speichern, sich eine bestimmte Maske öffnet.
Mittlerweile habe ich schon so eingies ausprobiert und seh wohl vor lauter Wald den Baum nicht mehr. Wäre super wenn Ihr mir helfen könntet.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 09.11.06 - 10:49:38
Willst du ein neues/anderes Dokument oder das aktuell geöffnete Dokument, in dem sich die Action befindet, mit einer bestimmten Maske öffnen?
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 09.11.06 - 10:55:01
Man befindet sich bereits in einer Maske, in der man einige Felder etc. ausgefüllt hat. Mit der Aktion soll eine Nummer generiert werden, diese gespeichert und danach soll sich halt eine neue Maske öffnen, die im Grunde nur eine Art Druckversion der vorherigen darstellt.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 09.11.06 - 11:09:58
Also...
du kannst natürlich über das NotesUIWorkspace Objekt eine Maske öffnen.
Aber nur um das ganze etwas genauer zu sagen:
Einer "geöffneten" Maske liegt immer ein Dokument zu grunde.
Im Prinzip sagt das im Dokument enthaltene Feld "Form" welche Maske zum Anzeigen des Dokuments verwendet werden soll:

! Ich hab den Code direkt hier eingegeben, also noch nicht laufen gelassen !

Code
Dim db as NotesDatabase
Dim doc as NotesDocument
Dim s as NotesSession
Dim uidoc as NotesUIDocument
Dim uiws as NotesUIWorkspace

Set s = New NotesSession
Set db = s.CurrentDatabase
Set doc = db.CreateDocument
doc.Form = "Preview"

Set uiws = New NotesUIWorkspace
Set uidoc = uiws.EditDocument(True, doc, False)

Um das aktuelle Dokument in einer neuen Maske zu öffnen:

Code
Dim doc as NotesDocument
Dim uidoc as NotesUIDocument
Dim uidoc_preview as NotesUIDocument
Dim uiws as NotesUIWorkspace

Set uiws = New NotesUIWorkspace
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document

Set s = New NotesSession
Set db = s.CurrentDatabase
Set doc_preview = doc.CopyToDatabase(doc.ParentDatabase)
doc_preview.Form = "Preview"

Set uidoc_preview = uiws.EditDocument(True, doc_preview, False)

!! Das aktuelle Dokument (uidoc) wird, wenn es gespeichert wird, zukünftig auch mit der Maske "Maskenname" geöffnet.

Um das zu umgehen kann man ein temporäres Dokument für die Vorschau erstellen:

Code
Dim db as NotesDatabase
Dim doc as NotesDocument
Dim doc_preview as NotesDocument
Dim s as NotesSession
Dim uidoc as NotesUIDocument
Dim uidoc_preview as NotesUIDocument
Dim uiws as NotesUIWorkspace

Set uiws = New NotesUIWorkspace
Set uidoc = uiws.CurrentDocument
Set doc = uidoc.Document
doc.Form = "Preview"

Set uidoc_printpreview = uiws.EditDocument(True, doc, False)


Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 09.11.06 - 11:31:14
Habe den letzten Teil in die Aktion eingebaut und es funzt einwandfrei.

Sieht jetzt so aus

Code
Sub Click(Source As Button)
	
	Dim db As NotesDatabase
	Dim doc As NotesDocument
	Dim doc_preview As NotesDocument
	Dim s As NotesSession
	Dim uidoc As NotesUIDocument
	Dim uidoc_preview As NotesUIDocument
	Dim uiws As NotesUIWorkspace
	
	Set uiws = New NotesUIWorkspace
	Set uidoc = uiws.CurrentDocument
	Set doc = uidoc.Document
	doc.Form = "BerichtDeutsch"
	Set uidoc_printpreview = uiws.EditDocument(True, doc, False)
	
	If Not uidoc.editmode Then uidoc.editmode = True
	uidoc.document.Number = GenerateSequentialNumber( profileNumberForm_Main$ )
	Call uidoc.save
	Call uidoc.Close
	
End Sub

Danke für die Hilfe.

Gruß Bernd
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 09.11.06 - 11:37:21
 :o
Hab noch nen Bug gefunden:
Ändere "uidoc_printpreview" in "uidoc_preview"!

Du solltest auch im Options-Bereich eines jeden Scripts die Anweisung "Option Declare" respektive "Option Explicit" verwenden.
Damit sagst du, daß alle verwendeten Variablen deklariert werden müssen. So werden Schreibfehler bei Variablennamen folglich auch Fehler verhindert.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: outerspace am 09.11.06 - 12:03:54
Hallo headshrinker,
noch eine kleine Anmerkung zu folgenden Zeilen:

If Not uidoc.editmode Then uidoc.editmode = True
uidoc.document.Number = GenerateSequentialNumber( profileNumberForm_Main$ )
Call uidoc.save

Wenn ein Dokument im Edit Mode geöffnet ist und man per uidoc.Document in das Backend
einen Wert schreibt, dürfte meines Wissens der Wert im Gespeicherten Doc nicht ankommen,
weil uidoc.Save das Backend mit dem Frontend überschreibt es sei den es ist in deiner GenerateSequentialNumber Funktion irgendwo ein Reload.
Besser wäre eventuell
Call uidoc.FieldSetText(CStr("Number", GenerateSequentialNumber( profileNumberForm_Main$ )))

Gruß
Andreas
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 09.11.06 - 12:07:20
Jep!

Solange uidoc.AutoReload = False ist (Standard ist auf True).
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 04.12.06 - 08:37:58
Hallo,

wollte nicht extra ein neues Thema aufmachen.

Bislang lief der NummernGenerator Local und machte keine Probleme.
Aufn Server jedoch generiert er mir keine Nummer. Habe mir den Generator aus
der Sandbox geholt und dort hatte unter Reviews wohl schonmal einer das gleiche Problem.

Kann mein Problem mit dem
Zitat
Wenn ein Dokument im Edit Mode geöffnet ist und man per uidoc.Document in das Backend
einen Wert schreibt, dürfte meines Wissens der Wert im Gespeicherten Doc nicht ankommen,
weil uidoc.Save das Backend mit dem Frontend überschreibt es sei den es ist in deiner GenerateSequentialNumber Funktion irgendwo ein Reload.
Besser wäre eventuell
Call uidoc.FieldSetText(CStr("Number", GenerateSequentialNumber( profileNumberForm_Main$ )))

bzw. mit diesem

Zitat
Jep!

Solange uidoc.AutoReload = False ist (Standard ist auf True)

zusammenhängen. Wo müßte ich ein Auto.Reload einfügen, hatte das nicht so ganz verstanden. Bin für jeder noch so kleine Hilfe dankbar.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 04.12.06 - 14:55:55
CODE!!!

Was gibt dir denn die GenerateSequentialNumber Funktion zurück?
Will sagen: Ist der Rückgabewert der Funktion bereits ein leerer String.

Gruß
Johnson
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: m3 am 04.12.06 - 15:11:42
Bislang lief der NummernGenerator Local und machte keine Probleme.
Aufn Server jedoch generiert er mir keine Nummer. Habe mir den Generator aus
der Sandbox geholt und dort hatte unter Reviews wohl schonmal einer das gleiche Problem.
Kein Profil-Dokument eingerichtet?  ;)
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: koehlerbv am 04.12.06 - 15:16:14
Profildokument, Server und Nummerngenerator? Das kann doch gar nichts werden - der produziert doch dann sackweise doppelte Nummern ...

Bernhard
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: m3 am 04.12.06 - 15:21:17
LOL. "Nummerngenerator", "Profil" oder "Datum konvertieren" in einem Posting und Bernhard ist schon da. Hast Du eine spezielle Suche dafür? ;)

Klar kann das nix werden, das sagt (http://www.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/5e0be790b7fb7b6f852569ba005078aa?OpenDocument&Highlight=0,Generator) der Autor aber auch:
Zitat
So how does the Generator guarantee a unique sequential number? Well, it does not. Not a 100% guarantee, but the likelihood is very very very slim that more than one document receive the same number.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 04.12.06 - 15:22:01
So habe mich gerade mal wieder mit meinem Problem befassen können.

Der Code des Scriptes für den NummernGenerator ist:

Code
' Assignes a unique number and formats it according to prefs. defined in profileNumber
' profileNumber is NOT and in-memory profile document

' Inputs -
'               The name of the form to be assigned a number
' Returns-
'               a sequential number
' Calls-
'              MaskNumber, CreateProfileSequential

Function GenerateSequentialNumber( formName$ ) As String
	
	Dim s As New notessession
	Dim doc As notesdocument
	Dim viewNumber As notesview
	
	Dim bSaved As Integer ' acts as semaphor
	Dim tries%, delay% ' record locking     
	Dim num%, newnum% ' current and next number     
	Dim currentYear%, currentMonth%, currentDay% ' today in numbers
	Dim txtYear$, txtMonth$, txtDay$ ' today in text
	Dim proNum%, proYear%, proMonth%, proDay% ' last vals (in profileNumber)
	Dim mask$, resetNum$ ' formatting (in profileNumber)
	Dim maskedNewNum$ ' the final result  
	
	Dim n As New notesname( s.currentdatabase.server ) 
	Dim srv$
	srv$ = n.abbreviated
	If srv$ = "" Then srv$ = "[Local]" ' cant use blank as key
	
	On Error Goto errorHandling
	
	Set viewNumber = s.currentdatabase.getview( lookSequentialNumber$ ) ' lookup view
	
	bSaved = False
	currentYear% = Year( Today )
	currentMonth% = Month( Today )
	currentDay% = Day( Today )
	tries% = 1
	
     ' Loop while document profileNumber is not saved
     ' If another user has the document open then it can not be saved.
     ' Aborts after 10 tries and returns 0000 as number
	While bSaved = False 
		
		profileID$ = formName$ & "_" &  srv$ ' key
		
		Set doc = viewNumber.getdocumentbykey( profileID$ )
		
          ' Exit if no number setup document
[b]If doc Is Nothing Then Error 4001, "No sequential number setup document"[/b]		
          ' if disabled then return blank
		If doc.mask(0) = "DISABLED" Then
			GenerateSequentialNumber = ""
			Exit Function    ' exit
		End If
		
		If Not doc.hasitem("Year") Then ' extra precautions
			doc.Year = currentYear%
			doc.Month = currentMonth%
			doc.Day = currentDay%
		End If
		
          ' Get settings from profile document
		proNum% = doc.Number(0)
		num% = proNum%
		proYear% = doc.Year(0)
		proMonth% = doc.Month(0)
		proDay% = doc.Day(0)
		mask$ = doc.Mask(0)
		ResetNum$ = doc.Reset(0)
		
		
          ' Year
		If proYear% <> currentYear% Then doc.year = currentYear% 
		txtYear$ = Cstr( currentYear% )
          ' Month
		If proMonth% <> currentMonth% Then doc.month = currentMonth%
		If currentMonth% < 10 Then txtMonth$ = "0" & Cstr(currentMonth%) Else txtMonth$ = Cstr(currentMonth%)
          ' Day
		If proDay% <> currentDay% Then doc.day = currentDay% 
		If currentDay% < 10 Then txtDay$ = "0" & Cstr( currentDay% ) Else txtDay$ = Cstr( currentDay% )
		
          ' Reset
		Select Case ResetNum$
		Case "N" : num% = proNum% ' never
		Case "Y" : If proYear% = currentYear% Then num% = proNum% Else num% = 0 ' year
		Case "M" : If proMonth% = currentMonth% Then num% = proNum% Else num% = 0 ' month
		Case "D" : If proDay% = currentDay% Then num% = proNum% Else num% = 0 ' day
		End Select
		
		newnum% = num% + 1 ' set new number
		
          ' Mask (format) the new number
		maskedNewNum$ = MaskNumber( newnum%, mask$, txtYear$, txtMonth$, txtDay$ )     
		
          ' Try to save doc
		doc.Number = newnum%
		bSaved = doc.save( False, False ) 
		
		If bSaved = False Then 
			Set doc = Nothing ' release to prevent deadlock
			tries% = tries% + 1
			If tries% > 10 Then
                    ' make sure we dont end up in an indefinate loop
				Print msgBarTimedOut$ 
				GenerateSequentialNumber = "0000" ' exit and return 0000
				Exit Function
			Else 
				For delay% = 1 To 10000
                         ' wait 
                         ' redo the whole thing again
				Next               
			End If
		Else
			Print "Number assigned: " & maskedNewNum$
		End If
		
	Wend ' while bSaved = false
	
	
     '*** New number has been generated and document profileNumber saved
	GenerateSequentialNumber = maskedNewNum$
	
	
	Exit Function
	
errorHandling:
	Print "SequentialNumber.GenerateSequentialNumber reports:"     
	Print Err & " " & Error$
	Print "Sequential Number Generator Failed"
	GenerateSequentialNumber = "0000"
	Exit Function
End Function

Habe mal den Debugger laufen lassen.
Bis hier geht alles reibunglos: If doc Is Nothing Then Error 4001, "No sequential number setup document" und dann springt er zum ende  "errorHandling"

und schmeißt mir dann die "0000" aus als Nummer
Profildokument ist eingerichtet etc. Wie gesagt local hat das ganze gut funktioniert.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: m3 am 04.12.06 - 15:23:31
Woks as designed.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Thomas Schulte am 04.12.06 - 16:07:09
Wenn man schon klaut, dann sollte man wenigstens in der Lage sein zu verstehen was man geklaut hat.

Der Code ist von Villi Helgason und eine der besseren Implementationen für das erstellen von Sequentiellen Nummern.
Und weil es das Teil gut ist hat es auch die Möglichkeit das erstellen dieser Nummer auf einen bestimmten Server zu begrenzen. Warscheinlich hast du entweder gar keinen oder nicht den richtigen Server Namen angegeben.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 04.12.06 - 16:53:39
Oder der Übergabe-Parameter "formName$" ist passt nicht - Oder?
(Ich hab dat Ding noch nie gebraucht  ::)).
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Thomas Schulte am 04.12.06 - 17:07:40
@Johnson Nur als kleiner Tipp. Geh mal davon aus, das wenn das lokal funktioniert hat der FormName$ richtig sein muss.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: Johnson am 04.12.06 - 17:16:23
 :P ::)
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: outerspace am 04.12.06 - 17:50:42
Zeigt die View den Namen denn auch als Abbreviated an ?
Über unterschiedliche Keys wegen der Namensanzeige bin ich auch schon des öfteren gestolpert.

Gruss
Andreas
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 05.12.06 - 09:22:32
Irgendwie scheint der Server wohl gar nicht erkannt zu werden. In einer Vorgabemaske für den Generator wo die Felder

srv: mit Formel: @If(srv="";"([Local])";srv)

profileID: mit Formel:  Owner + "_" + srv


in der View wird dann aber immer "Main_[Local]" angezeigt, da die DB aber ja aufn Server liegt, müßte doch eingentlich "Main_srv" da stehen, oder nicht?
Vielleicht habe ich auch scohn zu lange davor gesessen.  :-[
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: DerAndre am 05.12.06 - 09:41:45
Versuch doch mal den Server auf diese Weise zu ermitteln:

@Subset(@DbName;1)

Schau Dir dann noch die Funktion @DBName mal genauer an.


Sorry bin wohl noch nicht wirklich gesund...

Korrektur:

@If(srv="";"([Local])";srv) ?

Da wird nichts zugewiesen, wenn srv = "".

Und wie wird der Server ermittelt?
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: headshrinker am 05.12.06 - 09:48:38
Habs gerade hinbekommen. Habe die
Codezeile wo

srv$ = n.abbreviated   steht, durch

srv$ = unserServername

ersetzt und schon läuft das ganze.
Es wird zwar immer noch
Main_[Local] angezigt, aber da werde ich mich mal wietersehen, ob ich da noch ne Lösung finde. Vielleicht muss das ja auch gar nicht geändert werden.

Danke für eure Geduld und danke für den Tip mit
abbreviated, hätte mir das sonst wahrscheinlich nciht genauer angesehen.

Gruß Bernd  ;D
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: DerAndre am 05.12.06 - 09:55:45
Ist die Variable auch wirklich einem Wert?
Das sieht eigentlich danach aus, als wäre srv immer leer.
Titel: Re: Speichern und dann neue Maske öffnen mit Script
Beitrag von: dirk_2909 am 05.12.06 - 09:57:50
Zitat
Da wird nichts zugewiesen, wenn srv = "".

Und wie wird der Server ermittelt?

Vielleicht hilft die Frage von Andre weiter ?!!