Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: BigWim am 12.03.09 - 15:22:55

Titel: Gültigkeit von Variablen
Beitrag von: BigWim am 12.03.09 - 15:22:55
ich verstehe es einfach nicht!

Ich habe mir eine Funktion gebastelt, die per Agent Fälligkeiten von Verträgen rechnet. Nach erfolgreichem Test habe die Funktion um zwei Parameter erweitert (zwecks „universellen“ Einsatzes) und danach lief sie nicht mehr.

Nehme ich Variante 1, rennt die Funktion wie gewollt.
Nehme ich Variante 2, liefert viewCheck.GetFirstDokument Nothing zurück

Und ich verstehe nicht warum ?? Warum kann ich in diesem Fall nicht den übergebenen Parameter innerhalb der Funktion nutzen? Ist doch Standard - zumindest bei mir. Ich habe jetzt den ganzen Tag damit verbracht, herauszufinden, was ich übersehe. Vielleicht ist da jemand, der mich aufklärt ...

Vielen Dank im voraus!
Markus



*** Variante 2 ***
Sub BerechneFaelligkeiten (docCheck As NotesDocument, sNameView As String)
   
   Dim session       As New NotesSession
   Dim db          As NotesDatabase
   Dim viewCheck      As NotesView
   Dim objVZeiten      As New CVertragszeiten
   Dim iAgentstatus      As Integer
   Dim sSearch      As String
   Dim docColKonfig      As NotesDocumentCollection
   Dim docKonfig      As NotesDocument
‘   Dim docCheck      As NotesDocument
<Replace docHallo in docCheck>




*** Variante 1 ***

Sub BerechneFaelligkeiten (docHallo As NotesDocument, sNameView As String)
   
   Dim session       As New NotesSession
   Dim db          As NotesDatabase
   Dim viewCheck      As NotesView
   Dim objVZeiten      As New CVertragszeiten
   Dim iAgentstatus      As Integer
   Dim sSearch      As String
   Dim docColKonfig      As NotesDocumentCollection
   Dim docKonfig      As NotesDocument
   Dim docCheck      As NotesDocument
   
   Set db    = session.CurrentDatabase
   
   
   If docHallo Is Nothing Then
      
'      ***   VIEW neu berechnen
      
      Set viewCheck = db.GetView("KeyList\Alle\Vertrag")
'      Set viewCheck = db.GetView("KeyList\TestMarkus")
'      Set viewCheck = db.GetView (sNameView)
      Print "sNameView = " + sNameView + "; viewCheck.Name = " + viewCheck.Name
      Set docCheck = viewCheck.GetFirstDocument
      If docCheck Is Nothing Then
         Messagebox "View enthält " + Cstr(viewcheck.AllEntries.Count) + " Dokument(e)", 0, "funzt nicht"
      End If
      While Not docCheck Is Nothing
         
'         Fälligkeiten aktualisieren      
         Call objVZeiten.Berechnung (docCheck, "DebugAgentBerechnung")
         
'         Status der Berechnung
         If objVZeiten.bBerechnungOK = False Then
            docCheck.DebugAgentAktionen = "Berechnung unvollständig"
         Else
            docCheck.DebugAgentAktionen = "Berechnung OK"
         End If
         
'         nächste Dokument prüfen
         Call docCheck.Save(True, True)
         Set docCheck = viewCheck.GetNextDocument(docCheck)
      Wend
      
   Else
      
'      ***   ein Dokument neu berechnen
      
'      Fälligkeiten aktualisieren      
      Call objVZeiten.Berechnung (docHallo, "DebugAgentBerechnung")
      
'      Status der Berechnung
      If objVZeiten.bBerechnungOK = False Then
         docHallo.DebugAgentAktionen = "Berechnung unvollständig"
      Else
         docHallo.DebugAgentAktionen = "Berechnung OK"
      End If
      
'      Dokument speichern
      Call docHallo.Save(True, True)
   End If
   
End Sub

Titel: Re: Gültigkeit von Variablen
Beitrag von: DerAndre am 12.03.09 - 15:35:35
Eine Variante fehlt...
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 12.03.09 - 15:50:34
Sorry, ist aber nur die Beschriftung, die ich vergessen habe. Die funktionierende Variante 1 habe ich komplett gepostet.

