Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: hOtze am 06.10.04 - 15:51:48

Titel: User Defined Error
Beitrag von: hOtze am 06.10.04 - 15:51:48
Hallo ,
stehe hier mal wieder vor einem Notes Mysterium (oder meine eigene Blödheit blockiert mich wieder)

Kollegen aus einer andern Niederlassung bekommen allle die Fehlermeldung
"User-Defined Error" vom Errorhandler im folgenden Script, und zwar an Zeile 302 quasi
dieser Zeile

Call O_Dokument.Save(True,False,True)

Komischerweiße funktioniert die ganze Geschichte an meinem Client einwandfrei. Auch mit einem 5er Client funktioniert es, daher kann ich den fehler auch nicht debuggen! ;(

Hier der Code:

   Private Sub Urlaubberrechnen
      ClassFunction = "MitarbeiterDokument / Urlaubberrechnen"      
      On Error Goto ErrorHandler
      
      O_Resturlaub = (O_Urlaubstage + O_Übertrag) - O_UrlaubGenommen   
      O_Dokument.Urlaubstage =  O_Urlaubstage
      O_Dokument.genommen = O_UrlaubGenommen
      O_Dokument.Resturlaub = O_Resturlaub
      O_Dokument.NewYear = O_NewYear
      
      Call O_Dokument.Save(True,False,True)
      
      Exit Sub
      
ErrorHandler:
      Msgbox "Class-Function: "+ClassFunction + Chr(13) +"Error: " + Chr( 9 ) + Cstr( Err ) + " " + Error( Err ) + Chr( 13 ) + "in Line: " + Chr( 9 ) + Cstr( Erl ), 16, "Critical Error"      
      Exit Sub
   End Sub
Titel: Re: User Defined Error
Beitrag von: Driri am 06.10.04 - 16:51:23
Hi,

Verkettung von Strings werden in Script mit "&" gemacht, nicht mit "+".
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 06.10.04 - 17:11:46
Genau, Ordnung und Sauberkeit im Schlachthof muss sein. Das mit "+" funktioniert zwar, aber entspricht nicht den Vorgaben.

Ingo, Du hast aber was übersehen: "Urlaubberrechnen". Das ist eigentlich das selbe in Gründe - es "funktioniert", aber ...

Jetzt aber ernsthaft: Stimmen den erforderlichen Rechte für die betroffenen User ? Manchmal ist es ja nur ein ganz kleiner vergessener Haken ...

Bernhard
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 06.10.04 - 22:07:23
Bernhard und Ingo

Ich kann mich Euren Aussagen gar nicht anschliessen. Wenn die Syntax der Sprache eine Notation zulässt, ist es uns nicht gegeben, diese zu beurteilen. Die Designer-Hilfe gibt ganz klar die Unterschiede der beiden Operatoren an, wertet aber in keiner Weise, es bleibt also dem Benutzer überlassen, was ihm besser passt. Alles andere ist in meinen Augen religiöse Aussage.
Titel: Re: User Defined Error
Beitrag von: Glombi am 06.10.04 - 22:19:35
Es gibt sogar einen Unterschied zwischen + und &. Das haben wir mal vor einiger Zeit hier diskutiert...

Die Ergebnisse können schon unterschiedlich sein!

Use the ampersand (&) operator to ensure a concatenation operation. The plus (+) operator  concatenates two character strings, but LotusScript determines whether to interpret the plus as a concatenation operator or an addition operator on the basis of the operands in the expression in which it appears.
For example:
Print 100 & "200"
' Output is 100200, because & is always
' a concatenation operator
while
Print 100 + "200"
' Output is 300, because + was interpreted
' as addition operator

Print "100" + "200"
' Output is 100200, because + was interpreted
' as concatenation operator

Religion ist hier aber nicht gefragt, eher Pragmatismus (oder ist das das gleiche, nur auf hohem Niveau  ;D)

Andreas
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 06.10.04 - 22:27:23
Ich kann mich Jens' Aussage diesmal zu 0 Prozent anschliessen. Es gibt - auch wenn die Programmiersprache das  - leider - zulässt, gewisse Regeln, die es sich einfach lohnt zu befolgen. Die DesignerHelp zieht dies auch stringent durch - wohl ebenso nicht ohne Grund.

Es folgen ein paar Codezeilen, die man sich bitte mal im Kontext von Tausenden Codezeilen vorstellt (wo der Überblick ja mal verloren gehen kann). Aus meinen Augen verbietet sich für Stringoperationen schlicht jedwede Vermengung von vielleicht möglichen, aber nicht ausdrücklich angeratenen Operatoren:

Code
Sub Click(Source As Button)
	
	Dim Wert1 As Integer
	Dim Wert2 As Integer
	
	Wert1 = 5
	Wert2 = 7
	
	Messagebox "Unsauber: " & Wert1 + Wert2
	Messagebox "Auch nicht sauber, aber erwartetes Ergebnis: " & Wert1 & Wert2
	Messagebox "Sauber: " & Cstr (Wert1) & Cstr (Wert2)
	
End Sub

Einen Zusammenhang zu religiösen Dingen kann ich absolut nicht erkennen, Jens. Und Andreas' Posting zielt hier auch in die gleiche Richtung.

Bernhard
Titel: Re: User Defined Error
Beitrag von: Glombi am 06.10.04 - 22:33:59
Print 100 + "200"

hat für mich die gleiche "Qualität" wie i++ oder ++i

Liefert das jetzt "300" oder 300 ? Habe keinen Bock das jetzt auszuprobieren. Wehe einer der Azubis, deren Code ich dann warten muss, programmiert das  ;D

Verwirrung ohne Ende

Wenn man mit Cstr(i) arbeitet, ist es egal, ob + oder &. Dann aber bitte &  ;D
(aus meinen subjektiv ästhetischem Empfinden)

Andreas
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 06.10.04 - 22:42:00
Wenn man mit Cstr(i) arbeitet, ist es egal, ob + oder &. Dann aber bitte &  ;D
(aus meinen subjektiv ästhetischem Empfinden)

FULL ACK, Andreas !

Ich halte das aber weder für eine subjektiv noch eine für ästhetische Frage. Ich habe es weiter oben mit "Ordnung und Sauberkeit im Schlachthof" umschrieben. Wer derart einfache Regeln der Code-Lesbarkeit (dazu zählt auch eine naming convention wie die Hungarian notation) und vor allem EINDEUTIGKEIT missachtet, schreibt entweder nur 100-Zeiler oder fällt irgendwann tierisch auf die Schnauze. Eine Sauerei ist zumindest gegenüber Kollegen, die den "Kot" mal warten müssen.

Bernhard
Titel: Re: User Defined Error
Beitrag von: TMC am 06.10.04 - 23:02:06
Messagebox "Auch nicht sauber, aber erwartetes Ergebnis: " & Wert1 & Wert2

Ich wollte hier erst widersprechen und hätte schwören können, dass in der Designerhilfe steht, dass Integer etc. bei der Übergabe in die Massagebox immer als String umgewandelt werden (und man sich das CStr somit schenken kann). Aber konnte es nicht finden, schätze ich habe das mal in einem Buch gelesen....

Ich mag nämlich CStr's in Messageboxes nicht, weil diese die Codezeilen länger werden lassen, dies kann gerade bei längeren Messages dann unübersichtlicher werden.
Werde das trotzdem weiter so handhaben ohne CStr, aber natürlich immer mit & als Verkettung.
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 06.10.04 - 23:08:36
Ui, das halte ich jetzt aber für bedenklich, Matthias. Und Massagekisten kann man doch wunderbar in einzelne Zeilen aufteilen (ab und an bleibt einem da ja sowieso keine Möglichkeit - auch ohne Cstr-Statements):
Messagebox "Ein Fehler ist aufgetreten !" & Chr$ (10) & Chr$ (10) &_
                     "Bitte beschimpfen Sie den Programmierer !"

oder - einfacher -

Messagebox |Ein Fehler ist aufgetreten !"

"Bitte beschimpfen Sie den Programmierer !" |

"Lange Zeilen" sind für mich jedenfalls kein Argument gegen sauberes Coding.

Bernhard (wie immer grüssend von "Ober" nach "Nieder")
Titel: Re: User Defined Error
Beitrag von: Glombi am 06.10.04 - 23:11:56
Oder noch einfacher

Messagebox {Ein Fehler ist aufgetreten !

Bitte beschimpfen oder steinigen Sie den Programmierer ! }

Zwischen was Notes implizit macht und was sinnvoll ist besteht meiner Meinung nach noch ein Unterschied. Und implizite Typumwandlung ist - was die Wartbarkeit und Fehlersuche betrifft - schwierig nachzuvollziehen.

Andreas
Titel: Re: User Defined Error
Beitrag von: TMC am 06.10.04 - 23:14:34
Die mehrzeilige Aufteilungssyntax ist mir klar, Bernhard.

Aber ich perönlich finde
Messagebox collection.Count & " Dokumente von " & intIrgendwas & "wurden abgearbeitet."
einfach lesbarer als
Messagebox cstr(collection.Count) & " Dokumente von " & cstr(intIrgendwas) & "wurden abgearbeitet."

Dies gerade, wenn in einer Massagebox mehrere Variablen vorkommen.
Mir fällt auch kein einziger Nachteil hier ein, außer eben dass dies leider so nicht in der Messagebox-Hilfe explizit erwähnt wird, eben dass z.B. ein
  Messagebox collection.Count
keinen Fehler wirft.
Titel: Re: User Defined Error
Beitrag von: TMC am 06.10.04 - 23:29:52
Zwischen was Notes implizit macht und was sinnvoll ist besteht meiner Meinung nach noch ein Unterschied. Und implizite Typumwandlung ist - was die Wartbarkeit und Fehlersuche betrifft - schwierig nachzuvollziehen.

Das sehe ich genauso.
Gerade bei Messagebox mache ich da aber eine Ausnahme, ich musste auch noch nie Fehler in einer Messagebox suchen (außer Leerzeichen und/oder Zeilenumbruch zuviel/zuwenig).
Daher sehe ich wirklich kein Argument, mit CStr's in der Msgbox zu arbeiten, außer dass dies nicht explizit in der Help erwähnt ist. Ich würde auch stark an IBM zweifeln, wenn plötzlich in ND8 ein "Msgbox coll.Count" einen "Incorrect Datatype" fehler bringen würde.
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 06.10.04 - 23:53:31
Gerade bei Messagebox mache ich da aber eine Ausnahme, ich musste auch noch nie Fehler in einer Messagebox suchen (außer Leerzeichen und/oder Zeilenumbruch zuviel/zuwenig).

Entweder - oder, Matthias ...

Bernhard
Titel: Re: User Defined Error
Beitrag von: TMC am 06.10.04 - 23:59:42
Gerade bei Messagebox mache ich da aber eine Ausnahme, ich musste auch noch nie Fehler in einer Messagebox suchen (außer Leerzeichen und/oder Zeilenumbruch zuviel/zuwenig).

Entweder - oder, Matthias ...

Wie meinst Du das jetzt, Bernhard? Bezug auf CStr und Ampersand als Verknüpfung? Oder allgemein gemeint? Wegen Ausnahme?
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 07.10.04 - 00:09:08
Allein schon wegen der Lesbarkeit hinsichtlich der Datentypen: Sauber bleiben ! Ich meine also sowohl Cstr als auch Ampersand.

Aber das ist natürlich immer eine persönliche Entscheidung. Danken würde es aber einem derjenige, der vielleicht mal mit meinem Code umgehen müsste.

Bernhard

PS: Ich habe jetzt sogar den Teamstudio Configurator über alle wesentlichen Apps gejagt, damit er "msgbox" gegen "Messagebox" austauscht (und habe mir angewöhnt, nur noch diese Notation zu verwenden), damit ich irgendwann mal nach zwei möglichen Notationen suchen muss. Aus Erfahrung ...
Titel: Re: User Defined Error
Beitrag von: TMC am 07.10.04 - 00:20:42
Für mich fällt das schon fast in die Kategorie "Geschmack"  :)

