Autor Thema: Gültigkeit von Variablen  (Gelesen 12952 mal)

BigWim

  • Gast
Gültigkeit von Variablen
« 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

« Letzte Änderung: 13.03.09 - 14:17:37 von BigWim »

Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Gültigkeit von Variablen
« Antwort #1 am: 12.03.09 - 15:35:35 »
Eine Variante fehlt...
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #2 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


Offline DerAndre

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.655
  • Geschlecht: Männlich
  • Keep cool!
Re: Gültigkeit von Variablen
« Antwort #3 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
André

Elterninitiative diabetischer Kinder und Jugendlicher e.V.
-----------------------------------------------------------------------------
Fliegen ist die Kunst auf den Boden zu Fallen, aber daneben.
-----------------------------------------------------------------------------
Etwas mehr Hardware dazu zu kaufen ist viel billiger als
Software besser zu machen. ( Niklaus Wirth )

BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #4 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


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Gültigkeit von Variablen
« Antwort #5 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


BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #6 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


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Gültigkeit von Variablen
« Antwort #7 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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Gültigkeit von Variablen
« Antwort #8 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.

BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #9 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





BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #10 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Gültigkeit von Variablen
« Antwort #11 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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Gültigkeit von Variablen
« Antwort #12 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.

BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #13 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?


Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Gültigkeit von Variablen
« Antwort #14 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.

Offline Werner Götz

  • Aktives Mitglied
  • ***
  • Beiträge: 249
  • Geschlecht: Männlich
Re: Gültigkeit von Variablen
« Antwort #15 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

Offline TRO

  • Senior Mitglied
  • ****
  • Beiträge: 296
Re: Gültigkeit von Variablen
« Antwort #16 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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Gültigkeit von Variablen
« Antwort #17 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

BigWim

  • Gast
Re: Gültigkeit von Variablen
« Antwort #18 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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Gültigkeit von Variablen
« Antwort #19 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

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz