Autor Thema: Prüfen, ob Array leer ist  (Gelesen 14871 mal)

Offline sja

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Weiblich
  • Ich liebe dieses Forum!
Prüfen, ob Array leer ist
« am: 26.05.04 - 15:05:42 »
Hallo zusammen,

werde sehr dankbar für jede Hilfe.

In folgendem Script sollen Mails gesendet werden, wenn Arrays an(1 To 4)  bzw. kopie(1 To 2) nicht leer sind. Wie man sieht im Script, prüfe ich nur erste Element, aber es kann sein, dass erstes Element zwar leer ist aber weitere Elemente nicht leer sind.

Meine Frage: gibt es im LotusScript eine Funktion zur Überprüfung gesamtes Array's, ohne jedes Element des Array's zu überprüfen?


Dim an(1 To 4) As String
Dim kopie(1 To 2) As String

Function MailSenden()
   Projekt = PymDoc.GetItemValue("KundenProjektTitel")(0)
   Kunde= PymDoc.GetItemValue("KundenName")(0)
   Betreff = "PYM -> " & Projekt &"  -> Letzter Update vor " & nTagen & " Tagen"
   Text = "Sie werden darauf hingewiesen, dass das Projekt  '" & Projekt & "'  beim Kunden  '" & Kunde & "'  in den letzen " & nTagen & " Tagen nicht aktualisiert worden ist. " _
   & Chr(13) & "Bitte prüfen Sie, ob das Projekt noch die aktuelle Situation wiedergibt." & Chr(13) & "Vielen Dank" & Chr(13)
   status = PymDoc.ProjektStadium(0)
   VB = PymDoc.VFVB(0)
   SE = PymDoc.VFSE(0)
   VL = PymDoc.VFVL(0)
   TL = PymDoc.VFTL(0)
   
   If status = "Presales" Then
   '********************PRESALES********************   
   '*** 21 ***      
      If nTagen = "21" Then
         Prior = "2"
         an(1) = VB      
   '*** 28 ***      
      Elseif nTagen = "28" Then
         Prior = "1"
         an(1)= VB
         kopie(1) = SE
   '*** 35 ***         
      Elseif nTagen = "35" Then
         Prior = "1"
         an(1)= VB
         kopie(1) = SE   
         kopie(2) = VL
   '*** 42 ***         
      Elseif nTagen = "42" Then
         Prior = "1"
         an(1)= VB
         an(2)= VL
         an(3)= TL
         kopie(1) = SE   
      End If
   '********************POSTSALES********************   
   Else

   '*** 21 ***         
      If nTagen = "21" Then
         Prior = "1"
         an(1) = SE
         kopie(1) = VB
   '*** 28 ***         
      Elseif nTagen = "28" Then
         Prior = "1"
         an(1) = SE
         an(2) = TL
         kopie(1) = VB
   '*** 35 ***         
      Elseif nTagen = "35" Then
         Prior = "1"
         an(1) = VB
         an(2) = SE
         an(3) = TL
         kopie(1) = VL   
   '*** 42 ***         
      Elseif nTagen = "42" Then
         Prior = "1"
         an(1) = VB
         an(2) = SE
         an(3) = VL
         an(4) = TL
      End If
   '***************************************************   
   End If
   
   If Not ((an(1) = "") And (kopie(1) = "")) Then
      Set MailDoc = New NotesDocument(db)
      MailDoc.Form = "Memo"
      MailDoc.Subject = Betreff
      MailDoc.SendTo = an
      MailDoc.CopyTo = kopie
      Set rtitem = New NotesRichTextItem( MailDoc , "Body" )
      Call rtitem.AppendText( Text )
      Call rtitem.AddNewLine( 1 )
      Call rtitem.AppendDocLink( PymDoc, Projekt)
      MailDoc.Importance = Prior         
      MailDoc.Send(False)         
   End If
   
   Erase an
   Erase kopie   
End Function

