Berechnete Felder und Knopfskripte

Berechnete Felder und Knopfskripte verwenden die Programmiersprache Python. Die Berechnung oder das Skript ist die Implementierung einer Funktion, deren Signatur Ihnen zur Verfügung gestellt wird.

Abbildung B-1Bearbeiten der Definition eines berechneten Feldes

B.1. Feldwerte

Beispielsweise ist

record["name_first"]
der Wert des Feldes name_first im aktuellen Datensatz.

B.2. Bezugsdatensätze

Beispielsweise stellt

record.related["location"]
die Bezugsdatensätze für den aktuellen Datensatz bereit.

B.2.1. Einzelbeziehungen

Für Beziehungen, die einen einzelnen Datensatz angeben, können Sie den Wert des Feldes in diesem Datensatz erhalten. Beispielsweise ist

record.related[»Ort«][»Name«]
der Wert des »name«-Feldes in der Tabelle, die durch die Beziehung angegeben wird (oft als location::name bezeichnet).

B.2.2. Datensätze mit mehrfachen Bezügen

Für Beziehungen, die mehrere Datensätze umfassen, können Sie die Aggregatfunktionen (sum, count, average) benutzen, um allgemeine Werte zu erhalten. Beispielsweise

record.related["invoice_lines"].sum("total_price")
.

B.3. Prüfen auf leere Werte

So überprüfen Sie auf leere Werte, abhängig vom Feldtyp:

B.3.1. Nicht-Text-Felder

Nicht-Textfelder dürfen leer sein, was anzeigt, dass der Benutzer noch keinerlei Wert in dieses Feld eingegeben hat. Beispielsweise nimmt Glom nicht an, dass ein leerer Wert in einem numerischen Feld den Wert 0 hat.

Sie können testen, ob ein Feld leer ist, indem Sie »None« aus Python verwenden. Zum Beispiel:

  if(record["contact_id"] == None):
    return "No Contact"
  else:
    return record.related["contacts"]["name_full"]
  

Sie können auch überprüfen, ob Bezugsdatensätze vorhanden sind. Zum Beispiel:

  if(record.related["contacts"] == None):
    return "No Contact"
  else:
    return record.related["contacts"]["name_full"]
  

B.3.2. Textfelder

In Textfeldern sollten Sie prüfen, ob Zeichenketten der Länge Null vorhanden sind. Glom kann nicht zwischen Zeichenketten der Länge Null und fehlenden Zeichenketten unterscheiden, weil dies keinerlei Vorteile hätte. Zum Beispiel:

  if(record["name_full"] == ""):
    return "No Name"
  else:
    return record["name_full"]
  

B.4. Benutzung der vollen Pygda-API

pygda ist eine Python-API zur libgda-API. Das connection-Attribut stellt eine gda.connection bereit, die zum direkten Zugriff auf die aktuelle Datenbank genutzt werden kann. Dies ermöglicht Ihnen die Ausführung einer SQL-Abfrage, beispielsweise zum Lesen von Daten aus der Datenbank mit einer SELECT-Anweisung, oder zum Ändern von Werten in der Datenbank mit einer UPDATE-Anweisung. Bedenken Sie, dass die Verbindung bereits offen ist, so dass die Eingabe der Verbindungsdetails nicht mehr erforderlich ist.

Das Attribut table_name des Datensatzes stellt auch den Namen der aktuellen Tabelle zur Verfügung.

Dieses Beispiel liest alle Daten aus der aktuellen Tabelle und gibt deren Werte im Terminal aus:

# Die aktuelle Verbindung zur Datenbank zum
# Lesen aller Daten der aktuellen Tabelle verwenden.
#
# record.connection ist eine bereits geöffnetes gda.connection Objekt,
# das uns ein Öffnen einer Verbindung erspart,
# und selbst das Wissen über den Namen der Datenbank.

query = "SELECT * FROM %s" % record.table_name
command = gda.Command(query)
data_model = record.connection.execute_single_command(command)

rows = data_model.get_n_rows()
columns = data_model.get_n_columns()
print "    Number of columns: ", columns

for i in range(columns):
    print "      column ", i;
    print "        name=", data_model.get_column_title(i)

    # Herausfinden, ob es der Primärschlüssel ist:
    field = data_model.describe_column(i)
    if field.get_primary_key():
        print "        (primary key)"

    print "\n";
     
print "    Number of rows: ", rows

for row_index in range(rows):
    print "      row ", row_index;

    for col_index in range(columns):
        print "        value=", data_model.get_value_at(col_index, row_index).get()

    print "\n";