Article dédié la syntaxe des dataqueries : la balise <dataquery>, ses sous-balises, les attributs possibles, leur fonctionnement.

Edit me

Introduction

Le dataquery décrit une requête en base données visant à nourrir un dataset.

Articles connexes :

Un exemple complet de dataquery permettant de récupérer l’ensemble des fiches patient “appartenant” à l’utilisateur courant. Dans une configuration classique des droits, il s’agit de l’ensemble des fiches créées par l’utilisateur courant.

<dataquery id="patients" table_name="{pj}_patient_data" varset_name="patient" table_alias="p" mode="r" begin="0" range="10">

    <column_simple table_name="p" field_name="id_data"/>
    <column_simple table_name="p" field_name="firstname"/>
    <column_simple table_name="p" field_name="lastname"/>
    <column_simple table_name="p" field_name="date_of_birth"/>
    <column_simple table_name="p" field_name="sex"/>

    <!-- Column for the owner of the record -->
    <column sql="CONCAT_WS(' ', {u.firstname}, {u.lastname})" type="string" alias="owner_name">
        <field table_name="u" field_name="firstname" alias="u.firstname"/>
        <field table_name="u" field_name="lastname" alias="u.lastname"/>
    </column>

    <!-- Join on users to find the owner of each patient record -->
    <join detail_table="{pj}_user_data" detail_alias="u" sql="{u.id_group}={p.id_owner}" type="inner" detail_varset_name="user" mode="r">
        <field table_name="u" field_name="id_group" alias="u.id_group"/>
        <field table_name="p" field_name="id_owner" alias="p.id_owner"/>
    </join>

    <!-- Condition on lastname -->
    <conditions operator="or">
        
        <condition sql="{p.commonname} LIKE CONCAT('%',{name_filter},'%')" optional="true">
            <field table_name="p" field_name="commonname" alias="p.commonname"/>
            <variable alias="name_filter" default="NULL">
                <entry type="param" name="name"/>
                <entry type="dataset" name="filter" field="name" row="current"/>
            </variable>
        </condition>

        <condition sql="{p.birthname} LIKE CONCAT('%',name_filter},'%')" optional="true">
            <field table_name="p" field_name="birthname" alias="p.birthname"/>
            <variable alias="name_filter" default="NULL">
                <entry type="param" name="name"/>
                <entry type="dataset" name="filter" field="name" row="current"/>
            </variable>
        </condition>

    </conditions>

    <!-- Condition to have only the current user's records -->
    <condition sql="{p.id_owner} = {current_user_id}">
        <field table_name="p" field_name="id_owner" alias="p.id_owner"/>
        <variable alias="current_user_id" default="0">
            <entry type="user" name="user_id"/>
        </variable>
    </condition>

    <!-- Order by creation date -->
    <order_by sql="{p.sys_creation_date} DESC">
        <field field_name="sys_creation_date" table_name="p" alias="p.sys_creation_date"/>
    </order_by>

</dataquery>

Balise principale

<dataquery
  id="dataquery_contact"
  table_name="{pj}_patient_data"
  table_alias="p"
  varset_name="patient"
  mode="r"
  begin="0"
  range="20"
  cacheable="true" 
  standby="true" 
  auto_add_record="false"     
/>
  • id* : identifiant du Dataquery (et à terme du dataset généré), il est utiliser pour référencer le Dataquery.
  • table_name* : nom de la table principale du Dataquery.
    Dans le cas où le dataquery doit être utilisé sur plusieurs projets, il est possible d’indiquer un nom de table générique sous la forme: {pj}_nom_table, où {pj} est remplacé par le préfix du projet.
    Exemple : {pj}_pj_group.
  • table_alias : alias de la table, sera utilisé pour faire référence à cette table dans la suite du dataquery.
  • varset_name : nom du varset auquel est lié le dataquery. Correspond à la colonne name dans la table des varset (optionnel). Cet attribut indique à Voozanoo4 que la table concernée (table_name) est un Varset. Les droits des utilisateurs doivent donc s’appliquer.
  • mode : indique si l’élément est en lecture/écriture, ou en lecture seule. S’il n’est pas mis, l’élément est en lecture/écriture. Les valeurs possibles: rw (lecture/écriture) ou r (lecture).
  • begin et range : “begin” correspond au numéro de ligne à partir de laquelle se fait la requête et “range”, au nombre de lignes renvoyées. begin et range sont l’équivalent sql de LIMIT et OFFSET
    SELECT * FROM table LIMIT 20 OFFSET 0;
    
  • cacheable : (Défaut : true) indique si le Dataset (généré depuis le Dataquery) doit être mis en cache coté client.
  • standby : (Défaut : true) indique au processus de suspension de saisie si le Dataset (généré depuis le Dataquery) peut être gelé et conservé en l’état (= true) ou s’il doit être regénéré (= false). Plus d’infos : Frame et hooks -> Suspendre la saisie (Stand by).
  • auto_add_record : (Défaut : false) permet l’ajout automatique d’un record vierge si le Dataset généré depuis ce Dataquery est vide. L’ajout se fait coté JS (et non coté Serveur). Très utile dans le cas d’un Dataquery utilisé pour créer une fiche.
  • invoke_from : permet d’“invoquer” un dataquery défini ailleurs. Pour en savoir plus : Invokable Datasets et Dataqueries : création et utilisation.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur. Sert également d’identifiant pour invoquer le dataquery (voir : Invokable Datasets et Dataqueries : création et utilisation).
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Les colonnes (SELECT)

Les colonnes permettent de sélectionner les variables à récupérer dans la partie “select” de la requête.

Balise <column_simple>

La balise <column_simple> permet de déclarer une colonne rapidement en indiquant uniquement le nom du champ, et la table source.

<dataquery id="patient" table_name="{pj}_patient_data" table_alias="p" varset_name="patient" mode="r" begin="0" range="20">
	<column_simple table_name="p" field_name="nom" />
</dataquery>
SELECT p.nom FROM proj_patient_data p LIMIT 0, 20;
  • table_name* : nom ou alias (si spécifié) de la table. Equivaut soit à la valeur de l’attribut table_alias de la balise <dataquery> ou detail_alias de la balise <join>, soit à la valeur de l’attibut table_name de la balise <dataquery> ou detail_table de la balise <join>.
  • field_name* : nom du champ dans la table
  • default_label : libellé qui sera utilisé pour le champ si aucun autre libellé n’est indiqué dans le layout. Surcharge le default_label indiqué dans le varset.
  • mode : indique si l’élément est en lecture/écriture, ou en lecture seule. S’il n’est pas mis, l’élément est en lecture/écriture. Les valeurs possibles: rw (lecture/écriture) ou r (lecture).
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Balise <column>

La balise <column> permet de déclarer une colonne demandant un traitement plus complexe (une concaténation de plusieurs champs, un calcul, etc.).

<dataquery id="patient" table_name="{pj}_patient_data" table_alias="p" varset_name="patient" mode="r" begin="0" range="20">
  <column sql="CONCAT({p.nom}, ' ', {p.prenom})" alias="nom_prenom" default_label="Nom du patient" type="string">
    <field table_name="p" field_name="nom" alias="p.nom"/>
    <field table_name="p" field_name="prenom" alias="p.prenom" />
  </column>
</dataquery>
SELECT CONCAT(p.nom, ' ', p.prenom) AS nom_prenom FROM proj_patient_data p LIMIT 0, 20;

Attributs :

  • alias : nom de la colonne, correspond à l’alias SQL : SELECT YEAR(ddn) AS annee_naissance
  • default_label : libellé qui sera utilisé pour le champ si aucun autre libellé n’est indiqué dans le layout.
  • default_short_label : libellé qui sera utilisé, si indiqué, par le WidgetTable.
  • default_value : valeur par défaut de la colonne. Sera utilisée si la valeur en base est nulle.
  • dico_name : dans le cas où type vaut fkey_dico ou fkey_dico_ext, nom du dictionnaire utilisé par la variable.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).
  • length : longueur maximal du champ.
  • mandatory : permet d’indiquer si la colonne est considérée comme obligatoire ou non (peut être placé sur un champ calculé). Prend le pas sur le Varset (surcharge).
  • sql : il s’agit du sql qui sera utilisé pour récupérer la valeur. On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • translate : le résultat de la requête doit être traduit, c’est à dire qu’il est envoyé à l’instance de Zend_Translate (valeurs possibles: true | false).
  • type : lorsqu’une colonne est le résultat d’un calcul ou bien n’est pas issue d’un varset, il est recommandé de définir un type.
    Il est également possible de typer une colonne issue d’un varset. La définition du type est alors prioritaire par rapport à la définition dans le varset.