Danke im Voraus
Sofia


Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Prüfen, ob Array leer ist
« Antwort #1 am: 26.05.04 - 15:14:28 »
Hier musst Du tatsächlich jedes Element einzeln prüfen. Es lohnt sich auf jeden Fall, sich für sowas eine universelle Prüfroutine zu schreiben, die Skalare und Arrays unabhängig von ihrer Dimension prüft - sowas braucht man immer wieder.

In Deinem Spezialfall könntest Du es Dir höchstens dadurch erleichtern, dass Du in einem ErrorHandler die Fehlersituation abfängt, dass Notes keine Empfänger findet (ist irgendeine 4000er Fehlernummer, musst mal in den entspr. .lss schauen).

Bernhard

Offline sja

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Weiblich
  • Ich liebe dieses Forum!
Re:Prüfen, ob Array leer ist
« Antwort #2 am: 26.05.04 - 15:26:57 »
Hi Bernhard,

vielen Dank für schnelle Antwort.

Ich habe gerade die Funktion IsEmpty gefunden, aber wie ich verstanden habe, wird die nur für Variant. Weiss jemand, ob man die Funktion auch für Array verwenden kann?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Prüfen, ob Array leer ist
« Antwort #3 am: 26.05.04 - 15:57:59 »
Das nützt Dir nur etwas, wenn der Wert tatsächlich nicht initialisiert ist.
Dim vTest as Variant
If IsEmpty (vTest) then
   Messagebox "EMPTY"
End if

gibt Dir die Messagebox aus.
Wenn Du allerdings ein Array hast, welches bereits initialisiert wurde, dann gilt die Bedingung nicht mehr. Ausserdem ist auch ein Leerstring NICHT empty.

HTH,
Bernhard

Hernan Cortez

  • Gast
Re:Prüfen, ob Array leer ist
« Antwort #4 am: 26.05.04 - 16:28:21 »
Wenn ich das richtig verstehe und wie Bernhard im Prinzip bereits gesagt hat:
Ein Array ist ja eigentlich ein Container für andere (hm. sagen wir) Objekte wie String, ints, NotesDocument oder was auch immer.
Wenn die Prüfung auf isEmpty ergibt, dass er nicht empty ist, kann das trotzdem heissen, dass der Array Elemente enthält, die sehr wohl empty sind.

Dieses Thema begegnet dir aber bei anderen Programmiersprachen auch.

Glombi

  • Gast
Re:Prüfen, ob Array leer ist
« Antwort #5 am: 26.05.04 - 16:52:42 »
Ich würde es mit Fulltrime machen.

dim ftarray as Variant
ftarray = Fulltrime(an)
...

Andreas

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Prüfen, ob Array leer ist
« Antwort #6 am: 26.05.04 - 17:03:49 »
Das macht die Sache sooooviel einfacher auch nicht. Ist das Array "leer" (enthält nur Leerstrings als Elemente), bekommt man ein Array zurück, das aus einem einziges Leerstring besteht. Okay, dann bräuchte man nur noch das 0. Element zu prüfen. Mit einer universelleren Routine wäre man aber auch bei skalaren Werten oder tatsächlich empty-Werten auf der sichereren Seite.

Bernhard

Offline sja

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Weiblich
  • Ich liebe dieses Forum!
Re:Prüfen, ob Array leer ist
« Antwort #7 am: 26.05.04 - 18:43:57 »
Hallo Leute,

Ich habe den Vorschlag von Andreas ausprobiert (s. Script unten) und geprüft, wenn Array leer ist, 1. Element leer, 1. Element und 2. Element leer usw. und das alles funktioniert.

Dim ftarrayAn As Variant
Dim ftarrayKopie As Variant

...
...
   '***************************************************   
   End If

   ftarrayAn = Fulltrim(an)
   ftarrayKopie = Fulltrim(kopie)
      
   If Not ((ftarrayAn(1) = "") And (ftarrayKopie(1) = "")) Then
      Set MailDoc = New NotesDocument(db)
      MailDoc.Form = "Memo"
      MailDoc.Subject = Betreff
      MailDoc.SendTo = an
      MailDoc.CopyTo = kopie
      Set rtitem = New NotesRichTextItem( MailDoc , "Body" )   
      Call rtitem.AppendText( Text )
      Call rtitem.AddNewLine( 1 )
      Call rtitem.AppendDocLink( PymDoc, Projekt)
      MailDoc.Importance = Prior         
      MailDoc.Send(False)         
   End If
   
   Erase an
   Erase kopie   
