Wie mit Bedingtem Text umgehen?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Wie mit Bedingtem Text umgehen?

Beitrag von Stephan »

Hallo,

in einem Textdokument sind Felder mit bedingtem Text (Einfügen-Feldbefehl-Funktionen-Bedingter Text), beispielsweise mit:

Bedingung: ([Adressdatenbank.Firma.FOrt] == "")
Dann: Adressdatenbank.Firma.FBsOrt
Sonst: Adressdatenbank.Firma.FOrt


Wie fülle ich diese Felder per Makro mit passendem Text (.CurrentPresentation) der dem aktuellen Datensatz entspricht? Zwar kenne ich jeweils direkt den Dann- und Sonst-Wert (denn der steht im ResultSet) aber wie werte ich überhaupt die Bedingung aus? Bitte daran denken dort kann etwas völlig Beliebiges stehen und das müsste in jedem Falle ausgewertet werden können (es ist also keine Lösung einfach im Makro zu prüfen ob der gerade aktuelle Wert für Adressdatenbank.Firma.FOrt ein Leerstring ist)?

Hat jemand einen Beispielcode?

Hier mein derzeitiges Testmakro, was für gewöhnliche Seriendruckfelder funktioniert, aber wo ich für bedingten Text noch keinen Ansatz habe (da steht nur ein XRay-Aufruf im Code):

Code: Alles auswählen

sub Test4
    Dim myDataBaseContext as Object
    Dim myStatement as Object
    Dim ResultSet as Object
    Dim oTxt as Object
    Dim oFeld as Object
    Dim i as integer
    Dim s as string
    myDataBaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    myStatement = myDataBaseContext.getByName("Adressdatenbank").getConnection("","").createStatement()
    ResultSet = myStatement.executeQuery("SELECT * FROM Firma WHERE FID = '12'")
    if ResultSet.next then' nur den ersten Datensatz verwenden
        oTxt = thiscomponent.getTextFields().createEnumeration()
        while oTxt.hasmoreElements()
          oFeld = oTxt.nextElement
          if ofeld.supportsService("com.sun.star.text.TextField.Database") then
            sfieldname = ofeld.Textfieldmaster.DataColumnName
            If ResultSet.Columns.hasByName(sfieldName) then
            s$ = ResultSet.Columns.getByName(sfieldName).String 'Get desired presentation string.
            ofeld.CurrentPresentation = s$ 'Set the presentation.
           endif
          endif
          If ofeld.supportsService("com.sun.star.text.TextField.ConditionalText") then
          	GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
			GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
			XrayTool._Main.Xray ofeld

          End If
        wend
        msgbox "Fertig"
    else
        msgbox "Abbruch, Fehler"
    endif
end sub

Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Wie mit Bedingtem Text umgehen?

Beitrag von F3K Total »

Hallo Stefan,
ich habe gerade das

Code: Alles auswählen

xray oFeld
auf ein bedingtes Textfeld angewendet, Teile des Ergebnis:

.Condition string [Adressen_FAQ.Adressen.Nachname] == ""
.CurrentPresentation string ""
.FalseContent string "Voll"
.TrueContent string "Leer"
.IsConditionTrue boolean True

Ich verstehe das so:
Schreibe den aktuellen Wert von Adressdatenbank.Firma.FBsOrt in die Eigenschaft ofeld.TrueContent
Schreibe den aktuellen Wert von Adressdatenbank.Firma.FOrt in die Eigenschaft ofeld.FalseContent
des bedingten Textfeldes, dann noch ein

Code: Alles auswählen

ofeld.update
das sollte es sein.
Gruß R
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie mit Bedingtem Text umgehen?

Beitrag von Stephan »

Hallo R,

dadurch wird dem Feld kein Datensatz zugewiesen und folglich kann weiterhin die gesetzte Bedingung nicht ausgewertet werden.
Ich hatte auch bereits darauf hingewiesen das ich keine Möglichkeit sehe die Bedingung 'irgendwie' per Makro 'ausrechnen', denn die Bedingung kann völlig beliebig sein.

Darin liegt doch das Problem, denn wenn ich wüsste wie ich quasi den Klick auf "Daten in Felder" durch ein Makro ersetzen kann, wäre ja alles gelöst. [1] Ich kenne nur keine Lösung dafür wo ich über eine Dokumenteigenschaft(?) diese Info (also welche Zeile des Recordset soll die Aktuelle sein) ins Dokument bekomme.
Wie Du im Datenbankforum, an meiner dortigen Frage erahnen kannst versuche ich eine Alternative über Mailmerge, nur ist das eigentlich nicht das was ich suche.

Gruß
Stephan