Balise <field>

Attributs :

  • table_name : nom ou alias (si spécifié) de la table, ‘p’ dans cet exemple. Equivaut soit à la valeur de l’attribut table_alias de la balise <dataquery> ou detail_alias de la balise <join>, soit à la valeur de l’attibut table_name de la balise <dataquery> ou detail_table de la balise <join>.
  • field_name : nom du champ dans la table.
  • alias : nom du champ tel qu’il sera utilisé dans l’attribut sql de la balise column. Cet attribut est particulièrement utile lorsque la colonne utilise deux champs qui ont le même nom dans deux tables différentes. Exemple :
<dataquery id="dataquery_contact" table_name="{pj}_contact_data" table_alias="c" varset_name="contact" mode="r" begin="0" range="20">
  <column sql="CONCAT('Le patient habitant ', {p.ville}, ' a été en contact avec le cas index à ', {c.ville})" alias="c.situation">
    <field table_name="p" field_name="ville" alias="p.ville"/>
    <field table_name="c" field_name="ville" alias="c.ville"/>
  </column>

  <join sql="{c.id_patient}={p.id_data}"  detail_table="{pj}_patient_data" detail_alias="p" detail_varset_name="patient" mode="r" type="left">
    <field table_name="c" field_name="id_patient" alias="c.id_patient"/>
    <field table_name="p" field_name="id_data" alias="p.id_data"/>
  </join>
</dataquery>
SELECT p.ville AS p.ville, c.ville AS c.ville, p.id_data AS p.id_data, c.id_patient AS c.id_patient, CONCAT('Le patient habitant ', p.ville, ' a été en contact avec le cas index à ', c.ville) AS c.situation 
FROM proj_contact_data c
LEFT JOIN proj_patient_data p ON c.id_patient = p.id_data
LIMIT 20 OFFSET 0;
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Les variables

Les variables permettent d’utiliser dans un dataquery des valeurs provenant de sources de données autres qu’une table en base - par exemple un autre dataset, un paramètre passé à la requête XHR ou encore des informations relatives à l’utilisateur courant.

Il est possible de déclarer des variables :

  • directement sous la balise dataquery et d’indiquer la colonne dans laquelle doit être stockée l’information. Dans ce cas, elles doivent impérativement être déclarées au sein d’une balise <variables> :
<dataquery id="visite" table_name="{pj}_visite_data" table_alias="v" varset_name="visite" mode="r" begin="0" range="20">
    <column_simple table_name="v" field_name="id_patient"/>
    <variables>
        <variable alias="id_patient" default="NULL" target_column="id_patient">
            <entry type="dataset" name="patient" field="id_data" row="current"/>
        </variable>
    </variables>
</dataquery>
SELECT v.id_patient
	FROM proj_visite_data v
	LIMIT 20 OFFSET 0;
  • sous n’importe quelle sous-balise de <dataquery> (condition, group_by, etc) :
<dataquery id="recherche_patient" table_name="{pj}_patient_data" table_alias="p" varset_name="patient" mode="r" begin="0" range="20">
	<condition sql="{p.lastname} = CONCAT('%', {param_lastname}, '%')" optional="true">
		<field table_name="p" field_name="lastname" alias="p.lastname"/>
		<variable alias="param_lastname" default="null">
			<entry type="param" name="lastname" />
		</variable>
	</condition>
</dataquery>