Ich editiere mal das Ursprungsposting.

Meine Vermutung geht ja dahin, dass ich bei der fehlerhaften Variante ein Nothing für docCheck übergebe und dann im späteren Funktionsverlauf die Variable doch benutzen will - eben, das viewCheck.GetFirstDokument.

Aber kann das wirklich sein?


   Dim docKonfig      As NotesDocument
‘   Dim docCheck      As NotesDocument
<Replace docHallo in docCheck>


---> Variante 1 <--- im Ursprungspost ergänzt.

Sub BerechneFaelligkeiten (docHallo As NotesDocument, sNameView As String)
   
   Dim session       As New NotesSession
   Dim db          As NotesDatabase
   Dim viewCheck      As NotesView

Titel: Re: Gültigkeit von Variablen
Beitrag von: DerAndre am 12.03.09 - 15:59:06
Wie sieht der Aufrufende Code aus?

Bitte poste jeweils den kompletten Code.
Das ist sehr sehr Mühsam sich das Lesbar zu machen.

Danke
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 12.03.09 - 16:17:50
Der "Aufruf"  enthielt ein "use" auf die ScriptBibliothek, die die Klasse CVertragszeiten enthält und den Funktionsaufruf, der auch in der SB untergebracht ist.

*** a) Ich habe eine Schaltfläche mit direktem Funktionsaufruf
Der "Aufruf"  enthielt ein "use" auf die ScriptBibliothek, die die Klasse CVertragszeiten enthält und den Funktionsaufruf, der auch in der SB untergebracht ist.

*** b) ich habe eine Schaltfläche, die einen Agenten starte @Command([RunAgent];".."), der den Aufruf von a) enthielt

*** c) ich habe einen zeitgesteuerten Agenten probiert, der den Aufruf aus a) hatte


Ich hoffe, ich habe es jetzt klarer dargestellt. Danke schonmal für Dein Interesse
Markus




*** Aufruf per call BerechneFaelligkeiten  (nothing, "KeyList\TestMarkus") - funktioniert.

Sub BerechneFaelligkeiten (docHallo As NotesDocument, sNameView As String)
   
   Dim session       As New NotesSession
   Dim db          As NotesDatabase
   Dim viewCheck      As NotesView
   Dim objVZeiten      As New CVertragszeiten
   Dim iAgentstatus      As Integer
   Dim sSearch      As String
   Dim docColKonfig      As NotesDocumentCollection
   Dim docKonfig      As NotesDocument
   Dim docCheck      As NotesDocument
   
   Set db    = session.CurrentDatabase
   
   
   If docHallo Is Nothing Then
      
'      ***   VIEW neu berechnen
      
'      Set viewCheck = db.GetView("KeyList\Alle\Vertrag")
'      Set viewCheck = db.GetView("KeyList\TestMarkus")
      Set viewCheck = db.GetView (sNameView)
      Print "sNameView = " + sNameView + "; viewCheck.Name = " + viewCheck.Name
      Set docCheck = viewCheck.GetFirstDocument
      If docCheck Is Nothing Then
         Messagebox "View enthält " + Cstr(viewcheck.AllEntries.Count) + " Dokument(e)", 0, "funzt nicht"
      End If
      While Not docCheck Is Nothing
         
'         Fälligkeiten aktualisieren      
         Call objVZeiten.Berechnung (docCheck, "DebugAgentBerechnung")
         
'         Status der Berechnung
         If objVZeiten.bBerechnungOK = False Then
            docCheck.DebugAgentAktionen = "Berechnung unvollständig"
         Else
            docCheck.DebugAgentAktionen = "Berechnung OK"
         End If
         
'         nächste Dokument prüfen
         Call docCheck.Save(True, True)
         Set docCheck = viewCheck.GetNextDocument(docCheck)
      Wend
      
   Else
      
'      ***   ein Dokument neu berechnen
      
'      Fälligkeiten aktualisieren      
      Call objVZeiten.Berechnung (docHallo, "DebugAgentBerechnung")
      
'      Status der Berechnung
      If objVZeiten.bBerechnungOK = False Then
         docHallo.DebugAgentAktionen = "Berechnung unvollständig"
      Else
         docHallo.DebugAgentAktionen = "Berechnung OK"
      End If
      
