Python-Makro mit Datenbank-Funktion und regulären Ausdrücken liefert falsches Ergebnis

Hallo Welt,

wenn ich im Python-Makro eine Datenbak-Funktion anwende und dabei die Suchkriterien eine Null enthalten, gibt das Makro eine andere Anwort als die Funktion im Tabellenblatt selbst.

Hier ist das Tabellenblatt:

Nummer Platz Art
z[0-9]+ Reis
Nummer Platz Art
1 z01 Reis
2 z10 Reis
3 a01 Reis
4 a10 Reis
Anzahl im Regal Z
berechnet mit Formel im Blatt: 2
berechnet mit Formel im Makro: 0

Die Formel im Tabellenblatt lautet:

=DBANZAHL2($D$5:$F$9;"Nummer";$D$1:$F$2)

Dies ist das Python-Makro:

def db_funktionen(*_):
    
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets['Tabelle1']
    createUnoService = XSCRIPTCONTEXT.ctx.ServiceManager.createInstance
    fa = createUnoService("com.sun.star.sheet.FunctionAccess")

    z_platz = "z[0-9]+"
    sheet['E2'].setString(z_platz)

    datenbank = sheet['$D$5:$F$9']
    kriterien = sheet['$D$1:$F$2']

    anzahl = fa.callFunction("DCOUNTA", (datenbank, "Nummer", kriterien))
    sheet['D14'].setString(anzahl)

“Reguläre Ausdrücke in Formeln ermöglichen” ist in den Optionen unter → Calc → Berechnen angeklickt.

Nun erläutert die Calc-Hilfe zum Thema Datenbankfunktionen, dass Zeichenfolgen-Kriterien zunächst in Zahlen umgewandelt werden. Um zu erreichen, dass der reguläre Ausdruck aber als solcher ausgewertet wird, solle man einen Ausdruck verwenden, der nicht als numerisch falsch verstanden werden kann. Ist das bei “z[0-9]+” nicht gegeben? Wer weiß Rat?

Hier ist die Datei:
db-funktionen.ods (13.7 KB)

Wenn Du die Variable ‘fa’ analysierst, wirst Du feststellen, dass die ihre eigenen Berechnungseinstellungen hat. fa.RegularExpressions ist False per default.

Danke, Villeroy. Das hat geholfen. Mir war das Untersuchen von Code mit MRI nicht so geläufig. Ist aber gar nicht so schwer.

Zur Erläuterung für andere sind hier meine Schritte zum Lösen des Problems:

  1. Den Code mit APSO debuggen.
  2. Nach Zeile 6 fa = createUnoService("com.sun.star.sheet.FunctionAccess") unten rechts im Fenster “Local Scope” auf fa doppelklicken.
  3. Im MRI-Fenster folgendes auswählen:
    a) → Tools → Code → Python
    b) → Mode → Set
  4. RegularExpressions doppelklicken
  5. Im sich öffnenden Dialog True eingeben.
  6. Das Code-Fenster aufziehen (wie, siehe hier) und das Code-Beispiel übernehmen, in meinem Fall also: fa.RegularExpressions = True.

Dies ist der Code, der danach zum gewünschten Ergebnis führt:

def db_funktionen(*_):
    
    doc = XSCRIPTCONTEXT.getDocument()
    sheet = doc.Sheets['Tabelle1']
    createUnoService = XSCRIPTCONTEXT.ctx.ServiceManager.createInstance
    fa = createUnoService("com.sun.star.sheet.FunctionAccess")
    fa.RegularExpressions = True

    z_platz = "z[0-9]+"
    sheet['E2'].setString(z_platz)

    datenbank = sheet['$D$5:$F$9']
    kriterien = sheet['$D$1:$F$2']

    anzahl = fa.callFunction("DCOUNTA", (datenbank, "Nummer", kriterien))
    sheet['D14'].setString(anzahl)
1 Like

Du kannst in MRI auch Menü>Target>Service wählen und com.sun.star.sheet.FunctionAccess eingeben/pasten.