Ich meine, wenn man durchgängig in (auf Ampersand basierenden) Msgboxes auf CStr verzichtet, aber Variablen eh saubere Präfixe verleiht, dann rast kein Programmierer in Probleme, wenn der meinen Code lesen und verstehen muss. Mich würde aber ein Beispiel interessieren, das mir meine Behauptung widerlegt.
Einheitlich Msgbox oder Messagebox zu verwenden (ich persönl. nehme lieber Msgbox), halte ich auch für sehr sinnvoll.
Titel: Re: User Defined Error
Beitrag von: hOtze am 07.10.04 - 08:03:31
Morgen Kollegen,

hui da is ja ne ganze schöne Diskussion entstanden.... gut dann werd ich die + in der Messagebox durch & ersetzen! ;)
Aber das ja eigentlich nit das Problem, die Ausgabe der Box funktioniert ja .... nur was sie mir mitteilt find ich nit in Ordnung!

Also an Rechte hatte ich auch erst gedacht, hab deshalb hab ich es auch mal mit einer ID eines Stino Users getestet.... selbst da funktioniert es! Das Shizophrene ist ja gerade das es hier bei uns einwandfrei funktioniert, nur halt in der andern Niederlassung nicht.

Sonst noch wer ne Idee?
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 20:06:08
Bernhard: Ampersand UND CStr ist für mich eindeutig nicht sauber. Warum? Ampersand ruft den CStr intern auf, fügt man ihn dazu, wird er zweimal ausgeführt. Wozu?
Titel: Re: User Defined Error
Beitrag von: Glombi am 07.10.04 - 20:50:21
PS: Ich habe jetzt sogar den Teamstudio Configurator über alle wesentlichen Apps gejagt, damit er "msgbox" gegen "Messagebox" austauscht (und habe mir angewöhnt, nur noch diese Notation zu verwenden), damit ich irgendwann mal nach zwei möglichen Notationen suchen muss. Aus Erfahrung ...
Ups, hoffentlich bekommst Du nie Code von mir zum Suchen  ;D
Ich habe nämlich die Messagebox verbannt: Zuviel Tipparbeit und VB verwendet ja auch Msgbox. Warum hier eine künstliche Trennung gemacht wird ist mir nicht so klar.

