Champs calculés et scripts de boutons

Les champs calculés et les scripts de boutons utilisent le langage de programmation Python. Le calcul ou le script est la réalisation d'une fonction dont la signature vous est fournie.

Figure B.1 Édition de la définition d'un champ calculé

B.I. Valeurs de champ

For instance,

record["name_first"]
is the value of the name_first field in the current record.

B.II. Enregistrements reliés

For instance,

record.related["location"]
provides the related records for the current record.

B.II.I. Enregistrements reliés unique

For relationships that specify a single record, you can get the value of a field in that record. For instance,

record.related["location"]["name"]
is the value of the name field in the table indicated by the location relationship (often called location::name).

B.II.II. Enregistrements reliés multiples

For relationships that specify multiple records, you can use the aggregate functions (sum, count, average) to get overall values. For instance,

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

B.III. Test de valeurs vides

La manière de tester les valeurs vides dépend du type de champ :

B.III.I. Champs non-texte

Les champs non-texte peuvent être vides, signifiant que l'utilisateur n'a saisi aucune valeur dans le champ. Par exemple, Glom ne suppose pas qu'une valeur vide dans un champ numérique signifie 0.

Vous pouvez tester si un champ est vide en utilisant le « None » de Python. Par exemple :

  if(record["numero_identification"] == None):
    return "Aucun contact"
  else:
    return record.related["contacts"]["nom_complet"]
  

Vous pourriez également tester s'il existe des enregistrements reliés. Par exemple :

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

B.III.II. Champs texte

Pour les champs texte, vous devez vérifier que les chaînes ne sont pas vides. Il n'est pas possible dans Glom de faire la distinction entre des chaînes vides et l'absence d'une chaîne parce que ce n'est pas avantageux de le faire. Par exemple :

  if(record["nom_complet"] == ""):
    return "Aucun nom"
  else:
    return record["nom_complet"]
  

B.IV. Utilisation de l'API pygda complète

Le module pygda est une API Python de l'API libgda. L'attribut connection d'un enregistrement fournit une gda.connection qui peut être utilisée pour accéder à la base de données actuelle de manière directe. Ceci vous permet d'exécuter n'importe quelle requête SQL, par exemple lire des données de la base de données avec SELECT ou modifier des valeurs dans la base de données avec un UPDATE. Notez que la connexion est déjà ouverte ce qui vous évite le travail difficile de spécification des détails de connexion.

L'attribut table_name de l'enregistrement fournit également le nom de la table actuelle.

Cet exemple permet de lire toutes les données de la table actuelle et d'afficher les valeurs sur le terminal :

# Utilise la connexion à la base de données actuelle 
# pour récupérer toutes les données de la table actuelle.
#
# record.connection est un objet gda.connection déjà ouvert,
# nous évitant de nous occuper de l'ouverture de la connexion,
# ou même de connaître le nom de la base de données.

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 "    Nombre de colonnes: ", columns

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

    # Recherche s'il s'agit de la clé primaire :
    field = data_model.describe_column(i)
    if field.get_primary_key():
        print "        (clé primaire)"

    print "\n";
     
print "    Nombre de lignes : ", rows

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

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

    print "\n";