'      Dokument speichern
      Call docHallo.Save(True, True)
   End If
   
End Sub





*** Aufruf per call BerechneFaelligkeiten (nothing, "KeyList\TestMarkus") - funktioniert nicht.

Sub BerechneFaelligkeiten (docCheck As NotesDocument, sNameView As String)
   
   Dim session       As New NotesSession
   Dim db          As NotesDatabase
   Dim viewCheck      As NotesView
   Dim objVZeiten      As New CVertragszeiten
   Dim iAgentstatus      As Integer
   Dim sSearch      As String
   Dim docColKonfig      As NotesDocumentCollection
   Dim docKonfig      As NotesDocument
   
   Set db    = session.CurrentDatabase
   
   
   If docCheck Is Nothing Then
      
'      ***   VIEW neu berechnen
      
'      Set viewCheck = db.GetView("KeyList\Alle\Vertrag")
'      Set viewCheck = db.GetView("KeyList\TestMarkus")
      Set viewCheck = db.GetView (sNameView)
      Print "sNameView = " + sNameView + "; viewCheck.Name = " + viewCheck.Name
      Set docCheck = viewCheck.GetFirstDocument
      If docCheck Is Nothing Then
         Messagebox "View enthält " + Cstr(viewcheck.AllEntries.Count) + " Dokument(e)", 0, "funzt nicht"
      End If
      While Not docCheck Is Nothing
         
'         Fälligkeiten aktualisieren      
         Call objVZeiten.Berechnung (docCheck, "DebugAgentBerechnung")
         
'         Status der Berechnung
         If objVZeiten.bBerechnungOK = False Then
            docCheck.DebugAgentAktionen = "Berechnung unvollständig"
         Else
            docCheck.DebugAgentAktionen = "Berechnung OK"
         End If
         
'         nächste Dokument prüfen
         Call docCheck.Save(True, True)
         Set docCheck = viewCheck.GetNextDocument(docCheck)
      Wend
      
   Else
      
'      ***   ein Dokument neu berechnen
      
'      Fälligkeiten aktualisieren      
      Call objVZeiten.Berechnung (docCheck, "DebugAgentBerechnung")
      
'      Status der Berechnung
      If objVZeiten.bBerechnungOK = False Then
         docCheck.DebugAgentAktionen = "Berechnung unvollständig"
      Else
         docCheck.DebugAgentAktionen = "Berechnung OK"
      End If
      
'      Dokument speichern
      Call docCheck.Save(True, True)
   End If
   
End Sub

Titel: Re: Gültigkeit von Variablen
Beitrag von: koehlerbv am 12.03.09 - 18:16:23
Markus, Du fütterst uns hier bruchstückhaft mit Informationen, die offensichtlich mit des Pudels Kern nichts zu tun haben. Hinzu kommt Code, der nicht beteiligt sein kann, dann auskommentierte Zeilen etc. pp. - ich sage Dir mit einiger Forenerfahrung voraus: Sowas liest dann keiner mehr.

Was ich in erster Linie nicht verstehe: Warum kaprizierst Du Dich überhaupt auf das Objekt docCheck, was ja nirgendwo als Parameter vorkommt?

Wenn Du Antworten haben willst: Beschreibe logisch nachvollziehbar Dein Konstrukt. Und beschreibe das, was man in solchen Situationen als erstes macht: Was beobachtest Du bei der Codeausführung im Entwanzer?

Bernhard

Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 13.03.09 - 09:56:50
Zitat
die offensichtlich mit des Pudels Kern nichts zu tun haben
sorry, ich bin mir immer noch unsicher, wann Quellcode, wann Beschreibung, ist zu lang, zu kurz, zu wenig ...

Zitat
Warum kaprizierst Du Dich überhaupt auf das Objekt docCheck, was ja nirgendwo als Parameter vorkommt?
Weil hier der Fehler liegt - definitiv, ich aber nicht erkennen kann warum.
Es scheint ein Unterschied zu machen, ob ich auf diese Weise ein Objekt oder eine Variable benutze. Mir macht es Sorgen, weil es mich zum ersten mal trifft, obwohl zigmal benutzt - und Programmierung sollte ja nicht aus Glück bestehen ...