Attributs :

  • alias: nom de la variable (surtout utile pour les conditions, voir plus bas.
  • default: valeur par défaut de la variable.
  • target_column: référence (field_name ou alias) de la colonne qui sera remplie avec la valeur récupérée par cette variable.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Les différents types d’entrées

La valeur provient d’une des entrées (balises <entry>) ou de la valeur par défaut si aucune entrée n’est présente. Plusieurs type d’entrée existent :

Le type “param”

La valeur est passée en paramètre d’une requête (chargement du formulaire, rafraîchaissement de dataset, etc).

Attributs :

  • type : “param” -> le type d’entrée
  • name : nom du paramètre passé par la requête
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Exemple : Je souhaite remplir un un compte-rendu de visite médical pour un patient et j’accède au formulaire via un bouton “Ajouter une visite” présent sur la page du dossier du patient.

Dans l’exemple ci-dessous, la requête pour ressembler à “monAppli.voozanoo.net/monProjet/form/frame/get/sid/lfzzesxgti1543832166536/id_patient/38/” et le champ id_patient serait rempli avec la valeur “38”.

<dataquery id="visite" table_name="{pj}_visite_data" table_alias="v" varset_name="visite" mode="r" begin="0" range="20">
	<column_simple field_name="id_patient" table_name="v"/>
	<variable alias="param_id_patient" default="NULL" target_column="id_patient">
	    <entry type="param" name="id_patient"/>
	</variable>
</dataquery>

Le type “dataset”

La valeur est récupérée au sein de l’enregistrement (rowdata) d’un autre dataset.

Attributs :

  • type : “dataset” -> le type d’entrée
  • name : nom du dataset au sein duquel on souhaite récupérer la valeur
  • field : nom du champ à récupérer dans le rowdata
  • row : position du rowdata qui nous intéresse dans le dataset. Valeurs possible :
    • “current” : rowdata sur lequel le curseur est positionné
    • “next” : rowdata suivant celui sur lequel le curseur est positionné
    • “prev” : rowdata précédent celui sur lequel le curseur est positionné
    • “last” : dernier rowdata du dataset
    • “first” : premier rowdata du dataset
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Exemple : J’ai une liste de patient et je souhaite ajouter un médecin traitant en le cherchant via un champ de recherche.

<variable alias="id_medecin" default="NULL" target_column="id_medecin_traitant">
    <entry type="dataset" name="recherche_medecin" field="id_data" row="current"/>
</variable>

Le type “user”

La valeur est récupérée parmi les informations de l’utilisateur courant.

Attributs :

  • type : “user” -> le type d’entrée
  • name : correspond au nom d’un getter de l’objet User (voir la classe Core_Library_User. Le nom est transformé pour correspondre à la syntaxe des méthodes Voozanoo, par exemple user_id devient GetUserId.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Exemple :

<variable alias="user_id" default="0">
	<entry type="user" name="user_id" />
</variable>

Le type “field”

Attributs :

  • type : “field” -> le type d’entrée
  • table_name : nom de la table où s etrouve le champ.
  • field_name: nom du champ
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Les formats spécifiques

Certaines variables ont des valeurs spécifiques :

  • Le format des variables de type dates est YYYY-MM-DD
  • Les variables de type fkey_dico et fkey_sysdico reçoivent le code du dictionnaire ou id_data.
  • Les variables de type fkey_dico_ext et fkey_sysdico_ext reçoivent un code de dictionnaire ou id_data. On peut passer un tableau avec ces informations pour sélectionner plusieurs valeurs. Il s’agit d’un tableau js stringifié, exemple: “[A,B,C]”.

Variable de type string:

<variable alias="param_message_bienvenue" default="Hello world" target_column="message_bienvenue">
    <entry type="param" name="message_bienvenue"/>
</variable>

Variable de type date:

<variable alias="param_ddn_patient" default="1980-05-04" target_column="date_naissance">
    <entry type="param" name="ddn"/>
</variable>

Variable de type fkey_dico:

<variable alias="param_sex_patient" default="1" target_column="sexe">
    <entry type="param" name="sexe"/>
</variable>

Variable de type fkey_dico_ext:

<variable alias="param_symptomes_patient" default="[0,1,5,6]" target_column="symptomes_patient">
    <entry type="param" name="symptomes_patient"/>
</variable>

Les Conditions (WHERE)

Les conditions, comme les colonnes, s’utilisent en combinaison avec des balises field pour appeler les champs qui seront utilisés dans la condition :

<dataquery id="dataquery_contact" table_name="{pj}_contact_data" table_alias="c" varset_name="contact" mode="r" begin="0" range="20">
    <condition sql="{c.age} > 18">
        <field table_name="c" field_name="age" alias="c.age"/>
    </condition>
    <column_simple table_name="c" field_name="nom" />
</dataquery>
SELECT c.nom FROM proj_contact_data c WHERE c.age > 18 LIMIT 20 OFFSET 0;

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour récupérer la valeur. On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • optional : Si spécifié et mis à “true”, la condition ne sera valable que si les valeurs provenant des balises variable qui lui sont passées ne sont pas égal à null ou à "null".
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Combiner des conditions

Il est possible d’avoir plusieurs conditions au sein d’un même dataquery.

Par défaut, les balises <condition> sont liées par un AND entre elles.

Pour que le lien logique entre des conditions soit de type OR, il faut encadrer les conditions d’une balise <conditions> et lui attribuer un operator="or".

Les attributs de la balise <condtions> :

  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).
  • operator : défini les lien logique entre les différentes conditions contenues dans la balise. Accepte les valeur “and” et “or”.

Passer des paramèrres aux conditions

Il est possible de passer des paramètres aux conditions grâce aux variables.

Exemple :

<dataquery id="recherche_patient" table_name="{pj}_patient_data" table_alias="p" varset_name="patient" mode="r" begin="0" range="20">
   <condition sql="{p.lastname} = {param_lastname}" optional="true">
      <field table_name="p" field_name="lastname" alias="p.lastname" />
      <variable alias="param_lastname" default="null">
         <entry type="param" name="lastname" />
      </variable>
   </condition>
   <condition sql="{p.num_ss} = {param_num_ss}" optional="true">
      <field table_name="p" field_name="num_ss" alias="p.num_ss"/>
      <variable alias="param_num_ss" default="null">
         <entry type="param" name="num_ss" />
      </variable>
   </condition>
</dataquery>

Les conditions seront placées dans la requête SQL uniquement si les paramètres param_lastname et param_num_ss sont renseignés.

Si optional est égal à true :

Si les paramètres sont passés (!= null || !== "null") :

SELECT lastename p.lastname, num_ss p.num_ss FROM proj_patient_data p WHERE p.lastname = "Nom de famille passé en paramètre" AND p.num_ss = "Numéro de sécu passé en paramètre" LIMIT 20 OFFSET 0;

Si les paramètres ne sont pas passés (!= null || !== "null") :

SELECT lastename p.lastname, num_ss p.num_ss FROM proj_patient_data p LIMIT 20 OFFSET 0;

Si optional est égal à false :

Les paramètres sont toujours appliqués.

La balise MATCH (WHERE [...] LIKE)

La balise MATCH est un dérivé de la balise condition, elle permet de faire une recherche sur des champs. La syntaxe est quasiment la même que pour la balise condition, la différence est qu’il doit obligatoirement y avoir une balise VARIABLE.

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour effectuer la jointure (correspond au ON de la requête SQL). On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • onset : indique le comportement du moteur si la balise match est appliquée.
    • onset = "ignore_conditions": les conditions sont ignorées. Il s’agit du comportement par défaut si l’attribut onset n’est pas défini.
    • onset = "none": aucune action particulière.
  • optional : si spécifié et mis à “true”, la condition ne sera valable que si les valeurs qui lui sont passées ne sont pas NULL.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).