Andreas
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 07.10.04 - 20:52:59
Obicht, bevor wir uns da missverstehen: Ich hätte das genauso anders herum machen können und Messagebox durch Msgbox ersetzen lassen können. Wegen des späteren Suchens habe ich mich lediglich auf EINE Variante geeinigt.

Bernhard
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 21:23:20
Es geht das Gerücht um, dass Lotus seinerzeit bei der Einführung von LS, welches ja bewusst ein VB-Clon ist, gewisse Aenderungen eingeführt hat, um nicht mit MS in einen Copyright-Konflikt zu geraten. Einde der 6 Aenderungen war Messagebox statt Msgbox, und um kompatibel zu bleiben, wurde der Alias geschaffen. Vielleicht finde ich die Angabe noch, welche anderen 5 Aenderungen gemacht wurden.
Titel: Re: User Defined Error
Beitrag von: TMC am 07.10.04 - 21:26:51
@Jens:
Eine weitere war afaik Option Declare und Option Explicit.

Das mit den leichten Anpassungen aufgrund Copyright hab ich auch schon oft gehört und gelesen.
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 21:33:05
Genau, das war auch in der Liste
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 21:38:41
Gefunden, von einem Ex-Loti, der in der Entwicklung war

Zitat
"Oral history" is that when LotusScript was being created...