End Function


Den Vorschlag von Bernhard mit einem ErrorHandler habe ich noch nicht ausprobiert, da diese Sache noch nicht beherrsche (Frischling), aber werde das mir auch merken.


Vielen Dank für eure Hilfe. Ich sage vom ganzen Herz: "Ich liebe dieses Forum".

Chao
Sofia




Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re:Prüfen, ob Array leer ist
« Antwort #8 am: 26.05.04 - 19:16:17 »
Zitat
Vielen Dank für eure Hilfe. Ich sage vom ganzen Herz: "Ich liebe dieses Forum".

Danke, Sofia. Und genau deswegen macht es uns soviel Spass, hier mitzuhelfen ;-)

Ich habe noch einen wichtigen Tip für Deinen aktuellen Code:
Der Wert 1 als Zeiger auf Dein(e) Array(s) kann durchaus in die Hose gehen, denn das erste Element eines Arrays hat ja den Index 0 (es sei denn, Du hast durch Option Base etwas anderes deklariert).
Du solltest daher unbedingt nach FullTrim auf (beispielsweise)
ftarrayAn (0) <> "")
abprüfen. Wenn nämlich gar kein Empfänger vorhanden ist, dann gibt FullTrim nur ein Array mit EINEM Element (eben Number Zero) zurück, und mit Deinem ftarray (1) würdest Du dann sofort einen run-time error erhalten.

HTH - und nochmals danke für Deine nette Replik,
Bernhard

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Prüfen, ob Array leer ist
« Antwort #9 am: 26.05.04 - 19:48:52 »
ich weiß nicht, ob ich das schonmal als Frage hier gepostet habe.
Jetzt poste ich es als Warnung.
Fulltrim funktioniert nicht zuverlässig. Zumindest im Web (ich weiß leider nicht mehr die Serverversion) hatte ich das Problem, dass die Funktion einfach nichts gemacht hat. Naja, vielleicht hat sie was gemacht, aber der Array, den ich reingesteckt hab, kam unverändert wieder raus, obwohl er leere Elemente enthielt. War ne super Sache damals.
« Letzte Änderung: 26.05.04 - 19:51:04 von Thomas Völk »
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Prüfen, ob Array leer ist
« Antwort #10 am: 26.05.04 - 19:53:38 »
Wenn nämlich gar kein Empfänger vorhanden ist, dann gibt FullTrim nur ein Array mit EINEM Element (eben Number Zero) zurück, und mit Deinem ftarray (1) würdest Du dann sofort einen run-time error erhalten.

Kommt drauf an.
Es gibt die Möglichkeit, die Basis von Arrays von 0 auf 1 zu stellen

Option Base = 1 (oder so ähnlich).

dann würde es laufen
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Glombi

  • Gast
Re:Prüfen, ob Array leer ist
« Antwort #11 am: 26.05.04 - 20:05:09 »
Das Problem mit Fulltrim ist inzwischen gefixt (falls es das von Thomas beschriebene ist):
Aus der KBASE:

LotusScript FullTrim Function Returns Unexpected Values

This document is based on the following :
About SPRs
SPR Number   SPR Status   SPR Fixed Release
RBEE5HZS9Z
RPOH5JGKXL      
Problem
The LotusScript FullTrim Function does not function as designed in certain releases.

Under Notes Domino 6.0 and 6.0.1

The FullTrim function returns a value of unexpected length in cases where applied to a fixed length string that has not been assigned a value.

For example, in the following code, LenA will be set to 20, rather than the expected 0:
Dim S As String * 20
Dim A As String
Dim LenA as Integer
A = Fulltrim(s)
LenA = len(A)

The FullTrim function returns a value that internally contains multiple null characters that can have undesired results.  It can cause unexpected termination of string formulas.