Zitat
was man in solchen Situationen als erstes macht:
Ok, ich beschreibe. Von kurz nach lang - und eins nach dem anderen

Zitat
Beschreibe logisch nachvollziehbar Dein Konstrukt
- Für alle Dokumente in einer View sind Fälligkeiten neu zu berechnen.
- Benutze dafür den (für mich) üblichen funktionierenden Code
Code
Sub BerechneFaelligkeiten
      Dim uiws as new notesuiworkspace
      Dim viewCheck as notesview
      Dim docCheck as notesdocument
      Dim db as notesdatabase

      set db = uiws.currentdatabase.database
      Set viewCheck = db.GetView ("<ViewName>")
      Set docCheck = viewCheck.GetFirstDocument
      While Not docCheck Is Nothing
         Set docCheck = viewCheck.GetNextDocument(docCheck)
      Wend
EndSub


Neue Anforderung an diese Funktion.
- keine hardcodierte View
- Berechnung eines einzelnen Dokuments
Codeerweiterung wie folgt

Code
Sub BerechneFaelligkeiten [color=blue](docCheck as notesdocument, sViewName as string)[/color]
      Dim uiws as new notesuiworkspace
      Dim viewCheck as notesview
      [s]Dim docCheck as notesdocument[/s]
      Dim db as notesdatabase

      set db = uiws.currentdatabase.database
[color=blue]
      if docCheck is nothing then
[/color]
            Set viewCheck = db.GetView ([color=blue]sViewName[/color])
            Set docCheck = viewCheck.GetFirstDocument
            While Not docCheck Is Nothing
               Set docCheck = viewCheck.GetNextDocument(docCheck)
            Wend
      else
[color=blue]
            ...
      endif
[/color]
EndSub

Rufe ich Funktion nun auf mit
Code
      Call BerechneFälligkeiten (nothing, "MeineView")

Zitat
Was beobachtest Du bei der Codeausführung im Entwanzer?
liefert mir
Code
      Set docCheck = viewCheck.GetFirstDocument
IMMER nothing zurück. Ich bin in der richtigen View, die Anzahl der Dokumente stimmt ....



Ändere ich den Funktionsaufruf wie folgt ab, läuft es fehlerfrei.
Code
Sub BerechneFaelligkeiten [color=blue]([color=red]docHallo[/color] as notesdocument, sViewName as string)[/color]
      Dim uiws as new notesuiworkspace
      Dim viewCheck as notesview
      [color=blue]Dim docCheck as notesdocument[/color] 
      Dim db as notesdatabase

      set db = uiws.currentdatabase.database
[color=blue]
      if [color=red]docHallo[/color] is nothing then
[/color]
            Set viewCheck = db.GetView ([color=blue]sViewName[/color])
            Set docCheck = viewCheck.GetFirstDocument
            While Not docCheck Is Nothing
               Set docCheck = viewCheck.GetNextDocument(docCheck)
            Wend
      else
[color=blue]
            ...
      endif
[/color]
EndSub

Titel: Re: Gültigkeit von Variablen
Beitrag von: koehlerbv am 13.03.09 - 10:17:01
Ah - jetzt sehe ich erst den Unterschied zwischen docCheck und docHallo und worauf Du hinaus willst.

Du hebelst hier die Vererbung der Objekte aus (oder versuchst es zumindest). Dein Parameter docCheck kommt von irgendwo her, dann versuchst Du docCheck als Child von NotesView als Child von NotesDatabase zu instantiieren - obwohl Dein Parameter von diesen Vorfahren nichts weiss.

Das kann so also nichts werden.

Bernhard
Titel: Re: Gültigkeit von Variablen
Beitrag von: MadMetzger am 13.03.09 - 10:22:59
Ich denke es hilft an dieser Stelle die Funktion in zwei Teile zu spalten:

1. Eine Funktion, die die Fälligkeit für ein Dokument berechnet
2. Eine Funktion, die über eine beliebige View iteriert und erstere Funktion verwendet

Damit sparst du dir das eine oder andere if und trennst Iterierlogik von Berechnungslogik. Das führt auch zu etwas besser lesbarem Code.

