Intelligentes Cut und Copy im Report

Beim Report werden viele Leerzeichen eingesetzt, die nicht gewollt sind, bei dieser Formel z.B.: … THEN ', ’ + Datensatz-xy wird vor das Komma ein Leerzeichen eingefügt. Wie kann ich das verhindern?

Dürfte nicht sein; geschieht bei mir nicht. Wenn bei mir unbeabsichtigte Leerzeichen in einem Report entstehen, habe ich in den Formeln etwas nicht bedacht.

Gruß

Markus Mall

Egal welche Formeln in den Datensätzen definiert sind, die Leerzeichen werden ja zwischen den Datensätzen in der Reportvorlage beim Report eingefügt. Selbst bei evtl. leeren Datensätzen, weil z.B. eine 2. Telefonnummer nicht vorhanden ist, werden Leerzeichen eingefügt. Das würde ich gerne abstellen können.

Hallo HeHo.

Formelinterpreter - (auch feste?) Leerzeichen - weitere Eingabe-Kontrollelemente für papyrus-BASE

Hauptsächliche Ursachen für das Auftauchen unerwünschter Leerzeichen beim erzeugten BEASE-Report sind:

**::**DB-Felder, denen in der Report-Vorlage bspw. durch Formeln Bedingungen zugewiesen wurden, die mal erfüllt aber auch mal nicht erfüllt sein können.

Beispiel:

Die DB-Felder “Strasse” und “HausNr” in einer DB “Adressen” können LEER sein, wenn es zudem ein DB-Feld “Postfach” gibt, welches einen Wert beinhaltet.

**::**Wenn in der Report-Vorlage selbst zwischen eingefügten (Formel)Datenfeldern versehentlich ein Leerzeichen gesetzt bzw. belassen wurde.

Beispiel:

Feld_StrasseLEERZEICHENFeld_HausNrLEERZEICHENFeld_Postfach

Lösung

Den Kampf gegen überflüssige Leerzeichen gewinnt, wer sich die einschlägigen Rechenfunktionen unter dem Menüpunkt “Hilfe” - “Übersicht Rechenfunktionen” zunutze macht.

TRIM(str) → links und rechts Leerzeichen entfernen

LTRIM(str) → links Leerzeichen entfernen

RTRIM(str) → rechts Leerzeichen entfernen

Beispiel:

StrasseLEERZEICHENHausNrLEERZEICHENPostfach

Ergibt:

Weg 22LEERZEICHEN

(Da das DB-Feld Postfach in diesem Fall LEER war, gibt es in der Tat ein unprofessionelles Leerzeichen nach der Hausnummer 22, was man so trimmen könnte:

TRIM( IF LENGTH(Strasse) > 0 THEN Strasse + ’ ’ + HausNr ELSE Postfach)

Ergibt:

Weg 22

Klasse.

Gäbe es die Daten “Weg” und “22” nicht und stattdessen einen Postfachwert - bspw. “12345”, dann würde die Formel BASE veranlassen folgendes Reportergebnis zu generieren:

12345

KLasse. Ungeprüft.

Festes Leerzeichen?

papyrus‘ Formelinterpeter kann zurzeit nicht mit sog. festen Leerzeichen umgehen - muss er aus meiner Sicht auch nicht zwingend.

Geht es hier wirklich nur um Leerzeichen?

Ich denke hier schwingt auch noch etwas mit, was papyrus-BASE zurzeit noch fehlt.

HeHo kämpft hier mit Straßennamen, die nun mal unterschiedlich lang sein können und dann gibt es auch noch Straßennummern. Eine Folge; das Ganze passt nicht in die millimetergenau justierte Report-Vorlage. Dagegen mit festen Leerzeichen anzugehen ist meiner Ansicht nach nicht so der “Bringer”.

Besser wäre es BASE erhielte weitere Eingabe-Kontrollelemente, mit denen der Anwender bereits bei der Eingabe festlegen kann, wie lang ein Straßenname zu sein hat, damit er von BASE noch auswertbar im erzeugten Report dargestellt werden kann.

Solche Kontrollelemente sind bspw.:

MIN | MAX (Siedepunkt Wasser kann nicht 110 Grad Celsius sein - → Message)

WERTEBEREICH (Bsp. 0-9, sobald Buchstabe → Message)

ANZAHL_ZEICHEN: (DB-Feld Strasse darf nur 20 Zeichen (inkl. Leerzeichen) aufnehmen. Sobald darüber → Message ))