The Lotus dev weenies went to the lawyers-on-high and asked, "OK, we basically want to rip off Microsoft's VB, make it better, and stick it in all our products. What do we need to do to keep from getting our asses sued by Darth Bill and the M$ Legal Deathstar?"
The Lotus lawyers went and meditated... "oooouuuuuhhhhhhmmmmm....." "AAAAAAAammmmmiiiiiPPPPrrrrrrroooooooo....."
They came back in an indeterminable time later and said, "In order for the Manzi Federation to keep the M$ Legal Deathstar at bay you must change these six things [ed. note: I heard it was 6, may be 5, don't know] these 6 things are (a drumroll was heard off in the distance, completely unlike an Alex van Halen drum solo):
use MessageBox instead of MsgBox
use Option Declare instead of Option Explicit
use Forall instead of For Each
[ed. note: the rest is lost from my version of the oral history. sorry. at this point imagine hearing the "Girl from Ipanema" as a musical interlude instead]
So, that's the way I heard it. Your mileage may vary. I'm sure others can add their recounting of this favorite fireside story to the discussion.
Update: In a flash of lucidity I remembered to check the Help file - here's a list of aliases in LotusScript...

Die Liste ist zu finden in der Designer Help mit dem Titel Lotus Script Aliases
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 07.10.04 - 21:39:25
Bernhard: Ampersand UND CStr ist für mich eindeutig nicht sauber. Warum? Ampersand ruft den CStr intern auf, fügt man ihn dazu, wird er zweimal ausgeführt. Wozu?