@Bernhard: Das ist keine Vererbung an der Stelle. Wir hatten das Thema irgendwann schon mal.
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 13.03.09 - 10:28:45
Danke Bernhard, für die schnelle Antwort.

Ich hielt das (bis jetzt) für eine kluge Idee, mir ein Dim doc as Notesdocument sparen zu können. Das hier die Vererbung im Spiel ist, war mir nicht bewußt und so ganz verstehe ich das nicht. Muß ich zugeben.

Die Funktion rechnet entweder nur ein Dokument oder eine View neu. Für mich ist "NotesDocument" erst einmal nichts anderes als ein Typ von xy. Und ob die Deklaration nun als Parameterübergabe erfolgt oder innerhalb der Funktion war für mich (bis jetzt) einerlei.

Aber ich glaube Dir auf jeden Fall und tue so etwas nie nie wieder.

Danke für die Bestätigung
Markus




Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 13.03.09 - 10:32:25
@Markus

Ich gebe Dir natürlich vollkommen Recht. Da es in dieser Funktion aber "nur" um das Drumherum geht; die eigentliche Berechnung findet in einer Klasse steht, dachte und hoffte ich mir hier, den Aufwand sparen zu können. Aber ....

Markus
Titel: Re: Gültigkeit von Variablen
Beitrag von: koehlerbv am 13.03.09 - 10:34:14
... und so ganz verstehe ich das nicht.

Hallo Markus,

stell Dir vor, Du gehst durch die Stadt und quatschst ein wildfremdes Kind an und teilst diesem mit, dass Du sein Vater bist: Das Kind zeigt Dir einen Vogel  ;D

Würdest Du hingegen Deiner Sub als Parameter auch die zugehörige View mit übergeben und sich dann bei Set NotesDocument Dich wiederum darauf beziehen, dann klappt das auch mit der Vererbung.

Bernhard
Titel: Re: Gültigkeit von Variablen
Beitrag von: MadMetzger am 13.03.09 - 10:51:29
An der Stelle ist auch keine Vererbung im Spiel. Es geht an der Stelle um eine Assoziation, die aber wiederum bei Bernhards Beschreibung dann richtig besetzt ist. Ich finde die Bezeichnungen child und parent legen hier begrifflich eine Vererbung nahe, dabei ist es einfach keine. Oder kannst du an jeder Stelle das Notesdokument verwenden, wo eine View verwendet wurde? ... Nein, natürlich nicht, denn Notesdocument ist keine Unterklasse Notesview.

Ich denke nämlich nicht, dass Notesdocument so declariert ist (Bitte nagelt mich nicht auf Syntax fest, aber so war doch Vererbung in LS, oder?):
Code
public class Notesdocument As NotesView
...
end class

@Markus: Offensichtlich sparst du durch diesen Code keinen Aufwand, wie wir hier ja gerade sehen. Selbst wenn die Funktion zum Berechnen nur die Klasse verwendet, wäre das schon eine sinnvolle Trennung, in Iteration, Aufruf der Logik und Ausführung der Logik.
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 13.03.09 - 12:42:51
Hallo Bernhard, hallo Markus,

Wow, da habe ich ja was losgetreten. Ein NotesDocument und eine NotesView haben zunächst einmal gar nichts miteinander zu tun. Aber NotesDocument benötige ich, wenn ich an die Items will, die in der View angezeigt werden. Das Prinzip der Vererbung verstehe ich ja - glaube ich zumindest, aber meiner Meinung darf es bei der Deklaration keinen Unterschied geben. Offensichtlich ist ein Unterschied, ob ich mein Objekt im Funktionsaufruf deklariere, also

Sub Funktion (docTmp as Notesdocument)
End Sub

oder innerhalb einer Funktion, also

Sub Funktion
    Dim docTmp as Notesdocument
End Sub


Macht Euch bitte nicht so viel Mühe. Ich habe es jetzt umgeschrieben es läuft. Aber wenn es euch interessiert, ich wette, es funktioniert auch bei Euch nicht, wenn ihr folgendes probiert.

call Test (nothing)

Sub Test (docTmp es Notesdocument)
      Dim uiws as new notesuiworkspace
      Dim viewCheck as notesview

      Set viewCheck = uiws.currentview.view
      Set docTmp = viewCheck.GetFirstDocument

      if docTmp is nothing then
            Print "er hat Recht"
      else
            Print "er ist doch zu doof, dass zu verstehen"
      endif