[1]
Ich glaube mich zu erinnern es gibt eine Möglichkeit per Makro in der Datenquellenansicht Datenzeilen zu markieren. Da es reine Fleißarbeit wäre herauszufinden welcher dispatch-Befehl hinter "Daten in Felder" steckt, könnte das theoretisch so machen, ich halte nur dieses Vorgehen für absurd.
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Wie mit Bedingtem Text umgehen?

Beitrag von F3K Total »

Hallo Stephan,
vielleicht verstehe ich dich falsch,
kannst Du die aktuellen, dem Datensatz entsprechenden Bedingungen doch gleich aus der Abfrage nehmen, oder?

Code: Alles auswählen

oFeld.TrueContent = ResultSet.Columns.FBsOrt.getstring
oFeld.FalseContent = ResultSet.Columns.FOrt.getstring

Code: Alles auswählen

sub Test4
    Dim myDataBaseContext as Object
    Dim myStatement as Object
    Dim ResultSet as Object
    Dim oTxt as Object
    Dim oFeld as Object
    Dim i as integer
    Dim s as string
    myDataBaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
    myStatement = myDataBaseContext.getByName("Adressdatenbank").getConnection("","").createStatement()
    ResultSet = myStatement.executeQuery("SELECT * FROM Firma WHERE FID = '12'")
    if ResultSet.next then' nur den ersten Datensatz verwenden
        oTxt = thiscomponent.getTextFields().createEnumeration()
        while oTxt.hasmoreElements()
          oFeld = oTxt.nextElement
          if ofeld.supportsService("com.sun.star.text.TextField.Database") then
            sfieldname = ofeld.Textfieldmaster.DataColumnName
            If ResultSet.Columns.hasByName(sfieldName) then
            s$ = ResultSet.Columns.getByName(sfieldName).String 'Get desired presentation string.
            ofeld.CurrentPresentation = s$ 'Set the presentation.
           endif
          endif
          If ofeld.supportsService("com.sun.star.text.TextField.ConditionalText") then
              oFeld.TrueContent = ResultSet.Columns.FBsOrt.getstring
              oFeld.FalseContent = ResultSet.Columns.FOrt.getstring
              oFeld.update
          End If
        wend
        msgbox "Fertig"
    else
        msgbox "Abbruch, Fehler"
    endif
end sub
Gruß R
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie mit Bedingtem Text umgehen?

Beitrag von Stephan »

Hallo R,
kannst Du die aktuellen, dem Datensatz entsprechenden Bedingungen doch gleich aus der Abfrage nehmen, oder?
ja, 'in diesem Sinne' (eigentlich ist ja die "Bedingung" wörtlich genommen der andere Teil des Feldes).

Das Problem ist doch nur, wenn ich ein solches Feld habe mit:

Bedingung: <Irgend etwas völlig Beliebiges!>
Dann: Adressdatenbank.Firma.FBsOrt
Sonst: Adressdatenbank.Firma.FOrt

und ich kenne nun die aktuellen Werte für Adressdatenbank.Firma.FBsOrt und Adressdatenbank.Firma.FOrt, dann weiß ich doch trotzdem nicht welchen ich nehmen muss solange die Bedingung nicht ausgewertet ist.
Wenn aber nun die Bedingung BELIEBIG sein kann, wie soll ich das per Makro zuverlässig auswerten?

Solange die Bedingung nur lautet ([Adressdatenbank.Firma.BlaBla] == "xyz"), ist das einfach, aber die Bedingung kann auch mehrere WENN-DANN-SONST enthalten, mit Datenfeldern und/oder statischen Werten. Halt alles was denkbar ist.

Wozu?
Das Makro soll später mit beliebigen WENN_DANN_SONST-Feldern funktionieren ohne bei jeder neuen Vorlage darüber nachdenken zu müssen im Makro etwas zu ergänzen.



Gruß
Stephan
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Wie mit Bedingtem Text umgehen?

Beitrag von F3K Total »

Hallo Stephan,
die Bedingung steht doch in der Eigenschaft des Feldes:
F3K Total hat geschrieben: Mi, 11.12.2019 16:46 .Condition string [Adressen_FAQ.Adressen.Nachname] == ""
Kann es jetzt nicht versuchen, denke aber, man kann den String auch setzen.
Gruß R
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: Wie mit Bedingtem Text umgehen?

Beitrag von F3K Total »

Hallo Stephan,
jetzt habe ich es ausprobiert, man kann die Bedingung per Makro setzen:
BT.png
BT.png (12.45 KiB) 1947 mal betrachtet
UND mit

Code: Alles auswählen

oFeld.IsConditionTrue
kannst du das Ergebnis jeder beliebigen Bedingung auslesen, falls dir das hilft.

Gruß R
Antworten