home *** CD-ROM | disk | FTP | other *** search
/ Amiga Times / AmigaTimes.iso / demos / programme / TurboCalc5d / Extras / Klug / WorkShops / WS_boolsche.txt < prev    next >
Encoding:
Text File  |  1998-10-06  |  31.8 KB  |  843 lines

  1.  
  2.                     TurboCalc WorkShop Nr. 2
  3.  
  4.        © 1997 by Günther Klug Frh. v. Biedermann, München
  5.  
  6.                      Makro-Programmierung_1
  7.  
  8.  
  9. Dies ist der erste aus einer ganzen  Reihe  von  (geplanten)  Work-Shops
  10. zum Thema Makro-Programmierung.  Die fast  unendliche  Anzahl  möglicher
  11. Makro-Sequenzen ist in nur EINEM  Work-Shop  nicht  zu  bewerkstelligen;
  12. dazu bedürfte es eines dicken Buches. Da - infolge der (z.Zt.)  prekären
  13. Lage des Amiga und der  (immer schon) fehlenden Risiko-Bereitschaft  der
  14. Amiga-Presse bzw. der zugehörigen Verlage - ein solches  Buch  wohl  nie
  15. erscheinen würde und die Verlage auch lieber  Work-Shops  (der  seichten
  16. Art) selbst zusammenbasteln, als entsprechende Angebote von Leuten,  die
  17. was davon verstehen, zu berücksichtigen, habe ich mich zu dieser Art der
  18. Veröffentlichung entschlossen.
  19.  
  20. Falls auf diesen Work-Shop keine mich motivierende Resonanz  (neudeutsch
  21. "Feedback") erfolgt, wird dies allerdings der Letzte sein, denn ich habe
  22. keine Lust, mir für einen elitären Kreis von 5-6 Leuten diese doch recht
  23. anstrengende Arbeit zu machen. Das mußte mal gesagt werden dürfen,  gel!
  24.  
  25. Bei dieser Gelegenheit möchte ich auch gleich anmerken,  daß  Work-Shops
  26. zum Thema Export von Text und Graphik an andere  Programme  (PostScript,
  27. DTP- und Grapik-Programme und andere  Betriebs-Systeme  MS-DOS,  WINDOWS
  28. MAC) von mir NICHT beabsichtigt sind, weil ich mich sonst auch noch  mit
  29. den Eigenheiten und Fehlern dieser  Programme  auseinandersetzen  müßte!
  30.  
  31.  
  32. Sie werden hier keine fertigen Anwendungen finden, sondern Makro-Module,
  33. welche bei bestimmten Anwendungen immer wieder gebraucht werden. Es  mag
  34. Ihnen vorkommen, als wäre die Auswahl und  Reihenfolge  der  behandelten
  35. Module rein willkürlich - aber dem ist NICHT so! Vielmehr treffe ich die
  36. Auswahl entsprechend eigener  Erfahrung  bezgl.  Schwierigkeit  und/oder
  37. Wichtigkeit für den fehlerfreien Ablauf von Makros.
  38.  
  39.  
  40.  
  41.        Dieses Mal geht es um die Überprüfung von User-Eingaben unter
  42.        Verwendung der Funktionen UND (AND), ODER (OR) und XOR.
  43.  
  44.  
  45. Sie werden in vielen ihrer Applikationen den End-Anwender (der natürlich
  46. auch Sie sein können) auffordern müssen, einen Input (also eine Eingabe)
  47. zu machen. Dieser Work-Shop befaßt sich mit den diversen  Möglichkeiten,
  48. solche Eingaben zu überprüfen und notfalls zu korrigieren.
  49.  
  50.  
  51. SYNTAX DES INPUT-BEFEHLs
  52.  
  53.   INPUT(["Text";"Titel";Zelle])
  54.  
  55.  wobei die Definition von <Text> zwar optional, aber zur Vermeidung  von
  56.  Fehleingaben aufs DRINGENDSTE zu empfehlen ist. Der User  soll  wissen,
  57.  WAS von ihm verlangt wird. Zwar wird -  falls  SIE  keinen  erklärenden
  58.  Text definieren - folgender Default-Text gezeigt...
  59.  
  60.   "Bitte Text (für Zellinhalt) eingeben:"
  61.  
  62.  ...aber der ist notgedrungen ziemlich nichtssagend.
  63.  
  64.  <Titel> ist die ebenfalls optionale Überschrift, welche im Requester zu
  65.  sehen sein soll.
  66.  
  67.  <Zelle> ist ebenfalls optional und definiert diejenige Zelle, in welche
  68.  der Input zu tätigen ist. Es zwingt Sie also Niemand, hier  eine  Zelle
  69.  zu definieren. Sie sollten aber sicher machen, daß die Eingabe  in  die
  70.  richtigen Zelle gemacht wird, denn OHNE Definition einer Zelle wird die
  71.  Eingabe in die momentan aktuelle Zelle getätigt.
  72.  
  73.  Dieses "sicher machen" geschieht alternativ...
  74.  
  75.   - weil Sie wissen,  daß im Ablauf der  Makro-Sequenz die Ziel-Zelle
  76.     zum Zeitpunkt, da der Input  angefordert wird, schon die aktuelle
  77.     Zelle ist (Probleme tauchen aber möglicherweise dann auf,wenn Sie
  78.     das Makro ändern und vergessen, daß die dann aktive Zelle evtuell
  79.     die Falsche ist!).
  80.  
  81.   - durch  vorheriges  Anspringen  der Zelle  mittels GEHEZU (SELECT)
  82.  
  83.       Es gibt natürlich Fälle, in welchen die Zelle, in die ein Input
  84.       zu tätigen ist, beim  Start des  Makros noch nicht bekannt ist.
  85.       Dann  müssen Sie andere  "Werkzeuge"  verwenden, um diese Zelle
  86.       zu ermitteln:
  87.  
  88.   - durch Cursor-Bewegung mittels NACHRECHTS (CURSORRIGHT), NACHLINKS
  89.     (CURSORLEFT),  NACHUNTEN  (CURSORDOWN) und  NACHOBEN  (CURSORUP).
  90.  
  91.   - mittels der  Makro-Befehle SPALTE (COLUMN)  und ZEILE (LINE) bzw.
  92.     INSPALTE (GOTOCOLUMN und INZEILE (GOTOLINE)
  93.  
  94.   - durch vorheriges Anspringen der Zelle mittels AUSWÄHLEN(ZELLEABS)
  95.     (SELECT(CELLABS)).
  96.  
  97.  Wie daraus folgt, ist der einfachste Weg (falls die  Zell-Adresse  beim
  98.  Ablauf des Makros IMMER dieselbe ist) die Definition dieses Parameters.
  99.  
  100.  Eine Eigenheit von EINGABE (INPUT) sollten Sie auch kennen: Der  Input-
  101.  Requester hat ZWEI Gadgets, die in der Default-Einstellung  (also  wenn
  102.  Sie die Option, mittels REQPARA Position und Inhalt der Gadgets  selbst
  103.  zu bestimmen, NICHT wahrnehmen), links "OK" u. rechts "Abbruch" zeigen.
  104.  Unabhängig davon wird bei Klick auf das linke Gadget (oder RETURN)  der
  105.  Inhalt von <Zelle> überschrieben - auch  wenn  garkein  Input  erfolgte
  106.  UND der Inhalt wird (trotzdem nix drin ist) "textlich" sein! Bei  Klick
  107.  auf das rechte Gadget wird - egal, was Sie (in REQPARA) auch  definiert
  108.  haben - den eventuellen vorhandenen Inhalt von <Zelle> NICHT verändern.
  109.  Diese Eigenheit zu kennen ist wichtig bei der Abfrage auf den  Typ  des
  110.  getätigten Inputs!
  111.  
  112. Soweit also die Handbuch-Lehrstunde.
  113.  
  114. Eingaben sollten IMMER auf Stimmigkeit überprüft werden. Es  gibt  dafür
  115. grundsätzlich 2 Haupt-Kriterien:
  116.  
  117.  
  118. PLAUSIBILITÄT und/oder EXAKTHEIT
  119.  
  120.   In interaktiven Anwendungen ist INPUT einer der Knackpunkte und Quelle
  121.   von Irritationen, auf die Sie durch clevere Programmierung von  Makros
  122.   prüfend - und notfalls regulierend - einwirken müssen, um  den  Erfolg
  123.   einer Anwendung nicht zu gefährden.
  124.  
  125.   Die vom Anwender geforderte Eingabe muß in aller Regel ganz bestimmten
  126.   Kriterien entsprechen, weil davon abhängt, OB - und wenn ja, WIE - das
  127.   Makro fortgesetzt wird, bzw. ob das End-Ergebnis stimmt.
  128.  
  129.   Ob und unter welchen Umständen ein Makro fortzusetzen ist, entscheiden
  130.   in erster Linie SIE - der Programmierer der Applikation. Sie müssen es
  131.   wissen, ob eine Fehleingabe...
  132.  
  133.   - im Interesse des  Gesamt-Erfolges zwingend zum Abbruch führen muß
  134.  
  135.   - unter bestimmten  Umständen  vernachlässigbar oder  tolerabel ist
  136.  
  137.   - eine Anfrage an den Anwender (ob die  eventuell scheinbar falsche
  138.     Eingabe übernommen werden soll) nötig macht
  139.  
  140.   - nach einer  vordefinierten Anzahl Fehlversuchen zum Abbruch führt
  141.  
  142.   - in eigener Entscheidung  (vom Makro)  korrigiert werden kann/soll
  143.  
  144.   - dem ANWENDER  (nach Benachrichtigung)  wahlseise Fortsetzung oder
  145.     Abbruch ermöglichen soll
  146.  
  147.  Das (und mehr) ist alles machbar, wenn man nur weiß, WIE!
  148.  
  149.  
  150.   Geforderte Eingaben und darauf  angewandte Kriterien können also sein:
  151.  
  152.   - wurde überhaupt eine Eingabe  (oder nur Return/Abbruch) getätigt?
  153.  
  154.   - ist die  Eingabe numerisch  (mit oder ohne Bereichs-Beschränkung)
  155.  
  156.   - ist die Eingabe  alphanumerisch  (mit/ohne Bereichs-Beschränkung)
  157.     Beispiel  hierfür wäre eine  Artikelnummer,  welche als Vor- oder
  158.     Nach-Spann Alphazeichen enthält.
  159.  
  160.   - ist die Eingabe reiner Alphatext (mit/ohne Bereichs-Beschränkung)
  161.  
  162.   - ist die Eingabe  ein Datum  (mit/ohne Bereichs-Beschränkung). Der
  163.     Amiga  und  TurboCalc haben keine  Schwierigkeiten Daten nach dem
  164.     Jahre 1999 richtig  zu erkennen und zu handhaben (im Gegensatz zu
  165.     Dosen beispielsweise - dies nur nebenbei)!
  166.  
  167.   - besteht die Eingabe aus zu vielen oder zu wenigen Zeichen/Ziffern
  168.  
  169.  Das Format der Eingabe zu bestimmen ist NICHT Sache des Anwenders, weil
  170.  der es in den wenigsten Fällen spontan beurteilen kann; SIE  müssen  es
  171.  in der Makro-Sequenz gefälligst selbst tun!
  172.  
  173.  User-Eingaben sind zu überprüfen, weil - zumindest  in  professionellen
  174.  Anwendungen - vermeidbare Fehler UNBEDINGT vermieden werden müssen  und
  175.  unerkannte Fehler katastrophale Folgen haben können!
  176.  
  177.  Müssen Eingaben eigentlich immer und unbedingt überprüft werden?
  178.  
  179.   Eingaben durch  Listenauswahl mit  AUSWÄHLENZEIGEN  (SELECTTOFRONT)
  180.   oder Auswahl durch Klick auf Gadgets oder auch die Wahlmöglichkeit,
  181.   welche mittels REQPARA mit  "JA" oder "NEIN" geboten wird, bedürfen
  182.   wohl keiner Überprüfung; Sie  (der Makro-Programmierer) haben es in
  183.   der Hand, dem  Anwender  keine  falschen Auswahlen anzubieten! Sehr
  184.   wohl überprüft  werden muß jedoch, ob der Anwender  ÜBERHAUPT  eine
  185.   Auswahl getroffen hat!
  186.  
  187.   Eine Prüfung der Eingabe muß nicht  zwingend erfolgen, wenn sie von
  188.   nachfolgenden Aktivitäten - beispielsweise bei Weiterverwendung als
  189.   Kriterium  innerhalb von  Datenbank-Anwendungen - einer Überprüfung
  190.   standhalten muß, denn...
  191.  
  192.   ...wird die Eingabe durch ein SUCHEN mittels Kriterien verifiziert,
  193.   dann war sie wohl OK - wenn NICHT (also kein zutreffender Datensatz
  194.   gefunden),  muß eine neue Eingabe  angefordert, oder zumindest eine
  195.   Abbruch-Option ermöglicht werden.
  196.  
  197.   Bei all dem sollten Sie aber im Hinterkopf behalten, daß selbst der
  198.   kleinste  Arbeits-Schritt Zeit braucht und durch  ANFRAGE (REQUEST)
  199.   bzw. MELDUNG (MESSAGE)  erzwungene Unterbrechungen am Gesamt-Ablauf
  200.   einer Makro-Sequenz oft 95-99.9% ausmachen! Die Ideal-Makro-Sequenz
  201.   wäre also eine, welche KEINERLEI Unterbrechung benötigt - aber wann
  202.   erreicht man je das Ideal!?
  203.  
  204.   Bezogen auf INPUT muß man also abwägen, ob die Vorprüfung des Input
  205.   Zeit einspart, OBWOHL durch  SUCHEN im Datenbank-Teil der Input ein
  206.   zweites Mal "geprüft" wird. Die Antwort darauf wird in der Regel JA
  207.   sein, weil die Vorprüfung in  Prozessorgeschwindigkeit  erfolgt und
  208.   bei richtiger Eingabe die Chance, daß auch der Datenbank-Teil keine
  209.   Fehler meldet, enorm verbessert wird.
  210.  
  211.  
  212.  
  213.  Plausibilitätsprüfung
  214.  ---------------------
  215.  
  216.   Wenn Sie den Anwender bitten, einen Namen  einzugeben,  bleiben  Ihnen
  217.   nur wenige Möglichkeiten der Überprüfung. Allerdings können  Sie  wohl
  218.   ausschließen, daß eine numerische oder alphanumerische Eingabe korrekt
  219.   ist und auch ein Name mit weniger als 3 Buchstaben dürfte wohl zu  den
  220.   Fehler-Aspiranten zählen (außer im Science  Fiction  Bereich).  Solche
  221.   Eingaben können Sie stillschweigend akzeptieren, oder mitttels ANFRAGE
  222.   auftretende Zweifel ausräumen.
  223.  
  224.   Hellhörig sollte Ihre Applikation aber zumindest dann werden, wenn der
  225.   Anwender ein  Geburtsdatum eingibt,  welches ein Alter von 123  Jahren
  226.   bescheinigt (außer bei historischen Persönlichkeiten oder  sündteueren
  227.   Weinen und Cognacs).
  228.  
  229.   Dasselbe gilt, wenn das eingegebene Gesamt-Gewicht der  Zutaten  einer
  230.   Rezeptur (Bäckerei-Anwendung) das  Fassungsvermögen  der  Knetmaschine
  231.   übersteigt, oder das Verhältnis Wasser/Mehl in einer Brot-Rezeptur als
  232.   Endprodukt eine Mehlsuppe ergeben würde.
  233.  
  234.   Dies sind nur 3 Beispiele aus einer Legion denkbarer Kriterien!
  235.  
  236.  
  237.  Exaktheitsprüfung
  238.  -----------------
  239.  
  240.   Hier ist - entsprechend der Anwendung - die Erwartung der Maßstab. Die
  241.   Eingabe muß also entweder GENAU einem Vergleich  standhalten  und/oder
  242.   einem ganz bestimmten Format (z.B. Datum) entsprechen  oder  zumindest
  243.   innerhalb eines umrissenen Bereiches sein, um vom Makro akzeptiert  zu
  244.   werden; dies betrifft in der Regel NUMERISCHE Eingaben.
  245.  
  246.  
  247. WELCHE MÖGLICHKEITEN DER ÜBERPRÜFUNG GIBT ES?
  248.  
  249.   Jedenfalls mehr, als Sie glauben - wetten?
  250.  
  251.   Direkte Prüfung:
  252.  
  253.   - ist die Zelle, in welche die Eingabe gemacht wurde, leer,
  254.     Fließkomma-Zahl, Ganzzahl, Datum, Zeit, Boolean, Text
  255.  
  256.  
  257.  Beispiel_1 (siehe dazu Tabelle "WS_Makros_1.TCD"):
  258.  
  259.  Eine imaginäre Kunden-Datenbank soll erweitert werden.  Irgendwann  muß
  260.  der Anwender also einen Namen eingeben. WO  dies  geschieht,  bestimmen
  261.  SIE - der Programmierer der  Anwendung  durch  geschickte  Nutzung  der
  262.  dafür geeigneten Makros und Funktionen (dafür ist demnächst ein eigener
  263.  Work-Shop vorgesehen). Hier ist es immer die Zelle A5 .
  264.  
  265.  Gleich zu Beginn eines Makros sollten Sie dem Anwender die  Möglichkeit
  266.  einräumen, das Makro abzubrechen - er hat vielleicht das falsche  Makro
  267.  aufgerufen! Tun Sie es NICHT, kann der Anwender in eine Lage kommen, wo
  268.  er sich nicht  mehr zu  helfen weiß! Das  Makro beginnt in Zelle B1 und
  269.  hat den Namen:
  270.  
  271. =MACRO("DB_modify1") ;der definierte Name des Makro
  272. =ANFRAGE("Datenbank modifizieren?¶ Wenn NEIN, klicken Sie auf Abbruch!")
  273. =IFGOTO(B2;B5)       ;wenn OK, geht das Makro bei B5 weiter
  274. =GOTO(B28)           ;wenn Abbruch endet das Makro bei B28
  275. =SELECT(A5)          ;der Zell-Cusor springt in Zelle A5
  276. =INPUT("Bitte den Namen eingeben.";"Datenbank modifizieren")
  277.  
  278.  Was ist bisher passiert?
  279.  
  280.  1. Das Makro "DB_modify1" wurde gestartet
  281.  
  282.  2. Der Anwender kann weitermachen (Klick auf OK) oder abbrechen  (Klick
  283.     auf Abbruch)
  284.  
  285.  3. Wenn OK, weiter in B5
  286.  
  287.  3. Wenn Abbruch fährt das Makro in B28 fort, wo dem Anwender mitgeteilt
  288.     wird, daß ER das Makro abgebrochen hat und das Makro  endet  in  B29
  289.  
  290.  4. Da der Anwender nicht weiß, wohin ein  neuer  Datensatz  geschrieben
  291.     werden soll und auch nicht, wohin in diesem Datensatz der  Name  des
  292.     Kunden gehört, übernimmt das Makro die Suche nach dem richtigen Ort.
  293.     In diesem Beispiel ist es die Zelle A5.
  294.  
  295.  5. Nun wird der Anwender im erscheinenden Requester höflich zur Eingabe
  296.     des Namens aufgefordert. Der Text "Datenbank modifizieren" erscheint
  297.     in der Titelzeile des Requesters. Der 3. Parameter, der  die  Zelle,
  298.     in die der Input erfolgen soll bezeichnet, ist  hier  unnötig,  weil
  299.     der Cursor bereits in der aktiven Zelle ist!
  300.  
  301.       ACHTUNG!
  302.       Einer der vielen Vorzüge von TurboCalc ist der, daß bei Erscheinen
  303.       eines Requesters NICHT alle anderen Aktivitäten gesperrt sind! Sie
  304.       könn(t)en also dennoch z.B ein anderes auf dem Screen befindliches
  305.       Blatt oder eine AmigaGuide-Hilfe Datei in den  Vordergrund  holen,
  306.       um was nachzulesen oder  das  Display  beliebig  verschieben  usw.
  307.       ABER - wie das mit der Freiheit so ist - es bestehen durchaus auch
  308.       Gefahren: Hüten Sie sich SEHR durch Herumgeklicke die Position des
  309.       Cursors (also die aktive Zell-Adresse) zu  verändern!  Die  Folgen
  310.       wären unvorhersehbar - na, eigentlich schon; es gäbe eine versaute
  311.       Tabelle!
  312.  
  313.     Wie weiter oben beschrieben, haben Sie  nicht  viele  Möglichkeiten,
  314.     eine Namen-Eingabe zu überprüfen; also prüfen wir...
  315.  
  316.       a) wurde überhaupt was eingegeben
  317.       b) wurde "Text" eingegeben
  318.       c) ist der Text wenigstens 3 Zeichen lang
  319.  
  320.  Jetzt wirds interessant: Der Anfänger wird in  "konventioneller"  Weise
  321.  die DREI Prüfungen (und zu Jeder die eventuelle Rückfrage beim Anwender
  322.  mit Neu-Eingabe und erneuter Prüfung und Rückfrage usw.) durchziehen...
  323.  
  324.  ...und hat damit die Möglichkeit, dem Anwender zu sagen, WELCHEN Fehler
  325.  er bei der Eingabe gemacht hat! Ist das beabsichtigt,  dann  käme  aber
  326.  noch eine genauere andere Methode in Frage!
  327.  
  328.  Ziel dieses WS ist es, Ihnen die für die Anwendung OPTIMALE Lösung  von
  329.  Problemen, NICHT unbedingt die  SCHNELLSTE  nahezubringen.  Welche  für
  330.  Ihre Anwendung die optimale ist, müssen Sie  aber  selbst  entscheiden.
  331.  
  332.  Zunächst fahren wir fort mit der "konventionellen" Variante:
  333.  
  334. =IFGOTO(NOT(ISTLEER(CELL(0;0)));B13)
  335. =REQPARA(;;"Nochmal";"Abbruch")
  336. =ANFRAGE("Sie haben nix eingegeben!¶Nochmal oder Abbruch?")
  337. =IFGOTO(NOT(B9);B27)
  338. =CLEAR(0)
  339. =GOTO(B6)
  340. =IFGOTO(ISTTEXT(CELL(0;0));B19)
  341. =REQPARA(;;"nochmal";"Abbruch")
  342. =ANFRAGE("Sie haben keinen Text eingegeben...")
  343. =IFGOTO(NOT(B15);B27)
  344. =CLEAR(0)
  345. =GOTO(B7)
  346. =IFGOTO(LÄNGE(CELL(0;0)>=3);B25)
  347. =REQPARA(;;"nochmal";"Abbruch")
  348. =ANFRAGE("Sie haben weniger als 3 Zeichen eingegeben...")
  349. =IFGOTO(NOT(B21);B27)
  350. =CLEAR(0)
  351. =GOTO(B6)
  352. =MESSAGE("Ihre Eingabe war OK")
  353. =GOTO(B29)
  354. =CLEAR(0)
  355. =MESSAGE("Das Makro wurde vom Anwender abgebrochen!")
  356. =RETURN
  357.  
  358.  Was ist da passiert?
  359.  
  360.  6. War die Zelle NICHT leer (der Anwender  hat  irgendwas  eingegeben),
  361.     gehts bei B13 weiter
  362.  
  363.  7. Andernfalls wird dem Anwender unter die Nase gehalten, daß er  keine
  364.     Eingabe gemacht hat und er kann wählen, ob er es  nochmal  versuchen
  365.     oder abbrechen will.
  366.  
  367.  8. Wählt er "nochmal" wird zuerst seine falsche  Eingabe  gelöscht  und
  368.     dann gehts zurück zu B6 (INPUT); da die aktive Zelle immer  noch  A5
  369.     ist, braucht nicht nach B5 zu "=SELECT(A5)"  gesprungen  zu  werden!
  370.  
  371.     Wählt er Abbruch, gehts weiter bei B27, wo ein eventueller Inhalt in
  372.     Zelle A5 gelöscht wird und ihm dann (in B28) mitgeteilt wird, daß ER
  373.     das Makro abgebrochen hat. Das Makro endet in B29 mit "=RETURN".
  374.  
  375.  9. War A5 NICHT leer, geht es in B13 weiter mit  der  Prüfung,  ob  die
  376.     Eingabe TEXT war - usw. usw.,  bis  alle  3  Prüfungen  durch  sind.
  377.  
  378.  
  379.  Nun die schnelle Variante:
  380.  
  381.    Weil nicht nur eingesparte Unterbrechungen durch  unnötige  Anfragen,
  382.    sondern auch eingesparte Makro-Befehle  den  Makro-Ablauf  verkürzen,
  383.    sollten Rechenschritte möglichst  zusammengefaßt  werden.  Dazu  sind
  384.    die boolschen Funktionen UND (AND), ODER (OR) und XOR  gut  geeignet.
  385.  
  386.  Überlegen wir:
  387.  
  388.    ZWEI Kriterien müssen erfüllt werden, damit wir (ausreichend)  sicher
  389.    sein können, daß die Eingabe korrekt war:
  390.       Sie muß vom Typ Text sein
  391.       und der muß mehr als 3 Zeichen enthalten
  392.  
  393.  
  394.  
  395. SYNTAX DER Funktion UND (AND):
  396.  
  397.   UND(Wert1;Wert2;Wert3;...)
  398.  
  399.  wobei die mindestens ZWEI Parameter <Wert> Zahlen  oder  Wahrheitswerte
  400.  (bzw. Aussagen, welche mit WAHR oder FALSCH beantwortet werden  können)
  401.  sein müssen.
  402.  
  403.  Der Rückgabe-Wert der Funktion ist WAHR, wenn  ALLE  Werte  (Parameter)
  404.  WAHR sind und FALSCH, wenn auch nur ein Wert FALSCH ist.
  405.  
  406.  Dies wären also die 2 hier zu machenden Aussagen (Behauptungen):
  407.  
  408.    =ISTTEXT(CELL(0;0))
  409.    =LÄNGE(CELL(0;0))>=3
  410.  
  411.  Die erste "behauptet", daß die Zelle textlich ist. Wenn dies  zutrifft,
  412.  wird WAHR zurückgegeben, andernfalls FALSCH
  413.  
  414.  und die andere, daß die Länge des Inhaltes >=3 ist. Wenn  es  zutrifft,
  415.  wird WAHR zurückgegeben, andernfalls FALSCH
  416.  
  417.  Fassen wir diese 2 Aussagen  mittels UND  zu  EINER  Aussage  zusammen,
  418.  nämlich daß BEIDE Aussagen WAHR ergeben, dann sieht das so aus:
  419.  
  420.    =AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3)
  421.  
  422.  Nun wird WAHR zurückgegeben, wenn  BEIDE  WAHR  sind  und  FALSCH  wenn
  423.  unsere Behauptung (daß BEIDE WAHR sind)  NICHT  zutrifft,  sondern  nur
  424.  eine WAHR ist oder beide FALSCH sind.
  425.  
  426. Soweit also die Handbuch-Lehrstunde zu AND.
  427.  
  428.  Alles, was wir nun noch zu tun haben ist, mittels SPRINGEWENN  (IFGOTO)
  429.  zu bestimmen, WO das Makro für den einen und anderen  Fall  fortgeführt
  430.  werden soll.
  431.  
  432.  
  433. SYNTAX DES Befehls SPRINGEWENN (IFGOTO) :
  434.  
  435.  IFGOTO(Bedingung;Zelle)
  436.  
  437.  Wenn <Bedingung> WAHR zurückgibt, wird zu <Zelle> gesprungen, ansonsten
  438.  wird in der nächsten Zeile fortgefahren.
  439.  
  440.  Dies gibt uns eine zusätzliche Steuerungsmöglichkeit an die Hand, indem
  441.  wir durch geschickte Formulierung von  <Bedingung>  auch  dafür  sorgen
  442.  können, daß die Bedingung FALSCH als Erwartungs-Wert zurückgibt -  dazu
  443.  später mehr.
  444.  
  445.  Es ist also ganz leicht: Man schreibe in die betreffende Zelle
  446.  
  447.    =IFGOTO(Bedingung;B47)
  448.  
  449.  und ersetze "Bedingung" durch die oben erarbeitete Zeile
  450.  
  451.    =AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3)
  452.  
  453.  jedoch ohne das "=" - was ergibt...
  454.  
  455.    =IFGOTO(AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3);B47)
  456.  
  457.  Hier (siehe Makro "DB_modify2") wird zunächst  darauf  verzichtet,  dem
  458.  Eingeber den genauen Fehler zu nennen, sondern ihm lapidar  mitgeteilt,
  459.  daß "etwas" falsch war.
  460.  
  461.  
  462. =MACRO("DB_modify2")
  463. =ANFRAGE("Datenbank modifizieren?¶ Wenn NEIN, klicken Sie auf Abbruch!")
  464. =IFGOTO(B36;B39)
  465. =GOTO(B50)
  466. =SELECT($A$5)
  467. =INPUT("Bitte den Namen eingeben.";"Datenbank modifizieren")
  468. =IFGOTO(AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3);B47)
  469. =REQPARA(;;"nochmal";"Abbruch")
  470. =ANFRAGE("Eingabe war nicht OK")
  471. =IFGOTO(NOT(B43);B49)
  472. =CLEAR(0)
  473. =GOTO(B40)
  474. =MESSAGE("Ihre Eingabe war OK")
  475. =GOTO(B51)
  476. =CLEAR(0)
  477. =MESSAGE("Das Makro wurde vom Anwender abgebrochen!")
  478. =RETURN
  479.  
  480.  Wie Sie unschwer sehen, ist das Makro statt 29 (beim Makro  DB_modify1)
  481.  nur 17 Zeilen lang und es enthält nur EINE einzige Prüfung.
  482.  
  483.  Auffallend ist hier aber ein "Manko", welches in der "langen"  Variante
  484.  nicht zu beklagen war:
  485.  
  486.  Es wird dem Anwender nicht mitgeteilt, WAS er  (evtl.)  falsch  machte!
  487.  
  488.  Nun, dem kann gesteuert werden. Wir ZEIGEN ihm seinen Input und so kann
  489.  er selbst sehen, was nicht stimmte!
  490.  
  491.  Diverse Befehle ermöglichen es, dem Anwender im erscheinenden Requester
  492.  einen Zell-Inhalt als Text zu zeigen; dazu gehören ANFRAGE und MELDUNG.
  493.  
  494.  Weil aber MELDUNG (MESSAGE) hier fehl am Platz wäre, weil es in  seinem
  495.  Requester keine Wahlmöglichkeit bietet, bleiben  wir  bei  ANFRAGE  und
  496.  tauschen den Befehl in Zelle B43 durch diesen aus:
  497.  
  498.    =ANFRAGE("Ihre Eingabe: "+TEXT(CELL(0;0))+" war nicht OK")
  499.  
  500.  das ergibt - falls z.B. "123" eingegeben wurde - im Requester den  Text
  501.  
  502.       Ihre Eingabe: 123 war nicht OK
  503.  
  504.  Weil wir aber dem Anwender das recht deutlich machen wollen,  verwenden
  505.  wir ein paar Tricks, um das zu bewerkstelligen:
  506.  
  507.  Mit "¶" (was mit ALT-P zu erzeugen ist) kann man  einen  Zeilenvorschub
  508.  erzwingen und ergänzt durch ein paar Leerzeichen sieht der Befehl  dann
  509.  so aus:
  510.  
  511.    =ANFRAGE("Ihre Eingabe:¶  --> "+TEXT(CELL(0;0))+"¶war nicht OK")
  512.  
  513.  Nun sieht der Anwender überdeutlich, was er angerichtet hat:
  514.  
  515.       Ihre Eingabe:
  516.         --> 123
  517.       war nicht OK
  518.  
  519.  
  520.  Weiter oben war die Rede von einer "zusätzlichen Steuerungsmöglichkeit"
  521.  durch geschickte Formulierung von  <Bedingung>  bei  IFGOTO.  Nun,  die
  522.  ganze "Geschicklichkeit" besteht in der Umkehrung der Bedingung  -  wir
  523.  setzen einfach ein "NOT" an den Anfang der Bedingung -  was  bei  einer
  524.  (erwarteten) richtigen Eingabe den Retourn-Wert FALSCH erzwingt  -  und
  525.  ändern den Bezug (hier "B47" in "B69") und  damit  natürlich  auch  die
  526.  Folgen für den Fall, daß die Eingabe NICHT richtig war.
  527.  
  528.  Wozu diesen Umstand?? Hat doch so auch ganz gut geklappt!?
  529.  
  530.  Stellen Sie sich vor, Sie hätten MEHRERE Datenbanken und bei allen  muß
  531.  eine (ähnliche) Abfrage gemacht werden; dann können Sie  beispielsweise
  532.  bei allen Datenbanken mittels ROUTINE (CALL)...
  533.  
  534.   - die Abfragen  auslagern und im Makro nur das  Sub-Makro aufrufen,
  535.     das die Abfragen abarbeitet und/oder
  536.  
  537.   - wie im  nachfolgenden  Beispiel (Makro "DB_modify3") dem Anwender
  538.     eine bestimmte Anzahl von  Fehleingaben zugestehen und ggfls. das
  539.     Makro zwangsweise beenden.
  540.  
  541.  ...und sparen sich u.a. EINIGES an Programmier-Arbeit!
  542.  
  543.  Dazu müssen allerdings ein paar Dinge umgestellt  und/oder  modifiziert
  544.  und ein paar neu programmiert werden:
  545.  
  546.  
  547. =MACRO("DB_modify3")
  548. =PUT(0;B87)
  549. =REQUEST("Datenbank modifizieren?¶ Wenn NEIN, klicken Sie auf Abbruch!")
  550. =IFGOTO(B62;B65)
  551. =GOTO(B75)
  552. =SELECT($A$5)
  553. =INPUT("Bitte den Namen eingeben.";"Datenbank modifizieren")
  554. =IFGOTO(NOT(AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3));B69)
  555. =GOTO(B73)
  556. =CALL(B89)
  557. =IFGOTO(NOT(B87=2);B66)
  558. =LÖSCHEN(3)
  559. =GOTO(B77)
  560. =MESSAGE("Ihre Eingabe war OK")
  561. =GOTO(B77)
  562. =CLEAR(3)
  563. =MESSAGE("Das Makro wurde vom Anwender abgebrochen!")
  564. =RETURN
  565.  
  566.  
  567.  Zusätzlich wird ein "Fehlerzählwerk" in B87 installiert und ein  (nicht
  568.  mit Namen definiertes) Sub-Makro "Fehlerbehandlung" ab  Zelle  B89  neu
  569.  erstellt.
  570.  
  571.  
  572. Fehlerzählwerk
  573.       0
  574.  
  575.  Sub-Makro
  576. Fehlerbehandlung
  577. =PUT(B87+1;B87)
  578. =IFGOTO(B87>1;B97)
  579. =REQPARA(;;"nochmal";"Abbruch")
  580. =ANFRAGE("   Ihre Eingabe war nicht OK¶EINE Chance haben Sie noch!")
  581. =IFGOTO(B93;B100)
  582. =PUT(2;B87)
  583. =GOTO(B99)
  584. =MELDUNG("Sie haben 2 Mal falsch eingegeben!¶  Makro wird abgebrochen!")
  585. =GOTO(B100)
  586. =MESSAGE("Das Makro wurde vom Anwender abgebrochen!")
  587. =RETURN
  588.  
  589.  
  590.  Was ist hier anders?
  591.  
  592.  1. Wird das Fehlerzählwerk in B87 auf 0 gestellt.
  593.  
  594.  2. Durch das vorangestellte "NOT" wurde erreicht, daß  im  Falle  einer
  595.     Falscheingabe nicht in der NÄCHSTEN Zeile fortgefahren wird, sondern
  596.     in Zelle B69, wo mit CALL zum Sub-Makro verzweigt wird (welches  die
  597.     Fehlerbehandlung durchzieht).
  598.  
  599.     =IFGOTO(NOT(AND(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3));B69)
  600.  
  601.     Da IFGOTO nur eine Zell-Adresse als Ziel erlaubt  (also  den  Befehl
  602.     CALL beispielsweise nicht), kann CALL nur über diesen kleinen  Umweg
  603.     (hier B69) aufgerufen werden.
  604.  
  605.  3. Wenn die Eingabe OK war, gehts NUN also in der NÄCHSTEN Zeile  (B68)
  606.     und dem dort stehenden Befehl "GOTO(B73)" weiter,  wo  dem  Anwender
  607.     bestätigt wird, daß er ein braves Kind war - und  das  Makro  endet.
  608.  
  609.  4. Bei einer Falscheingabe wird NUN also zu B69 gesprungen, wo mit  dem
  610.     Befehl "=CALL(B89)" zum Sub-Makro "Fehlerbehandlung" verzweigt wird.
  611.  
  612.     Hier wird
  613.     - zunächst das Fehlerzählwerk um 1 erhöht
  614.  
  615.     - geprüft ob das  Fehlerzählwerk nun  >1  ist und in diesem Falle
  616.       zu   B97 verzweigt, wo  dem Anwender  mitgeteilt  wird, daß das
  617.       Maß voll ist und  das  Makro wegen 2-maliger Fehleingabe endet.
  618.  
  619.     - War es aber die  ERSTE Fehleingabe, wird ihm die Wahl gelassen,
  620.       es nochmal zu versuchen oder seinerseits abzubrechen.
  621.  
  622.       Entscheidet er sich für "Abbruch", wird Zählwerk auf 2 gestellt
  623.       und die Meldung "Abbruch durch Anwender" gezeigt.
  624.  
  625.       Entscheidet  er sich für  "nochmal" wird das Sub-Makro beendet.
  626.  
  627.  5. Nun gehts zurück zum Haupt-Makro, wo in B70  geprüft  wird,  ob  das
  628.     Fehlerzählwerk NICHT 2 ist und in diesem Fall ein  weiterer  Versuch
  629.     in B66 (INPUT) gestartet.
  630.  
  631.     Andernfalls wird die falsche Eingabe gelöscht und das Makro beendet.
  632.  
  633.  
  634.  Soweit wäre der Work-Shop schon erledigt - aber da fehlen doch noch die
  635.  anderen boolschen Funktionen OR und XOR !
  636.  
  637.  
  638.  
  639. Nochmal eine Handbuch-Lehrstunde:
  640.  
  641.  
  642. SYNTAX DER Funktion ODER (OR):
  643.  
  644.   ODER(Wert1;Wert2;Wert3;...)
  645.  
  646.  wobei die mindestens ZWEI Parameter <Wert> Zahlen  oder  Wahrheitswerte
  647.  (bzw. Aussagen, welche mit WAHR oder FALSCH beantwortet werden  können)
  648.  sein müssen.
  649.  
  650.  Der Rückgabe-Wert der Funktion ist FALSCH, wenn ALLE Werte  (Parameter)
  651.  FALSCH sind und WAHR, wenn auch nur ein Wert WAHR ist.
  652.  
  653.  ODER macht also genau das Gegenteil von UND
  654.  
  655.  Wenn wir also bei unserem Beispiel bleiben, müssen wir feststellen, daß
  656.  wir mit ODER nicht zum Ziel kommen, denn wenn  die  BEIDEN  Bedingungen
  657.  
  658.    =ISTTEXT(CELL(0;0))
  659.    =LÄNGE(CELL(0;0))>=3
  660.  
  661.  - FALSCH sind, wird zwar  WAHR zurückgegeben und wir wissen, daß die
  662.    Eingabe tatsächlich falsch war      und
  663.  
  664.  - wenn nur EINE davon WAHR ist, wird FALSCH zurückgegeben, womit wir
  665.    wieder wissen, daß die Eingabe falsch war
  666.  
  667.  aber wir werden mit dieser Formel:
  668.  
  669.    =OR(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))>=3)
  670.  
  671.  nie sicher wissen, ob die Eingabe RICHTIG war!
  672.  
  673.  Aber damit ich Ihnen wenigstens EINE (zugegeben  doch  etwas  abstruse)
  674.  Möglichkeit demonstriere, auch mit ODER (OR) zum Ziel zu kommen,  diese
  675.  Formel:
  676.  
  677.    =OR(ISTTEXT(CELL(0;0))ANDLÄNGE(CELL(0;0))>=3;ISTTEXT(CELL(0;0))ANDLÄNGE(CELL(0;0))>=3)
  678.  
  679.  Der Trick dabei ist, daß der Funktion ODER zwei GLEICHLAUTENDE Parameter
  680.  verpaßt werden; BEIDE enthalten je ZWEI Aussagen, welche nur dann  WAHR
  681.  sind, wenn die Eingabe SOWOHL Text ist, ALS AUCH länger als 2  Zeichen.
  682.  
  683.  Damit ODER eine solche Konstruktion akzeptiert, wurde ein weiterer Trick
  684.  angewandt:
  685.  
  686.  Jede der beiden Aussagen wurde mit UND (AND) zu jeweils  EINER  Aussage
  687.  verknüpft und sieht so aus:
  688.  
  689.          ISTTEXT(CELL(0;0))ANDLÄNGE(CELL(0;0))>=3
  690.  
  691.  Damit wird sichergestellt, daß ODER auf jeden Fall "FALSCH" zurückgeben
  692.  muß, wenn BEIDE Aussagen NICHT zutreffen und WAHR nur dann,  wenn  eine
  693.  der beiden zutrifft; da aber beide gleich sind...?   ecco!
  694.  
  695.  Es gibt zwar in der Tabelle keine eigene Makro-Sequenz dafür, aber wenn
  696.  Sie die Konstruktion ausprobieren wollen, dann kopieren Sie den  Inhalt
  697.  der Zelle B56 einfach nach B47 und starten Sie das Makro  "DB_modify2".
  698.  
  699.  Wie gesagt, das ist "über mehrere Ecken" und sollte  zur  Demonstration
  700.  (was alles machbar ist) dienen, aber sollten Sie irgendwann tatsächlich
  701.  eine gute Verwendung dafür finden - lassen  Sie  es  mich  wissen  (mir
  702.  fällt momentan nix dazu ein)!
  703.  
  704.  
  705.  Kommen wir lieber zur Funktion XOR (steht für "eXklusiv OdeR"):
  706.  
  707. SYNTAX DER Funktion XOR:
  708.  
  709.   XOR(Wert1;Wert2;Wert3;...)
  710.  
  711.  Die Funktion XOR gibt FALSCH zurück, falls eine GERADE Anzahl der Werte
  712.  (Parameter) WAHR oder NICHT-NULL sind.
  713.  
  714.  Das paßt doch hier! Wir brauchen unsere bekannten ZWEI Aussagen, welche
  715.  WAHR sein müssen, damit XOR "FALSCH" zurückgibt, also
  716.  
  717.   =XOR(ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))=>3)   !??
  718.  
  719.  Der User gibt "Heini" ein und XOR gibt prompt zurück, was wir  erwartet
  720.  haben, nämlich FALSCH - weil beide Aussagen WAHR sind.
  721.  
  722.  Leider gibt es da noch den Passus "oder NICHT-NULL" !
  723.  
  724.  Wenn der Anwender also eine Zahl eingibt, dann ist
  725.  
  726.   - "ISTTEXT" zwar FALSCH aber NICHT-NULL  und
  727.   - "LÄNGE" ergibt bei Zahlen den Fehler #TYP also auch NICHT-NULL
  728.  
  729.  folglich wird XOR wieder FALSCH zurückgeben - weil eine  gerade  Anzahl
  730.  der Werte NICHT-NULL ist - und das wäre für unseren Zweck fatal!
  731.  
  732.  Klingt kompliziert, gel?
  733.  
  734.  Wir müssen dafür sorge tragen, daß der  XOR-Rückgabe-Wert  zweifelsfrei
  735.  interpretiert werden kann, wobei es  ganz  egal  ist,  WIE  er  lautet!
  736.  
  737.  XOR darf also nur dann FALSCH zurückgeben können, wenn tatsächlich  NUR
  738.  die (hier 2) von uns gewünschten Aussagen WAHR sind und andere mögliche
  739.  Eingaben (Zahl, Leer, Datum, Formel) nicht zu einer GERADEN Anzahl  von
  740.  WAHR-Werten führen können.
  741.  
  742.  Da haben wir glücklicherweise  keine  Probleme,  denn  diese  "anderen"
  743.  möglichen Eingaben schließen einander aus  (können  nicht  gleichzeitig
  744.  existieren), womit eine einfache Aufzählung genügt. Die Ausnahme  davon
  745.  ist Text. Wie wir weiter oben gesehen haben, kann eine  Zelle  zugleich
  746.  Text sein und doch leer (RETURN oder OK bei Input, ohne eine  Eingabe)!
  747.  Diese Möglichkeit wird aber bereits unterbunden durch die 2. Bedingung,
  748.  daß LÄNGE mindestens 3 sein muß!
  749.  
  750.  Die nachfolgende Konstruktion deckt praktisch all das ab.  Sollten  Sie
  751.  "Formel" hier vermissen, dann bedenken Sie, daß eine  Formel  berechnet
  752.  wird und somit irgendwas ergibt!
  753.  
  754.  Auch ein Abbruch bei INPUT kann uns nicht schrecken, denn dann wird  ja
  755.  der alte Inhalt erhalten bleiben und der kann nix anderes sein, als was
  756.  der Anwender auch eingegeben haben könnte!
  757.  
  758.    =XOR(ISTDATUM(CELL(0;0));ISTZAHL(CELL(0;0));ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))=>3)
  759.  
  760.  Dies muß nun in "IFGOTO(Bedingung;Zelle) integriert werden zu
  761.  
  762. =IFGOTO(XOR(ISTDATUM(CELL(0;0));ISTZAHL(CELL(0;0));ISTTEXT(CELL(0;0));LÄNGE(CELL(0;0))=>3)=FALSCH;A122)
  763.  
  764.  und wie es funktioniert, können Sie testen, wenn  Sie  "DB_modify4"  in
  765.  der Tabelle starten.
  766.  
  767.  Natürlich ist diese Konstruktion  für  den  hier  erforderlichen  Zweck
  768.  maßlos "over-dressed", aber es sind möglicherweise eine ganze Reihe von
  769.  Anwendungen denkbar, wo man zu solch einem Konstrukt greifen  muß  (nur
  770.  mir fällt wieder nix ein)!
  771.  
  772.       ACHTUNG!
  773.       IFGOTO reagiert auf den WAHR-Wert, aber XOR gibt (im  Gegensatz
  774.       zu den anderen Beispielen mit UND oder ODER der Tabelle) FALSCH
  775.       zurück, wenn unsere beiden Bedingungen zutreffen! Deshalb endet
  776.       obige Befehlszeile mit "=FALSCH;B122)" !
  777.  
  778.  
  779.  Zum Abschluß dieses Work-Shop noch so ein "overdressing":
  780.  
  781.  =IFGOTO(XOR(OR(ISTZAHL(CELL(0;0));ISTLEER(CELL(0;0));ISTDATUM(CELL(0;0)));OR(NOT(ISTTEXT(CELL(0;0)));ISTLEER(CELL(0;0)));LÄNGE(CELL(0;0))>=3);$B$122)
  782.  
  783.  Was ist das denn?
  784.  
  785.  =IFGOTOBedingung;$B$122)
  786.  
  787.    das dürfte klar sein!
  788.  
  789.  wobei <Bedingung> ist...
  790.   XOR(Wert1;Wert2)
  791.  
  792.    Xor hat hier zwar scheinbar nur ZWEI Werte; und da  beide  WAHR  sein
  793.    müssen, damit XOR den (erwünschten) Return-Wert FALSCH liefert,  kann
  794.    das schon verwirren...
  795.  
  796.    ABER wer sagt denn, daß man bei XOR nicht auch mit einem  Return-Wert
  797.    WAHR das gewünschte Ergebnis erreichen kann?
  798.  
  799.  <Wert1> besteht aus..
  800.   OR(ISTZAHL(CELL(0;0));ISTLEER(CELL(0;0));ISTDATUM(CELL(0;0)))
  801.  
  802.  <Wert2> besteht aus...
  803.   OR(NOT(ISTTEXT(CELL(0;0)));ISTLEER(CELL(0;0)));LÄNGE(CELL(0;0))>=3)
  804.  
  805.  
  806.    ...die Werte 1 & 2 sind ODER-Verknüpfungen mit ihrerseits je 3 Werten
  807.    und die liefern (wie weiter oben unter  "Syntax  der  Funktion  ODER"
  808.    bereits beschrieben) FALSCH, wenn ALLE Werte (Parameter) FALSCH  sind
  809.    und WAHR, wenn auch nur ein Wert WAHR ist.
  810.  
  811.    Somit kann XOR unter dieser Bedingung entweder
  812.  
  813.     WAHR;WAHR     oder
  814.     WAHR;FALSCH   oder
  815.     FALSCH;FALSCH
  816.  
  817.    empfangen.
  818.  
  819.  Hat der Anwender "Heini" eingegeben, wird <Wert1> FALSCH ergeben,  weil
  820.  der Input weder Zahl, noch Leer, noch Datum ist
  821.  
  822.  und <Wert2> wird WAHR sein, weil der Input zwar weder NICHT-Text,  noch
  823.  LEER ist aber die Länge >=3 hat.
  824.  
  825.  Folglich wird XOR den Wert WAHR zurückgeben (den wir ja bei der Art der
  826.  Konstruktion erwarten!).
  827.  
  828.  Anders als beim vorigen Beispiel (wo XOR FALSCH zurück gab)  darf  HIER
  829.  am Ende der Makrozeile das  "=FALSCH;"  NICHT  angehängt  werden,  weil
  830.  sonst in die falsche Zelle gesprungen wird (wenn Sie diese  Alternative
  831.  in das Makro "DB_modify4" einbauen !!!
  832.  
  833.  In welcher Anwendung so ein Monstrum von Nutzen sein kann,
  834.  hab ich nicht ausgetestet - das überlasse ich Ihnen ;-))
  835.     oder
  836.  bringe es in einem weiteren Work-Shop (irgendwann).
  837.  
  838.  Jedenfalls endet DIESER jetzt, denn 840 Zeilen sind genug.
  839.  
  840. Viel Spaß!
  841.  
  842.  
  843.