Ich halte es einfach mit den stringent durchgezogenen Typkonvertierungen. Man muss da ja nicht tun. Ich bin jedenfalls schon mehrfach mit einer "erwarteten" Konvertierung durch Ampersand auf die Nase gefallen. Es wird mir ein innerer Vorbeimarsch sein, das zu posten, wenn ich das nächste Mal wieder darüber stolpere (und wenn ich daran denke, werde ich beim Coden provokativ testen  ;))
Vielleicht lag es aber auch an nur an früheren Versionen. Aber Notes lehrt uns ja: Was schon mal war, kann wieder kommen.

By the way: Ich habe eben mal 100.000 Strings mit Longs mit und ohne CStr verknüpft. Da beide Varianten innerhalb einer Sekunde fertig waren: "Kein" Unterschied. Das wäre also kein Argument.

Wir sind hier aber an einem Punkt, an dem ich meine: Jeder mag nach seinerr Fasson glücklich werden.  ;)  (Preussische Könige hatten ja auch ab und an Recht  ;D)

Bernhard
Titel: Re: User Defined Error
Beitrag von: Glombi am 07.10.04 - 21:41:17
Wenn ich in der R6 Designer Hilfe nach "is acceptable" suche, bekomme ich wohl eine Obermenge der Befehle, die ersetzt werden mussten:

DoEvents is acceptable in place of Yield
TimeSerial is acceptable in place of TimeNumber
StrComp is acceptable in place of StrCompare
SetAttr is acceptable in place of SetFileAttr
GetAttr is acceptable in place of GetFileAttr
DateSerial is acceptable in place of DateNumber
AppActivate is acceptable in place of ActivateApp
Explicit is acceptable in place of Declare
VarType is acceptable in place of DataType
CVDate is acceptable in place of CDat
MsgBox is acceptable in place of MessageBox

Option Compare option1 [ , option2 ]
Elements
Option can be any of the following:
Binary
Comparison is bit-wise. If Binary is specified, no other option can be specified.
Case or NoCase
Comparison is case sensitive (default) or case insensitive. Only one of these options can be specified. The keyword Text is acceptable in place of NoCase.


bei einigen Namen war IBM ja sehr kreativ  ;D

Andreas
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 21:42:38
Hier noch der Kommentar von Bob Balaban zu der Liste der "Copyright"-Verursachten Aliasse (er muss es wissen, ihm verdanken wir das Ur-LS):

Zitat
It was 4 things, not 6

Otherwise, you got it right. The follow up was that during the deliberations, Lotus got bought by IBM. The product manager went to some IBM lawyers and presented the same question. The IBM lawyers essentially said, "Take whatever keywords you want. Let 'em sue us."
Thus is the mighty power of IBM
Titel: Re: User Defined Error
Beitrag von: Semeaphoros am 07.10.04 - 21:44:32
Hier die Liste aus der 6.5.1er Designer-Hilfe:


Zitat
This appendix lists the LotusScript aliases and their equivalent text.
An alias is an alternate spelling of a language keyword (usually VB compliant) such as "MsgBox" for the LotusScript "MessageBox" function.   

LotusScript Syntax   Alias
ActivateApp   AppActivate
CDat   CVDate
DataType   VarType
DateNumber   DateSerial
GetFileAttr   GetAttr
Implode   Join
MessageBox   MsgBox
NoCase (Option Compare)   Text (Option Compare)
Option Declare   Option Explicit
SetFileAttr   SetAttr
StrCompare   StrComp
TimeNumber   TimeSerial
Yield   DoEvents
Titel: Re: User Defined Error
Beitrag von: koehlerbv am 07.10.04 - 22:03:34
Äh, ich habe ja selber zur "Entgleisung" beigetragen, aber: Sind wir jetzt hier nicht MÄCHTIG off-topic ?

Sorry, hotze.

Für mich ist das hotze'sche Problem insofern interessant, da ich gerade eine absolut nicht nachvollziehbare Fehlermeldung auf dem Tisch habe, die letztendlich genauso lautet. Hier ist es kein NotesDocument.Save, sondern ein NotesDocument.Remove. Fehler 4000 - aber keinerlei Sinn erkennbar.
Das Ganze natürlich in einer Fremdanwendung. Die (umfangreiche) Routine habe ich mittlerweile teilweise neu geschrieben, und der Fehler (der auch nur in einer DB auftrat, in allen anderen auf diesem Template basierenden passierte aber - zumindest dort  ;D - nix).

Konzentrieren wir uns also wieder darauf, hotze zu helfen.

Bernhard