<match sql="{p.nom} like {search_string} or {p.prenom} like {search_string}" onset="none">
  <field table_name="p" field_name="nom" alias="p.nom"/>
  <field table_name="p" field_name="prenom" alias="p.prenom"/>
  <variable alias="search_string" default="NULL">
    <entry type="param" name="search_string" />
  </variable>
</match>

La partie SQL est répétée pour chaque mot contenu dans la variable.

Par exemple, si on passe la chaine de caractère “Harry Seldon” dans la variable search string, le résultat sera le suivant:

SELECT [...] WHERE ((nom like '%Harry%' or prenom like '%HARRY%') and (nom like '%Seldon%' or prenom like '%Seldon%'))

La balise SEARCH_ON (WHERE [...] LIKE)

Cette balise est assez spécifique, elle est utilisée exclusivement par le WidgetAutocomplete.

Les jointures (JOIN)

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour effectuer la jointure (correspond au ON de la requête SQL). On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • detail_table : nom de la table, comme pour l’attribut table_name du dataquery, il est possible de mettre un nom générique (de la forme {pj}_table_name)
  • detail_alias : alias de la table utilisé pour y faire référence dans les colonnes dans l’ensemble du datequery (équivaut à l’attribut table_alias du dataquery).
  • detail_varset_name : nom du varset auquel est lié la table.(équivaut à l’attribut varset_name du dataquery).
  • mode : indique si les colonnes liées à la table jointe sont en lecture/écriture, ou en lecture seule. S’il n’est pas mis, alors les colonnes de la jointure sont en lecture/écriture. Les valeurs possibles: rw (lecture/écriture) ou r (lecture).
  • type : type de jointure. Valeurs possibles : “inner”, “left”, “right”. Par défaut : “left”.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Il est possible de grouper plusieurs <join> dans une balise <joins>.

<dataquery id="dataquery_contact" table_name="{pj}_contact_data" table_alias="c" varset_name="contact" mode="r" range="20">
  <column sql="CONCAT('Le patient habitant ', {p.ville}, ' a été en contact avec le cas index à ', {c.ville})" alias="c.situation" type="string">
    <field table_name="p" field_name="ville" alias="p.ville"/>
    <field table_name="c" field_name="ville" alias="c.ville"/>
  </column>

  <join sql="{c.id_patient}={p.id_data}" detail_table="{pj}_patient_data" detail_alias="p" detail_varset_name="patient" mode="r" type="left">
    <field table_name="c" field_name="id_patient" alias="c.id_patient"/>
    <field table_name="p" field_name="id_data" alias="p.id_data"/>
  </join>
</dataquery>
SELECT p.ville p.ville, c.ville c.ville, p.id_data p.id_data, c.id_patient c.id_patient, CONCAT('Le patient habitant ', p.ville, ' a été en contact avec le cas index à ', c.ville)
	FROM proj_contact_data c
	LEFT JOIN proj_patient_data p ON c.id_patient = p.id_data
	LIMIT 20 OFFSET 0;

Tri (ORDER BY)

La balise <order_by>correspond au mot clé SQL ORDER BY.

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour effectuer le tri (correspond au ORDER BY de la requête SQL). On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Il est possible de grouper plusieurs <order_by> dans une balise <orders>.

<order_by sql="{p.nom} DESC">
  <field table_name="p" field_name="nom" alias="p.nom"/>
</order_by>
SELECT [...] ORDER BY p.nom DESC LIMIT 20 OFFSET 0;

Regroupement (GROUP BY)

La balise <group_by>correspond au mot clé SQL GROUP BY.

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour effectuer le groupement (correspond au GROUP BY de la requête SQL). On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Il est possible de grouper plusieurs <group_by> dans une balise <groups>.

<group_by sql="{p.sexe}">
  <field table_name="p" field_name="sexe" alias="p.sexe"/>
</group_by>
SELECT [...] GROUP BY p.sexe LIMIT 20 OFFSET 0;

La clause Having (HAVING)

La balise <having>correspond au mot clé SQL HAVING. Comme en SQL, elle accompagne généralement une balise <group_by> et s’utilise toujours avec une fonction d’aggrégation (COUNT, MAX, SUM, etc.).

Elle permet de filtrer les résultats de la requête pour ne garder que ceux qui vérifient le résultat de la fonction d’aggrégation.

Attributs :

  • sql* : il s’agit du sql qui sera utilisé pour effectuer le filtrage (correspond au HAVING de la requête SQL). On ne met pas directement les champs de la table, mais des alias vers les balises fields qui sont définies à l’intérieur de la balise colonne.
  • id : identfiant unique de la condition. Ajouté systématiquement par Epicraft depuis la version 1.18.
  • editor_id : identifiant unique ajouté par Epicraft et servant à gérer les mises à jour de l’élément par l’éditeur.
  • is_custom : attribut ajouté par Epicraft, indique si le composant a été défini de façon personnalisée (“à la main” VS via les fonctionnalités offertes par Epicraft).

Exemple :

<dataquery id="stats_patient" table_name="{pj}_patient_data" table_alias="p" varset_name="patient" mode="r" range="20">
   <column sql="COUNT({p.sexe})" alias="p.count_sexe">
      <field table_name="p" field_name="sexe" alias="p.sexe"/>
   </column>
   <column_simple table_name="p" field_name="sexe"/>

   <group_by sql="{p.sexe}">
      <field table_name="p" field_name="sexe" alias="p.sexe"/>
   </group_by>

   <having sql="COUNT({p.sexe}) >= 5">
      <field table_name="p" field_name="sexe" alias="p.sexe"/>
   </having>
</dataquery>
SELECT COUNT(p.sexe) p.count_sexe, p.sexe GROUP BY p.sexe HAVING p.count_sexe >= 5 LIMIT 20 OFFSET 0;

Même si SQL autorise l’utilisation des alias spécifiés dans la partie SELECT la balise <having>, elle, requiert la re-déclaration de la formule utilisée (ici, COUNT({p.sexe})), il n’est pas possible d’utiliser l’alias spécifié dans la balise <column>.