Procédure pour exploiter une relation 1-1 entre deux tables.

Edit me

Introduction

Il peut avoir les contextes où l’on aimerait mettre en place une relation 1-1 entre deux différents varsets. Par exemple, votre varset contient énormément de variables et vous arrivez la fin de la capacité du varset (la gauge d’espace pour les variables est au maximum). Ou bien vous voulez gérer l’accèss à différentes parties de votre base de données en mettant par exemple, une partie des données d’un patient disponible seulement à un rôle particulier (comme les médecins).

Scenario

Imaginons que nous vouloins créer une rélation 1-1 entre les deux varsets suivants :

  • patient (données administrative du patient)
  • pat_restr (données resteintes aux médecins)

Schéma patient à pat_restr

De plus, dans les formulaires :

  • Sur la page d’information du patient, nous voulons avoir un bouton pour aller à la page des informations restreints que seulement le rôle de médecin peut voir.
  • Sur la page des informations restreintes, nous voulons avoir :
    • un bouton de retour pour aller aux informations basiques sur le patient ;
    • un rappel de l’identité du patient.

Procédure

Etape 1 : Mettre en place la relation dans EpiCraft

Sur la page des propriétés du projet, séléctionner Relation entre varsets puis ajouter une relation avec le bouton +.

Screenshot relation

Etape 2 : Ajouter une colonne pour la clé étrangère dans le formulaire de pat_restr

Dans les propriétés de la page de pat_restr, créer le custom form.dataquery.main.column_simple et ajouter la ligne suivante :

<column_simple field_name="id_lepat" table_name="main"/>

Etape 3 : Créer une variable pour récupérer l’identifiant passé en paramètre

Dans cette même page, ajouter le custom form.dataquery.main.variable et ajouter les lignes suivantes :

<variable default="null" target_column="id_lepat">
  <entry name="id_patient_info" type="param"/>
</variable>

Cette variable sera utilisée pour recevoir la valeur du id_data de la fiche patient correspondante.

Etape 4 : Créer la condition pour la requête afin d’avoir la fiche liée

Pour trouver la bonne fiche, on ajoute la condition normale pour la retrouver directement par le id_data envoyé ou par l’identifiant patient qui sera envoyé en paramètre par le bouton de navigation.

C’est fait en ajoutant le custom form.dataquery.main.condition avec les lignes suivantes :

<condition sql="{pat_restr.id_data} = {patient.id_data} OR {pat_restr.id_lepat}  = {patient.id_lepat}">
<!-- C'est la même chose que WHERE {main.id_data} = variable id_data est envoyé OR {main.id_lepat} = variable id_lepat est envoyé     --> 
  
  <!-- côté gauche de OR (la condition de chaque requête normale pour trouver la fiche quand l'id_data est envoyé)  -->
  <field field_name="id_data" table_name="main" alias="pat_restr.id_data"/>
  <variable alias="patient.id_data" default="NULL">
    <entry type="param" name="id_data"/>
  </variable>
  
  <!-- côté droit de OR (la condition pour retrouver la bonne fiche d'après la valeur id_data envoyé par le bouton-->
  <field field_name="id_lepat" table_name="main" alias="pat_restr.id_lepat"/>
  <variable alias="patient.id_lepat" default="NULL">
    <entry type="param" name="id_patient_info"/>
  </variable>
  
</condition>

Etape 5 : Enlever la condition standard du dataquery main de la page

Ajouter encore un custom qui s’appelle form.dataquery.main[disable_main_condition] et mettez le mot true.

Nous voulons enlever cette condition car elle serait interprétée comme une deuxième condition avec le logic AND avec notre condition ci-dessus.

Etape 6 : Faire une requête pour avoir le nom du patient

Quand quelqu’un est sur la page des informations restreintes, nous voulons rappeler la personne pour laquelle on saisit les données.

Créer un custom form.dataquery et ajouter les lignes suivants.

<dataquery id="who" table_name="{pj}_patient_data" varset_name="patient" table_alias="p" begin="0" range="1" mode="r">
  
  <!-- Les colonnes que l'on souhaite afficher afin de se rappeller du patient dont on est en train de saisir des infos -->
  <column_simple field_name="id_data" table_name="p"/>
  <column_simple field_name="nom" table_name="p"/>
  <column_simple field_name="prenom" table_name="p"/>

  <!-- La condition pour n'avoir que le patient lié à la fiche pat_restr courant -->
  <!-- Celui-là est la condition égal en langage MySQL "WHERE patient.id_data = pat_restr.id_lepat" -->
  <condition sql="{id_data_from_patient} = {lepat_from_pat_restr}">
    <field field_name="id_data" table_name="p" alias="id_data_from_patient"/>
    <variable alias="lepat_from_pat_restr" default="NULL">
      <entry type="param" name="id_patient_info"/>
      <entry type="dataset" name="pat_restr" field="id_lepat" row="current" />
    </variable>
  </condition> 
  
</dataquery>

Etape 7 : Afficher le nom et prénom sur la page “Infos restreintes” pour rappel

Ajouter un bulk comme form.widget et afficher ces deux variables avec les lignes suivantes :

<form_row>
  <label dataset="who" field="prenom" class="text-right col-md-3"/>
  <value dataset="who" field="prenom" mode="r" class="text-left col-md-9"/>
</form_row>
<form_row>
  <label dataset="who" field="nom" class="text-right col-md-3"/>
  <value dataset="who" field="nom" mode="r" class="text-left col-md-9"/>
</form_row>

Etape 8 : Créer le bouton sur la page “Patient” pour aller à la page “Infos restreintes”

Il faut passer l’id_data de la fiche courante en paramètre lorsqu’on passe de la page “Patient” à la page “Infos restreintes” pour que ce paramètre puisse être utilisé ensuite pour ouvrir la bonne fiche.

Ajouter le bouton suivant comme Bulk avec form.widget et ajouter le bouton suivant.

<button label="Vers la page Infos restreintes" action="save" class="btn-primary pull-right">
  <redirection module="form" ctrl="frame" action="get">
    <params>
      <dataset dataset_name="patient" field="id_data" alias="id_patient_info"/>
      <value alias="sid">lkrekiqbfu1559639191931</value>
    </params>
  </redirection>
</button>

Etape 9 : Créer le bouton sur la page “Infos restreintes” pour aller à la page “Patient”

Ajouter un bulk sur la page “Infos restreintes” comme form.widget et ajouter le bouton suivant :

<button label="Vers la fiche patient" action="save" class="btn-primary pull-right">
  <redirection module="form" ctrl="frame" action="get">
    <params>
      <dataset dataset_name="who" field="id_data" alias="id_data"/>
      <value alias="sid">buiczkfchr1553783109459</value>
    </params>
  </redirection>
</button>