Autor Thema: Error Handling für @PostedCommand([FileOpenDBRepID];DB;Server)  (Gelesen 3012 mal)

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Hi,

ich versuche mich gerade mal an Formulas.
Habe eine DB-Bibliothek, die alle DB auflistet und das Öffnen der dieser DB's per Button ermöglichen soll.

Buttoncode:
Code
@PostedCommand([FileOpenDBRepID];DB;Server)

Da ja FileOpenDBRepID unter Script die DB nur im Backend öffnet und die User damit nichts anfangen können, muss ich also auf Formulas gehen.  :(

Wenn der User Zugriff auf die ausgewählte DB hat, wird diese auch korrekt geöffnet. Ansonsten erscheint ein Dialogfeld in dem der User zusätzliche Server zur DB-Suche auswählen kann.  >:(

Natürlich begreift keiner,  dass das mit den Rechten zusammenhängen könnte. Daher wollte ich dieses Dialogfeld abfangen und statt dessen ein Prompt bringen.

Leider schlagen meine Versuche mit @ifError usw. fehl. Habt Ihr vielleicht eine Idee, wie man das anstellen könnte?

cu
der B@sti

« Letzte Änderung: 28.09.05 - 21:08:31 von SKL74 »
Domino, Notes, Sametime

Glombi

  • Gast
Mit
Call notesUIWorkspace.OpenDatabase( server$, file$, view$, key$, newInstance, temp )
kannst Du auch in Script eine Datenbank öffnen.

Vorher dann die DB im Backend öffnen und dort ein Error Handling einbauen.
set targetdb = New NotesDatabase( "", "" )
call targetdb.OpenByReplicaID( replicaid )
if not targetdb.IsOpen then
msgbox "...."
elseif
targetdb.ReplicaID = "00000000:00000000"
msgbox...
end if

call ws.OpenDatabase(targetdb.Server, targetdb.Filepath,...)

Sowas in der Art.

Andreas

Offline eknori

  • @Notes Preisträger
  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.730
  • Geschlecht: Männlich
Zitat
call targetdb.OpenByReplicaID( replicaid )

Die ReplicaID muss hier OHNE den Dopelpunkt übergeben werden; nur so als Hinweis hintendran
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Auch noch einen Tip von mir: Auf jeden Fall ErrorHandling dahingehend erweitern, dass die Fehlernummer lsERR_NOTES_DBNOACCESS = 4060 nach Deinen Wünschen abgefangen wird.

Bernhard

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Danke erst mal für Eure schnelle Hilfe.

Mein Code nach einem harten Arbeitstag ...

Code
On Error Goto ErrorHandler
	On Error 4060 Goto ErrorAccess 
	Dim workspace As New NotesUIWorkspace	
	Dim doc As NotesDocument
	Dim uidoc As NotesUIDocument	
	Set uidoc = workspace.CurrentDocument
	Set doc = uidoc.document
	Dim strServer As String
	Dim vReplicaID As Variant
	Dim strReplicaID As String	
	Dim strPathname As String
	
	strServer = doc.Server(0)
	vReplicaID = doc.ReplicaID
	Dim oldvalue(0) As String
	Dim newvalue(0) As String
	oldvalue(0) = ":"
	newvalue(0) = ""
	newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
	strReplicaID = newvReplicaID(0)
	
	Dim db As New NotesDatabase( "", "" )
	Call db.OpenByReplicaID( strServer, strReplicaID )
	If Not db.Isopen Then
		Print "Fehler bei Öffnen","Error"
	Else
		strPathname = doc.Pathname(0)
		Call workspace.OpenDatabase( strServer, strPathname )
	End If
	
GoOut:
	Exit Sub
	
ErrorHandler:
	Msgbox "Error #" & Err & " — " & Error$ & " (line: " & Erl & ")"
	Resume GoOut
	
ErrorAccess:
	Msgbox "Zugriffsverletzung"'
	Resume GoOut

Was sagen die Fachleute dazu?  ;)

cu
der B@sti

PS:
@koehlerbv: Wo kriegst Du eigentlich immer die ErrorCode her? Gabs da nicht eine Datei, in der sowas steht?
cu
« Letzte Änderung: 27.09.05 - 22:32:50 von SKL74 »
Domino, Notes, Sametime

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Hallo Bastian,

ich würde es folgendermassen machen (beachte bitte die Verlegung des spezifischen ErrorHandlings):

On Error Goto ErrorHandler
Dim workspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.document
Dim strServer As String
Dim vReplicaID As Variant
Dim strReplicaID As String
Dim strPathname As String

strServer = doc.Server(0)
vReplicaID = doc.ReplicaID
Dim oldvalue(0) As String
Dim newvalue(0) As String
oldvalue(0) = ":"
newvalue(0) = ""
newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
strReplicaID = newvReplicaID(0)

Dim db As New NotesDatabase( "", "" )
Call db.OpenByReplicaID( strServer, strReplicaID )
On Error 4060 Goto ErrorAccess
If Not db.Isopen Then
Print "Fehler bei Öffnen","Error"
Else
On Error Goto ErrorHandler
strPathname = doc.Pathname(0)
Call workspace.OpenDatabase( strServer, strPathname )
End If
On Error Goto ErrorHandler

GoOut:
Exit Sub

ErrorHandler:
Msgbox "Error #" & Err & " — " & Error$ & " (line: " & Erl & ")"
Resume GoOut

ErrorAccess:
Msgbox "Zugriffsverletzung"'
Resume GoOut


Damit verlegst Du das spezifische ErrorHandling genau an die Stelle, an der "es" passieren könnte. Ansonsten: Das Resume - wie Du es einsetzt - ist entscheidend, genauso, wie Du es eingesetzt hast. Sonst schleppst Du den aufgetretenen Error in das aufrufende Modul weiter, und es wäre zunächst unklar, warum denn der Fehler angeblich dann in dieser Routine aufgetreten ist (dies nur als Anmerkung für Forumsmitglieder, die diesen Thread später einmal lesen).

Ich hoffe, Dir noch ein klein wenig geholfen zu haben.

Bernhard

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
@koehlerbv: Wo kriegst Du eigentlich immer die ErrorCode her? Gabs da nicht eine Datei, in der sowas steht?

Sorry, ich habe nicht zu Ende gelesen bei Beantwortung Deines Postings: Die ErrorCodes stehen in .lss-Datein im Notes-Programmverzeichnis und können (wahlweise) per %INCLUDE eingebunden werden:
LSXBEERR.LSS - Konstanten für Backend-Fehlermeldungen
LSXUIERR.LSS - Konstanten für Frontend-Fehlermeldungen
LSERR.LSS - hm, etwas exotisch: "Historische Fehlermeldungen" (V2 und V3  :))

Bernhard

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Wieso die Erroraufrufe über den Code zerstreuen?

Code
On Error Goto ErrorHandler
Dim workspace As New NotesUIWorkspace
Dim doc As NotesDocument
Dim uidoc As NotesUIDocument
Set uidoc = workspace.CurrentDocument
Set doc = uidoc.document
Dim strServer As String
Dim vReplicaID As Variant
Dim strReplicaID As String
Dim strPathname As String

strServer = doc.Server(0)
vReplicaID = doc.ReplicaID
Dim oldvalue(0) As String
Dim newvalue(0) As String
oldvalue(0) = ":"
newvalue(0) = ""
newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
strReplicaID = newvReplicaID(0)

Dim db As New NotesDatabase( "", "" )
Call db.OpenByReplicaID( strServer, strReplicaID )

If Not db.Isopen Then
Print "Fehler bei Öffnen","Error"
Else

strPathname = doc.Pathname(0)
Call workspace.OpenDatabase( strServer, strPathname )
End If


GoOut:
Exit Sub

ErrorHandler:
if err = 4060 then 
msgbox "Zugriffsverletzung"
else
Msgbox "Error #" & Err & " — " & Error$ & " (line: " & Erl & ")"
end if
Resume GoOut
und zwar aus dem einfachen Grund, dass die einzige Stelle an der 4060 auftreten kann, eben die Stelle ist, wo versucht wird auf die andere Datenbank zuzugreifen.

Für meinen Geschmack lenken diese vielen Erroraufrufe vom eigentlichen funktionalen Code ab und das ist so übersichtlicher.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Du hast vollkommen Recht, Axel - vorausgesetzt, der Code läuft nicht in einer Schleife ab. Und in diesem Fall soll wirklich nur eine DB geöffnet werden.

Mea culpa.

Bernhard

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Hi,