For example, for the following code:
Dim S As String * 20
Dim A As String
A = Fulltrim(s)
Print "Retuned value = '" + A + "'"
...the expected output would be:
Returned value ''

However, under Notes 6.0/6.0.1, the output actually is:
Returned value '

Under Notes 5.x:

When applying the LotusScript FullTrim function to the same variable multiple times, the subsequent calls add garbage characters.

For example, the following code:

 Dim S As String * 20
 Dim A As String
 Dim B As String
 Dim C As String
 S="test"
 A = Fulltrim(s)
 B = Fulltrim(s)
 C = Fulltrim(s)

...results in the following assignments:

 A = "test"
 B = "test &#64742;&#1225;"
 C = "test &#64782;&#1225;&#64822;&#1225;"




These issues have been reported to Lotus Quality Engineering.

The issues that appear with Notes 6.0 and 6.0.1 are resolved in Notes 6.0.1 CF1.

Excerpt from the Lotus Notes and Domino Release 6.0.1 CF1 fix list (available at http://www.notes.net):

LotusScript
SPR# RPOH5JGKXL - Fulltrim will now always trim at first null encountered.


For the issues that appear under Notes 5.x, there is the following workaround and a fix is being researched:

Call the function only once per variable and refer to the variable assigned to the value.  For instance, from the example above, you would use the variable A rather than making the additional calls setting the variables B and C.

Related Documents:

For additional issues that involve the FullTrim function, refer to the following documents:

Notes Domino 6.0/6.0.1:

Might Not Be Able to Attend Sametime Meetings in Environment Running Domino 6.0/6.0.1 and Sametime 3.x  (Document #1105532)

Notes Domino 5.x, 6.0, 6.01:

Domino 5.0.12 or 6.0.1 Server Crashes when Execute FullTrim and/or When Running Sametime 3.x  (Document #1105890)

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:Prüfen, ob Array leer ist
« Antwort #12 am: 26.05.04 - 20:10:05 »
In diesem Problem gehts scheinbar nur um einzelene Strings, die der Funktion übergeben werden, wenn ich das jetzt beim Überfliegen richtig gecheckt habe.
das war nicht mein Problem.
ich wollte, wie sja, leere Elemente aus nem Array schmeißen.
Ich habe den Thread von damals mittlerweile gefunden:
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline sja

  • Senior Mitglied
  • ****
  • Beiträge: 328
  • Geschlecht: Weiblich
  • Ich liebe dieses Forum!
Re:Prüfen, ob Array leer ist
« Antwort #13 am: 27.05.04 - 15:20:19 »
Hallo,

Bernhard, vielen Dank für wichtigen Tip: ftarray(0) (leider habe ich nicht verstanden, wie man hier ein Zitat einträgt), ich werde das unbedingt prüfen und Ergebnisse mitzuteilen.
Übrigens eine ErrorHandler werde ich benutzen in dem Fall, wenn es nur eine einzige Adresse gibt und zwar falsch geschrieben. In diesem Fall denke ich kommt bestimmt Fehlermeldung, dass die Adresse ist nicht in dem Adressbuch gefunden. Das habe ich noch nicht getestet. Ich habe nur getestet den Fall, wenn es einige Adressen gibt und eine davon falsch ist. In diesem Fall läuft alles ohne Fehlermeldung.

Thomas, für Web habe ich das nicht getestet, da Web bei mir nicht geplant ist, aber im Client, wie  gesagt, funktioniert es bei mir ohne Problem. Ich habe der Agent mit Fulltrim-Funktion lokal und auf dem Server getestet.
Client 6.0.2CF1 und 6.5.1
Server 6.0.2CF1
 

Noch mal herzlichen Dank für eure Hilfe. Ich weiss das zu schätzen, besonders, wenn in unserem grossen Unternehmen gib es kein Mensch, mit welchem ich über LotusNotes-Programmierung sprechen könnte.
Übrigens, da meine Muttersprache nicht Deutsch ist, klingen eventuell einige meine Ausdrücke komisch für euch, aber ich hoffe, dass ihr nicht zu streng zu mir werden.  :)

Grüssen
Sofia

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz