Beräknade fält och knappskript

Beräknade fält och knappskript använder programmeringsspråket Python. Beräkningen eller skriptet är implementationen av en funktion vars signatur tillhandahålls åt dig.

Figur B-1Redigera definitionen för ett beräknat fält

B.1. Fältvärden

Till exempel är

record["name_first"]
värdet på fältet name_first i den aktuella posten.

B.2. Relaterade poster

Till exempel tillhandahåller

record.related["location"]
de relaterade posterna för aktuell post.

B.2.1. Enkla relaterade poster

För relationer som anger en ensam post kan du få värdet på ett fält i den posten. Till exempel är

record.related["location"]["name"]
värdet på namnfältet i tabellen som indikeras av platsrelationen (ofta kallad location::name).

B.2.2. Flera relaterade poster

För relationer som anger flera poster kan du använda aggregatfunktionerna (sum, count, average) för att få generella värden. Till exempel,

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

B.3. Testa för tomma värden

Hur du testar efter tomma värden beror på fältets typ:

B.3.1. Icke-textfält

Icke-textfält kan vara tomma, vilket indikerar att användaren inte har matat in något värde i fältet. Till exempel antar inte Glom att ett tomt värde i ett numeriskt fält betyder 0.

Du kan testa om ett fält är tomt genom att använda Pythons None. Till exempel:

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

Du kan också testa huruvida det finns relaterade poster. Till exempel:

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

B.3.2. Textfält

För textfält ser du om strängar har längden noll. Det är inte möjligt i Glom att skilja mellan strängar av längden noll och avsaknad av en sträng, detta för att det inte finns någon fördel i att göra så. Till exempel:

  if(record["name_full"] == ""):
    return "Inget namn"
  else:
    return record["name_full"]
  

B.4. Använda det fullständiga pygda-API:t

pygda är ett python-API för libgda-API:t. Postens attribut connection tillhandahåller en gda.connection som kan användas för att komma åt den aktuella databasen direkt. Detta låter dig köra valfri SQL-fråga, till exempel för att läsa data från databasen med SELECT, eller för att ändra värden i databasen med UPDATE. Observera att anslutningen redan är öppen, så du kan undvika det svåra jobbet med att ange anslutningsdetaljerna.

Attributet table_name för posten tillhandahåller också namnet på den aktuella tabellen.

Detta exempel läser alla data från den aktuella tabellen och skriver ut värdena till terminalen:

# Använd den aktuella databasens anslutning 
# för att få alla data för aktuell tabell.
#
# record.connection är ett öppet gda.connection-objekt,
# vilket besparar oss besväret med att öppna anslutningen,
# eller ens att veta databasens namn.

query = "SELECT * FROM %s" % record.table_name
data_model = gda.gda_execute_select_command(record.connection, query)

rows = data_model.get_n_rows()
columns = data_model.get_n_columns()
print "    Antal kolumner: ", columns

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

    # Ta reda på om det är primärnyckeln:
    field = data_model.describe_column(i)
    if field.get_primary_key():
        print "        (primärnyckel)"

    print "\n";
     
print "    Antal rader: ", rows

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

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

    print "\n";