So etwas hilft schon mal bei der Gestaltung von dynamischen (Listen)Reports bzw. von fixen (Masken)Reports.

Und was mach‘ ich bis das kommt?

Tipp: Ein berechnetes DB-Feld “Meldungen” - eben für diverse Meldungen einführen.

Beispiel:

IF LENGTH(Strasse) > 20 THEN ‘Straßenname ggf. einschl. Hausnummer überschreiten 20 Zeichen. Kürzen Sie laut den Einstellregeln in der Statuszeile!’

Abschweifend

Zur Frage, ob Straßenname und Hausnummer in unterschiedlichen DB-Feldern gehalten werden sollten - ob das “üblich” ist…

Die Frage sollte lauten; was spricht dagegen, es so zu tun?

Meiner Meinung nach spricht nichts dagegen - im Gegenteil.

Das geht schon mal los bei den Einstellregeln für das DB-Feld “HausNr”:

Alter Weg 44a

Alter Weg 44 a

Alter Weg 44 A

Hauptstr. 12-16

Hauptstr. 12 - 16

Hauptstr. 12/16

Hauptstr. 12 / 16

Hier kann man sich voll auf das DB-Feld “HausNr” konzentrieren. Man sollte festlegen, dass es keine Leerzeichen, keine “/” usw. enthalten darf.

papyrus BASE-Anwender werden von der tollen Suche vielleicht dazu verführt.(?)

Aber was ist, wenn nach dBASE exportiert werden soll - viel Spaß dort bei der Erstellung kryptischer Suchstrings …

apropos Suche:

Gegeben: ein x-beliebiger Gebäudekomplex Hauptstraße 22-24

Wenn man bspw. Anbieter eines Kabelnetzes ist, wäre u.a. wichtig, dass die eingesetzte Datenbank die Sicht "Alle Kunden Strasse == ‘Hauptstraße’ UND HausNr = ‘22-24’ generieren kann. (Von der Etagenzählung mal ganz abgesehen.)

Und selbstverständlich würde diese Firma darauf bestehen in der Sicht auch noch den Gebäudekomplex in HausNr 24 und 26 aufzusplitten.

Prinzipiell also stehen hinter der Trennung der DB-Felder für Straßenname und Hausnummer in der Welt der relat. Datenbanken auch noch andere Überlegungen, als die oben Angeführten. So ich beende mal an dieser Stelle. (Stichworte: Normalisierung, Redundanz …).

Das ist eine gute Idee. Man kann sich die Zeichenkette für die Adresse zuammenbauen und dann die Leerzeichen wegzaubern.

Die Kontrollelemente sind sicherlich für einige Anwendungen interessant, aber gerade bei Straßennamen kann man kaum vorhersehen, wie lang diese werden können. Mir fallen z.B. auf Anhieb drei Straßennamen in der näheren Umgebung ein, die länger als 20 Zeichen sind. Und was passiert erst, wenn man auch noch ausländische Adressen hinzuzieht? Nicht nur die deutsche Sprache kennt ellenlange zusammengesetzte Substantive …

Darüber hinaus ist die Anzahl der Zeichen einer Zeichenkette kein besonders guter Indikator für Ihre physische Länge. Letztere hängt nicht nur von der gewählten Schrift, sondern auch von der Häufigkeit schmaler und breiter Buchstaben ab.

Dagegen spricht die Unvorhersehbarkeit der möglichen Adressformate. Nicht alle Adressen genügen dem einfachen Schema „Straße + Hausnummer“ oder „Postfach + Nummer“. Auch die Nummern halten sich nicht an feste Regeln. Eine etwas kompexere Adresse, die ich kürzlich gesehen habe, lautete z.B. Gewebegebiet X, Areal A, Farbenstraße y, Bau 3.645 – auf so etwas wäre ich beim Entwurf einer Datenbank nicht mal im Traum gekommen. Ich halte deshalb ein einfaches Feld „Adresse“ – ggf. mehrzeilig – für die meisten Fälle für optimal.