End Sub

Vielen Dank & viele Grüße
Markus






Für Interessierte - ich versuche mal meinen Gedankengang ein wenig ausführlich zu beschreiben, wie es überhaupt zu dieser Situation gekommen ist:


Um weitere Umbauarbeiten in der Datenbank zu vermeiden, habe ich die Funktion erweitert, um zwei Anwendungsfälle abzubilden, die eigentlich gar nichts mit einander zu tun haben.


Ich hatte bereits eine Funktion, die die Neuberechnung durchführt, nämlich die Version "Alle Dokumente in einer bestimmten View".

Nun kam ein Berechnungssimulator dazu und verschiedene Stati, die in diversen Views dargestellt wurden. Da ich die Funktionsaufrufe eh anpassen mußte, habe ich den Funktionsaufruf gleich um zwei Parameter erweitert, nämlich ....

- Fall 1: eine View berechnen. Dafür übergebe nur den Namen, des Rest konnte die Funktion ja schon.
- Fall 2: übergebe ein bestimmtes Dokument und berechne. Konnte die Funktion bisher nicht.

Nach der Erweiterung hatte ich jetzt zwei NotesDocument deklarationen.

a) einmal die aus Fall1: da ich ja an die Dokumente in der View wollte. Besagtes Set docCheck = view.GetFirstDocument

b) neu aus Fall 2: das übergebene neuzuberechende Dokument Sub Ber... (docCheck as NotesDokument, ...)

damit hatte ich zweimal docCheck as Notesdocument deklariert.

Ok, dachte ich mir in meinem jugendlichen Leichtsinn. Lösche das Dim docCheck as Notesdocument aus Fall 1, da ja docCheck jetzt über die Funktionsparameter deklariert wird.

Und dieser Fall führte ohne weitere Codeänderung dazu, dass jetzt "plötzlich" das Set docCheck = view.GetFirstDocument vor der While Schleife IMMER nothing zurücklieferte. Wirklich Immer. Und erst, wenn ich das NotesDocument innerhalb der Funktion mittels DIM deklariere, liefert mir GetFirstDocument das erste Dokument zurück.

Und meine tiefste innere Überzeugung ist, dass GetFirstDocument nach wie vor richtig arbeitet, aber das Rückgabeergebnis meinem Objekt nicht zuweisen kann - weil es als Funktionsparameter definiert wurde?

Titel: Re: Gültigkeit von Variablen
Beitrag von: MadMetzger am 13.03.09 - 13:26:33
Ha! Jetzt fällt es mir wie Schuppen von den Augen... Dann scheinen Parameter in LS gemäß Java-Sprache final zu sein, also kann der Wert nicht mehr überschrieben werden. Daher weht hier wohl der Wind. Was lernen wir nun daraus? Missbrauche niemals einen Funktionsparameter als lokale Variable.
Titel: Re: Gültigkeit von Variablen
Beitrag von: Werner Götz am 13.03.09 - 13:31:18
Hallo Marcus,

ich denke Du hast schon recht. Das Problem besteht aber wohl darin, dass Objekte im Parameter automatisch als "call by reference" betrachtet werden. Für solche Argumente wird also kein neuer Speicherplatz reserviert, sondern es wird die Variable genutzt, mit der die Routine aufgerufen wurde.
Dummerweise wird nun aber bei Dir nicht mit einer Variable (die dann Nothing als Wert haben könnte ... ) aufgerufen sondern direkt mit Nothing, es gibt also auch keinen Speicherplatz, an den das Ergebnis
Set docTmp = viewCheck.GetFirstDocument
geschrieben werden könnte.

Eigenlich sollte die Laufeitumgebung an dieser Stelle einen Fehler werfen!


-Werner
Titel: Re: Gültigkeit von Variablen
Beitrag von: TRO am 13.03.09 - 13:34:27
Ich sehe das auch so, dass die harte Übergabe von Nothing als Parameter die Probleme verursacht.
Würde man in der übergeordneten Prozedur set doc = Nothing machen und dann dieses doc als Parameter übergeben, dann sollte alles wieder wie gewünscht funktionieren.