hier gab es ja noch echt Resonanz heute nacht. Müßt Ihr nicht auch mal schlafen?  ;)

So, jetzt aber:
Code
Sub Click(Source As Button)
	On Error Goto ErrorHandler
	Dim workspace As New NotesUIWorkspace
	Dim doc As NotesDocument
	Dim uidoc As NotesUIDocument
	Set uidoc = workspace.CurrentDocument
	Set doc = uidoc.document
	Dim strServer As String
	Dim vReplicaID As Variant
	Dim strReplicaID As String
	Dim strPathname As String
	
	strServer = doc.Server(0)
	vReplicaID = doc.ReplicaID
	Dim oldvalue(0) As String
	Dim newvalue(0) As String
	oldvalue(0) = ":"
	newvalue(0) = ""
	newvReplicaID = Replace (vReplicaID, oldvalue, newvalue)
	strReplicaID = newvReplicaID(0)
	
	Dim db As New NotesDatabase( "", "" )
	Call db.OpenByReplicaID( strServer, strReplicaID )
	If Not db.Isopen Then
		Msgbox "Es ist ein Fehler aufgetreten." ,64,"Error"
	Else	
		strPathname = doc.Pathname(0)
		Call workspace.OpenDatabase( strServer, strPathname )
	End If
	
exitScript:
	Exit Sub
	
ErrorHandler:
	If Err = 4060 Then 
		Msgbox "Es ist ein Fehler aufgetreten." & Chr(10)  & Chr(10) _
		& "Sie sind zum Zugriff auf diese Datenbank nicht berechtigt." & Chr(10) _
		& "Bitte wenden Sie sich an Ihren Administrator." ,64,"Error"	
		Resume exitScript
	Else
		Msgbox "Es ist ein Fehler aufgetreten." & Chr(10)  & Chr(10) _
		& "Fehlermeldung: " & Error$ & Chr(10) _
		& "Fehlernummer: " & Err & Chr(10) _
		& "Codezeile: " & Erl & Chr(10) _
		,64,"Error"
		Resume exitScript
	End If
End Sub

Wenn ich jetzt "If Not db.Isopen Then" noch dazu kriegen könnte, einen richtigen Fehler auszuwerfen, und dann zum ErrorHandler zu springen, damit auch die Codezeile angegeben wird, wäre ich total glücklich.

cu
der B@sti
Domino, Notes, Sametime

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Bevor ich das jetzt nachbauen muss, Basti: Was passiert tatsächlich (bei "no access"), und was sollte passieren ?

Bernhard

PS: Ich verspreche, heute eher ins Bett zu gehen  ;D

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Es wird nur die MsgBox ausgegeben.
Natürlich keine Error-Number und somit keine Codezeile, da

If Not db.Isopen Then

ja keinen Error erzeugt.

Tausche ich die MsgBox gegen "Goto Errorhandler" dann Fehler: Resume ohne Error.

Lasse ich Resume weg, dann Fehler: No Resume

Bei diesem Code ist das nur ein Schönheitsfehler aber bei größeren Sachen wäre es schon schön, zu sehen, welche Zeile den Error produziert, ohne immer durch den Debugger zu müssen.

cu
der B@sti
Domino, Notes, Sametime

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Moment - einen Error bekommst Du ja gar nicht. Warum dann also das Schielen auf den ErrorHandler ? Du kannst doch bei "Not db.IsOpen" auch gleich die gewünschte Fehlermeldung ausgeben. Die Zeile ist dabei doch vollkommen uninteressant, da Du die Sache ja eh unter Kontrolle hast.
By the way - auch wenn die db not open ist  :) kannst Du auf db.Title oder db.FilePath zugreifen und damit die Messagebox noch aussagekräftiger gestalten.

Bernhard

Offline theBastian

  • Senior Mitglied
  • ****
  • Beiträge: 484
  • Geschlecht: Männlich
Naja, der ErrorHandler gibt mir schön aus,

Fehlermeldung
Fehlernummer
Codezeile

wäre halt aussagekräftig gewesen (für mich als Admin).

Aber über db.Title usw. werde ich es dann machen und damit kann vielleicht der ein oder andere User was anfangen.

Natürlich nur, wenn er die Meldung auch liest. ;-)

Danke Dir für Deine Hilfe und denk dran --> eher in's Bett heute. ;-)

cu
der B@sti
Domino, Notes, Sametime

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz