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

Par exemple,

record["prenom"]
est la valeur du champ prenom de l'enregistrement actuel.

B.II. Enregistrements reliés

Par exemple,

record.related["location"]
fournit les enregistrements reliés à l'enregistrement actuel.

B.II.I. Enregistrements reliés unique

Pour les relations qui spécifient un enregistrement unique, vous pouvez récupérer la valeur de ce champ dans cet enregistrement. Par exemple,

record.related["location"]["nom"]
est la valeur du champ nom dans la table indiquée par la relation location (souvent appelée location::name).

B.II.II. Enregistrements reliés multiples

Pour les relations qui spécifient des enregistrements multiples, vous pouvez utiliser les fonctions d'agrégation (sum, count, average) pour récupérer des valeurs globales. Par exemple :

record.related["facture"].sum("prix_total")

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 :

# Use the current database's connection 
# to get all the data for the current table.
#
# record.connection is an already-open gda.connection object,
# saving us the bother of opening the connection,
# or even knowing the name of the database.

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 "    Number of columns: ", columns

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

    # Find out whether it's the primary key:
    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";