Thomas
Titel: Re: Gültigkeit von Variablen
Beitrag von: koehlerbv am 13.03.09 - 13:54:04
Werner und Thomas (und "MadMetzger" Markus)  - Ihr habt natürlich Recht. Solange das Objekt NotesDocument instantiiert wird (wie auch immer - durchaus auch als Abkömmling eines ganz anderen Objekts oder mit Set docCheck = Nothing) funktioniert die Zuweisung auch in der Sub.

Ich war da auf dem falschen Dampfer. Mea culpa.

Bernhard
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 13.03.09 - 14:17:05
Vielen Dank an Euch allen,

ich freue mich nicht nur, dass ich dass jetzt verstanden habe, sondern dass es mir auch gelungen ist, mich doch noch verständlich auszudrücken.

Markus
Titel: Re: Gültigkeit von Variablen
Beitrag von: MadMetzger am 13.03.09 - 15:59:33
Werner, das würde ich so nicht ganz sehen. Für den Parameter wird mit Sicherheit doch Speicher reserviert. Und zwar muss die Laufzeitumgebung doch wissen, auf welchen Wert der Parameter zeigt. Ergo sollte zumindest Speicher für die Referenz reserviert und fix vergeben werden. Das heißt, ein einmal auf Nothing zeigender Funktionsparameter kann nicht mehr auf einen anderen Wert verlegt werden. Wobei das hier jetzt schon ins Detail geht. An der Moral von der Geschicht "Missbrauche Parameter als lokale Variablen nicht" ändert das eh nichts mehr.

Sehr schön, mal wieder was gelernt und die grauen Zellen angestrengt...  ;D
Titel: Re: Gültigkeit von Variablen
Beitrag von: koehlerbv am 13.03.09 - 16:04:26
Markus, probiert einfach folgendes aus:

Code
Sub Test (docTmp As NotesDocument)
	
	Dim session As New NotesSession
	Dim dbCurrent As NotesDatabase
	Dim collAllDocs As NotesDocumentCollection
	
	
	Set dbCurrent = session.CurrentDatabase
	Set collAllDocs = dbCurrent.AllDocuments
	Set docTmp = collAllDocs.GetFirstDocument
	
	If docTmp Is Nothing Then
		Msgbox "docTmp is Nothing"
	Else
		Msgbox "docTmp is NOT Nothing!" & Chr$ (10) & "Form = " & docTmp.Form (0)
		
	End If
End Sub

Button mit dem Test-Code:
Code
Sub Click (Source As Button)
	
	Dim session As New NotesSession
	Dim dbCurrent As NotesDatabase
	Dim docOther As NotesDocument
	
	Set dbCurrent = session.CurrentDatabase
	
	Call Test (Nothing)
	
	Set docOther = Nothing
	Call Test (docOther)
	
	Set docOther = dbCurrent.CreateDocument
	docOther.Form = "TEST"
	Call Test (docOther)
	
End Sub

Call Test (Nothing) zeigt das beklagte Verhalten, wie es Werner beschrieben und Markus (der andere) erlebt hat.

Bernhard
Titel: Re: Gültigkeit von Variablen
Beitrag von: MadMetzger am 13.03.09 - 16:08:51
Leider kann ich es nicht mehr ausprobieren... Ich habe seit 1,5 Jahren nicht mehr mit Notes gearbeitet und habe auch keinen Rechner, auf dem ich Notes installiert habe. Bernhard, aber ich glaube dir, dass das so ist, wie du es beschrieben hast.
Titel: Re: Gültigkeit von Variablen
Beitrag von: BigWim am 15.03.09 - 14:50:01
Zitat
Markus, probiert einfach folgendes aus
ich weiß, ich bin nicht gemeint, habe es aber dennoch ausprobiert. Ich wollte wissen, ob ich das im Debugger hätte erkennen können.

Ergebnis: Nein!

Zitat
Offensichtlich sparst du durch diesen Code keinen Aufwand, wie wir hier ja gerade sehen. Selbst wenn die Funktion zum Berechnen nur die Klasse verwendet, wäre das schon eine sinnvolle Trennung, in Iteration, Aufruf der Logik und Ausführung der Logik.
Das habe ich dabei gelernt!

Markus