Das Beispiel mit dem Kabelnetzanbieter ist aus meiner Sicht ein Spezialfall, der sicher seine Berechtigung hat. Für normale Anwender wäre eine solche Aufschlüsselung aber übertrieben.

P.S. Apostrophenalarm! Du hast in deinem Beitrag Akzente (´ und `) anstelle des Apostrophs (’ oder notfalls auch ') verwendet. Bitte beim nächsten Beitrag vermeiden.

[quote title=glucose schrieb am So, 19 April 2009 17:12

P.S. Apostrophenalarm! Du hast in deinem Beitrag Akzente (´ und `) anstelle des Apostrophs (’ oder notfalls auch ') verwendet. Bitte beim nächsten Beitrag vermeiden.

[/quote]

Vielen Dank für den Hinweis.

Danke für die ausführlichen Antworten. Der Straßenname war nur ein Beispiel. Ich brauche folgende Lösung. Der Einfachheit beschreibe ich es mit Töpfen, die zwischen 1-6 unterschiedliche zusammengehörige Teile beinhalten. Der Report soll jeweil ein Teil rausgreifen mit null bis zwei zusätzlichen Attributen und die zugehörigen Teile nennen. Also:

“Teil 3 grün rund” gehört zu Topf A. In diesem Topf sind aber noch “Teil1+, Teil2+, Teil4+ und Teil5+” . (Datensätze in “”; Plus steht für die Attribute)

Für die Auflistung der noch im Topf befindlichen Teile, habe ich für jedes Teil einen Datensatz mit Formel definiert, dass wie hier im Beispiel Teil3+ nicht erneut aufgeführt wird und die Attribute dabei sind, zwischen den Teilen ein Komma steht und vor dem letzten Teil statt dem Komma ein und.

Es fällt also immer mal das Teil aus der Liste raus, das schon oben steht. Und hin und wieder fehlen auch Attribute. Im einzelnen Datensatz habe ich schon “getrimmt”, doch zwischen den Datensätzen entsteht auch ein Leerzeichen und schiebt sich vor das Komma. Ich hatte es so definiert, dass das Komma oder und vorneweg ergänzt wird: ', ’ + Datensatz.

Hallo HeHo.

Bei der Erläuterung Deines Problems hast Du Dir wirklich Mühe gegeben. Leider habe ICH es nicht wirklich begriffen.

Bitte lade doch einmal eine Demo-DB hoch. Sie sollte zwei schlüssige Datensätze beinhalten und Deine Report-Vorlage. Erstelle noch mit dieser Report-Vorlage einen Report, markiere dort die Stellen, die Dich stören und lege ihn der Demo bei.

Hallo,

Demo-DB in Arbeit, aber ich scheitere im Moment noch an einer anderen Frage. Wie kombiniere ich IF … THEN, wenn ich nicht zwei sondern drei Ergebnisse unterscheiden muss, also Ergebnis 1, Ergebnis 2 und Ergebnis 3. Ich hatte versucht, es zu verschachteln, aber an 1-2 Stellen kommen Ergebnisse, die nicht stimmen:

(Bedingung=B; Ergebnis = E)

IF (B1 AND B2) OR (B1 AND B3 AND B4) THEN E1 ELSE (IF B1 AND B2 AND B5 AND B6 THEN E2 ELSE (IF B1 AND B7 AND B8 THEN E3))

Ist diese Verschachtelung überhaupt erlaubt?

Ich nehme mir jetzt nicht die Zeit, das Beispiel genauer anzuschauen. Papyrus geht mit den “if” Bedingungen etwas anders um, als ich von früheren Programierungen gewohnt war. Es handelt die Bedingungen nach der Reihenfolge ab. Das folgt dann zwar nicht nach den Regeln der Logik, aber pragmatisch hat das Konsequenzen: Man kann die Bedingungen nach einander abarbeiten, muss sie nicht exakt formulieren, wenn man die Reihenfolge beachtet. Beispiel “If a1>2 then x if a1>4 then y” ergibt nicht das gewünschte Ergebnis, weil eine Teilmenge nach ihrer übergeordneten Menge abgefragt wird. Man muss also mit den Teilmengen, hierarchisch, beginnen. Vorteil aber ist, die Bedingungen können sehr einfach formuliert werden.

Gruß

Markus Mall

Hallo.

Ich habe selbst einmal eine kleine Test-Datenbank erstellt. Das Thema interessiert mich.

Datenbank

Die Datenbank besteht aus drei Datensätzen.

  1. Datensatz: Topf2 UND Topf3 beinhalten Werte.

  2. Datensatz: Nur Topf3 beinhaltet Werte.

  3. Datensatz: Topf2 und Topf3 beinhalten keine Werte.

Report-Vorlage

Name: „Leerzeichen.pap“.

Dort sind insgesamt drei Datenfelder eingefügt.

Alle drei Datenfelder agieren ausschließlich auf der dritten Zeile.

Vorgehensweise

Markiere nun irgendeinen Datensatz und erzeuge einen Report.

Nirgendwo taucht da ein überflüssiges Leerzeichen auf. Und da wurde noch nicht einmal bspw TRIM(str) eingesetzt.

Aber sicherlich habe ich das Problem nicht (völlig) verstanden. Kommt diese Datenbank zumindest in die Nähe Deiner Frage?

HeHo1.zip (3.09 KB)

Hallo,

hier die Demo-Datenbank für Kinder-Steckbriefe, um die Kinder optimal persönlich betreuen zu können. Eine Vorgabe ist, dass die Geschwister der Kinder mit aufgeführt werden. Zwischen den Geschwister-Kindern mit evtl. anderem Nachnamen und wenn bekannt, dem Geburtstag, soll jeweils ein Komma und zwischen vorletztem und letztem ein und sein.

Ich habe hier in der Demo Familien mit 2,3,4,5 und sechs Kindern. Im Report ist nur Kind 1 definiert. Doch da tauchen schon Fehler auf. In der 6er-Familie bei Kind 2 sollte ein Komma stehen statt einem und – und in der 3erFamilie bei Kind 3 ein und statt einem Komma. Doch ich kann den Fehler nicht finden.

Ich hatte für jedes Kind einen Formel-Datensatz definiert und diese Datensätze aneinandergereiht. Dabei kam es dann zu meinen überzähligen Leerzeichen.

Da ich die Daten aus einer mit der Zeit so gewachsenen Datenbank-Tabelle ziehe, die ich ungerne umbauen würde, weil noch andere Reports daran hängen, wäre ich an einer Lösung interessiert, bei der die Tabelle nicht verändert werden muss.

Demo.zip (16.3 KB)

Hallo HeHo.

An das bewusste Formelfeld kann ich leider nicht gehen. Es wäre für mich zu zeitintensiv… (Es scheint lösbar zu sein.)

Steckbrief.

Dort habe ich Dir das Feld Telefon von - wie ich meine - unerwünschten Leerzeichen bereinigt.

Bitte fertige Dir von dieser BASE-Vorlage eine Sicherungskopie.

Kopiere die folgende Formel einfach in das Report-Datenfeld “Telefon” und prüfe es ausgiebig.

( IF Telefon1 > 0 AND Telefon2 > 0 AND Mobil > 0 THEN

Telefon1 + '; ’ + Telefon2 + '; ’ + Mobil) +

( IF Telefon1 > 0 AND Telefon2 > 0 AND Mobil <= 0 THEN

Telefon1 + '; ’ + Telefon2) +

( IF Telefon1 > 0 AND Telefon2 <= 0 AND Mobil <= 0 THEN

Telefon1) +

( IF Telefon1 <= 0 AND Telefon2 <= 0 AND Mobil > 0 THEN

Mobil) +

( IF Telefon1 <= 0 AND Telefon2 > 0 AND Mobil > 0 THEN

Telefon2 + '; ’ + Mobil) +

( IF Telefon1 > 0 AND Telefon2 <= 0 AND Mobil > 0 THEN

Telefon1 + '; ’ + Mobil)

Herzlichen Dank für alle Mühe!

Aber im Moment stehe ich irgendwie auf´m Schlauch. Also mit den Leerzeichen habe ich insofern begriffen, dass ich nicht eine Fließtextreportvorlage nehmen kann und alle Returns lösche und die Datensätze einfach aneinanderhänge. Da werden dann automatisch Leerzeichen gesetzt. Ich hoffe, das stimmt so erstmal.

Sondern in einem Datensatz verbinde ich die einzelnen Datensätze mit +, wenn ich etwas aneinanderreihen will. Bitte korrigieren, wenn ich noch falsch liege.

Im Moment bewegt mich ABER die Frage:

Ich habe drei Ergebnisse bei drei verschiedenen Bedingungen. Wie bringe ich das in eine Formel?

Also:

Wenn ‘grün’, dann ‘10’

Wenn ‘rot’, dann ‘10’+‘,’

Wenn ‘gelb’, dann ‘10’+’ und’

IF ‘grün’ THEN ‘10’ ELSE (IF ‘rot’ THEN ‘10’+‘,’ ELSE (IF ‘gelb’ THEN ‘10’+’ und’))

scheint ja nicht zu funktionieren. Wie bringe ich das in einer Formel unter?

Noch ne Ergänzung: Ist das Folgende genauso zu handhaben und in eine Formel zu packen wie das Beispiel ohne ‘blau’ oder sind da Unterschiede zu machen?

Wenn ‘blau’ AND ‘grün’, dann ‘10’

Wenn ‘blau’ AND ‘rot’, dann ‘10’+‘,’

Wenn ‘blau’ AND ‘gelb’, dann ‘10’+’ und’

IF ‘blau’ AND ‘grün’ THEN ‘10’ ELSE (IF ‘blau’ AND ‘rot’ THEN ‘10’+‘,’ ELSE (IF ‘blau’ AND ‘gelb’ THEN ‘10’+’ und’))

So zur Erklärung meines Wissensstandes: Ich habe rudimentäre SPS7-Erfahrung mit Programmieren – mehr nicht.

Hallo HeHo.

Wie sieht denn bitte die DB-Tabelle aus?

Variante 1:

DB-Feld: “Farbe1” Wert: grün

DB-Feld: “Farbe2” Wert: rot

DB-Feld: “Farbe3” Wert: gelb

Variante 2:

DB-Feld: “Farben” mit den beispielhaften Werten: rot gelb (und nicht grün) …

Hallo dotpap,

die Farben sollten das mit meinen Kindern vereinfachen. Also wieder zu den Kindern:

Die Kinder stehen in der Demotabelle weiter hinten bei der Anrede Familie und werden über die Relation Elterndaten->… geholt: DB-Feld Kind1VN bis DB-Feld Kind6VN.

Wenn der Datensatz von Kind1 bearbeitet wird, steht dort ja unter VName der Vorname von Kind1, das identisch ist mit dem DB-Feld Kind1VN unter dem zugehörigen Datensatz für die Familie von Kind1 (Anrede-Feld Familie). Das ist über die Relation Kind1VN verknüpft.

Im Reportdokument soll dann der Name von Kind1 in der Geschwisterzeile nicht mehr auftauchen. Das ist die erste Bedingung.

IF Kind1VN != VName THEN Kind1VN

Hat die Familie nur ein Kind, steht also unter Geschwister nichts.

Bei zwei Kindern, ab DB-Feld Kind3VN bis DB-Feld Kind6VN steht also nichts mehr, gibt es die zwei Datensätze von Kind 1 und von Kind 2. Beim Datensatz von Kind1 erscheint nur Kind2 und umgekehrt.

Bei drei Kindern wird es dann noch interessanter. Immer ein Kind erscheint nicht in der Geschwisterzeile und so sollen die Namen durch ein und getrennt werden.

Bei vier Geschwistern sind drei in der Geschwisterzeile. Wie bei einer Aufzählung steht zwischen den ersten beiden ein Komma mit Leerzeichen und zwischen den letzten beiden ein und. Und so weiter …

Für Kind1, Kind 2 bis Kind 6 muss also definiert werden, wann kein Komma und kein und dahinter kommt, wann jeweils ein und dahinter kommt und wann ein Komma. Dabei stellt sich noch die Frage, ob es reicht, zu definieren, wenn nichts dahinter kommt und wann ein und dahinter kommt - und bei allen restlichen Bedingungen müsste dann ja ein Komma folgen.

Ich habe mal die Bedingungen für Kind 1 bis 3 aufgelistet, aber keine Garantie, dass alles stimmt:

Bedingungen für Steckbriefkinder

K=Kind, VN=Feld VName, ‘’ = leeres Feld (Bezeichnungen ohne relationale Verknüpfungen - entsprechen auch nicht den Feldbezeichnungen)

Kind 1

K1 (ohne Komma, ohne und) - K1 wenn K2 = VN, wenn K3 leer

IF K1 != VN

  • K2 = VN

  • K3 = ‘’

K1 und (mit und, ohne Komma) - Ki und K2, K3 = VN oder leer

					ODER

					K1 (K2=VN) und K3, K4 = leer

IF K1 + K2 != VN

  • K4 = ‘’

  • K3 = ‘’ OR K3 = VN

OR

IF K1 != VN

  • K2 = VN

  • K3 != ‘’

  • K3 != VN

  • K4 = ‘’

K1, (Mit Komma, ohne und) - K1 wenn K2 = VN, wenn K3 und K4 nicht leer

					ODER

					K1,K2 und K3 nicht leer und K1+K2 nicht VN

IF K1 != VN

  • K2 = VN

  • K3 != ‘’

OR

IF K1 + K2 != VN

  • K3 != ‘’

Kind 2

K2 (ohne Komma, ohne und) - K1 = VN wenn K2 != leer und != VN, wenn K3 leer

IF K2 != VN

  • K3 = ‘’

K2 und (mit und, ohne Komma) - (Ki1 = VN) K2 und K3 != ‘’ und != VN und K4 leer

					ODER

					K1,K2 und (K3=VN) K4 != leer, K5=''

IF K1 = VN

  • K3 != ‘’ + != VN

  • K4 = ‘’

OR

IF K2 != VN

  • K3 = VN

  • K4 != ‘’

  • K5 = ‘’

(K2, (Mit Komma, ohne und) - K1, K2, K3 und K4 nicht leer

					ODER

					K1,K2,(K3 = VN) K4 nicht leer

ELSE IF K2 != VN THEN K2,

ODER

IF K2+K3 != VN

  • K4 != ‘’

OR

IF K2 != VN

  • K3 = VN

  • K4 != ‘’)

Kind 3

K3 (ohne Komma, ohne und) - K1 oder K2 = VN wenn K3 != leer und != VN, wenn K4 leer

IF K3 != VN

  • K3 != ‘’

  • K4 = ‘’

K3 und (mit und, ohne Komma) - K1 oder K2= VN, K3 != ‘’ und != VN und K4 != leer, K5 = leer

					ODER

					K1,K2 und (K3=VN) K4 != leer, K5=''

IF K1 = VN

  • K3 != ‘’ + != VN

  • K4 = ‘’

OR

IF K2 != VN

  • K3 = VN

  • K4 != ‘’

  • K5 = ‘’

K3, (Mit Komma, ohne und) - K1, K2, K3, K4 und K5 nicht leer

					ODER

					K1 oder K2 oder K6 = VN, K3 != VN, K5 nicht leer

ELSE IF K3 != VN THEN K3,

ODER

IF K3+K4 != VN

  • K5 != ‘’

OR

IF K3 != VN

  • K5 != ‘’

Ich muss noch anmerken, dass ich zuerst das Komma oder das Und jeweils vor das Kind setzen wollte. Da tauchten dann auch die Leerzeichen vor dem Komma auf. Hier ist es jetzt geändert, das Komma oder Und angehängt werden.

Was für eine Formel brauche ich, um zu definieren:

Wenn Bedingung A und B … THEN Kind1 (ohne Anhängsel)

Wenn Bedingung A und C … THEN Kind1+’ und’ (mit Ergänzung und)

Wenn Bedingung A und C und E … THEN Kind1+‘,’ (mit Ergänzung Komma) ?

Und das jeweils für jedes andere Kind bei Familien von 2 bis 6 Kindern. bei nur einem Kind gibt es den Familiendatensatz auch nicht.

Hallo HeHo.

Wie ich schon sagte, es scheint lösbar zu sein. (Für mich jedoch mit zu hohem Zeitaufwand, weil ich nicht so wie Du, den Datenbankentwurf im Kopf habe und weil für jede mögliche Bedingung (Geschwisterkinder 1-6) je ein Musterdatensatz fehlt.

Beispielsweise habe ich versucht einer bestehenden “Familie” (es war der erste Datensatz in der DB-Tabelle) weitere 3 Kinder zuzuordnen, damit ich einen Datensatz habe von dem ich sagen kann die Bedingung “6 Geschwister” ist zu 100% erfüllt. Beim Abspeichern wurde die DB-Tabelle (für Dich vielleicht erwartungsgemäß) ziemlich “rot”.

Dann habe ich mir zig Mal die Formel im “Geschwisterfeld” angeschaut. Wohl ab der Mitte verliere ich den Faden … Das bedeutet, es sollte eine Arbeitshilfe geschaffen werden.

Ich glaube, dass DU das alleine schaffen kannst. Alles was Du zur Umsetzung wissen musst hast Du meiner Ansicht nach mehrfach und an verschiedenen Stellen in dieser Datenbank angewendet.

Ich vermute Du arbeitest ohne Notizen - immer nur im Formeleditor?

Ich greife aus Deiner Datenbank die DB-Felder “Telefon1”, “Telefon2” und “Mobil” heraus. Nur drei anscheinend überschaubare Felder und dennoch waren nicht alle Bedingungen im Code berücksichtigt. Das wäre auch Dir aufgefallen, wenn Du in etwa wie folgt vorgegangen wärst:

Es wird eine Tabelle mit drei Spalten für “Telefon1”, “Telefon2” und “Mobil” erstellt. “Ja” und “Nein” machen deutlich, ob das jeweilige Feld belegt oder leer ist.

T1 T2 Mo

Ja Ja Ja

Ja Ja Nein

Ja Nein Nein

Nein Nein Nein (Nein.Abfrage erübrigt sich → LEER)

Nein Nein Ja

Nein Ja Ja

Ja Nein Ja

Beispiel für die beiden ersten Zeilen Ja Ja Ja UND Ja Ja Nein

( IF Telefon1 > 0 AND Telefon2 > 0 AND Mobil > 0 THEN

Telefon1 + '; ’ + Telefon2 + '; ’ + Mobil) +

( IF Telefon1 > 0 AND Telefon2 > 0 AND Mobil <= 0 THEN

Telefon1 + '; ’ + Telefon2)

Ist die Tabelle abgearbeitet (kompletter Code - siehe weiter oben) kann man sicher sein, dass keine der möglichen Bedingungen übersehen wurde. Wer mag kann kürzen.

Das Gleiche könntest Du mit den 6 “Geschwisterkindern” machen. Das würde ICH auch gar nicht anders angehen.

Ein sehr guter Anfang sind Deine oben formulierten Bedingungen.

Die erste Zeile wäre wohl 1 Geschwisterkind ggf. mit der verbundenen Zeichensetzung.

Ach, - Stichwort Zeichensetzung:

Ich glaube irgendetwas ist nicht korrekt, wenn Du Dich veranlasst siehst, ein Komma vor einen Namen zu setzen, nur damit mit “Ach und Krach” die Zeichensetzung stimmt.

(Überlege bloß mal was mit dem Code werden soll, wenn Du irgendwann die Datenbank auf ein *7 Geschwisterkind erweitern *möchtest.)

Hallo dotpap und alle anderen Helfer!,

danke für deine/eure Hilfe. Aber Antwort auf meine Frage, ob diese Definition IF … THEN … ELSE (IF … THEN … ELSE ( IF … THEN … ELSE … )) erlaubt ist oder nicht, habe ich für mich aus den Antworten so noch nicht entnehmen können. Es scheint, erlaubt ist, was funktioniert.

Zum anderen wollte ich jedes Kind einzeln definieren, ob es überhaupt erscheint, ob es erscheint ohne Anhang, ob es erscheint mit Und oder mit Komma.

Meine Überlegung ist, dass es dann einfacher ist, Kinder hinzuzufügen. Der Report würde dann so aussehen, wie im Anhang, bloß dass statt der Originalbezeichnung Kind1VN dann die Formel da drin steht. (Sicher könnte man das auch alles in einem Reportfeld mit + verbunden aneinanderreihen.)

Weil ich zuerst das so definiert hatte, dass die Satzzeichen vorangestellt wurden, hatte ich das Leerzeichenproblem. Mit der Definition des hintenanstellens kann ich diese Leerzeichen mit berücksichtigen, indem ich nur das Komma ergänze statt Komma mit Leerzeichen. Das Leerzeichenproblem wäre für mich jetzt gelöst. DANKE!

Nur bei meinen Definitionen stimmt noch was nicht. Und nun wollte ich wissen, ob es an formal falschen Formeln liegt, eben z.B. diese Verschachtelung, oder ich eher eine Bedingung nicht ausreichend definiert habe. Im Moment tippe ich auf letzteres. Habe aber auch so dazugelernt.

Geschwister.jpg

Hallo HeHo.

Eine Grenze für die Verschachtelungstiefe bei Wenn - Dann - Sonst ist mir nicht bekannt.

Für Deine Anfrage ist u. a. die korrekte Anwendung von Vergleichsoperatoren wichtig:

Hier der entsprende Auszug aus der papyrus-Hilfe:

Priorität: „NOT“ bindet am stärksten; „AND“ bindet stärker als „OR“/“XOR“, aber weniger als „NOT“. Im Zweifel setze man Klammern; geklammerte Bereiche werden zuerst ausgeführt.

rom UND NICHT logicware ODER Papyrus UND NICHT base entspricht also

(rom UND (NICHT logicware)) ODER (Papyrus UND (NICHT base))

Die Wirkung von gesetzten Verschachtelungen - insbesondere, wenn NOT im Spiel ist und etwa ab der 2. Ebene - führe ICH gern schrittweise mit der Erzeugung des Reports durch, um frühzeitig Fehler zu erkennen. Genau das, ist mir so ohne weiteres leider bei Deiner Demo-DB nicht möglich.

A. sollte für jede Bedingung ein Musterdatensatz angelegt sein.

B. muss ich mich erst mit den Bezeichnungen der DB-Felder und ggf. Relationen Deiner DB vertraut machen.

Ich habe hier 2 - 3 Beispiele, die Deine Aufgabenstellung durchaus tangieren könnten - ich hoffe, Du kannst sie für Deine Belange „ausbauen“.

IF (‚String‘ = X) AND (Wert=(Wert1 - Wert2)) THEN

‚String‘ ELSE

IF (‚String‘ = Y) AND (Wert=(Wert1 + Wert4)) THEN

‚String‘ ENDIF

ungeprüft

DB-Feld „Geschwister“ - angezeigt wird Geschwisterkind1:

IF NOT ( Geschwister : ‚K4‘ AND ‚K5‘ AND ‚K6‘) THEN

'Hier die Geschwister von ’ + K1 + ': '+ ‚K2‘ + 'und ’ + ‚K3‘ + ‚.‘

ungeprüft

Verschachtelte Bedingungen per Operator abfragen und entspr. Strings schreiben.

IF Wert = ‚XYZ‘ THEN

IF Alpha > Beta THEN ‚String1‘ ELSE ‚String2‘ ENDIF

ELSE IF Alpha = Beta THEN

‚String3‘ ELSE ‚String4‘ ENDIF ENDIF

geprüft

Es könnte weiter verschachtel werden.

Anstelle von ENDIF könnten auch entsprechend oft „))“ gesetzt werden.

Ich habe zu „Verschachtelte Bedingungen per Operator abfragen und entspr. Strings schreiben.“ eine entspr. DB erstellt. Man kann damit bspw. einiges von dem aus der Hilfe (s.o.) gut nachvollziehen.

IF_THEN_ELSE.zip (1.85 KB)