Domino 9 und frühere Versionen > ND6: Entwicklung

Frage zum AND-Operator

(1/2) > >>

el_erik:
Hallo,

ich habe da mal eine blöde Frage. Ich habe folgendes Konstrukt:

if (a_expr AND b_expr) Then
...
End If

a_expr liefert den Wert False. Trotzdem wird noch der Wert von b_expr ausgewertet.

Konkret sieht der Code wie folgt aus:


--- Code: ---If (doc.HasEmbedded) Then
   Dim item As NotesItem
   Dim attachmentnames As Variant

   Set item = doc.GetFirstItem ("Body")
   attachmentnames = Evaluate( |@Attachmentnames|, doc )

   If (Not item Is Nothing) Then
      If (item.Type = RICHTEXT) Then
         Dim rtitem As NotesRichTextItem

Set rtitem = doc.GetFirstItem ("Body")

          If (Isarray (rtitem.EmbeddedObjects)_
     And Ubound (attachmentnames) = Ubound (rtitem.EmbeddedObjects)) Then
              'exportiere Attachments ueber EmbeddedObjects...
         ElseIf
             'exportiere Attachments ueber doc.GetAttachment...
         End If
     End If
End If

--- Ende Code ---

Isarray (rtitem.EmbeddedObjects) liefert False
Ubound (attachmentnames)  liefert irgendeine Zahl
Ubound (rtitem.EmbeddedObjects) faellt auf die Nase (was ja auch richtig ist)

Ich habe mich nun darauf verlassen, dass die If-Bedingung in diesem Fall bereits nach dem der Auswertung des ersten Operanten abgebrochen wird. Zumindest ist es in anderen Sprachen so.
Muss ich nun wirklich die If-Bedingung in 2 If-Konstrukte aufsplitten oder sehe ich den Wald vor lauter Bäumen nicht  :(

Ich bin für jede Erleuchtung dankbar.

Bye Marco

klaussal:
Da "IsArray" ja entweder False oder True zurückliefern kann, du aber das Ergebnis nicht abfragst, kann das m.E. nicht funzen.

Es müsste wohl so (oder ähnlich) lauten: If( isArray = true and   yxz = 123)........

ghost:
Hallo Marco,

es ist in LS tatsächlich so, dass beim logischen Operatoren alle Ausdrücke ausgewertet werden. Deshalb muss die Prüfung auf zwei If-Bedingungen aufgeteilt werden. Das kann bei anderen Fällen, wo es nicht wie bei Dir zu einem Laufzeitfehler führt, dann aber zu Performanceverbesserungen beitragen.

Viele Grüße
ghost

DerAndre:
Hi Marco.

In anderen Ländern ißt man mit Stäbchen.  ;)

Es ist einfach so, das solche Auswertungen von Sprache zu Sprache anders gehandelt werden. In Pascal ist es auch so, das alle Bedingungen eine Auswertung erfahren, aber was ist daran so schlimm?

Das Ergebnis von If a und b

oder if a then
           if b then
           .
           .
          end
       end

sollte immer gleich aussehen. Beide haben zum Ergebnis, das was passiert wenn a und b True sind.

Gruss

André

Thomas Schulte:
Das Verhalten von Notes war übrigens an dieser Stelle ursprünglich genau so wie du es erwartet hast. Mit irgendeiner 5er Version ist das dann geändert worden, weil das jetzige Verhalten nämlich eigentlich das logisch richtige ist. Das hat damals einen ziemlichen Aufruhr verursacht weil etliche Anwendungen die sich genau darauf verlassen haben danach auf die Nase gefallen sind.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln