Files
XdlOrm/doc/qxorm_fr/manual_qxee.html
2026-04-03 11:32:07 +08:00

5824 lines
419 KiB
HTML
Raw Blame History

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<title>QxOrm : C++ Qt ORM Object Relational Mapping database library - QxEntityEditor : C++ Qt entities graphic
editor (data model designer and source code generator)</title>
<link rel='stylesheet' type='text/css' href='./resource/qxorm_style.css'>
<script type="text/javascript" src="./resource/jquery.min.js"></script>
<script type="text/javascript" src="./resource/qxorm_script.js"></script>
</head>
<body>
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td><a href="./home.html"><img alt="QxOrm" src="./resource/logo_qxorm_and_qxee.png" align="left"
border="0"></a></td>
<td align="right" style="vertical-align:bottom">
<div id="qx_search">
<gcse:search></gcse:search>
</div>
</td>
<td width="15"></td>
<td align="right" style="vertical-align:bottom">
<img alt="Windows" src="./resource/logo_windows.gif" width="35" height="35">
<img alt="Linux" src="./resource/logo_linux.gif" width="35" height="35">
<img alt="Macintosh" src="./resource/logo_mac.gif" width="35" height="35">
</td>
<td width="70"><img alt="C++" src="./resource/logo_cpp.gif" width="50" height="50" align="right"></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td align="center"><a href="./home.html" class="btn_nav">Accueil</a></td>
<td align="center"><a href="./download.html" class="btn_nav">T<EFBFBD>l<EFBFBD>chargement</a></td>
<td align="center"><a href="./quick_sample.html" class="btn_nav">Exemple rapide</a></td>
<td align="center" onmouseover="showHideElementById('menu_tuto', true);"
onmouseout="showHideElementById('menu_tuto', false);">
<a href="./tutorial.html" class="btn_nav">Tutoriel (4)</a>
<table class="table_menu_tuto">
<tbody>
<tr>
<td>
<div id="menu_tuto" class="div_menu_tuto">
<a href="./tutorial_3.html" class="btn_sub_menu">install QxOrm</a><br />
<a href="./tutorial.html" class="btn_sub_menu">qxBlog</a><br />
<a href="./tutorial_2.html" class="btn_sub_menu">qxClientServer</a><br />
<a href="./tutorial_4.html" class="btn_sub_menu">QxEntityEditor videos</a>
</div>
</td>
</tr>
</tbody>
</table>
</td>
<td align="center" onmouseover="showHideElementById('menu_manual', true);"
onmouseout="showHideElementById('menu_manual', false);">
<a href="./manual.html" class="btn_nav">Manuel (2)</a>
<table class="table_menu_manual">
<tbody>
<tr>
<td>
<div id="menu_manual" class="div_menu_manual">
<a href="./manual.html" class="btn_sub_menu">Manuel QxOrm</a><br />
<a href="./manual_qxee.html" class="btn_sub_menu">Manuel QxEntityEditor</a><br />
</div>
</td>
</tr>
</tbody>
</table>
</td>
<td align="center"><a href="./link.html" class="btn_nav">Forum</a></td>
<td align="center"><a href="./customer.html" class="btn_nav">Nos clients</a></td>
</tr>
</tbody>
</table>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<col>
<col>
<col>
<tbody>
<tr>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxOrm &gt;&gt; Manuel d'utilisation de l'application
QxEntityEditor</font>
</td>
<td align="right" valign="top">
<table cellspacing="0" cellpadding="1">
<col>
<col>
<tbody>
<tr>
<td align="right" valign="top">
<font size="2" class="txt_with_shadow">Version courante :&nbsp;</font>
</td>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxOrm 1.5.0 - <a href="../doxygen/index.html"
target="_blank">documentation en ligne de la biblioth<74>que QxOrm</a> - <a
href="https://github.com/QxOrm/QxOrm" target="_blank">GitHub</a></font>
</td>
</tr>
<tr>
<td align="right" valign="top">
<font size="2" class="txt_with_shadow"></font>
</td>
<td align="left" valign="top">
<font size="2" class="txt_with_shadow">QxEntityEditor 1.2.8</font>
</td>
</tr>
</tbody>
</table>
</td>
<td width="10px"></td>
<td width="40px" height="30px"><a href="../qxorm_fr/manual_qxee.html"><img alt="Version fran<61>aise du site"
src="./resource/FR.png" width="40" height="30" border="0"></a></td>
<td width="40px" height="30px"><a href="../qxorm_en/manual_qxee.html"><img alt="Web site english version"
src="./resource/GB.png" width="40" height="30" border="0"></a></td>
<td width="40px" height="30px"><a href="http://sites.google.com/site/qxormpostgres/" target="_blank"><img
alt="" src="./resource/ES.png" width="40" height="30" border="0"></a></td>
</tr>
</tbody>
</table>
<table border="1" frame="vsides" rules="cols" style="width: 80%" align="center" cellpadding="6" bgcolor="#F2F2F4">
<col>
<tbody>
<tr>
<td align="justify">
<script>$(function () { initQxOrmManualWebPage(); });</script>
<table border="0" cellpadding="4">
<col>
<col>
<tbody>
<tr>
<td>
<font class="txt_with_shadow" color="#0B0B61" size="4"><i>S<EFBFBD>lection du manuel : </i></font>
</td>
<td align="left">
<a href="./manual.html" class="btn_tuto">Manuel QxOrm</a>
<a href="./manual_qxee.html" class="btn_tuto_selected">Manuel QxEntityEditor</a>
</td>
</tr>
</tbody>
</table>
<hr style="width: 100%" align="center" size="1" color="#100D5A">
<br>
<table border="0" style="width: 100%" align="center">
<col>
<col>
<tbody>
<tr>
<td>
<h3 class="txt_slogan"><b>Manuel d'utilisation de l'application QxEntityEditor - Table des
mati<74>res</b></h3>
<div id="manual_table_of_contents">
<ol class="manual_manual_ol_title_1" type="I">
<li class="manual_li_title_1">
<a href="#intro">Introduction</a>
<ol class="manual_ol_title_2" type="1">
<li class="manual_li_title_2">
<a href="#intro_01">QxEntityEditor : <20>diteur graphique pour la biblioth<74>que
QxOrm</a>
</li>
<li class="manual_li_title_2">
<a href="#download_and_install">T<EFBFBD>l<EFBFBD>chargement et installation</a>
</li>
<li class="manual_li_title_2">
<a href="#intro_videos">Vid<EFBFBD>os de pr<70>sentation de l'application
QxEntityEditor</a>
</li>
</ol>
</li>
<li class="manual_li_title_1">
<a href="#qxee_manual">Pr<EFBFBD>sentation g<>n<EFBFBD>rale</a>
<ol class="manual_ol_title_2" type="1">
<li class="manual_li_title_2">
<a href="#qxee_views">Vues de l'<27>cran principal de QxEntityEditor</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#qxee_zoom">Zoomer/d<>zoomer le diagramme d'entit<69>s</a>
</li>
<li class="manual_li_title_3">
<a href="#qxee_splitter">Affichage en mode "splitter"</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#global_settings">Param<EFBFBD>trage de l'application QxEntityEditor</a>
</li>
<li class="manual_li_title_2">
<a href="#license_details">Enregistrer un code licence</a>
</li>
<li class="manual_li_title_2">
<a href="#project_params_wnd">Cr<EFBFBD>er/ouvrir un projet *.qxee</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#qxee_database">Architecture d'un fichier projet *.qxee (base
de donn<6E>es SQLite)</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#project_settings">Param<EFBFBD>trage d'un projet *.qxee</a>
</li>
<li class="manual_li_title_2">
<a href="#entities">Gestion des entit<69>s</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#entities_create">Cr<EFBFBD>er une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#entities_modify">Modifier une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#entities_delete">Supprimer une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#entities_clone">Cloner une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#entity_params">Param<EFBFBD>tres d'une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#color_settings_by_item">Couleur associ<63>e <20> une entit<69></a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#properties">Gestion des propri<72>t<EFBFBD>s associ<63>es <20> une entit<69></a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#properties_actions">Ajouter/modifier/supprimer une
propri<72>t<EFBFBD></a>
</li>
<li class="manual_li_title_3">
<a href="#property_params">Param<EFBFBD>trage d<>taill<6C> d'une propri<72>t<EFBFBD></a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#relationships">Gestion des relations entre entit<69>s</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#relationships_actions">Ajouter/modifier/supprimer une
relation</a>
</li>
<li class="manual_li_title_3">
<a href="#relationship_params">Param<EFBFBD>trage d<>taill<6C> d'une relation</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#enums">Gestion des <20>num<75>rations</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#enums_actions">Ajouter/modifier/supprimer/cloner une
<20>num<75>ration</a>
</li>
<li class="manual_li_title_3">
<a href="#enumeration_params">Param<EFBFBD>tres d'une <20>num<75>ration</a>
</li>
<li class="manual_li_title_3">
<a href="#enums_colors">Couleur associ<63>e <20> une <20>num<75>ration</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#namespace">Gestion des espaces de nom (namespace)</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#rename_namespace">Renommer un espace de nom</a>
</li>
<li class="manual_li_title_3">
<a href="#color_settings_by_namespace">Gestion des couleurs d'un espace
de nom</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#comment_params">Gestion des notes (ou post-it)</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#comments_actions">Ajouter/modifier/supprimer/cloner une
note</a>
</li>
<li class="manual_li_title_3">
<a href="#comments_colors">Couleur associ<63>e <20> une note</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#organize_diagram_layout">Organisation automatique du diagramme
d'entit<69>s</a>
</li>
<li class="manual_li_title_2">
<a href="#tag_project_state">Historique d'un projet *.qxee</a>
</li>
<li class="manual_li_title_2">
<a href="#cpp_preview_code">Aper<EFBFBD>u du code C++ d'une entit<69>/<2F>num<75>ration</a>
</li>
<li class="manual_li_title_2">
<a href="#naming_convention">Convention de nommage (snake_case, camelCase)</a>
</li>
<li class="manual_li_title_2">
<a href="#plugin_about">Liste des plugins disponibles</a>
</li>
</ol>
</li>
<li class="manual_li_title_1">
<a href="#import_plugins">Plugins d'import</a>
<ol class="manual_ol_title_2" type="1">
<li class="manual_li_title_2">
<a href="#wnd_source_control_import">Importer un projet <20> partir d'un
r<>pertoire associ<63> <20> un gestionnaire de code source (Git, Perforce, CVS,
etc.)</a>
</li>
<li class="manual_li_title_2">
<a href="#wnd_json_import">Importer un projet <20> partir d'un fichier texte au
format JSON</a>
</li>
<li class="manual_li_title_2">
<a href="#wnd_mysql_import">Importer <20> partir d'une base de donn<6E>es MySQL ou
MariaDB</a>
</li>
<li class="manual_li_title_2">
<a href="#wnd_postgresql_import">Importer <20> partir d'une base de donn<6E>es
PostgreSQL</a>
</li>
<li class="manual_li_title_2">
<a href="#wnd_sqlite_import">Importer <20> partir d'une base de donn<6E>es
SQLite</a>
</li>
<li class="manual_li_title_2">
<a href="#wnd_odbc_import">Importer <20> partir d'une base de donn<6E>es en
utilisant un driver ODBC (Oracle, MS SQL Server, etc.)</a>
</li>
</ol>
</li>
<li class="manual_li_title_1">
<a href="#export_plugins">Plugins d'export</a>
<ol class="manual_ol_title_2" type="1">
<li class="manual_li_title_2">
<a href="#cpp_export_settings">Exporter en projet C++</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#cpp_export_settings_parameters">Param<EFBFBD>tres de l'export C++</a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_export_settings_generated">Pr<EFBFBD>sentation du projet C++
g<>n<EFBFBD>r<EFBFBD></a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_export_settings_compilation">Compilation du projet C++
g<>n<EFBFBD>r<EFBFBD> (par qmake ou cmake)</a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_export_settings_example">Exemple d'utilisation</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#cpp_model_view_export_settings">Exporter en projet C++ de type
model/view</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#cpp_model_view_export_settings_parameters">Param<EFBFBD>tres de
l'export</a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_model_view_export_settings_generated">Pr<EFBFBD>sentation du
projet g<>n<EFBFBD>r<EFBFBD></a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#cpp_services_export_settings">Exporter en projet C++ de type
services</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#cpp_services_export_settings_parameters">Param<EFBFBD>tres de
l'export</a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_services_export_settings_generated">Pr<EFBFBD>sentation du projet
g<>n<EFBFBD>r<EFBFBD></a>
</li>
<li class="manual_li_title_3">
<a href="#cpp_services_export_settings_server_app">Serveur
d'applications g<>n<EFBFBD>rique</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#ddl_export_settings">Exporter le sch<63>ma de base de donn<6E>es SQL
DDL</a>
</li>
<li class="manual_li_title_2">
<a href="#printer_settings">Imprimer le diagramme d'entit<69>s</a>
</li>
<li class="manual_li_title_2">
<a href="#source_control_export_settings">Exporter le projet dans un
r<>pertoire associ<63> <20> un gestionnaire de code source (Git, Perforce, CVS,
etc.)</a>
</li>
<li class="manual_li_title_2">
<a href="#xml_export_settings">Exporter le projet sous format XML ou JSON</a>
</li>
</ol>
</li>
<li class="manual_li_title_1">
<a href="#js_engine">Moteur Javascript pour personnaliser les exports</a>
<ol class="manual_ol_title_2" type="1">
<li class="manual_li_title_2">
<a href="#js_engine_architecture">Architecture et fonctionnement du moteur de
personnalisation Javascript</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#js_engine_input_params">Liste des param<61>tres d'appel du moteur
Javascript</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#js_engine_functions">Fonctions disponibles par Javascript</a>
<ol class="manual_ol_title_3" type="a">
<li class="manual_li_title_3">
<a href="#js_engine_functions_entity">Obtenir les informations associ<63>es
<20> une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_iterate_property">Parcourir la liste des
propri<72>t<EFBFBD>s d'une entit<69></a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_property">Obtenir les informations
associ<63>es <20> une propri<72>t<EFBFBD></a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_enum">Obtenir les informations associ<63>es <20>
une <20>num<75>ration</a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_meta_data">Acc<EFBFBD>s aux m<>ta-donn<6E>es d'une
entit<69>/propri<72>t<EFBFBD>/<2F>num<75>ration</a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_env_var">Acc<EFBFBD>der aux variables
d'environnement</a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_files">Gestion des fichiers : lecture et
<20>criture</a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_functions_list">Obtenir la liste des toutes les
entit<69>s/<2F>num<75>rations d'un projet</a>
</li>
<li class="manual_li_title_3">
<a href="#js_engine_qxee_params">R<EFBFBD>cup<EFBFBD>rer le param<61>trage de
l'application (niveau global, projet et plugin)</a>
</li>
</ol>
</li>
<li class="manual_li_title_2">
<a href="#js_engine_placeholder">Ajout d'une action (placeholder)
personnalis<69>e dans le template d'export C++</a>
</li>
<li class="manual_li_title_2">
<a href="#js_engine_example_q_property">Exemple de script : ajout automatique
de la d<>finition Q_PROPERTY sur les propri<72>t<EFBFBD>s C++ g<>n<EFBFBD>r<EFBFBD>es</a>
</li>
<li class="manual_li_title_2">
<a href="#js_engine_debug">Activation du d<>bogueur Javascript int<6E>gr<67></a>
</li>
</ol>
</li>
<li class="manual_li_title_1">
<a href="#plugin_script">Ex<EFBFBD>cution de scripts personnalis<69>s avant/apr<70>s ex<65>cution
d'un plugin</a>
</li>
<li class="manual_li_title_1">
<a href="#qxee_command_line">Ex<EFBFBD>cuter QxEntityEditor en ligne de commande</a>
</li>
</ol>
</td>
<td width="200" align="center" valign="top"><a href="./resource/qt_ambassador_logo.png"
target="_blank"><img alt="qt_ambassador" src="./resource/qt_ambassador_logo_150x150.png"
width="150" height="150" border="0"></a><br>
<b>
<font size="2">QxOrm library has been accepted into the <a
href="http://forum.qt.io/category/24/qt-ambassador-program" target="_blank">Qt
Ambassador Program</a></font>
</b>
</td>
</tr>
</tbody>
</table>
<br>
<hr width="90%">
<div id="manual_content">
<p class="manual_p_title_1"><a class="manual_a_title_1" name="intro">Introduction</a></p>
<div class="manual_div_content_1">
L'objectif de ce manuel utilisateur est de pr<70>senter de mani<6E>re structur<75>e l'ensemble des
fonctionnalit<69>s propos<6F>es par l'application <b>QxEntityEditor</b> (<28>diteur graphique de la
biblioth<74>que <b>QxOrm</b>).
Ce manuel est destin<69> aux d<>veloppeurs et architectes logiciel qui souhaitent g<>rer une couche de
donn<6E>es persistante en C++/Qt.
Des comp<6D>tences techniques en C++ et base de donn<6E>es sont requises pour la bonne compr<70>hension de
ce document.
<br><br>
<b>Remarque :</b> <a href="./manual.html">un manuel utilisateur d<>di<64> <20> la biblioth<74>que
<b>QxOrm</b> est <20>galement disponible</a>.
<br><br>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="intro_01">QxEntityEditor : <20>diteur
graphique pour la biblioth<74>que QxOrm</a></p>
<div class="manual_div_content">
<b>QxEntityEditor</b> est un <20>diteur graphique pour la biblioth<74>que <b>QxOrm</b> :
<b>QxEntityEditor</b> permet de g<>rer graphiquement le mod<6F>le d'entit<69>s.<br>
<b>QxEntityEditor</b> est multi-plateforme (disponible pour Windows, Linux et Mac OS X) et
g<>n<EFBFBD>re du code natif pour tous les environnements : bureau (Windows, Linux, Mac OS X), embarqu<71>
et mobile (Android, iOS, Windows Phone, Raspberry Pi, etc.).<br>
<br>
<b>QxEntityEditor</b> est bas<61> sur un syst<73>me de plugins et propose diverses fonctionnalit<69>s
pour importer/exporter le mod<6F>le de donn<6E>es :
<ul>
<li><a href="#cpp_export_settings">g<EFBFBD>n<EFBFBD>ration automatique du code C++</a> (classes
persistantes enregistr<74>es dans le contexte QxOrm) ;</li>
<li><a href="#ddl_export_settings">g<EFBFBD>n<EFBFBD>ration automatique des scripts SQL DDL</a> (sch<63>ma de
base de donn<6E>es) pour les bases SQLite, MySQL (ou MariaDB), PostgreSQL, Oracle et MS SQL
Server ;</li>
<li>supporte l'<27>volution du sch<63>ma de base de donn<6E>es pour chaque version d'un projet
(<i>ALTER TABLE</i>, <i>ADD COLUMN</i>, <i>DROP INDEX</i>, etc.) ;</li>
<li><a href="#cpp_services_export_settings">g<EFBFBD>n<EFBFBD>ration automatique des classes C++ de
services</a> pour transf<73>rer le mod<6F>le de donn<6E>es sur le r<>seau, en utilisant le module
<a href="../doxygen/html/group___qx_service.html" target="_blank">QxService</a>, pour
cr<63>er rapidement des applications client/serveur ;
</li>
<li><a href="#wnd_mysql_import">importation automatique des structures de bases de donn<6E>es
existantes</a> (par connexion ODBC ou pilote natif) pour les bases SQLite, MySQL (ou
MariaDB), PostgreSQL, Oracle et MS SQL Server ;</li>
<li>parce que chaque projet est diff<66>rent, QxEntityEditor propose plusieurs outils pour
personnaliser les fichiers g<>n<EFBFBD>r<EFBFBD>s (notamment <a href="#js_engine">un moteur javascript et
un d<>bogueur int<6E>gr<67></a>).</li>
</ul>
<table border="0" style="width:90%" align="center">
<col>
<col>
<col>
<tbody>
<tr>
<td valign="bottom" style="text-align:center;"><a
href="https://www.qxorm.com/qxentityeditor/resource/qxee_windows.png"
target="_blank"><img alt="QxEntityEditor on Windows"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_windows_small.png" /></a>
</td>
<td valign="bottom" style="text-align:center;"><a
href="https://www.qxorm.com/qxentityeditor/resource/qxee_linux.png"
target="_blank"><img alt="QxEntityEditor on Linux"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_linux_small.png" /></a>
</td>
<td valign="bottom" style="text-align:center;"><a
href="https://www.qxorm.com/qxentityeditor/resource/qxee_macosx.png"
target="_blank"><img alt="QxEntityEditor on Mac OS X"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_macosx_small.png" /></a>
</td>
</tr>
<tr>
<td style="text-align:center;"><i>QxEntityEditor on Windows</i></td>
<td style="text-align:center;"><i>QxEntityEditor on Linux</i></td>
<td style="text-align:center;"><i>QxEntityEditor on Mac OS X</i></td>
</tr>
</tbody>
</table>
<br><br>
<b>QxEntityEditor</b> est d<>velopp<70> XDL Teamarty, Ing<6E>nieur en d<>veloppement logiciel depuis
2003.<br>
<br><br>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="download_and_install">T<EFBFBD>l<EFBFBD>chargement
et installation</a></p>
<div class="manual_div_content">
L'application QxEntityEditor peut <20>tre t<>l<EFBFBD>charg<72>e sur <a href="./download.html">la page de
t<>l<EFBFBD>chargement du site QxOrm</a>.
Plusieurs versions sont disponibles :
<ul>
<li><b>Windows</b> (de Windows XP <20> Windows 10) en mode 32bits et 64bits ;</li>
<li><b>Linux</b> (les distributions les plus populaires sont support<72>es, Ubuntu, Fedora,
etc...) en mode 32bits et 64bits ;</li>
<li><b>Mac OS X</b> (64bits uniquement).</li>
</ul>
Pour Windows, QxEntityEditor est disponible avec un setup d'installation ou bien un fichier ZIP
portable.<br>
Pour Linux et Mac OS X, QxEntityEditor est disponible uniquement en fichier ZIP portable.<br>
Aucune d<>pendance suppl<70>mentaire n'est requise, l'installation est tr<74>s simple : il suffit de
d<>zipper le fichier t<>l<EFBFBD>charg<72> et de lancer l'ex<65>cutable QxEntityEditor.
<br><br>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="intro_videos">Vid<EFBFBD>os de pr<70>sentation
de l'application QxEntityEditor</a></p>
<div class="manual_div_content">
Voici <a href="http://www.youtube.com/watch?v=ZyjvDiOI3uw" target="_blank">une vid<69>o de
pr<70>sentation de l'application QxEntityEditor</a> :<br />
<br />
<iframe width="640" height="360" src="//www.youtube.com/embed/ZyjvDiOI3uw?rel=0" frameborder="0"
allowfullscreen></iframe><br />
<br />
Cette vid<69>o pr<70>sente les <20>tapes suivantes :
<ul>
<li>T<EFBFBD>l<EFBFBD>charger et installer la biblioth<74>que QxOrm <i>(10s)</i> ;</li>
<li>T<EFBFBD>l<EFBFBD>charger et installer l'application QxEntityEditor <i>(56s)</i> ;</li>
<li>Cr<EFBFBD>er un projet QxEntityEditor <i>(1m 46s)</i> ;</li>
<li>Exporter les entit<69>s vers un projet C++/Qt <i>(8m 26s)</i> ;</li>
<li>Exporter les entit<69>s vers un script DDL SQL de base de donn<6E>es <i>(10m 22s)</i> ;</li>
<li>Cr<EFBFBD>er une application client/serveur pour transf<73>rer son mod<6F>le de donn<6E>es sur le r<>seau
<i>(12m 31s)</i> ;
</li>
<li>Exporter un projet QxEntityEditor vers un fichier XML ou JSON <i>(17m 13s)</i> ;</li>
<li>Ex<EFBFBD>cuter QxEntityEditor en ligne de commande (sans IHM) <i>(18m 07s)</i>.</li>
</ul>
<br />
<hr style="width: 90%" align="center" size="1" color="#100D5A">
<br />
Voici <a href="http://www.youtube.com/watch?v=M-DcTqh4OZQ" target="_blank">une autre vid<69>o de
l'application QxEntityEditor</a> pour montrer comment importer une structure de base de
donn<6E>es existante (projet MySQL Workbench) :<br />
<br />
<iframe width="640" height="360" src="//www.youtube.com/embed/M-DcTqh4OZQ" frameborder="0"
allowfullscreen></iframe><br />
<br />
Cette vid<69>o pr<70>sente les <20>tapes suivantes :
<ul>
<li>Projet MySQL Workbench - exemple de base de donn<6E>es Sakila <i>(10s)</i> ;</li>
<li>Cr<EFBFBD>ation d'un DSN pour se connecter <20> MySQL par ODBC <i>(46s)</i> ;</li>
<li>Import de la structure de base de donn<6E>es dans un projet QxEntityEditor <i>(1m 15s)</i> ;
</li>
<li>Export du projet QxEntityEditor vers un projet C++ Qt <i>(3m 10s)</i> ;</li>
<li>Compilation des classes g<>n<EFBFBD>r<EFBFBD>es du projet C++ Qt <i>(4m 22s)</i>.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="qxee_manual">Pr<EFBFBD>sentation g<>n<EFBFBD>rale</a>
</p>
<div class="manual_div_content_1">
<b>QxEntityEditor</b> est un <20>diteur graphique permettant de g<>rer : entit<69>s, propri<72>t<EFBFBD>s, relations
entre entit<69>s, <20>num<75>rations, espaces de nom (namespace).
Pour faire le lien entre la base de donn<6E>es et le code C++ :
<ul>
<li>une entit<69> correspond <20> une table c<>t<EFBFBD> base de donn<6E>es, et <20> une classe c<>t<EFBFBD> code C++ ;</li>
<li>une propri<72>t<EFBFBD> correspond <20> une colonne d'une table c<>t<EFBFBD> base de donn<6E>es, et <20> une donn<6E>e
membre d'une classe c<>t<EFBFBD> code C++ ;</li>
<li>une relation (<i>1-n</i>, <i>n-1</i>, <i>1-1</i> ou <i>n-n</i>) correspond <20> une liaison
entre 2 tables de la base de donn<6E>es (cl<63> <20>trang<6E>re), et <20> une liaison entre 2 classes C++ ;
</li>
<li>une <20>num<75>ration correspond <20> une liste de valeurs disponibles c<>t<EFBFBD> code C++ (pour le moment
pas de notion c<>t<EFBFBD> base de donn<6E>es : converti en valeur num<75>rique) ;</li>
<li>un espace de nom (namespace) correspond <20> un sch<63>ma de base de donn<6E>es, et un namespace o<>
se trouve une classe c<>t<EFBFBD> code C++.</li>
</ul>
<br />
<p class="manual_p_title_2"><a class="manual_a_title_2" name="qxee_views">Vues de l'<27>cran principal
de QxEntityEditor</a></p>
<div class="manual_div_content">
Voici une copie <20>cran pr<70>sentant les diff<66>rentes zones d'affichage de l'application
QxEntityEditor :
<br /><br />
<img alt="All views" src="https://www.qxorm.com/qxentityeditor/resource/qxee_all_views.jpg" />
<br /><br />
<ul>
<li><i>Zone 1 :</i> menu principal et barre d'outils de l'application QxEntityEditor ==>
toutes les actions sont accessibles par ces boutons ;</li>
<li><i>Zone 2 :</i> liste d<>roulante permettant d'acc<63>der rapidement aux projets charg<72>s
r<>cemment ;</li>
<li><i>Zone 3 :</i> liste sous forme d'arbre (tree view) pr<70>sentant les <20>l<EFBFBD>ments du projet
charg<72>s (entit<69>s, propri<72>t<EFBFBD>s, relations, <20>num<75>rations, espaces de nom) ;</li>
<li><i>Zone 4 :</i> vue "<i>Navigator</i>" permettant de se d<>placer rapidement dans le
diagramme d'entit<69>s (particuli<6C>rement utile pour des projets volumineux) ;</li>
<li><i>Zone 5 :</i> diagramme d'entit<69>s affichant tous les <20>l<EFBFBD>ments du projet dans un vue
graphique ;</li>
<li><i>Zone 6 :</i> <20>cran de param<61>trage (sous forme d'onglets) des entit<69>s, propri<72>t<EFBFBD>s,
relations, <20>num<75>rations + pr<70>visualisation du code C++ ;</li>
<li><i>Zone 7 :</i> zoom sur le diagramme d'entit<69>s.</li>
</ul>
<br />
<p class="manual_p_title_3"><a class="manual_a_title_3" name="qxee_zoom">Zoomer/d<>zoomer le
diagramme d'entit<69>s</a></p>
<div class="manual_div_content">
Il est possible de zoomer/d<>zoomer le diagramme d'entit<69>s :
<ul>
<li>par le menu principal : <i>View &gt;&gt; Zoom view to XX%</i> ;</li>
<li>par la petite fen<65>tre (slider) tout en bas <20> droite de l'<27>cran ;</li>
<li>par menu contextuel suite <20> un clic-droit sur le diagramme d'entit<69>s, sous menu :
<i>View &gt;&gt; Zoom view to XX%</i> ;
</li>
<li>en maintenant clic-gauche + molette de la souris sur le diagramme d'entit<69>s.</li>
</ul>
<br />
<img alt="Zoom" src="https://www.qxorm.com/qxentityeditor/resource/qxee_zoom.png" />
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="qxee_splitter">Affichage en mode
"splitter"</a></p>
<div class="manual_div_content">
Le menu <i>View &gt;&gt; Show/hide splitter mode</i> permet de basculer l'affichage des
onglets des param<61>tres des entit<69>s, propri<72>t<EFBFBD>s, relations, <20>num<75>rations + pr<70>visualisation du
code C++ :
<ul>
<li>sur la partie droite de l'<27>cran permettant d'avoir un acc<63>s rapide <20> la fois sur le
diagramme d'entit<69>s et le d<>tails des param<61>tres de l'<27>l<EFBFBD>ment s<>lectionn<6E> ;</li>
<li>masqu<EFBFBD> sous forme d'oglets permettant d'afficher le diagramme d'entit<69>s en mode plein
<20>cran (valeur par d<>faut).</li>
</ul>
<br />
<img alt="Splitter mode"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_splitter.png" />
<br /><br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="global_settings">Param<EFBFBD>trage de
l'application QxEntityEditor</a></p>
<div class="manual_div_content">
L'acc<63>s au param<61>trage global (pour tous les projets) de l'application QxEntityEditor se fait
par le menu principal <i>Tools &gt;&gt; Global settings</i> :
<br /><br />
<img alt="Global settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_global_settings.png" />
<br />
<ul>
<li>Champ <20> <i>QxOrm library path</i> <20> : chemin d'acc<63>s au r<>pertoire de la biblioth<74>que
QxOrm. Ce param<61>tre est requis pour d<>marrer un export C++ afin de trouver le fichier de
configuration <i>QxOrm.pri</i> (ou <i>QxOrm.cmake</i>). Il est possible de renseigner un
chemin absolu, ou bien d'indiquer une variable d'environnement, par exemple :
<i>$$(QXORM_DIR)</i> ;
</li>
<li>Champ <20> <i>Auto load last opened project at startup</i> <20> : d<>marre QxEntityEditor en
chargeant automatiquement le dernier projet ouvert ;</li>
<li>Champ <20> <i>Display property type in entities viewer</i> <20> : affiche sur le diagramme
d'entit<69>s le type des propri<72>t<EFBFBD>s ;</li>
<li>Champ <20> <i>Use old style to draw relationships</i> <20> : simplifie l'affichage des
relations (<i>1-n</i>, <i>n-1</i>, <i>1-1</i> ou <i>n-n</i>) ;</li>
<li>Champ <20> <i>Disable undo/redo feature</i> <20> : d<>sactive la fonctionnalit<69>
<i>undo/redo</i>, peut <20>tre utile pour optimiser les performances sur des projets
volumineux ;
</li>
<li>Champs <20> <i>Entity/Enum/Comment width</i> <20> : permet de r<>gler la largeur par d<>faut des
<20>l<EFBFBD>ments graphiques.</li>
</ul>
<br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="license_details">Enregistrer un code
licence</a></p>
<div class="manual_div_content">
Sans cl<63> de licence valide, un projet QxEntityEditor est limit<69> <20> 5 entit<69>s par projet.
Afin de supprimer cette limitation, l'acc<63>s <20> l'enregistrement d'un code licence se fait par le
menu principal <i>Help &gt;&gt; License information</i> :
<br /><br />
<img alt="License" src="https://www.qxorm.com/qxentityeditor/resource/qxee_license.png" />
<br /><br />
Il suffit d'entrer la cl<63> de license fournie dans le champ <i>License key</i>, puis d'appuyer
sur le bouton <i>Save</i>.
Un acc<63>s <20> internet est requis pour l'enregistrement d'une cl<63> de licence.
Si aucune erreur n'apparait, la cl<63> de licence est enregistr<74>e et l'application QxEntityEditor
peut alors <20>tre utilis<69>e sans aucune limitation jusqu'<27> la date indiqu<71>e dans le champ
<i>Expiration date</i>.
<br /><br />
<b>Remarque :</b> si une erreur de connexion internet apparait au moment de l'enregistrement,
vous pouvez essayer de cocher la case <i>If you are behind a proxy...</i>.
<br /><br />
<b>Autre remarque :</b> pour acqu<71>rir une cl<63> de licence valide, vous pouvez nous contacter <20>
l'adresse suivante : <a href="mailto:ic-east.com">ic-east.com</a>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="project_params_wnd">Cr<EFBFBD>er/ouvrir un
projet *.qxee</a></p>
<div class="manual_div_content">
La cr<63>ation d'un nouveau projet QxEntityEditor se fait par le menu principal <i>File &gt;&gt;
New project</i> :
<br /><br />
<img alt="Project new"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_project_new.png" />
<br />
<ul>
<li>Champ <20> <i>Project name</i> <20> : nom du projet QxEntityEditor. Le fichier du nouveau
projet portera le m<>me nom avec l'extension <i>*.qxee</i> ;</li>
<li>Champ <20> <i>Project location</i> <20> : chemin d'acc<63>s au fichier associ<63> au projet
QxEntityEditor. Il est possible d'utiliser le bouton "<i>...</i>" afin de s<>lectionner le
r<>pertoire de destination.</li>
</ul>
<br />
L'ouverture d'un projet QxEntityEditor se fait par le menu principal <i>File &gt;&gt; Open
project</i> : il suffit de s<>lectionner un fichier projet avec l'extension <i>*.qxee</i>.
Sous la barre d'outils du menu principal, une liste des projets r<>cents est disponible et permet
de basculer rapidement d'un projet <20> un autre :
<br /><br />
<img alt="Project list"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_project_list.png" />
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3" name="qxee_database">Architecture d'un
fichier projet <i>*.qxee</i> (base de donn<6E>es SQLite)</a></p>
<div class="manual_div_content">
Un fichier projet <i>*.qxee</i> de l'application QxEntityEditor est une base de donn<6E>es
SQLite.<br />
Un m<>me projet peut <20>tre partag<61> sur tous les environnements support<72>s par QxEntityEditor :
Windows, Linux et Mac OS X.<br />
Un fichier projet <i>*.qxee</i> peut <20>tre ouvert par un outil de gestion de base de donn<6E>es
SQLite : par exemple, le plugin gratuit de Firefox <a
href="https://addons.mozilla.org/fr/firefox/addon/sqlite-manager/" target="_blank">SQLite
Manager</a> :
<br /><br />
<img alt="Project database"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_database.png" />
<br /><br />
<b>Remarque :</b> en utilisant la fonctionnalit<69> <a href="#plugin_script">Ex<EFBFBD>cution de
scripts personnalis<69>s avant/apr<70>s ex<65>cution d'un plugin</a>, il est possible par exemple
d'appliquer un script (<i>.bat</i> ou <i>.sh</i>) modifiant certaines donn<6E>es du projet
SQLite <i>*.qxee</i> apr<70>s un import de base de donn<6E>es par exemple.
<br /><br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="project_settings">Param<EFBFBD>trage d'un
projet *.qxee</a></p>
<div class="manual_div_content">
Le param<61>trage d'un projet QxEntityEditor <i>*.qxee</i> se fait par le menu principal <i>Tools
&gt;&gt; Project settings</i> :
<br /><br />
<img alt="Project settings tab 1"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_project_settings_01.png" />
<br /><br />
<ul>
<li>Champ <20> <i>Default entity namespace</i> <20> : espace de nom par d<>faut des entit<69>s <20> leur
cr<63>ation (il est possible de d<>finir un autre espace de nom dans <a
href="#entity_params">l'<27>cran de param<61>trage d'une entit<69></a>) ;</li>
<li>Champ <20> <i>Table name prefix</i> <20> : pr<70>fixe <20> appliquer sur la table associ<63>e <20> une
entit<69> ;</li>
<li>Champ <20> <i>Table name suffix</i> <20> : suffixe <20> appliquer sur la table associ<63>e <20> une
entit<69> ;</li>
<li>Champ <20> <i>Primary key prefix</i> <20> : pr<70>fixe par d<>faut de la cl<63> primaire d'une entit<69>
;</li>
<li>Champ <20> <i>Primary key suffix</i> <20> : suffixe par d<>faut de la cl<63> primaire d'une entit<69>
;</li>
<li>Champ <20> <i>Default primary key type</i> <20> : type C++ par d<>faut pour les cl<63>s primaires ;
</li>
<li>Champ <20> <i>Default property type</i> <20> : type C++ par d<>faut pour les propri<72>t<EFBFBD>s des
entit<69>s.</li>
</ul>
<br />
Le 2<>me onglet de l'<27>cran de param<61>trage d'un projet permet de g<>rer les couleurs des diff<66>rents
<20>l<EFBFBD>ments du diagramme d'entit<69>s au niveau projet :
<br /><br />
<img alt="Project settings tab 2"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_project_settings_02.png" />
<br /><br />
<b>Remarque :</b> les couleurs des <20>l<EFBFBD>ments du diagramme d'entit<69>s peuvent <20>tre g<>r<EFBFBD>es <20>
plusieurs niveaux (du niveau le plus global au plus sp<73>cifique) :
<ul>
<li><a href="#project_settings">Niveau projet</a> : menu principal <i>Tools &gt;&gt; Project
settings</i>, onglet <i>Colors</i> ;</li>
<li><a href="#color_settings_by_namespace">Niveau espace de nom (namespace)</a> : menu
contextuel par clic-droit sur un espace de nom <i>Define colors by namespace</i> ;</li>
<li><a href="#color_settings_by_item">Niveau <20>l<EFBFBD>ment graphique (entit<69>, <20>num<75>ration ou
post-it)</a> : menu contextuel par clic-droit sur l'<27>l<EFBFBD>ment <i>Define entity
colors</i>.</li>
</ul>
<br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="entities">Gestion des entit<69>s</a></p>
<div class="manual_div_content">
Une entit<69> dans l'application QxEntityEditor correspond <20> une table de la base de donn<6E>es, et
correspond <20>galement <20> une classe (persistante et enregistr<74>e dans le contexte QxOrm) dans le
code C++.
L'application QxEntityEditor permet de cr<63>er, modifier, supprimer et cloner une entit<69>.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3" name="entities_create">Cr<EFBFBD>er une
entit<69></a></p>
<div class="manual_div_content">
La cr<63>ation d'une nouvelle entit<69> se fait par :
<ul>
<li>Le menu principal : <i>Actions &gt;&gt; New entity</i> ;</li>
<li>Un menu contextuel sur clic-droit dans le diagramme d'entit<69>s : <i>Entity &gt;&gt; New
entity</i> ;</li>
<li>Le bouton <i>Create a new entity</i> sur l'<27>cran de param<61>trage d'une entit<69> lorsque
aucune entit<69> n'est s<>lectionn<6E>e.</li>
</ul>
<br />
<img alt="Entity new"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_new.png" />
<br /><br />
<b>Remarque :</b> ces actions ouvrent <a href="#entity_params">l'<27>cran de param<61>trage d'une
entit<69></a> en mode cr<63>ation. L'entit<69> sera r<>ellement cr<63><72>e et ajout<75>e au projet
<i>*.qxee</i> au moment de l'enregistrement de l'<27>cran de param<61>trage.
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="entities_modify">Modifier une
entit<69></a></p>
<div class="manual_div_content">
La modification d'une entit<69> se fait par :
<ul>
<li>Le menu principal : <i>Actions &gt;&gt; Modify entity</i> ;</li>
<li>Un menu contextuel sur clic-droit dans le diagramme d'entit<69>s : <i>Entity &gt;&gt;
Modify entity</i> ;</li>
<li>Le double-clic sur le nom d'une entit<69> dans le diagramme.</li>
</ul>
<br />
<img alt="Entity modify"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_modify.png" />
<br /><br />
<b>Remarque :</b> ces actions ouvrent <a href="#entity_params">l'<27>cran de param<61>trage d'une
entit<69></a> en mode modification. Les modifications de l'entit<69> seront r<>ellement
appliqu<71>es au projet <i>*.qxee</i> au moment de l'enregistrement de l'<27>cran de param<61>trage.
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="entities_delete">Supprimer une
entit<69></a></p>
<div class="manual_div_content">
La suppression d'une (ou plusieurs) entit<69> se fait par :
<ul>
<li>Le menu principal : <i>Actions &gt;&gt; Delete entity</i> ;</li>
<li>Un menu contextuel sur clic-droit dans le diagramme d'entit<69>s : <i>Entity &gt;&gt;
Delete entity</i> ;</li>
<li>La touche "<i>Suppr</i>" du clavier lorsqu'une (ou plusieurs) entit<69> est s<>lectionn<6E>e.
</li>
</ul>
<br />
<img alt="Entity delete"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_delete.png" />
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="entities_clone">Cloner une
entit<69></a></p>
<div class="manual_div_content">
Le clonage d'une entit<69> se fait par :
<ul>
<li>Le menu principal : <i>Actions &gt;&gt; Clone entity</i> ;</li>
<li>Un menu contextuel sur clic-droit dans le diagramme d'entit<69>s : <i>Entity &gt;&gt;
Clone entity</i> ;</li>
</ul>
<br />
<img alt="Entity clone"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_clone.png" />
<br /><br />
<b>Remarque :</b> une entit<69> clon<6F>e dispose de toutes les propri<72>t<EFBFBD>s de l'entit<69> source. Les
relations ne sont pas clon<6F>es.
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="entity_params">Param<EFBFBD>tres d'une
entit<69></a></p>
<div class="manual_div_content">
Les param<61>tres de l'entit<69> s<>lectionn<6E>e sont accessibles dans l'onglet de param<61>trage
<i>Entity</i> :
<br /><br />
<img alt="Entity settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_settings.png" />
<br /><br />
Cet <20>cran de param<61>trage est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Entity information (version XX)</i> :</b> la version de l'entit<69> est
incr<63>ment<6E>e <20> chaque <a href="#tag_project_state">historique de projet</a> cr<63><72>.
<ul>
<li>Champ <20> <i>Name</i> <20> : nom de l'entit<69> et de la classe C++ g<>n<EFBFBD>r<EFBFBD>e ;</li>
<li>Champ <20> <i>Table name</i> <20> : nom de la table en base de donn<6E>es associ<63>e <20> l'entit<69>
(utilise le <a href="#project_settings">pr<EFBFBD>fixe/suffixe par d<>faut d<>fini dans les
param<61>tres du projet</a>) ;</li>
<li>Champ <20> <i>Namespace</i> <20> : espace de nom de l'entit<69> et de la classe C++ associ<63>e,
chaque sous-namespace doit <20>tre s<>par<61> par <i>::</i>, par exemple :
<i>ns1::ns2::ns3</i> ;
</li>
<li>Champ <20> <i>Description</i> <20> : description de l'entit<69> (apparait dans le code C++
g<>n<EFBFBD>r<EFBFBD>) ;</li>
<li>Champ <20> <i>Inherit from</i> <20> : entit<69> parente (ou classe C++ de base) : l'entit<69>
fille r<>cup<75>re automatiquement la cl<63> primaire et la liste des propri<72>t<EFBFBD>s d<>finies dans
l'entit<69> parente ;</li>
<li>Champ <20> <i>Read only</i> <20> : si coch<63>, alors entit<69> en lecture seule : la biblioth<74>que
QxOrm autorise uniquement des requ<71>tes SQL de type <i>SELECT</i> sur l'entit<69> (<a
href="./manual.html#manual_350">fonctions de r<>cup<75>ration/fetch du namespace
<i>qx::dao</i> de QxOrm</a>). Si coch<63>, alors les requ<71>tes SQL de type
<i>INSERT</i>, <i>UPDATE</i> et <i>DELETE</i> ne sont pas disponibles. Ce param<61>tre
peut par exemple <20>tre utilis<69> pour mapper une entit<69> <20> une vue (lecture seule) de la
base de donn<6E>es ;
</li>
<li>Champ <20> <i>Abstract</i> <20> : une entit<69> abstraite n'a pas de table associ<63>e dans la
base de donn<6E>es, et la classe C++ g<>n<EFBFBD>r<EFBFBD>e ne peut pas <20>tre instanti<74>e (<a
href="./manual.html#manual_510">classe abstraite</a>) : ce param<61>tre peut <20>tre utile
par exemple pour cr<63>er des entit<69>s parentes contenant une liste de propri<72>t<EFBFBD>s communes
<20> toutes les autres entit<69>s ;</li>
<li>Champ <20> <i>Soft delete column</i> <20> : si vide, une suppression de l'entit<69> en base de
donn<6E>es correspond <20> une suppression physique. Si non vide, ce champ correspond <20> <a
href="./manual.html#manual_3400">la colonne en base de donn<6E>es utilis<69>e pour
effectuer une suppression logique</a> (conserve les informations de suppression et
l'entit<69> reste en base de donn<6E>es).</li>
<li>Champ <20> <i>Validator method name</i> <20> : nom de la m<>thode de validation (par exemple
<i>IsValid</i>) utilis<69>e pour valider une entit<69> avant insertion et modification en
base de donn<6E>es. L'impl<70>mentation de la m<>thode de validation est <20> la charge du
d<>veloppeur dans son propre fichier source <i>*.cpp</i> : voir <a
href="./manual.html#manual_420">le module QxValidator de la biblioth<74>que QxOrm</a>
pour plus de d<>tails.
</li>
</ul>
<br />
<b>-- Section <i>Entity triggers</i> :</b>
<ul>
<li>Cases <20> cocher <20> <i>Before fetch</i>, <i>After fetch</i>, <i>Before insert</i>, etc...
<20> : si coch<63>(s), ajoute les d<>finitions dans le code C++ des m<>thodes
<i>onBeforeFetch()</i>, <i>onAfterFetch()</i>, <i>onBeforeInsert()</i>, etc...
L'impl<70>mentation des m<>thodes de trigger est <20> la charge du d<>veloppeur dans son propre
fichier source <i>*.cpp</i> : voir <a href="./manual.html#manual_410">le manuel
utilisateur de la biblioth<74>que QxOrm</a> pour plus de d<>tails.
</li>
</ul>
<br />
<b>-- Section <i>Primary key property</i> :</b> d<>finition rapide de la cl<63> primaire (<a
href="#property_params">un param<61>trage d<>taill<6C> de la cl<63> primaire de l'entit<69> est
disponible</a>).
<ul>
<li>Champ <20> <i>Name</i> <20> : nom de la propri<72>t<EFBFBD> cl<63> primaire (ou identifiant) de l'entit<69>,
et nom de la donn<6E>e membre correspondante en C++ (utilise le <a
href="#project_settings">pr<EFBFBD>fixe/suffixe par d<>faut d<>fini dans les param<61>tres du
projet</a>) ;</li>
<li>Champ <20> <i>Column name</i> <20> : nom de la colonne de la cl<63> primaire dans la base de
donn<6E>es (si vide, alors <i>Column name</i> == <i>Name</i>). Pour <a
href="./manual.html#manual_3010">d<EFBFBD>finir une cl<63> primaire sur plusieurs
colonnes</a>, la liste des noms de colonnes doit <20>tre s<>par<61>e par le caract<63>re
<i>|</i> , par exemple : <i>film_id|category_id</i> ;
</li>
<li>Champ <20> <i>Type</i> <20> : type de la propri<72>t<EFBFBD> C++ (le type de la cl<63> primaire par
d<>faut peut <20>tre d<>fini <a href="#project_settings">dans les param<61>tres du projet</a>).
Pour <a href="./manual.html#manual_3010">d<EFBFBD>finir une cl<63> primaire sur plusieurs
colonnes</a>, il faut utiliser les types <i>boost::tuple</i>, <i>std::tuple</i>,
<i>QPair</i> ou <i>std::pair</i> ;
</li>
<li>Champ <20> <i>Description</i> <20> : description de la cl<63> primaire (apparait dans le code
C++ g<>n<EFBFBD>r<EFBFBD>).</li>
</ul>
<br />
<b>-- Section <i>List of properties</i> :</b> d<>finition rapide de la liste des propri<72>t<EFBFBD>s
(<a href="#property_params">un param<61>trage d<>taill<6C> des propri<72>t<EFBFBD>s de l'entit<69> est
disponible</a>). Cette liste peut <20>tre ordonn<6E>e par les 2 boutons <i>fl<EFBFBD>che haut</i> et
<i>fl<EFBFBD>che bas</i>.
<ul>
<li>Colonne <20> <i>Name</i> <20> : nom de la propri<72>t<EFBFBD> de l'entit<69>, et nom de la donn<6E>e membre
associ<63>e dans le code C++ ;</li>
<li>Colonne <20> <i>Type</i> <20> : type C++ de la propri<72>t<EFBFBD> (le type par d<>faut peut <20>tre
d<>fini <a href="#project_settings">dans les param<61>tres du projet</a>) ;</li>
<li>Colonne <20> <i>Decoration</i> <20> : ajoute une d<>coration au type C++ (par exemple <a
href="./manual.html#manual_4300"><i>boost::optional</i> pour g<>rer les valeurs
<i>NULL</i></a>) ;</li>
<li>Colonne <20> <i>Collection</i> <20> : si la propri<72>t<EFBFBD> est une liste, alors d<>fini le type de
liste C++ ;</li>
<li>Colonne <20> <i>Default value</i> <20> : valeur par d<>faut de la propri<72>t<EFBFBD> ;</li>
<li>Colonne <20> <i>Index</i> <20> : optimisation des requ<71>tes SQL de type <i>SELECT</i> pour
les recherches en base de donn<6E>es ;</li>
<li>Colonne <20> <i>Transient</i> <20> : si coch<63>, alors la donn<6E>e membre C++ n'est pas mapp<70>e <20>
une colonne de la base de donn<6E>es (la propri<72>t<EFBFBD> est enregistr<74>e dans le contexte QxOrm
mais n'est pas persistante) ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la propri<72>t<EFBFBD> de la liste.</li>
</ul>
<br />
<b>-- Section <i>List of relationships</i> :</b> d<>finition rapide de la liste des relations
(<a href="#relationship_params">un param<61>trage d<>taill<6C> des relations de l'entit<69> est
disponible</a>). Cette liste peut <20>tre ordonn<6E>e par les 2 boutons <i>fl<EFBFBD>che haut</i> et
<i>fl<EFBFBD>che bas</i>.
<ul>
<li>Colonne <20> <i>Name</i> <20> : nom de la relation, et nom de la donn<6E>e membre associ<63>e dans
le code C++ ;</li>
<li>Colonne <20> <i>Target</i> <20> : entit<69> cible ;</li>
<li>Colonne <20> <i>n-1</i> <20> : type de relation <i>many-to-one</i> ;</li>
<li>Colonne <20> <i>1-n</i> <20> : type de relation <i>one-to-many</i> ;</li>
<li>Colonne <20> <i>n-n</i> <20> : type de relation <i>many-to-many</i> ;</li>
<li>Colonne <20> <i>1-1</i> <20> : type de relation <i>one-to-one</i> ;</li>
<li>Colonne <20> <i>Decoration</i> <20> : ajoute une d<>coration au type C++ (pour les relations,
la biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Colonne <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i>
et <i>n-n</i>), alors d<>fini le type de liste C++ ;</li>
<li>Colonne <20> <i>Foreign key</i> <20> : cl<63> <20>trang<6E>re de la relation : nom d'une propri<72>t<EFBFBD> de
l'entit<69> cible ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la relation de la liste.</li>
</ul>
<br />
<b>-- Section <i>List of meta-data</i> :</b> les m<>ta-donn<6E>es permettent d'ajouter des
param<61>tres suppl<70>mentaires et sont accessibles dans le code C++ (<a
href="./manual.html#manual_70">moteur d'introspection de QxOrm</a>) et <a
href="#js_engine_functions_meta_data">le moteur Javascript de personnalisation des exports
de QxEntityEditor</a>.
<ul>
<li>Colonne <20> <i>Key</i> <20> : cl<63> de la m<>ta-donn<6E>e ;</li>
<li>Colonne <20> <i>Value</i> <20> : valeur de la m<>ta-donn<6E>e ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la m<>ta-donn<6E>e de la liste.</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="color_settings_by_item">Couleur
associ<63>e <20> une entit<69></a></p>
<div class="manual_div_content">
Les couleurs d'une entit<69> peuvent <20>tre modifi<66>es par le menu contextuel sur un clic-droit sur
une entit<69> <i>Define entity colors</i> :
<br /><br />
<img alt="Entity colors"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_entity_colors.png" />
<br /><br />
<b>Remarque :</b> les couleurs des <20>l<EFBFBD>ments du diagramme d'entit<69>s peuvent <20>tre g<>r<EFBFBD>es <20>
plusieurs niveaux (du niveau le plus global au plus sp<73>cifique) :
<ul>
<li><a href="#project_settings">Niveau projet</a> : menu principal <i>Tools &gt;&gt;
Project settings</i>, onglet <i>Colors</i> ;</li>
<li><a href="#color_settings_by_namespace">Niveau espace de nom (namespace)</a> : menu
contextuel par clic-droit sur un espace de nom <i>Define colors by namespace</i> ;</li>
<li><a href="#color_settings_by_item">Niveau <20>l<EFBFBD>ment graphique (entit<69>, <20>num<75>ration ou
post-it)</a> : menu contextuel par clic-droit sur l'<27>l<EFBFBD>ment <i>Define entity
colors</i>.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="properties">Gestion des propri<72>t<EFBFBD>s
associ<63>es <20> une entit<69></a></p>
<div class="manual_div_content">
Une propri<72>t<EFBFBD> dans l'application QxEntityEditor correspond <20> une colonne d'une table de la base
de donn<6E>es, et correspond <20>galement <20> une donn<6E>e membre d'une classe C++ (enregistr<74>e dans le
contexte QxOrm).
L'application QxEntityEditor permet de cr<63>er, modifier, supprimer et ordonner les propri<72>t<EFBFBD>s
d'une entit<69>.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="properties_actions">Ajouter/modifier/supprimer une propri<72>t<EFBFBD></a></p>
<div class="manual_div_content">
L'ajout et la suppression d'une propri<72>t<EFBFBD> se fait depuis <a href="#entity_params">l'<27>cran de
param<61>trage d'une entit<69></a> : la section <i>List of properties</i> de cet <20>cran de
param<61>trage permet d'ajouter et supprimer des propri<72>t<EFBFBD>s.
Il est <20>galement possible d'ordonner cette liste pour positionner les propri<72>t<EFBFBD>s dans l'ordre
voulu.
<br /><br />
La modification d'une propri<72>t<EFBFBD> est accessible par un bouton qui s'affiche sur le diagramme
d'entit<69>s lorsque la souris est positionn<6E>e sur une propri<72>t<EFBFBD> :
<br /><br />
<img alt="Property settings access"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_property_settings_access.png" />
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="property_params">Param<EFBFBD>trage
d<>taill<6C> d'une propri<72>t<EFBFBD></a></p>
<div class="manual_div_content">
Les param<61>tres d<>taill<6C>s d'une propri<72>t<EFBFBD> s<>lectionn<6E>e sont accessibles dans l'onglet de
param<61>trage <i>Property</i> :
<br /><br />
<img alt="Property settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_property_settings.png" />
<br /><br />
Cet <20>cran de param<61>trage est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Property information (version XX)</i> :</b> la version de la propri<72>t<EFBFBD>
d<>pend du niveau d'<a href="#tag_project_state">historique du projet</a>.
<ul>
<li>Champ <20> <i>Name</i> <20> : nom de la propri<72>t<EFBFBD> de l'entit<69>, et nom de la donn<6E>e membre
associ<63>e dans le code C++ ;</li>
<li>Champ <20> <i>Column name</i> <20> : nom de la colonne dans la base de donn<6E>es (si vide,
alors <i>Column name</i> == <i>Name</i>) ;</li>
<li>Champ <20> <i>Description</i> <20> : description de la propri<72>t<EFBFBD> (apparait dans le code C++
g<>n<EFBFBD>r<EFBFBD>) ;</li>
<li>Champ <20> <i>Index</i> <20> : optimisation des requ<71>tes SQL de type <i>SELECT</i> pour les
recherches en base de donn<6E>es ;</li>
<li>Champ <20> <i>Transient</i> <20> : si coch<63>, alors la donn<6E>e membre C++ n'est pas mapp<70>e <20>
une colonne de la base de donn<6E>es (la propri<72>t<EFBFBD> est enregistr<74>e dans le contexte QxOrm
mais n'est pas persistante) ;</li>
<li>Champ <20> <i>Serializable</i> <20> : si coch<63>, la propri<72>t<EFBFBD> est prise en compte par <a
href="./manual.html#manual_60">le moteur de s<>rialisation de la biblioth<74>que
QxOrm</a> ;</li>
<li>Champ <20> <i>Obsolete</i> <20> : cocher cette option pour supprimer une propri<72>t<EFBFBD> <a
href="./manual.html#manual_605">sans casser la compatibilit<69> ascendante du moteur de
s<>rialisation de la biblioth<74>que QxOrm</a> : la propri<72>t<EFBFBD> devient priv<69>e sans
accesseur <i>Get/Set</i>.</li>
</ul>
<br />
<b>-- Section <i>Property type</i> :</b>
<ul>
<li>Champ <20> <i>Type</i> <20> : type C++ de la propri<72>t<EFBFBD> (le type par d<>faut peut <20>tre d<>fini
<a href="#project_settings">dans les param<61>tres du projet</a>) ;
</li>
<li>Champ <20> <i>Decoration</i> <20> : ajoute une d<>coration au type C++ (par exemple <a
href="./manual.html#manual_4300"><i>boost::optional</i> pour g<>rer les valeurs
<i>NULL</i></a>) ;</li>
<li>Champ <20> <i>Default value</i> <20> : valeur par d<>faut de la propri<72>t<EFBFBD> ;</li>
<li>Champ <20> <i>Collection</i> <20> : si la propri<72>t<EFBFBD> est une liste, alors d<>fini le type de
liste C++.</li>
</ul>
<br />
<b>-- Section <i>Property validation</i> :</b> validation d'une propri<72>t<EFBFBD> avant
insertion/modification en base de donn<6E>es par <a href="./manual.html#manual_420">le module
QxValidator de la biblioth<74>que QxOrm</a>.
<ul>
<li>Champ <20> <i>Min value</i> <20> : valeur minimale autoris<69>e pour une propri<72>t<EFBFBD> de type
num<75>rique ;</li>
<li>Champ <20> <i>Max value</i> <20> : valeur maximale autoris<69>e pour une propri<72>t<EFBFBD> de type
num<75>rique ;</li>
<li>Champ <20> <i>Min length</i> <20> : longueur minimale autoris<69>e pour une propri<72>t<EFBFBD> de type
chaine de caract<63>res ;</li>
<li>Champ <20> <i>Max length</i> <20> : longueur maximale autoris<69>e pour une propri<72>t<EFBFBD> de type
chaine de caract<63>res ;</li>
<li>Champ <20> <i>Regular expression</i> <20> : expression r<>guli<6C>re utilis<69>e pour valider la
valeur d'une propri<72>t<EFBFBD> ;</li>
<li>Champ <20> <i>Not NULL</i> <20> : v<>rifie que <a href="./manual.html#manual_430">la valeur
de la propri<72>t<EFBFBD> n'est pas NULL</a> ;</li>
<li>Champ <20> <i>Unique</i> <20> : valeur unique en base de donn<6E>es : 2 lignes dans la table ne
peuvent avoir la m<>me valeur sur la colonne associ<63>e <20> cette propri<72>t<EFBFBD>.</li>
</ul>
<br />
<b>-- Section <i>Advanced</i> :</b>
<ul>
<li>Champ <20> <i>Accessibility</i> <20>, valeurs <20> <i>public</i>, <i>protected</i> ou
<i>private</i> <20> : une propri<72>t<EFBFBD> <i>public</i> est accessible sans accesseur
<i>Get/Set</i>, une propri<72>t<EFBFBD> <i>protected</i> est accessible uniquement par les
classes d<>riv<69>es, une propri<72>t<EFBFBD> <i>private</i> est accessible uniquement par les
accesseurs <i>Get/Set</i> ;
</li>
<li>Champ <20> <i>SQL type</i> <20> : la biblioth<74>que QxOrm <a
href="./manual.html#manual_475">associe automatiquement un type SQL en fonction du
type C++</a> de la propri<72>t<EFBFBD>, il est possible de surcharger le type SQL par d<>faut
avec ce param<61>tre ;</li>
<li>Champ <20> <i>SQL alias</i> <20> : force un alias sur cette colonne utilis<69> par la
biblioth<74>que QxOrm lors de la construction des requ<71>tes SQL ;</li>
<li>Champ <20> <i>Format</i> <20> : d<>fini le format (syntaxe <i>printf</i>) de la propri<72>t<EFBFBD>
pour le stockage en base de donn<6E>es (peut <20>tre utile pour g<>rer les dates et heures par
exemple) ;</li>
<li>Champ <20> <i>Get/Set accessors</i> <20> : si coch<63>, des accesseurs <i>Get/Set</i> seront
disponibles dans la classe C++ pour acc<63>der/modifier la valeur de la propri<72>t<EFBFBD> ;</li>
<li>Champ <20> <i>Read only</i> <20> : si coch<63>, un seul accesseur <i>Get</i> est disponible
dans la classe C++, ce qui rend la propri<72>t<EFBFBD> en lecture seule ;</li>
<li>Champ <20> <i>Get method implementation</i> <20> : permet de surcharger l'impl<70>mentation par
d<>faut de la m<>thode <i>Get</i> dans la classe C++ pour acc<63>der <20> la valeur de la
propri<72>t<EFBFBD> ;</li>
<li>Champ <20> <i>Set method implementation</i> <20> : permet de surcharger l'impl<70>mentation par
d<>faut de la m<>thode <i>Set</i> dans la classe C++ pour modifier la valeur de la
propri<72>t<EFBFBD>.</li>
</ul>
<br />
<b>-- Section <i>List of meta-data</i> :</b> les m<>ta-donn<6E>es permettent d'ajouter des
param<61>tres suppl<70>mentaires et sont accessibles dans le code C++ (<a
href="./manual.html#manual_70">moteur d'introspection de QxOrm</a>) et <a
href="#js_engine_functions_meta_data">le moteur Javascript de personnalisation des exports
de QxEntityEditor</a>.
<ul>
<li>Colonne <20> <i>Key</i> <20> : cl<63> de la m<>ta-donn<6E>e ;</li>
<li>Colonne <20> <i>Value</i> <20> : valeur de la m<>ta-donn<6E>e ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la m<>ta-donn<6E>e de la liste.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="relationships">Gestion des relations
entre entit<69>s</a></p>
<div class="manual_div_content">
Une relation entre 2 entit<69>s (<i>1-n</i>, <i>n-1</i>, <i>1-1</i> ou <i>n-n</i>) dans
l'application QxEntityEditor permet de lier 2 tables dans la base de donn<6E>es, et 2 classes dans
le code C++.
L'application QxEntityEditor permet de cr<63>er, modifier, supprimer et ordonner les relations
d'une entit<69>.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="relationships_actions">Ajouter/modifier/supprimer une relation</a></p>
<div class="manual_div_content">
L'ajout et la suppression d'une relation se fait depuis <a href="#entity_params">l'<27>cran de
param<61>trage d'une entit<69></a> : la section <i>List of relationships</i> de cet <20>cran de
param<61>trage permet d'ajouter et supprimer des relations.
Il est <20>galement possible d'ordonner cette liste pour positionner les relations dans l'ordre
voulu.
<br /><br />
La modification d'une relation est accessible par un bouton qui s'affiche sur le diagramme
d'entit<69>s lorsque la souris est positionn<6E>e sur une relation :
<br /><br />
<img alt="Relation settings access"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_relation_settings_access.png" />
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="relationship_params">Param<EFBFBD>trage
d<>taill<6C> d'une relation</a></p>
<div class="manual_div_content">
Les param<61>tres d<>taill<6C>s d'une relation s<>lectionn<6E>e sont accessibles dans l'onglet de
param<61>trage <i>Relationship</i> :
<br /><br />
<img alt="Relation settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_relation_settings.png" />
<br /><br />
Cet <20>cran de param<61>trage est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Relationship information (version XX)</i> :</b> la version de la relation
d<>pend du niveau d'<a href="#tag_project_state">historique du projet</a>.
<ul>
<li>Champ <20> <i>Name</i> <20> : nom de la relation, et nom de la donn<6E>e membre associ<63>e dans
le code C++ ;</li>
<li>Champ <20> <i>Target</i> <20> : entit<69> cible ;</li>
<li>Champ <20> <i>Description</i> <20> : description de la relation (apparait dans le code C++
g<>n<EFBFBD>r<EFBFBD>) ;</li>
<li>Champs <20> <i>1-n</i>, <i>n-1</i>, <i>1-1</i> ou <i>n-n</i> <20> : <a
href="./manual.html#manual_380">type de relation</a>, suivant le type s<>lectionn<6E>
certains param<61>tres sont actifs ou inactifs ;</li>
<li>Champ <20> <i>Column name</i> <20> : actif uniquement pour les relations de type <i>n-1</i>,
nom de la colonne dans la base de donn<6E>es (si vide, alors <i>Column name</i> ==
<i>Name</i>) ;
</li>
<li>Champ <20> <i>Decoration</i> <20> : ajoute une d<>coration au type C++ (pour les relations,
la biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Champ <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i>
et <i>n-n</i>), alors d<>fini le type de liste C++ ;</li>
<li>Champ <20> <i>Foreign key</i> <20> : cl<63> <20>trang<6E>re de la relation : nom d'une propri<72>t<EFBFBD> de
l'entit<69> cible ;</li>
<li>Champ <20> <i>FK owner</i> <20> : utilis<69> uniquement pour les relations de type <i>n-n</i> ;
</li>
<li>Champ <20> <i>Extra-table</i> <20> : utilis<69> uniquement pour les relations de type
<i>n-n</i>, correspond au nom de la table qui lie les 2 entit<69>s ;
</li>
<li>Champ <20> <i>Index</i> <20> : optimisation des requ<71>tes SQL de type <i>SELECT</i> pour les
recherches en base de donn<6E>es ;</li>
<li>Champ <20> <i>Serializable</i> <20> : si coch<63>, la relation est prise en compte par <a
href="./manual.html#manual_60">le moteur de s<>rialisation de la biblioth<74>que
QxOrm</a> ;</li>
<li>Champ <20> <i>Obsolete</i> <20> : cocher cette option pour supprimer une relation <a
href="./manual.html#manual_605">sans casser la compatibilit<69> ascendante du moteur de
s<>rialisation de la biblioth<74>que QxOrm</a> : la relation devient priv<69>e sans
accesseur <i>Get/Set</i>.</li>
</ul>
<br />
<b>-- Section <i>Advanced</i> :</b>
<ul>
<li>Champ <20> <i>Accessibility</i> <20>, valeurs <20> <i>public</i>, <i>protected</i> ou
<i>private</i> <20> : une relation <i>public</i> est accessible sans accesseur
<i>Get/Set</i>, une relation <i>protected</i> est accessible uniquement par les classes
d<>riv<69>es, une relation <i>private</i> est accessible uniquement par les accesseurs
<i>Get/Set</i> ;
</li>
<li>Champ <20> <i>Get/Set accessors</i> <20> : si coch<63>, des accesseurs <i>Get/Set</i> seront
disponibles dans la classe C++ pour acc<63>der/modifier la valeur de la relation ;</li>
<li>Champ <20> <i>Read only</i> <20> : si coch<63>, un seul accesseur <i>Get</i> est disponible
dans la classe C++, ce qui rend la relation en lecture seule ;</li>
<li>Champ <20> <i>Get method implementation</i> <20> : permet de surcharger l'impl<70>mentation par
d<>faut de la m<>thode <i>Get</i> dans la classe C++ pour acc<63>der <20> la valeur de la
relation ;</li>
<li>Champ <20> <i>Set method implementation</i> <20> : permet de surcharger l'impl<70>mentation par
d<>faut de la m<>thode <i>Set</i> dans la classe C++ pour modifier la valeur de la
relation.</li>
</ul>
<br />
<b>-- Section <i>List of meta-data</i> :</b> les m<>ta-donn<6E>es permettent d'ajouter des
param<61>tres suppl<70>mentaires et sont accessibles dans le code C++ (<a
href="./manual.html#manual_70">moteur d'introspection de QxOrm</a>) et <a
href="#js_engine_functions_meta_data">le moteur Javascript de personnalisation des exports
de QxEntityEditor</a>.
<ul>
<li>Colonne <20> <i>Key</i> <20> : cl<63> de la m<>ta-donn<6E>e ;</li>
<li>Colonne <20> <i>Value</i> <20> : valeur de la m<>ta-donn<6E>e ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la m<>ta-donn<6E>e de la liste.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="enums">Gestion des <20>num<75>rations</a>
</p>
<div class="manual_div_content">
Une <20>num<75>ration dans l'application QxEntityEditor correspond <20> une liste de valeurs disponibles
c<>t<EFBFBD> code C++ (pour le moment pas de notion c<>t<EFBFBD> base de donn<6E>es : converti en valeur
num<75>rique).
L'application QxEntityEditor permet de cr<63>er, modifier, supprimer et cloner une <20>num<75>ration.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="enums_actions">Ajouter/modifier/supprimer/cloner une <20>num<75>ration</a></p>
<div class="manual_div_content">
L'ajout, la modification, la suppression et le clonage d'une <20>num<75>ration se fait de la m<>me
fa<66>on que pour <a href="#entities">une entit<69></a>.<br />
Une <20>num<75>ration dispose des m<>mes <a href="#entities">menus qu'une entit<69></a>.
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="enumeration_params">Param<EFBFBD>tres
d'une <20>num<75>ration</a></p>
<div class="manual_div_content">
Les param<61>tres de l'<27>num<75>ration s<>lectionn<6E>e sont accessibles dans l'onglet de param<61>trage
<i>Enumeration</i> :
<br /><br />
<img alt="Enumeration settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_enum_settings.png" />
<br /><br />
Cet <20>cran de param<61>trage est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Enumeration information (version XX)</i> :</b> la version de l'<27>num<75>ration
est incr<63>ment<6E>e <20> chaque <a href="#tag_project_state">historique de projet</a> cr<63><72>.
<ul>
<li>Champ <20> <i>Name</i> <20> : nom de l'<27>num<75>ration et de la classe C++ g<>n<EFBFBD>r<EFBFBD>e ;</li>
<li>Champ <20> <i>Description</i> <20> : description de l'<27>num<75>ration (apparait dans le code C++
g<>n<EFBFBD>r<EFBFBD>) ;</li>
<li>Champ <20> <i>Namespace</i> <20> : espace de nom de l'<27>num<75>ration et de la classe C++
associ<63>e, chaque sous-namespace doit <20>tre s<>par<61> par <i>::</i>, par exemple :
<i>ns1::ns2::ns3</i> ;
</li>
<li>Champ <20> <i>Use Qt macro Q_ENUM</i> <20> : utilise <a
href="http://doc.qt.io/qt-5/qobject.html#Q_ENUM" target="_blank">la macro Q_ENUM
fournie par Qt</a> pour d<>finir une <20>num<75>ration compatible avec le moteur
d'introspection de Qt ;</li>
</ul>
<br />
<b>-- Section <i>List of values</i> :</b> liste des valeurs de l'<27>num<75>ration.
<ul>
<li>Colonne <20> <i>Key</i> <20> : cl<63> associ<63> <20> la valeur ;</li>
<li>Colonne <20> <i>Value</i> <20> : valeur ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la valeur de la liste.</li>
</ul>
<br />
<b>-- Section <i>List of meta-data</i> :</b> les m<>ta-donn<6E>es permettent d'ajouter des
param<61>tres suppl<70>mentaires et sont accessibles dans le code C++ (<a
href="./manual.html#manual_70">moteur d'introspection de QxOrm</a>) et <a
href="#js_engine_functions_meta_data">le moteur Javascript de personnalisation des exports
de QxEntityEditor</a>.
<ul>
<li>Colonne <20> <i>Key</i> <20> : cl<63> de la m<>ta-donn<6E>e ;</li>
<li>Colonne <20> <i>Value</i> <20> : valeur de la m<>ta-donn<6E>e ;</li>
<li>Bouton <20> <i>Delete</i> <20> : supprime la m<>ta-donn<6E>e de la liste.</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="enums_colors">Couleur associ<63>e <20>
une <20>num<75>ration</a></p>
<div class="manual_div_content">
Les couleurs d'une <20>num<75>ration peuvent <20>tre modifi<66>es par le menu contextuel sur un
clic-droit sur une <20>num<75>ration <i>Define enumeration colors</i> :
<br /><br />
<img alt="Enumeration colors"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_enum_colors.png" />
<br /><br />
<b>Remarque :</b> les couleurs des <20>l<EFBFBD>ments du diagramme d'entit<69>s peuvent <20>tre g<>r<EFBFBD>es <20>
plusieurs niveaux (du niveau le plus global au plus sp<73>cifique) :
<ul>
<li><a href="#project_settings">Niveau projet</a> : menu principal <i>Tools &gt;&gt;
Project settings</i>, onglet <i>Colors</i> ;</li>
<li><a href="#color_settings_by_namespace">Niveau espace de nom (namespace)</a> : menu
contextuel par clic-droit sur un espace de nom <i>Define colors by namespace</i> ;</li>
<li><a href="#color_settings_by_item">Niveau <20>l<EFBFBD>ment graphique (entit<69>, <20>num<75>ration ou
post-it)</a> : menu contextuel par clic-droit sur l'<27>l<EFBFBD>ment <i>Define entity
colors</i>.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="namespace">Gestion des espaces de nom
(namespace)</a></p>
<div class="manual_div_content">
Un espace de nom (ou namespace) dans l'application QxEntityEditor permet de regrouper plusieurs
entit<69>s et <20>num<75>rations dans une m<>me zone.
C<>t<EFBFBD> base de donn<6E>es, un espace de nom repr<70>sente g<>n<EFBFBD>ralement un sch<63>ma.
C<>t<EFBFBD> code C++, un espace de nom regroupe plusieurs classes ou fonctions C++ dans une m<>me zone.
<br /><br />
La notion d'espace de nom est utilis<69>e par la fonction : <a
href="#organize_diagram_layout">Organisation automatique du diagramme d'entit<69>s</a> (permet
un regroupement automatique).
<br /><br />
La gestion des espaces de nom dans QxEntityEditor se fait depuis l'arborescence du projet :
<br /><br />
<img alt="Namespace menu"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_namespace_menu.png" />
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3" name="rename_namespace">Renommer un
espace de nom</a></p>
<div class="manual_div_content">
Pour renommer un espace de nom, il faut faire un clic-droit sur l'arborescence du projet,
puis menu contextuel <i>Move entities to another namespace</i> :
<br /><br />
<img alt="Namespace rename"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_namespace_rename.png" />
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="color_settings_by_namespace">Gestion des couleurs d'un espace de nom</a></p>
<div class="manual_div_content">
Pour d<>finir les couleurs des <20>l<EFBFBD>ments d'un espace de nom, il faut faire un clic-droit sur
l'arborescence du projet, puis menu contextuel <i>Define colors by namespace</i> :
<br /><br />
<img alt="Namespace colors"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_namespace_colors.png" />
<br /><br />
La partie gauche de l'<27>cran liste tous les espaces de nom disponibles et d<>finis dans le
projet.<br />
La partie droite permet de d<>finir les couleurs des <20>l<EFBFBD>ments faisant partie de l'espace de
nom.
Il est <20>galement possible de d<>finir une couleur de fond (de pr<70>f<EFBFBD>rence, une couleur claire),
permettant de regrouper visuellement les <20>l<EFBFBD>ments dans le diagramme d'entit<69>s.
<br /><br />
<b>Remarque :</b> les couleurs des <20>l<EFBFBD>ments du diagramme d'entit<69>s peuvent <20>tre g<>r<EFBFBD>es <20>
plusieurs niveaux (du niveau le plus global au plus sp<73>cifique) :
<ul>
<li><a href="#project_settings">Niveau projet</a> : menu principal <i>Tools &gt;&gt;
Project settings</i>, onglet <i>Colors</i> ;</li>
<li><a href="#color_settings_by_namespace">Niveau espace de nom (namespace)</a> : menu
contextuel par clic-droit sur un espace de nom <i>Define colors by namespace</i> ;</li>
<li><a href="#color_settings_by_item">Niveau <20>l<EFBFBD>ment graphique (entit<69>, <20>num<75>ration ou
post-it)</a> : menu contextuel par clic-droit sur l'<27>l<EFBFBD>ment <i>Define entity
colors</i>.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="comment_params">Gestion des notes (ou
post-it)</a></p>
<div class="manual_div_content">
Une note (ou post-it) dans l'application QxEntityEditor permet de coller une <20>tiquette dans le
diagramme d'entit<69>s pour fournir des informations sur le mod<6F>le de donn<6E>es ou le projet en
cours.
Cette note peut <20>tre positionn<6E>e n'importe o<> dans le diagramme d'entit<69>s.
Une note dispose d'un titre et d'un texte libre. Il est possible d'<27>crire du texte au format
HTML pour ajouter des couleurs, mettre en gras, en italique, etc...
<br /><br />
L'application QxEntityEditor permet de cr<63>er, modifier, supprimer et cloner une note.
<br /><br />
<img alt="Post-it / comments"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_post_it.png" />
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="comments_actions">Ajouter/modifier/supprimer/cloner une note</a></p>
<div class="manual_div_content">
L'ajout, la modification, la suppression et le clonage d'une note se fait de la m<>me fa<66>on
que pour <a href="#entities">une entit<69></a>.<br />
Une note dispose des m<>mes <a href="#entities">menus qu'une entit<69></a> (il suffit de
remplacer le terme <i>entity</i> par <i>comment</i> dans les menus).
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="comments_colors">Couleur associ<63>e
<20> une note</a></p>
<div class="manual_div_content">
Les couleurs d'une note peuvent <20>tre modifi<66>es par le menu contextuel sur un clic-droit sur
une note <i>Define comment colors</i> :
<br /><br />
<img alt="Post-it colors"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_post_it_colors.png" />
<br /><br />
<b>Remarque :</b> les couleurs des <20>l<EFBFBD>ments du diagramme d'entit<69>s peuvent <20>tre g<>r<EFBFBD>es <20>
plusieurs niveaux (du niveau le plus global au plus sp<73>cifique) :
<ul>
<li><a href="#project_settings">Niveau projet</a> : menu principal <i>Tools &gt;&gt;
Project settings</i>, onglet <i>Colors</i> ;</li>
<li><a href="#color_settings_by_namespace">Niveau espace de nom (namespace)</a> : menu
contextuel par clic-droit sur un espace de nom <i>Define colors by namespace</i> ;</li>
<li><a href="#color_settings_by_item">Niveau <20>l<EFBFBD>ment graphique (entit<69>, <20>num<75>ration ou
post-it)</a> : menu contextuel par clic-droit sur l'<27>l<EFBFBD>ment <i>Define entity
colors</i>.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="organize_diagram_layout">Organisation
automatique du diagramme d'entit<69>s</a></p>
<div class="manual_div_content">
Une fonction permet de regrouper automatiquement les <20>l<EFBFBD>ments du diagramme d'entit<69>s en fonction
des espaces de nom, et en fonction des relations entre entit<69>s : menu principal <i>View &gt;&gt;
Organize diagram layout</i>.
Cette fonction est particuli<6C>rement utile pour organiser le diagramme d'entit<69>s apr<70>s <a
href="#import_plugins">un processus d'import</a> par exemple.
<br /><br />
<img alt="Organize diagram layout"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_organize_diagram_layout.png" />
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="tag_project_state">Historique d'un
projet *.qxee</a></p>
<div class="manual_div_content">
Un projet QxEntityEditor peut <20>tre historis<69> : menu principal <i>Actions &gt;&gt; Tag project
state</i>.
<br /><br />
Chaque historique de projet fait <20>voluer les n<> de version des diff<66>rents <20>l<EFBFBD>ments du projet
(entit<69>s, propri<72>t<EFBFBD>s, relations, etc...).
Ces n<> de version sont utiles pour assurer <a href="./manual.html#manual_605">une compatibilit<69>
ascendante avec le moteur de s<>rialisation de la biblioth<74>que QxOrm</a>.
L'historique de projet est <20>galement utilis<69> par <a href="#ddl_export_settings">l'export DDL de
sch<63>ma de base de donn<6E>es</a> : permet de suivre l'<27>volution du sch<63>ma de base de donn<6E>es
(ajout d'une table, suppression d'une colonne, ajout d'un index, etc...).
<br /><br />
<img alt="Tag project state tab 1"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_tag_project_state_01.png" />
<br /><br />
Le 1er onglet de l'<27>cran d'historique permet de poser une <20>tiquette (par exemple : date/heure,
num<75>ro de version du projet, etc...) et un commentaire en texte libre.
<br /><br />
<img alt="Tag project state tab 2"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_tag_project_state_02.png" />
<br /><br />
Le 2<>me onglet de l'<27>cran d'historique liste tous les historiques du projet, et permet de
r<>cup<75>rer l'<27>tat d'un projet <20> un instant donn<6E> sous plusieurs formats (XML, JSON ou bien
fichier projet <i>*.qxee</i>).
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="cpp_preview_code">Aper<EFBFBD>u du code C++
d'une entit<69>/<2F>num<75>ration</a></p>
<div class="manual_div_content">
Il est possible de pr<70>visualiser <20> tout moment le code C++ (fichier header <i>*.h</i> et fichier
source <i>*.cpp</i>) associ<63> <20> une entit<69> et une <20>num<75>ration (ce code C++ peut <20>tre g<>n<EFBFBD>r<EFBFBD> par
<a href="#cpp_export_settings">le processus d'export C++</a>).
Cette pr<70>visualisation est accessible en s<>lectionnant un <20>l<EFBFBD>ment dans le diagramme d'entit<69>s,
puis aller dans l'onglet <i>C++ preview</i> :
<br /><br />
<img alt="C++ preview"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_cpp_preview.png" />
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="naming_convention">Convention de
nommage (snake_case, camelCase)</a></p>
<div class="manual_div_content">
L'application QxEntityEditor fournit une fonction permettant d'appliquer rapidement une
convention de nommage sur tous les <20>l<EFBFBD>ments du projet (entit<69>s, propri<72>t<EFBFBD>s, relations, etc...).
Cette fonction conserve (ne casse pas) le mapping vers la base de donn<6E>es. L'acc<63>s <20> cette
fonction se fait par le menu principal : <i>Naming convention</i>.
3 styles de convention de nommage sont propos<6F>s : <i>snake_case</i>, <i>camelCase</i> et
<i>PascalCase</i>.
<br /><br />
<img alt="Naming convention"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_naming_convention.png" />
<br /><br />
<b>Remarque :</b> cette fonction peut <20>tre utile suite <20> <a href="#import_plugins">un processus
d'import</a> pour harmoniser le code C++ g<>n<EFBFBD>r<EFBFBD>.
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="plugin_about">Liste des plugins
disponibles</a></p>
<div class="manual_div_content">
L'application QxEntityEditor est bas<61>e sur un syst<73>me de plugins pour g<>rer les processus d'<a
href="#import_plugins">import</a>/<a href="#export_plugins">export</a>.
Une liste des plugins disponibles avec les n<> de version et une description de chaque plugin est
accessible depuis le menu principal : <i>Help &gt;&gt; About plugins</i>.
<br /><br />
<img alt="List of plugins"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_plugins_about.png" />
<br /><br />
</div>
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="import_plugins">Plugins d'import</a></p>
<div class="manual_div_content_1">
Tous les processus d'import de l'application QxEntityEditor sont accessibles depuis le menu
principal <i>Import</i> :
<br /><br />
<img alt="Import plugins"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_plugins.png" />
<br /><br />
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_source_control_import">Importer
un projet <20> partir d'un r<>pertoire associ<63> <20> un gestionnaire de code source (Git, Perforce,
CVS, etc.)</a></p>
<div class="manual_div_content">
Un projet QxEntityEditor (fichier <i>*.qxee</i>) peut <20>tre g<>r<EFBFBD> par une <20>quipe de d<>veloppeurs :
le code source d'un projet QxEntityEditor peut <20>tre export<72>/import<72> (manuellement ou en ligne de
commande) avec les plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a>.<br />
<br />
Associ<63> <20> un gestionnaire de code source (Git, Perforce, CVS, etc.), ces 2 plugins permettent
ainsi :
<ul>
<li>plusieurs personnes peuvent travailler simultan<61>ment sur un m<>me projet ;</li>
<li>un projet peut facilement <20>tre versionn<6E> dans le gestionnaire de code source ;</li>
<li>chaque <20>l<EFBFBD>ment d'un projet peut <20>tre compar<61> (diff<66>rence entre 2 versions d'une m<>me
entit<69> par exemple).</li>
</ul>
Voici un exemple d'utilisation des plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a>, avec 2 d<>veloppeurs
nomm<6D>s 'dev A' et 'dev B' (l'exemple pouvant <20>tre <20>tendu <20> X d<>veloppeurs) :
<ul>
<li>dev A et dev B travaillent sur un m<>me projet QxEntityEditor (fichier <i>*.qxee</i>) ;
</li>
<li>dev A cr<63><72>/modifie/supprime certaines entit<69>s dans l'application QxEntityEditor ;</li>
<li>dev B cr<63><72>/modifie/supprime d'autres entit<69>s dans l'application QxEntityEditor ;</li>
<li>dev A et dev B exportent le projet <i>*.qxee</i> en utilisant le plugin <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> (manuellement
ou en ligne de commande) ;</li>
<li>une fois le projet export<72> dans un r<>pertoire, dev A et dev B enregistrent
(<i>check-in</i> ou <i>submit</i>) les fichiers JSON g<>n<EFBFBD>r<EFBFBD>s dans le gestionnaire de code
source (Git, Perforce, CVS, etc.) sur leur propre branche de travail ;</li>
<li>depuis le gestionnaire de code source, dev A et dev B int<6E>grent (<i>merge</i> ou
<i>integrate</i>) leur branche de travail sur la branche de d<>veloppement DEV (ou MAIN ou
MASTER ou LATEST); <b>Remarque :</b> m<>me si il y a des conflits <20> r<>soudre, ils seront
simples <20> corriger car le format JSON est lisible facilement ;
</li>
<li>dev A et dev B peuvent <20> pr<70>sent obtenir la derni<6E>re version des fichiers JSON (<i>get
latest</i> depuis le gestionnaire de code source) <20> partir de la branche DEV (ou MAIN
ou MASTER ou LATEST) : les fichiers JSON obtenus <b>contiennent <20> la fois les
modifications de dev A et dev B</b> ;</li>
<li>dev A et dev B peuvent importer ces fichiers JSON dans l'application QxEntityEditor en
utilisant le plugin d'import <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a> (manuellement ou
en ligne de commande).</li>
</ul>
Les param<61>tres du plugin d'import sont accessibles depuis le menu principal <i>Import &gt;&gt;
Import from Source Control repository (Git, Perforce, CVS, etc.)</i> :
<br /><br />
<img alt="Source Control import plugin"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_source_control.png" />
<br /><br />
Le param<61>tre <20> renseigner correspond au fichier JSON pr<70>sent <20> la racine du <a
href="#source_control_export_settings">r<EFBFBD>pertoire o<> a <20>t<EFBFBD> export<72> le projet
<i>*.qxee</i></a>.<br />
Ce fichier est nomm<6D> <b><i>&lt;nom_du_projet&gt;.qxee.export.json</i></b>, par exemple pour le
projet de test qxBlog : <i>qxBlog.qxee.export.json</i>.
<br /><br />
<img alt="Source Control output directory"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_source_control_output_directory.png" />
<br /><br />
<b>Attention :</b> un import efface tous les <20>l<EFBFBD>ments du projet courant (entit<69>s, propri<72>t<EFBFBD>s,
relations, etc...).
<br /><br />
<b>Remarque :</b> il est possible de d<>marrer QxEntityEditor en ligne de commande pour charger
automatiquement un r<>pertoire associ<63> <20> un gestionnaire de code source au d<>marrage de
l'application.
<br /><br />
Exemple de ligne de commande :<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEESourceControlImport --QxEESourceControlImport_path="&lt;path_to_the_root_source_control_json_file&gt;"</pre>
</i>
</div>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_json_import">Importer un projet <20>
partir d'un fichier texte au format JSON</a></p>
<div class="manual_div_content">
<b>
<font style="background-color:yellow">Remarque :</font>
</b> pour travailler avec un gestionnaire de code source (Git, Perforce, CVS, etc.), il est
conseill<6C> d'utiliser les plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a> (au lieu de cr<63>er un
fichier unique).<br />
<br />
Il est possible de g<>rer un projet QxEntityEditor avec un fichier texte au format JSON : menu
principal <i>Import &gt;&gt; Import from JSON file</i>.<br />
Pour connaitre la structure du fichier JSON <20> respecter, il est conseill<6C> au pr<70>alable
d'effectuer <a href="#xml_export_settings">un 1er export de projet au format JSON</a>.
<br /><br />
<img alt="Import JSON"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_json.png" />
<br /><br />
L'<27>cran d'import dispose d'un seul champ <20> renseigner : le fichier JSON <20> importer.
<br /><br />
<b>Attention :</b> un import JSON efface tous les <20>l<EFBFBD>ments du projet courant (entit<69>s,
propri<72>t<EFBFBD>s, relations, etc...).
<br /><br />
<b>Remarque :</b> il est possible de d<>marrer QxEntityEditor en ligne de commande pour charger
automatiquement un fichier JSON au d<>marrage de l'application.
<br /><br />
Exemple de ligne de commande :<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEEJsonImport --QxEEJsonImport_file="&lt;path_to_your_json_file&gt;"</pre>
</i>
</div>
<br />
Exemple de fichier JSON (pr<70>sent dans le dossier <i>./samples/qxBlog.json</i> du package
QxEntityEditor) :<br />
<div style="width:900px; height:500px; overflow:auto; background-color:white">
<pre>
{
"app_version": 0,
"description": "",
"dt_creation": "20131206221737",
"dt_modification": "20131206221737",
"id": 1,
"list_all_entities": [
{
"app_version": 0,
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"id": 1,
"is_abstract": false,
"is_read_only": false,
"key": "",
"list_functions": null,
"list_functions_static": null,
"list_meta_data": null,
"list_properties": [
{
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 1,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "author_id",
"order_level": 0,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": null,
"id": 1,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 1
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 2,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "firstname",
"order_level": 1,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": null,
"id": 2,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 2
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 3,
"is_index": true,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "lastname",
"order_level": 2,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": null,
"id": 3,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 3
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 4,
"is_index": true,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "birthdate",
"order_level": 3,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": null,
"id": 4,
"list_meta_data": null,
"primitive_type": "QDateTime",
"property_id": {
"id": 4
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 5,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "sex",
"order_level": 4,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": {
"id": 1
},
"id": 5,
"list_meta_data": null,
"primitive_type": "sex::enum_sex",
"property_id": {
"id": 5
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 18,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "list_of_blog",
"order_level": 17,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214144",
"entity_id": {
"id": 4
},
"enumeration_id": null,
"id": 18,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 18
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20140617214144",
"extra_table": "",
"foreign_key": "author",
"foreign_key_owner": "",
"id": 2,
"inverse_property_id": {
"id": 15
},
"list_meta_data": null,
"property_id": {
"id": 18
},
"type_relation": "one-to-many",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
}
],
"name": "author",
"namespace": "",
"parent_id": null,
"project_id": {
"id": 1
},
"project_version": 0,
"property_id": {
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": {
"id": 1
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 1,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "author_id",
"order_level": 0,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221810",
"dt_modification": "20140617214144",
"entity_id": null,
"enumeration_id": null,
"id": 1,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 1
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
"soft_delete_column": "",
"table_name": "t_author",
"trigger_after_delete": false,
"trigger_after_fetch": false,
"trigger_after_insert": false,
"trigger_after_update": false,
"trigger_before_delete": false,
"trigger_before_fetch": false,
"trigger_before_insert": false,
"trigger_before_update": false,
"user_id_creation": 0,
"user_id_modification": 0,
"validator_method": "",
"version": 0
},
{
"app_version": 0,
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"id": 4,
"is_abstract": false,
"is_read_only": false,
"key": "",
"list_functions": null,
"list_functions_static": null,
"list_meta_data": null,
"list_properties": [
{
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 12,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "blog_id",
"order_level": 11,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": null,
"enumeration_id": null,
"id": 12,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 12
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 13,
"is_index": true,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "title",
"order_level": 12,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": null,
"enumeration_id": null,
"id": 13,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 13
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 14,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "text",
"order_level": 13,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": null,
"enumeration_id": null,
"id": 14,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 14
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 15,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "author",
"order_level": 14,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 1
},
"enumeration_id": null,
"id": 15,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 15
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"extra_table": "",
"foreign_key": "",
"foreign_key_owner": "",
"id": 1,
"inverse_property_id": {
"id": 18
},
"list_meta_data": null,
"property_id": {
"id": 15
},
"type_relation": "many-to-one",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 16,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "list_of_comment",
"order_level": 15,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 3
},
"enumeration_id": null,
"id": 16,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 16
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"extra_table": "",
"foreign_key": "blog_id",
"foreign_key_owner": "",
"id": 3,
"inverse_property_id": {
"id": 19
},
"list_meta_data": null,
"property_id": {
"id": 16
},
"type_relation": "one-to-many",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 17,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "list_of_category",
"order_level": 16,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 2
},
"enumeration_id": null,
"id": 17,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 17
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"extra_table": "t_qxee_blog_category",
"foreign_key": "blog_id",
"foreign_key_owner": "category_id",
"id": 5,
"inverse_property_id": {
"id": 20
},
"list_meta_data": null,
"property_id": {
"id": 17
},
"type_relation": "many-to-many",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
}
],
"name": "blog",
"namespace": "",
"parent_id": null,
"project_id": {
"id": 1
},
"project_version": 0,
"property_id": {
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": {
"id": 4
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 12,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "blog_id",
"order_level": 11,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214043",
"entity_id": null,
"enumeration_id": null,
"id": 12,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 12
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
"soft_delete_column": "",
"table_name": "t_blog",
"trigger_after_delete": false,
"trigger_after_fetch": false,
"trigger_after_insert": false,
"trigger_after_update": false,
"trigger_before_delete": false,
"trigger_before_fetch": false,
"trigger_before_insert": false,
"trigger_before_update": false,
"user_id_creation": 0,
"user_id_modification": 0,
"validator_method": "",
"version": 0
},
{
"app_version": 0,
"description": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"id": 2,
"is_abstract": false,
"is_read_only": false,
"key": "",
"list_functions": null,
"list_functions_static": null,
"list_meta_data": null,
"list_properties": [
{
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": {
"id": 2
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 6,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "category_id",
"order_level": 5,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": null,
"enumeration_id": null,
"id": 6,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 6
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": {
"id": 2
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 7,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "name",
"order_level": 6,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": null,
"enumeration_id": null,
"id": 7,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 7
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": {
"id": 2
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 8,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "description",
"order_level": 7,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": null,
"enumeration_id": null,
"id": 8,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 8
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214115",
"entity_id": {
"id": 2
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 20,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "list_of_blog",
"order_level": 19,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20140617214115",
"entity_id": {
"id": 4
},
"enumeration_id": null,
"id": 20,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 20
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20140617214115",
"extra_table": "t_qxee_blog_category",
"foreign_key": "category_id",
"foreign_key_owner": "blog_id",
"id": 6,
"inverse_property_id": {
"id": 17
},
"list_meta_data": null,
"property_id": {
"id": 20
},
"type_relation": "many-to-many",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
}
],
"name": "category",
"namespace": "",
"parent_id": null,
"project_id": {
"id": 1
},
"project_version": 0,
"property_id": {
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": {
"id": 2
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 6,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "category_id",
"order_level": 5,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221933",
"dt_modification": "20140617214115",
"entity_id": null,
"enumeration_id": null,
"id": 6,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 6
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
"soft_delete_column": "",
"table_name": "t_category",
"trigger_after_delete": false,
"trigger_after_fetch": false,
"trigger_after_insert": false,
"trigger_after_update": false,
"trigger_before_delete": false,
"trigger_before_fetch": false,
"trigger_before_insert": false,
"trigger_before_update": false,
"user_id_creation": 0,
"user_id_modification": 0,
"validator_method": "",
"version": 0
},
{
"app_version": 0,
"description": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"id": 3,
"is_abstract": false,
"is_read_only": false,
"key": "",
"list_functions": null,
"list_functions_static": null,
"list_meta_data": null,
"list_properties": [
{
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": {
"id": 3
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 9,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "comment_id",
"order_level": 8,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": null,
"enumeration_id": null,
"id": 9,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 9
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": {
"id": 3
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 10,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "title",
"order_level": 9,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": null,
"enumeration_id": null,
"id": 10,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 10
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": {
"id": 3
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 11,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "text",
"order_level": 10,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": null,
"enumeration_id": null,
"id": 11,
"list_meta_data": null,
"primitive_type": "QString",
"property_id": {
"id": 11
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
{
"accessibility": "protected",
"allow_null": true,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206222031",
"dt_modification": "20131206222031",
"entity_id": {
"id": 3
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 19,
"is_index": false,
"is_obsolete": false,
"is_primary_key": false,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "blog_id",
"order_level": 18,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "qx::QxCollection",
"decoration": "boost::shared_ptr",
"default_value": "",
"dt_creation": "20131206222031",
"dt_modification": "20131206222031",
"entity_id": {
"id": 4
},
"enumeration_id": null,
"id": 19,
"list_meta_data": null,
"primitive_type": "",
"property_id": {
"id": 19
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": {
"app_version": 0,
"dt_creation": "20131206222031",
"dt_modification": "20131206222031",
"extra_table": "",
"foreign_key": "",
"foreign_key_owner": "",
"id": 4,
"inverse_property_id": {
"id": 16
},
"list_meta_data": null,
"property_id": {
"id": 19
},
"type_relation": "many-to-one",
"user_id_creation": 0,
"user_id_modification": 0
},
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
}
],
"name": "comment",
"namespace": "",
"parent_id": null,
"project_id": {
"id": 1
},
"project_version": 0,
"property_id": {
"accessibility": "protected",
"allow_null": false,
"app_version": 0,
"column_name": "",
"description": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": {
"id": 3
},
"force_sql_alias": "",
"force_sql_type": "",
"format": "",
"get_method": "",
"id": 9,
"is_index": true,
"is_obsolete": false,
"is_primary_key": true,
"is_read_only": false,
"is_serializable": true,
"is_transient": false,
"is_unique": false,
"key": "",
"list_meta_data": null,
"max_length": "",
"max_value": "",
"min_length": "",
"min_value": "",
"name": "comment_id",
"order_level": 8,
"project_version": 0,
"property_type_id": {
"app_version": 0,
"collection": "",
"decoration": "",
"default_value": "",
"dt_creation": "20131206221951",
"dt_modification": "20131206221951",
"entity_id": null,
"enumeration_id": null,
"id": 9,
"list_meta_data": null,
"primitive_type": "long",
"property_id": {
"id": 9
},
"user_id_creation": 0,
"user_id_modification": 0
},
"qt_property": "",
"reg_exp": "",
"relation_id": null,
"set_method": "",
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0,
"write_accessors": true
},
"soft_delete_column": "",
"table_name": "t_comment",
"trigger_after_delete": false,
"trigger_after_fetch": false,
"trigger_after_insert": false,
"trigger_after_update": false,
"trigger_before_delete": false,
"trigger_before_fetch": false,
"trigger_before_insert": false,
"trigger_before_update": false,
"user_id_creation": 0,
"user_id_modification": 0,
"validator_method": "",
"version": 0
}
],
"list_comments": [
{
"app_version": 0,
"comment_text": "- Design the entity model in few minutes\n\n- Generate C++ persistent classes automatically\n\n- Generate DDL SQL script automatically\n\n- Manage schema evolution for each project version\n\n- Compile C++ native code everywhere : Windows, Linux, MacOSX, Android, iOS, etc...\n\n- Transfer your data model over network and create quickly client/server applications",
"comment_text_html": false,
"comment_title": "qxBlog project",
"dt_creation": "20131206222130",
"dt_modification": "20140107093142",
"id": 1,
"list_meta_data": null,
"user_id_creation": 0,
"user_id_modification": 0
}
],
"list_enumerations": [
{
"app_version": 0,
"description": "",
"dt_creation": "20131206221840",
"dt_modification": "20131210205552",
"id": 1,
"key": "",
"list_meta_data": null,
"list_of_key_value": {
"female": 2,
"male": 1,
"unknown": 3
},
"name": "sex",
"namespace": "",
"project_id": {
"id": 1
},
"project_version": 0,
"qt_enum": false,
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0
}
],
"list_groups": null,
"list_meta_data": null,
"list_namespaces": null,
"location": "C:/Temp/qxee",
"name": "qxBlog",
"project_guid": "{16335d56-73ac-48cf-8fcd-f74cc7d97201}",
"project_parameters": {
"app_version": 0,
"default_entity_namespace": "",
"default_primary_key_type": "long",
"default_property_type": "QString",
"dt_creation": "20131206221737",
"dt_modification": "20131206221737",
"id": 1,
"list_meta_data": null,
"lst_plugin_script": {
},
"primary_key_prefix": "",
"primary_key_suffix": "_id",
"project_id": {
"id": 1
},
"table_name_prefix": "t_",
"table_name_suffix": "",
"user_id_creation": 0,
"user_id_modification": 0
},
"user_id_creation": 0,
"user_id_modification": 0,
"version": 0
}
</pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_mysql_import">Importer <20> partir
d'une base de donn<6E>es MySQL ou MariaDB</a></p>
<div class="manual_div_content">
L'import d'une base de donn<6E>es MySQL (ou MariaDB) dans l'application QxEntityEditor se fait par
le menu principal : <i>Import &gt;&gt; Import from MySQL (or MariaDB) database</i> :
<br /><br />
<img alt="Import MySQL or MariaDB"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_mysql.png" />
<br /><br />
Cet <20>cran d'import est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>MySQL (or MariaDB) database connection</i> :</b>
<ul>
<li>Champ <20> <i>Database server address (IP)</i> <20> : adresse IP ou nom du serveur MySQL ;</li>
<li>Champ <20> <i>Database port</i> <20> : n<> de port pour se connecter <20> la base de donn<6E>es MySQL
;</li>
<li>Champ <20> <i>Database name</i> <20> : nom de la base de donn<6E>es qu'on souhaite importer ;</li>
<li>Champ <20> <i>Database login</i> <20> : nom d'utilisateur pour se connecter <20> la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Database password</i> <20> : mot de passe pour se connecter <20> la base de donn<6E>es
;</li>
<li>Bouton <20> <i>Connect to database</i> <20> : d<>marre la connexion <20> la base de donn<6E>es : si
une erreur se produit, un message d'avertissement est affich<63>, sinon la liste des tables
de la base de donn<6E>es apparait dans la section <20> <i>Database items to import to
QxEntityEditor project</i> <20>.</li>
</ul>
<br />
<b>-- Section <i>Import settings</i> :</b>
<ul>
<li>Champ <20> <i>Namespace</i> <20> : <a href="#namespace">espace de nom utilis<69> pour regrouper
les entit<69>s import<72>es</a> ;</li>
<li>Champ <20> <i>Delete all entities in the namespace before importing</i> <20> : supprime les
entit<69>s de l'espace de nom ci-dessus avant de d<>marrer l'import des tables de la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Import tables/columns comment to entities/properties description</i> <20> :
importe les commentaires des tables et colonnes d<>finis dans la base de donn<6E>es ;</li>
<li>Champ <20> <i>Add boost::optional&lt;T&gt; decoration if a column definition allows NULL
value</i> <20> : ajoute automatiquement <a href="./manual.html#manual_4300">la d<>coration
boost::optional pour g<>rer la valeur NULL</a> ;</li>
<li>Champ <20> <i>Import columns default value</i> <20> : importe les valeurs par d<>faut d<>finies
au niveau des colonnes de la base de donn<6E>es ;</li>
<li>Champ <20> <i>Organize diagram layout after import process</i> <20> : d<>marre automatiquement
<a href="#organize_diagram_layout">une r<>organisation du diagramme d'entit<69>s</a> apr<70>s le
processus d'import.
</li>
</ul>
<br />
<b>-- Section <i>Relationship import settings</i> :</b>
<ul>
<li>Champ <20> <i>Decoration</i> <20> : d<>coration par d<>faut du type C++ (pour les relations, la
biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Champ <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i> et
<i>n-n</i>), alors d<>fini le type de liste C++ par d<>faut ;
</li>
</ul>
<br />
<b>-- Section <i>Mapping database SQL type to C++ type</i> :</b> QxEntityEditor d<>finit un
mapping par d<>faut pour associer un type SQL <20> un type C++.
Il est possible d'utiliser cette liste pour surcharger le comportement par d<>faut :
<ul>
<li>Colonne <20> <i>SQL type</i> <20> : type SQL <20> mapper. La recherche du type SQL n'est pas
sensible <20> la casse, et s'effectue sur les 1er caract<63>res : par exemple, mettre
<i>varchar</i> va mapper <i>VARCHAR(255)</i> ;
</li>
<li>Colonne <20> <i>C++ type</i> <20> : type C++ correspondant au type SQL ;</li>
<li>Bouton <20> <i>Supprimer</i> <20> : supprime une association type SQL / type C++.</li>
</ul>
<br />
<b>-- Section <i>Database items to import to QxEntityEditor project</i> :</b> lorsque
QxEntityEditor est connect<63> <20> la base de donn<6E>es, la liste de tous les <20>l<EFBFBD>ments (tables,
colonnes, cl<63>s primaires, relations, vues, etc...) pouvant <20>tre import<72>s dans le projet
QxEntityEditor sont affich<63>s dans cette section.
Par d<>faut, aucun <20>l<EFBFBD>ment n'est s<>lectionn<6E>.
Il est possible de tout s<>lectionner en 1 clic en cochant l'<27>l<EFBFBD>ment racine de l'arborescence.
Il est <20>galement possible de s<>lectionner uniquement les <20>l<EFBFBD>ments appartenant <20> un sch<63>ma.
Une fois les <20>l<EFBFBD>ments s<>lectionn<6E>s, le bouton <20> <i>Ok</i> <20> devient actif pour d<>marrer le
processus d'import.
<br /><br /><br />
<b>Remarque :</b> tous les param<61>tres d'import (connexion <20> la base de donn<6E>es, param<61>tres
d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr<74>s <20> la
fermeture de cette fen<65>tre d'import.
Tous les param<61>tres d'import sont automatiquement valoris<69>s <20> la r<>-ouverture de la fen<65>tre
d'import.
<br /><br />
<b>Autre remarque :</b> <a href="#intro_videos">une vid<69>o de QxEntityEditor est disponible</a>
pour montrer un exemple d'import de la base de donn<6E>es de test MySQL : <i>sakila</i>.
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_postgresql_import">Importer <20>
partir d'une base de donn<6E>es PostgreSQL</a></p>
<div class="manual_div_content">
L'import d'une base de donn<6E>es PostgreSQL dans l'application QxEntityEditor se fait par le menu
principal : <i>Import &gt;&gt; Import from PostgreSQL database</i> :
<br /><br />
<img alt="Import PostgreSQL"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_postgresql.png" />
<br /><br />
Cet <20>cran d'import est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>PostgreSQL database connection</i> :</b>
<ul>
<li>Champ <20> <i>Database server address (IP)</i> <20> : adresse IP ou nom du serveur PostgreSQL ;
</li>
<li>Champ <20> <i>Database port</i> <20> : n<> de port pour se connecter <20> la base de donn<6E>es
PostgreSQL ;</li>
<li>Champ <20> <i>Database name</i> <20> : nom de la base de donn<6E>es qu'on souhaite importer ;</li>
<li>Champ <20> <i>Database login</i> <20> : nom d'utilisateur pour se connecter <20> la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Database password</i> <20> : mot de passe pour se connecter <20> la base de donn<6E>es
;</li>
<li>Bouton <20> <i>Connect to database</i> <20> : d<>marre la connexion <20> la base de donn<6E>es : si
une erreur se produit, un message d'avertissement est affich<63>, sinon la liste des tables
de la base de donn<6E>es apparait dans la section <20> <i>Database items to import to
QxEntityEditor project</i> <20>.</li>
</ul>
<br />
<b>-- Section <i>Import settings</i> :</b>
<ul>
<li>Champ <20> <i>Namespace</i> <20> : <a href="#namespace">espace de nom utilis<69> pour regrouper
les entit<69>s import<72>es</a> ;</li>
<li>Champ <20> <i>Delete all entities in the namespace before importing</i> <20> : supprime les
entit<69>s de l'espace de nom ci-dessus avant de d<>marrer l'import des tables de la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Import tables/columns comment to entities/properties description</i> <20> :
importe les commentaires des tables et colonnes d<>finis dans la base de donn<6E>es ;</li>
<li>Champ <20> <i>Add boost::optional&lt;T&gt; decoration if a column definition allows NULL
value</i> <20> : ajoute automatiquement <a href="./manual.html#manual_4300">la d<>coration
boost::optional pour g<>rer la valeur NULL</a> ;</li>
<li>Champ <20> <i>Import columns default value</i> <20> : importe les valeurs par d<>faut d<>finies
au niveau des colonnes de la base de donn<6E>es ;</li>
<li>Champ <20> <i>Organize diagram layout after import process</i> <20> : d<>marre automatiquement
<a href="#organize_diagram_layout">une r<>organisation du diagramme d'entit<69>s</a> apr<70>s le
processus d'import.
</li>
</ul>
<br />
<b>-- Section <i>Relationship import settings</i> :</b>
<ul>
<li>Champ <20> <i>Decoration</i> <20> : d<>coration par d<>faut du type C++ (pour les relations, la
biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Champ <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i> et
<i>n-n</i>), alors d<>fini le type de liste C++ par d<>faut ;
</li>
</ul>
<br />
<b>-- Section <i>Mapping database SQL type to C++ type</i> :</b> QxEntityEditor d<>finit un
mapping par d<>faut pour associer un type SQL <20> un type C++.
Il est possible d'utiliser cette liste pour surcharger le comportement par d<>faut :
<ul>
<li>Colonne <20> <i>SQL type</i> <20> : type SQL <20> mapper. La recherche du type SQL n'est pas
sensible <20> la casse, et s'effectue sur les 1er caract<63>res : par exemple, mettre
<i>varchar</i> va mapper <i>VARCHAR(255)</i> ;
</li>
<li>Colonne <20> <i>C++ type</i> <20> : type C++ correspondant au type SQL ;</li>
<li>Bouton <20> <i>Supprimer</i> <20> : supprime une association type SQL / type C++.</li>
</ul>
<br />
<b>-- Section <i>Database items to import to QxEntityEditor project</i> :</b> lorsque
QxEntityEditor est connect<63> <20> la base de donn<6E>es, la liste de tous les <20>l<EFBFBD>ments (tables,
colonnes, cl<63>s primaires, relations, vues, etc...) pouvant <20>tre import<72>s dans le projet
QxEntityEditor sont affich<63>s dans cette section.
Par d<>faut, aucun <20>l<EFBFBD>ment n'est s<>lectionn<6E>.
Il est possible de tout s<>lectionner en 1 clic en cochant l'<27>l<EFBFBD>ment racine de l'arborescence.
Il est <20>galement possible de s<>lectionner uniquement les <20>l<EFBFBD>ments appartenant <20> un sch<63>ma.
Une fois les <20>l<EFBFBD>ments s<>lectionn<6E>s, le bouton <20> <i>Ok</i> <20> devient actif pour d<>marrer le
processus d'import.
<br /><br /><br />
<b>Remarque :</b> tous les param<61>tres d'import (connexion <20> la base de donn<6E>es, param<61>tres
d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr<74>s <20> la
fermeture de cette fen<65>tre d'import.
Tous les param<61>tres d'import sont automatiquement valoris<69>s <20> la r<>-ouverture de la fen<65>tre
d'import.
<br /><br />
<b>Autre remarque :</b> <a href="#intro_videos">une vid<69>o de QxEntityEditor est disponible</a>
pour montrer un exemple d'import de la base de donn<6E>es de test MySQL : <i>sakila</i>.
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_sqlite_import">Importer <20> partir
d'une base de donn<6E>es SQLite</a></p>
<div class="manual_div_content">
L'import d'une base de donn<6E>es SQLite dans l'application QxEntityEditor se fait par le menu
principal : <i>Import &gt;&gt; Import from SQLite database</i> :
<br /><br />
<img alt="Import SQLite"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_sqlite.png" />
<br /><br />
Cet <20>cran d'import est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Database connection</i> :</b>
<ul>
<li>Champ <20> <i>Database path</i> <20> : chemin d'acc<63>s au fichier base de donn<6E>es SQLite ;</li>
<li>Bouton <20> <i>Connect to database</i> <20> : d<>marre la connexion <20> la base de donn<6E>es : si
une erreur se produit, un message d'avertissement est affich<63>, sinon la liste des tables
de la base de donn<6E>es apparait dans la section <20> <i>Database items to import to
QxEntityEditor project</i> <20>.</li>
</ul>
<br />
<b>-- Section <i>Import settings</i> :</b>
<ul>
<li>Champ <20> <i>Namespace</i> <20> : <a href="#namespace">espace de nom utilis<69> pour regrouper
les entit<69>s import<72>es</a> ;</li>
<li>Champ <20> <i>Delete all entities in the namespace before importing</i> <20> : supprime les
entit<69>s de l'espace de nom ci-dessus avant de d<>marrer l'import des tables de la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Import tables/columns comment to entities/properties description</i> <20> :
importe les commentaires des tables et colonnes d<>finis dans la base de donn<6E>es ;</li>
<li>Champ <20> <i>Add boost::optional&lt;T&gt; decoration if a column definition allows NULL
value</i> <20> : ajoute automatiquement <a href="./manual.html#manual_4300">la d<>coration
boost::optional pour g<>rer la valeur NULL</a> ;</li>
<li>Champ <20> <i>Import columns default value</i> <20> : importe les valeurs par d<>faut d<>finies
au niveau des colonnes de la base de donn<6E>es ;</li>
<li>Champ <20> <i>Organize diagram layout after import process</i> <20> : d<>marre automatiquement
<a href="#organize_diagram_layout">une r<>organisation du diagramme d'entit<69>s</a> apr<70>s le
processus d'import.
</li>
</ul>
<br />
<b>-- Section <i>Relationship import settings</i> :</b>
<ul>
<li>Champ <20> <i>Decoration</i> <20> : d<>coration par d<>faut du type C++ (pour les relations, la
biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Champ <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i> et
<i>n-n</i>), alors d<>fini le type de liste C++ par d<>faut ;
</li>
</ul>
<br />
<b>-- Section <i>Mapping database SQL type to C++ type</i> :</b> QxEntityEditor d<>finit un
mapping par d<>faut pour associer un type SQL <20> un type C++.
Il est possible d'utiliser cette liste pour surcharger le comportement par d<>faut :
<ul>
<li>Colonne <20> <i>SQL type</i> <20> : type SQL <20> mapper. La recherche du type SQL n'est pas
sensible <20> la casse, et s'effectue sur les 1er caract<63>res : par exemple, mettre
<i>varchar</i> va mapper <i>VARCHAR(255)</i> ;
</li>
<li>Colonne <20> <i>C++ type</i> <20> : type C++ correspondant au type SQL ;</li>
<li>Bouton <20> <i>Supprimer</i> <20> : supprime une association type SQL / type C++.</li>
</ul>
<br />
<b>-- Section <i>Database items to import to QxEntityEditor project</i> :</b> lorsque
QxEntityEditor est connect<63> <20> la base de donn<6E>es, la liste de tous les <20>l<EFBFBD>ments (tables,
colonnes, cl<63>s primaires, relations, vues, etc...) pouvant <20>tre import<72>s dans le projet
QxEntityEditor sont affich<63>s dans cette section.
Par d<>faut, aucun <20>l<EFBFBD>ment n'est s<>lectionn<6E>.
Il est possible de tout s<>lectionner en 1 clic en cochant l'<27>l<EFBFBD>ment racine de l'arborescence.
Il est <20>galement possible de s<>lectionner uniquement les <20>l<EFBFBD>ments appartenant <20> un sch<63>ma.
Une fois les <20>l<EFBFBD>ments s<>lectionn<6E>s, le bouton <20> <i>Ok</i> <20> devient actif pour d<>marrer le
processus d'import.
<br /><br /><br />
<b>Remarque :</b> tous les param<61>tres d'import (connexion <20> la base de donn<6E>es, param<61>tres
d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr<74>s <20> la
fermeture de cette fen<65>tre d'import.
Tous les param<61>tres d'import sont automatiquement valoris<69>s <20> la r<>-ouverture de la fen<65>tre
d'import.
<br /><br />
<b>Autre remarque :</b> <a href="#intro_videos">une vid<69>o de QxEntityEditor est disponible</a>
pour montrer un exemple d'import de la base de donn<6E>es de test MySQL : <i>sakila</i>.
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="wnd_odbc_import">Importer <20> partir
d'une base de donn<6E>es en utilisant un driver ODBC (Oracle, MS SQL Server, etc.)</a></p>
<div class="manual_div_content">
L'application QxEntityEditor fournit un import g<>n<EFBFBD>rique de base de donn<6E>es par connexion ODBC :
menu principal <i>Import &gt;&gt; Import from database using ODBC driver</i>.
Ce type d'import n<>cessite de d<>fnir un <a href="https://en.wikipedia.org/wiki/Data_source_name"
target="_blank">DSN (Data Source Name)</a> dans l'environnement.
L'import par ODBC de l'application QxEntityEditor permet d'importer des bases de donn<6E>es de type
: Oracle, Microsoft SQL Server, SQLite, MySQL/MariaDB, PostgreSQL, etc...
<br /><br />
<img alt="Import ODBC"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_import_odbc.png" />
<br /><br />
Cet <20>cran d'import est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Database connection</i> :</b>
<ul>
<li>Champ <20> <i>DSN or connection string</i> <20> : <a
href="https://en.wikipedia.org/wiki/Data_source_name" target="_blank">DSN (Data Source
Name)</a> d<>fini dans l'environnement permettant de se connecter <20> la base de donn<6E>es
par ODBC ;</li>
<li>Champ <20> <i>Login</i> <20> : nom d'utilisateur pour se connecter <20> la base de donn<6E>es
(optionnel suivant les DSN) ;</li>
<li>Champ <20> <i>Password</i> <20> : mot de passe pour se connecter <20> la base de donn<6E>es
(optionnel suivant les DSN) ;</li>
<li>Champ <20> <i>Database type</i> <20> : type de base de donn<6E>es : le type <i>Generic</i> permet
de se connecter <20> tous types de bases mais avec certaines limitations (pas de relation,
pas de cl<63> primaire sur plusieurs colonnes). Il est conseill<6C> de s<>lectionner le type r<><72>l
de base de donn<6E>es avant de d<>marrer la connexion <20> la base (Oracle, Microsoft SQL Server,
SQLite, MySQL/MariaDB, PostgreSQL) ;</li>
<li>Bouton <20> <i>Connect to database</i> <20> : d<>marre la connexion <20> la base de donn<6E>es : si
une erreur se produit, un message d'avertissement est affich<63>, sinon la liste des tables
de la base de donn<6E>es apparait dans la section <20> <i>Database items to import to
QxEntityEditor project</i> <20>.</li>
</ul>
<br />
<b>-- Section <i>Import settings</i> :</b>
<ul>
<li>Champ <20> <i>Namespace</i> <20> : <a href="#namespace">espace de nom utilis<69> pour regrouper
les entit<69>s import<72>es</a> ;</li>
<li>Champ <20> <i>Delete all entities in the namespace before importing</i> <20> : supprime les
entit<69>s de l'espace de nom ci-dessus avant de d<>marrer l'import des tables de la base de
donn<6E>es ;</li>
<li>Champ <20> <i>Import tables/columns comment to entities/properties description</i> <20> :
importe les commentaires des tables et colonnes d<>finis dans la base de donn<6E>es ;</li>
<li>Champ <20> <i>Add boost::optional&lt;T&gt; decoration if a column definition allows NULL
value</i> <20> : ajoute automatiquement <a href="./manual.html#manual_4300">la d<>coration
boost::optional pour g<>rer la valeur NULL</a> ;</li>
<li>Champ <20> <i>Import columns default value</i> <20> : importe les valeurs par d<>faut d<>finies
au niveau des colonnes de la base de donn<6E>es ;</li>
<li>Champ <20> <i>Organize diagram layout after import process</i> <20> : d<>marre automatiquement
<a href="#organize_diagram_layout">une r<>organisation du diagramme d'entit<69>s</a> apr<70>s le
processus d'import.
</li>
</ul>
<br />
<b>-- Section <i>Relationship import settings</i> :</b>
<ul>
<li>Champ <20> <i>Decoration</i> <20> : d<>coration par d<>faut du type C++ (pour les relations, la
biblioth<74>que QxOrm recommande l'utilisation de pointeurs intelligents :
<i>boost::shared_ptr</i>, <i>std::shared_ptr</i> ou <i>QSharedPointer</i>) ;
</li>
<li>Champ <20> <i>Collection</i> <20> : si le type de relation n<>cessite une liste (<i>1-n</i> et
<i>n-n</i>), alors d<>fini le type de liste C++ par d<>faut ;
</li>
</ul>
<br />
<b>-- Section <i>Mapping database SQL type to C++ type</i> :</b> QxEntityEditor d<>finit un
mapping par d<>faut pour associer un type SQL <20> un type C++.
Il est possible d'utiliser cette liste pour surcharger le comportement par d<>faut :
<ul>
<li>Colonne <20> <i>SQL type</i> <20> : type SQL <20> mapper. La recherche du type SQL n'est pas
sensible <20> la casse, et s'effectue sur les 1er caract<63>res : par exemple, mettre
<i>varchar</i> va mapper <i>VARCHAR(255)</i> ;
</li>
<li>Colonne <20> <i>C++ type</i> <20> : type C++ correspondant au type SQL ;</li>
<li>Bouton <20> <i>Supprimer</i> <20> : supprime une association type SQL / type C++.</li>
</ul>
<br />
<b>-- Section <i>Database items to import to QxEntityEditor project</i> :</b> lorsque
QxEntityEditor est connect<63> <20> la base de donn<6E>es, la liste de tous les <20>l<EFBFBD>ments (tables,
colonnes, cl<63>s primaires, relations, vues, etc...) pouvant <20>tre import<72>s dans le projet
QxEntityEditor sont affich<63>s dans cette section.
Par d<>faut, aucun <20>l<EFBFBD>ment n'est s<>lectionn<6E>.
Il est possible de tout s<>lectionner en 1 clic en cochant l'<27>l<EFBFBD>ment racine de l'arborescence.
Il est <20>galement possible de s<>lectionner uniquement les <20>l<EFBFBD>ments appartenant <20> un sch<63>ma.
Une fois les <20>l<EFBFBD>ments s<>lectionn<6E>s, le bouton <20> <i>Ok</i> <20> devient actif pour d<>marrer le
processus d'import.
<br /><br /><br />
<b>Remarque :</b> tous les param<61>tres d'import (connexion <20> la base de donn<6E>es, param<61>tres
d'import et des relations, liste mapping type SQL / type C++, etc...) sont enregistr<74>s <20> la
fermeture de cette fen<65>tre d'import.
Tous les param<61>tres d'import sont automatiquement valoris<69>s <20> la r<>-ouverture de la fen<65>tre
d'import.
<br /><br />
<b>Autre remarque :</b> <a href="#intro_videos">une vid<69>o de QxEntityEditor est disponible</a>
pour montrer un exemple d'import de la base de donn<6E>es de test MySQL : <i>sakila</i>.
<br /><br />
</div>
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="export_plugins">Plugins d'export</a></p>
<div class="manual_div_content_1">
Tous les processus d'export de l'application QxEntityEditor sont accessibles depuis le menu
principal <i>Export</i> :
<br /><br />
<img alt="Export plugins"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_plugins.png" />
<br /><br />
<p class="manual_p_title_2"><a class="manual_a_title_2" name="cpp_export_settings">Exporter en
projet C++</a></p>
<div class="manual_div_content">
L'export C++ g<>n<EFBFBD>re un projet complet C++ pr<70>t <20> <20>tre compil<69> (par <i>qmake</i> et/ou
<i>cmake</i>) et contenant toutes les entit<69>s/propri<72>t<EFBFBD>s/relations/<2F>num<75>rations enregistr<74>es
dans le contexte de la biblioth<74>que QxOrm.
<a href="./manual.html">Toutes les fonctionnalit<69>s de la biblioth<74>que QxOrm</a> (<a
href="./manual.html#manual_30">persistance</a>, <a
href="./manual.html#manual_60">s<EFBFBD>rialisation</a>, <a
href="./manual.html#manual_70">introspection</a>, etc...) sont ainsi disponibles pour
l'ensemble du projet C++ g<>n<EFBFBD>r<EFBFBD>.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_export_settings_parameters">Param<EFBFBD>tres de l'export C++</a></p>
<div class="manual_div_content">
Les param<61>tres de l'export C++ sont accessibles par le menu principal : <i>Tools &gt;&gt;
Export to C++ project (settings)</i>.
Cet <20>cran de param<61>trage apparait automatiquement au 1er export si aucun param<61>tre n'a <20>t<EFBFBD>
enregistr<74> au niveau du projet.
Lorsqu'un export C++ a d<>j<EFBFBD> <20>t<EFBFBD> r<>alis<69>, alors cette fen<65>tre de param<61>trage est accessible
uniquement par le menu principal : <i>Tools &gt;&gt; Export to C++ project (settings)</i> :
<br /><br />
<img alt="Export C++"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp.png" />
<br /><br />
Cet <20>cran d'export est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>C++ export settings</i> :</b>
<ul>
<li>Champ <20> <i>C++ project location</i> <20> : r<>pertoire de destination qui contiendra <a
href="#cpp_export_settings_generated">tous les fichiers du projet C++ g<>n<EFBFBD>r<EFBFBD></a>. Il
est possible de renseigner dans ce champ un chemin relatif par rapport au fichier
projet <i>*.qxee</i> ;</li>
<li>Option <20> <i>Relative path to QxOrm library</i> <20> : si coch<63>, le projet C++ r<>f<EFBFBD>rence
la biblioth<74>que QxOrm avec un chemin relatif, sinon la d<>pendance <20> la biblioth<74>que
QxOrm est d<>finie avec un chemin absolu. Il est conseill<6C> d'utiliser <a
href="#global_settings">une variable d'environnement dans les param<61>tres de
l'application QxEntityEditor</a> (par exemple : <i>$$(QXORM_DIR)</i>) <20> la place de
cette option ;</li>
<li>Option <20> <i>Generate a custom directory with custom files for each entity</i> <20> : si
coch<63>, le projet C++ g<>n<EFBFBD>r<EFBFBD> contient un fichier personnalis<69> par entit<69>.
Par d<>faut, ces fichiers custom sont vides et ne seront jamais <20>cras<61>s par un nouvel
export C++.
Ces fichiers custom peuvent <20>tre utilis<69>s par exemple pour impl<70>menter <a
href="./manual.html#manual_420">les m<>thodes de validation</a>, ou bien <a
href="./manual.html#manual_410">les m<>thodes de trigger</a>.</li>
<li>Option <20> <i>Generate all persistent classes using the PIMPL (Private Implementation)
idiom</i> <20> : si coch<63>, toutes les classes C++ g<>n<EFBFBD>r<EFBFBD>es et enregistr<74>es dans le
contexte QxOrm seront cod<6F>es en utilisant <a href="./manual.html#manual_455">le pattern
C++ PIMPL (ou d-pointer)</a>.</li>
</ul>
<br />
<b>-- Section <i>Custom script (Javascript file) to change the default behaviour of the
export process</i> :</b> <a href="#js_engine">param<EFBFBD>trage du moteur de personnalisation
de l'export</a>.
<ul>
<li>Champ <20> <i>Custom script file</i> <20> : chemin d'acc<63>s au fichier Javascript permettant
de <a href="#js_engine">personnaliser l'export C++</a>. Si vide, aucune
personnalisation n'est appliqu<71>e (export par d<>faut).
Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier
projet <i>*.qxee</i>, par exemple <i>./my_script.js</i> si le fichier
<i>my_script.js</i> se trouve dans le m<>me r<>pertoire que le fichier projet
<i>*.qxee</i> ;
</li>
<li>Bouton <20> <i>Debug custom Javascript file</i> <20> : si un fichier Javascript est d<>fini,
un clic sur ce bouton d<>clenchera <a href="#js_engine_debug">le mode d<>bogage
Javascript</a> au prochain lancement d'export C++.
Au lieu d'utiliser ce bouton, il est <20>galement possible d'activer <a
href="#js_engine_debug">le mode d<>bogage Javascript</a> en maintenant la touche
<i>SHIFT</i> au moment de lancer un export C++.
</li>
</ul>
<br />
<b>-- Section <i>C++ template files</i> :</b> cette section d<>finit le code C++ des entit<69>s
pour les fichiers <i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i>.
Le moteur d'export utilise des mots-cl<63> (<i>placeholder</i> sous la forme <i>@@ACTION@@</i>)
pour remplacer le code par la valeur correspondante.
Cette notion de <i>placeholder</i> est la base du <a href="#js_engine">moteur de
personnalisation Javascript</a>.
Il est possible de renseigner <a href="#js_engine_placeholder">des <i>placeholder</i>
personnalis<69>s en prefixant par <i>@@CUSTOM_</i></a>, par exemple :
<i>@@CUSTOM_MY_ACTION@@</i>.
<ul>
<li>Option <20> <i>No inheritance</i> <20> : si coch<63> (option par d<>faut), la classe C++ n'a pas
d'h<>ritage (aucune classe de base) ;</li>
<li>Option <20> <i>qx::IxPersistable</i> <20> : si coch<63>, chaque classe C++ g<>n<EFBFBD>r<EFBFBD>e h<>rite de <a
href="manual.html#manual_450">l'interface qx::IxPersistable</a> (fourni une
interface commune pour les actions de persistance <20> la base de donn<6E>es). Cette option
rallonge les temps de compilation du projet C++ ;</li>
<li>Option <20> <i>qx::IxPersistable + QObject</i> <20> : si coch<63>, chaque classe C++ g<>n<EFBFBD>r<EFBFBD>e
h<>rite de <a href="manual.html#manual_450">l'interface qx::IxPersistable</a> et de <a
href="http://doc.qt.io/qt-5/qobject.html" target="_blank">la classe Qt QObject</a>.
Cette option rallonge les temps de compilation du projet C++ ;</li>
<li>Option <20> <i>Custom</i> <20> : si coch<63>, possibilit<69> de fournir son propre code C++ (il
est cependant conseill<6C> de commencer <20> copier/coller <i>Header</i> <i>*.h</i> et
<i>Source</i> <i>*.cpp</i> d'une des 3 autres options pour r<>cup<75>rer les
<i>placeholder</i> <20> utiliser).
</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_export_settings_generated">Pr<EFBFBD>sentation du projet C++ g<>n<EFBFBD>r<EFBFBD></a></p>
<div class="manual_div_content">
Le projet C++ g<>n<EFBFBD>r<EFBFBD> dispose de l'arborescence suivante :
<br /><br />
<img alt="Export C++ output"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_output.png" />
<br /><br />
<ul>
<li>le dossier <20> <i>bin</i> <20> est vide par d<>faut, et contiendra le binaire compil<69>
(<i>*.dll</i> sous Windows, <i>*.so</i> sous Linux, etc...) ;</li>
<li>le dossier <20> <i>build</i> <20> est vide par d<>faut, il peut <20>tre utilis<69> pour produire
les fichiers <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>le dossier <20> <i>custom</i> <20> est aliment<6E> si l'option <20> <a
href="#cpp_export_settings_parameters"><i>Generate a custom directory with custom
files for each entity</i></a> <20> est coch<63>.
Ces fichiers custom peuvent <20>tre utilis<69>s par exemple pour impl<70>menter <a
href="./manual.html#manual_420">les m<>thodes de validation</a>, ou bien <a
href="./manual.html#manual_410">les m<>thodes de trigger</a> ;</li>
<li>le dossier <20> <i>include</i> <20> contient les d<>finitions de toutes les classes entit<69>s
et <20>num<75>rations du projet ;</li>
<li>le dossier <20> <i>src</i> <20> contient les impl<70>mentations de toutes les classes entit<69>s
et <20>num<75>rations du projet ;</li>
<li>le fichier <20> <i>CMakeLists.txt</i> <20> peut <20>tre utilis<69> pour compiler le projet C++
avec <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>les fichiers <20> <i>*.gen.pri</i> <20> et <20> <i>*.gen.pro</i> <20> peuvent <20>tre utilis<69>s pour
compiler le projet C++ avec <a href="http://doc.qt.io/qt-5/qmake-manual.html"
target="_blank">qmake</a> ;</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_export_settings_compilation">Compilation du projet C++ g<>n<EFBFBD>r<EFBFBD> (par qmake ou
cmake)</a></p>
<div class="manual_div_content">
Le projet C++ g<>n<EFBFBD>r<EFBFBD> peut <20>tre compil<69> avec <a href="https://cmake.org/"
target="_blank">CMake</a> ou <a href="http://doc.qt.io/qt-5/qmake-manual.html"
target="_blank">qmake</a>.<br />
La biblioth<74>que QxOrm dispose de certaines <a href="./manual.html#manual_220">options de
compilation document<6E>es dans les fichiers QxOrm.pri et QxOrm.cmake</a> (il est possible de
conserver les options par d<>faut).<br />
Le manuel utilisateur de la biblioth<74>que QxOrm indique <a
href="./manual.html#manual_230">comment proc<6F>der <20> la compilation du projet</a>.<br />
Un tutoriel est <20>galement disponible pour expliquer <a
href="./tutorial_3.html">l'installation d'un environnement de d<>veloppement sous Windows
avec MSVC</a>.<br />
Une fois le projet C++ compil<69> avec succ<63>s, le binaire est disponible dans le dossier <20>
<i>bin</i> <20> du projet export<72> (<i>*.dll</i> sous Windows, <i>*.so</i> sous Linux, etc...).
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_export_settings_example">Exemple d'utilisation</a></p>
<div class="manual_div_content">
Le dossier <i>./samples/</i> du package QxEntityEditor fournit un projet de test :
<i>qxBlog.qxee</i>.
Ce projet de test peut <20>tre ouvert m<>me avec une version de QxEntityEditor sans cl<63> de
licence active.
Une fois export<72> en projet C++, il est possible de compiler le projet afin d'obtenir une
biblioth<74>que partag<61>e <i>qxBlog.dll</i> (ou <i>qxBlog.so</i> sous Linux).
Cette biblioth<74>que partag<61>e poss<73>de toutes les entit<69>s et <20>num<75>rations du projet enregistr<74>es
dans le contexte QxOrm : <a href="./manual.html">toutes les fonctionnalit<69>s de la
biblioth<74>que QxOrm sont ainsi disponibles</a>.
<br /><br />
Le dossier <i>./samples/</i> du package QxEntityEditor fournit <20>galement un projet d'exemple
d'utilisation du binaire compil<69> : <i>qxBlogExec.zip</i>.
Une fois d<>zipp<70>, le fichier <i>readme.txt</i> <20> la racine contient les instructions
d'installation et compilation de ce projet d'exemple :
<br /><br />
<div style="width:900px; height:200px; overflow:auto; background-color:white">
<pre>
--------------------------------------------
-- To build qxBlogExec project with qmake --
--------------------------------------------
1- Export the 'qxBlog.qxee' project as a C++ project with QxEntityEditor and build it
2- Open the 'qxBlogExec.pro' file
3- Replace '$$(QXORM_DIR)' by your QxOrm library installation path
4- Replace 'C:/Temp/qxee/cpp/' by the path where you have exported the 'qxBlog.qxee' project as a C++ project
5- run command line : qmake
6- run command line : make debug (or make release)
--------------------------------------------
-- To build qxBlogExec project with CMake --
--------------------------------------------
1- Export the 'qxBlog.qxee' project as a C++ project with QxEntityEditor and build it
2- Open the 'CMakeLists.txt' file
3- Replace '$ENV{QXORM_DIR}' by your QxOrm library installation path
4- Replace 'C:/Temp/qxee/cpp/' by the path where you have exported the 'qxBlog.qxee' project as a C++ project
5- run cmake or cmake-gui to configure and generate your make files
</pre>
</div>
<br /><br />
Voici le contenu comment<6E> de la fonction <i>main()</i> qui montre un exemple d'utilisation
(proche du tutoriel <a href="./tutorial.html">qxBlog</a>) :
<br /><br />
<div style="width:900px; height:600px; overflow:auto; background-color:white">
<pre>
<span class="type">int</span><span class="keyword"> main</span><span class="operator">(</span><span class="type">int</span> argc<span class="operator">,</span><span class="type"> char</span><span class="operator"> *</span> argv<span class="operator">[])
{</span><span class="comment">
// Qt application
</span> QCoreApplication app<span class="operator">(</span>argc<span class="operator">,</span> argv<span class="operator">);</span>
QFile<span class="operator">::</span>remove<span class="operator">(</span><span class="string">"./qxBlog.sqlite"</span><span class="operator">);</span><span class="comment">
// Parameters to connect to database
</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setDriverName<span class="operator">(</span><span class="string">"QSQLITE"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setDatabaseName<span class="operator">(</span><span class="string">"./qxBlog.sqlite"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setHostName<span class="operator">(</span><span class="string">"localhost"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setUserName<span class="operator">(</span><span class="string">"root"</span><span class="operator">);</span>
qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setPassword<span class="operator">(</span><span class="string">""</span><span class="operator">);</span><span class="comment">
// Only for debug purpose : assert if invalid offset detected fetching a relation
</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getSingleton<span class="operator">()-&gt;</span>setVerifyOffsetRelation<span class="operator">(</span><span class="bool">true</span><span class="operator">);</span><span class="comment">
// !!! TO CREATE TABLES, PLEASE USE THE C++ DDL SQL EXPORT PLUGIN OF QXENTITYEDITOR !!!
// Create all tables in database (you should not use 'qx::dao::create_table&lt;T&gt;()' function in a production software, use it just for prototypes or samples)
</span> QSqlError daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>create_table<span class="operator">&lt;</span>author<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>create_table<span class="operator">&lt;</span>comment<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>create_table<span class="operator">&lt;</span>category<span class="operator">&gt;();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>create_table<span class="operator">&lt;</span>blog<span class="operator">&gt;();</span><span class="comment">
// Create a list of 3 author
</span> author_ptr author_1<span class="operator">;</span> author_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_ptr author_2<span class="operator">;</span> author_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_ptr author_3<span class="operator">;</span> author_3<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> author<span class="operator">());</span>
author_1<span class="operator">-&gt;</span>setlastname<span class="operator">(</span><span class="string">"author_1"</span><span class="operator">);</span>
author_1<span class="operator">-&gt;</span>setsex<span class="operator">(</span>sex<span class="operator">::</span>male<span class="operator">);</span>
author_1<span class="operator">-&gt;</span>setbirthdate<span class="operator">(</span>QDateTime<span class="operator">::</span>currentDateTime<span class="operator">());</span>
author_2<span class="operator">-&gt;</span>setlastname<span class="operator">(</span><span class="string">"author_2"</span><span class="operator">);</span>
author_2<span class="operator">-&gt;</span>setsex<span class="operator">(</span>sex<span class="operator">::</span>female<span class="operator">);</span>
author_2<span class="operator">-&gt;</span>setbirthdate<span class="operator">(</span>QDateTime<span class="operator">::</span>currentDateTime<span class="operator">());</span>
author_3<span class="operator">-&gt;</span>setlastname<span class="operator">(</span><span class="string">"author_3"</span><span class="operator">);</span>
author_3<span class="operator">-&gt;</span>setsex<span class="operator">(</span>sex<span class="operator">::</span>female<span class="operator">);</span>
author_3<span class="operator">-&gt;</span>setbirthdate<span class="operator">(</span>QDateTime<span class="operator">::</span>currentDateTime<span class="operator">());</span>
list_of_author authorX<span class="operator">;</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span><span class="int">1</span><span class="operator">,</span> author_1<span class="operator">);</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span><span class="int">2</span><span class="operator">,</span> author_2<span class="operator">);</span>
authorX<span class="operator">.</span>insert<span class="operator">(</span><span class="int">3</span><span class="operator">,</span> author_3<span class="operator">);</span><span class="comment">
// Insert list of 3 author into database
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>authorX<span class="operator">);</span>
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator">&lt;</span>author<span class="operator">&gt;() ==</span><span class="int"> 3</span><span class="operator">);</span><span class="comment">
// Clone author n<>2 : 'author_id_2'
</span> author_ptr author_clone<span class="operator"> =</span> qx<span class="operator">::</span>clone<span class="operator">(*</span> author_2<span class="operator">);</span>
qAssert<span class="operator">(</span>author_clone<span class="operator">-&gt;</span>getauthor_id<span class="operator">() ==</span> author_2<span class="operator">-&gt;</span>getauthor_id<span class="operator">());</span>
qAssert<span class="operator">(</span>author_clone<span class="operator">-&gt;</span>getsex<span class="operator">() ==</span> sex<span class="operator">::</span>female<span class="operator">);</span><span class="comment">
// Create a query to fetch only female author : 'author_id_2' and 'author_id_3'
</span> qx<span class="operator">::</span>QxSqlQuery query<span class="operator">(</span><span class="string">"WHERE t_author.sex = :sex"</span><span class="operator">);</span>
query<span class="operator">.</span>bind<span class="operator">(</span><span class="string">":sex"</span><span class="operator">,</span> sex<span class="operator">::</span>female<span class="operator">);</span>
list_of_author list_of_female_author<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_query<span class="operator">(</span>query<span class="operator">,</span> list_of_female_author<span class="operator">);</span>
qAssert<span class="operator">(</span>list_of_female_author<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
// Dump list of female author (xml serialization)
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>list_of_female_author<span class="operator">);</span><span class="comment">
// Create 3 categories
</span> category_ptr category_1<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">(</span><span class="string">"cat_1"</span><span class="operator">));</span>
category_ptr category_2<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">(</span><span class="string">"cat_2"</span><span class="operator">));</span>
category_ptr category_3<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">(</span><span class="string">"cat_3"</span><span class="operator">));</span>
category_1<span class="operator">-&gt;</span>setname<span class="operator">(</span><span class="string">"category_1"</span><span class="operator">);</span> category_1<span class="operator">-&gt;</span>setdescription<span class="operator">(</span><span class="string">"desc_1"</span><span class="operator">);</span>
category_2<span class="operator">-&gt;</span>setname<span class="operator">(</span><span class="string">"category_2"</span><span class="operator">);</span> category_2<span class="operator">-&gt;</span>setdescription<span class="operator">(</span><span class="string">"desc_2"</span><span class="operator">);</span>
category_3<span class="operator">-&gt;</span>setname<span class="operator">(</span><span class="string">"category_3"</span><span class="operator">);</span> category_3<span class="operator">-&gt;</span>setdescription<span class="operator">(</span><span class="string">"desc_3"</span><span class="operator">);
{</span><span class="comment"> // Create a scope to destroy temporary connexion to database
// Open a transaction to database
</span> QSqlDatabase db<span class="operator"> =</span> qx<span class="operator">::</span>QxSqlDatabase<span class="operator">::</span>getDatabase<span class="operator">();</span><span class="type">
bool</span> bCommit<span class="operator"> =</span> db<span class="operator">.</span>transaction<span class="operator">();</span><span class="comment">
// Insert 3 categories into database, use 'db' parameter for the transaction
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_1<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_2<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>category_3<span class="operator">, (&amp;</span> db<span class="operator">));</span> bCommit<span class="operator"> = (</span>bCommit<span class="operator"> &amp;&amp; !</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
qAssert<span class="operator">(</span>bCommit<span class="operator">);</span>
qAssert<span class="operator">(</span>category_1<span class="operator">-&gt;</span>getcategory_id<span class="operator">() !=</span><span class="string"> ""</span><span class="operator">);</span>
qAssert<span class="operator">(</span>category_2<span class="operator">-&gt;</span>getcategory_id<span class="operator">() !=</span><span class="string"> ""</span><span class="operator">);</span>
qAssert<span class="operator">(</span>category_3<span class="operator">-&gt;</span>getcategory_id<span class="operator">() !=</span><span class="string"> ""</span><span class="operator">);</span><span class="comment">
// Terminate transaction =&gt; commit or rollback if there is error
</span><span class="flow"> if</span><span class="operator"> (</span>bCommit<span class="operator">) {</span> db<span class="operator">.</span>commit<span class="operator">(); }</span><span class="flow">
else</span><span class="operator"> {</span> db<span class="operator">.</span>rollback<span class="operator">(); }
}</span><span class="comment"> // End of scope : 'db' is destroyed
// Create a blog with the class name (factory)
</span> boost<span class="operator">::</span>any blog_any<span class="operator"> =</span> qx<span class="operator">::</span>create<span class="operator">(</span><span class="string">"blog"</span><span class="operator">);</span>
blog_ptr blog_1<span class="operator">;</span><span class="flow">
try</span><span class="operator"> {</span> blog_1<span class="operator"> =</span> boost<span class="operator">::</span>any_cast<span class="operator">&lt;</span>blog_ptr<span class="operator">&gt;(</span>blog_any<span class="operator">); }</span><span class="flow">
catch</span><span class="operator"> (...) {</span> blog_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> blog<span class="operator">()); }</span>
blog_1<span class="operator">-&gt;</span>settext<span class="operator">(</span><span class="string">"blog_text_1"</span><span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>settitle<span class="operator">(</span><span class="string">"blog_title_1"</span><span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>setauthor<span class="operator">(</span>author_1<span class="operator">);</span><span class="comment">
// Insert 'blog_1' into database with 'save()' method
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
// Modify 'blog_1' properties and save into database
</span> blog_1<span class="operator">-&gt;</span>settext<span class="operator">(</span><span class="string">"update blog_text_1"</span><span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>setauthor<span class="operator">(</span>author_2<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save<span class="operator">(</span>blog_1<span class="operator">);</span><span class="comment">
// Add 2 comments to 'blog_1'
</span> comment_ptr comment_1<span class="operator">;</span> comment_1<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
comment_ptr comment_2<span class="operator">;</span> comment_2<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> comment<span class="operator">());</span>
comment_1<span class="operator">-&gt;</span>settext<span class="operator">(</span><span class="string">"comment_1 text"</span><span class="operator">);</span>
comment_1<span class="operator">-&gt;</span>setblog_id<span class="operator">(</span>blog_1<span class="operator">);</span>
comment_2<span class="operator">-&gt;</span>settext<span class="operator">(</span><span class="string">"comment_2 text"</span><span class="operator">);</span>
comment_2<span class="operator">-&gt;</span>setblog_id<span class="operator">(</span>blog_1<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_1<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>insert<span class="operator">(</span>comment_2<span class="operator">);</span>
qAssert<span class="operator">(</span>qx<span class="operator">::</span>dao<span class="operator">::</span>count<span class="operator">&lt;</span>comment<span class="operator">&gt;() ==</span><span class="int"> 2</span><span class="operator">);</span><span class="comment">
// Add 2 categories to 'blog_1' =&gt; must insert into extra-table 'category_blog'
</span> blog<span class="operator">::</span>type_list_of_category lst_category<span class="operator">;</span>
lst_category<span class="operator">.</span>insert<span class="operator">(</span>category_1<span class="operator">-&gt;</span>getcategory_id<span class="operator">(),</span> category_1<span class="operator">);</span>
lst_category<span class="operator">.</span>insert<span class="operator">(</span>category_3<span class="operator">-&gt;</span>getcategory_id<span class="operator">(),</span> category_3<span class="operator">);</span>
blog_1<span class="operator">-&gt;</span>setlist_of_category<span class="operator">(</span>lst_category<span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_with_relation<span class="operator">(</span><span class="string">"list_of_category"</span><span class="operator">,</span> blog_1<span class="operator">);</span><span class="comment">
// Fetch blog into a new variable with all relation : 'author', 'comment' and 'category'
</span> blog_ptr blog_tmp<span class="operator">;</span> blog_tmp<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> blog<span class="operator">());</span>
blog_tmp<span class="operator">-&gt;</span>setblog_id<span class="operator">(</span>blog_1<span class="operator">-&gt;</span>getblog_id<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id_with_all_relation<span class="operator">(</span>blog_tmp<span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>list_of_comment<span class="operator">().</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>list_of_category<span class="operator">().</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>gettext<span class="operator">() ==</span><span class="string"> "update blog_text_1"</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>getauthor<span class="operator">() &amp;&amp;</span> blog_tmp<span class="operator">-&gt;</span>getauthor<span class="operator">()-&gt;</span>getauthor_id<span class="operator">() ==</span> author_2<span class="operator">-&gt;</span>getauthor_id<span class="operator">());</span><span class="comment">
// Fetch blog into a new variable with many relations using "*-&gt;*-&gt;*-&gt;*" (4 levels of relationships)
</span> blog_tmp<span class="operator">.</span>reset<span class="operator">(</span><span class="keyword">new</span> blog<span class="operator">());</span>
blog_tmp<span class="operator">-&gt;</span>setblog_id<span class="operator">(</span>blog_1<span class="operator">-&gt;</span>getblog_id<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id_with_relation<span class="operator">(</span><span class="string">"*-&gt;*-&gt;*-&gt;*"</span><span class="operator">,</span> blog_tmp<span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>list_of_comment<span class="operator">().</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>list_of_category<span class="operator">().</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>gettext<span class="operator">() ==</span><span class="string"> "update blog_text_1"</span><span class="operator">);</span>
qAssert<span class="operator">(</span>blog_tmp<span class="operator">-&gt;</span>getauthor<span class="operator">() &amp;&amp;</span> blog_tmp<span class="operator">-&gt;</span>getauthor<span class="operator">()-&gt;</span>getauthor_id<span class="operator">() ==</span> author_2<span class="operator">-&gt;</span>getauthor_id<span class="operator">());</span><span class="comment">
// Dump 'blog_tmp' result from database (xml serialization)
</span> qx<span class="operator">::</span>dump<span class="operator">(</span>blog_tmp<span class="operator">);</span><span class="comment">
// Check qx::dao::save_with_relation_recursive() function
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_with_relation_recursive<span class="operator">(</span>blog_tmp<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_with_relation_recursive<span class="operator">(</span>blog_tmp<span class="operator">,</span> qx<span class="operator">::</span>dao<span class="operator">::</span>save_mode<span class="operator">::</span>e_update_only<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span><span class="comment">
// Call 'age()' method with class name and method name (reflexion)
//qx_bool bInvokeOk = qx::QxClassX::invoke("author", "age", author_1);
//qAssert(bInvokeOk);
// Test 'isDirty()' method
</span> qx<span class="operator">::</span>dao<span class="operator">::</span>ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;</span> blog_isdirty<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>ptr<span class="operator">&lt;</span>blog<span class="operator">&gt;(</span><span class="keyword">new</span> blog<span class="operator">());</span>
blog_isdirty<span class="operator">-&gt;</span>setblog_id<span class="operator">(</span>blog_1<span class="operator">-&gt;</span>getblog_id<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_by_id<span class="operator">(</span>blog_isdirty<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">() &amp;&amp; !</span> blog_isdirty<span class="operator">.</span>isDirty<span class="operator">());</span>
blog_isdirty<span class="operator">-&gt;</span>settext<span class="operator">(</span><span class="string">"blog property 'text' modified =&gt; blog is dirty !!!"</span><span class="operator">);</span>
QStringList lstDiff<span class="operator">;</span><span class="type"> bool</span> bDirty<span class="operator"> =</span> blog_isdirty<span class="operator">.</span>isDirty<span class="operator">(</span>lstDiff<span class="operator">);</span>
qAssert<span class="operator">(</span>bDirty<span class="operator"> &amp;&amp; (</span>lstDiff<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 1</span><span class="operator">) &amp;&amp; (</span>lstDiff<span class="operator">.</span>at<span class="operator">(</span><span class="int">0</span><span class="operator">) ==</span><span class="string"> "text"</span><span class="operator">));</span><span class="flow">
if</span><span class="operator"> (</span>bDirty<span class="operator">) {</span> qDebug<span class="operator">(</span><span class="string">"[QxOrm] test dirty 1 : blog is dirty =&gt; '%s'"</span><span class="operator">,</span> qPrintable<span class="operator">(</span>lstDiff<span class="operator">.</span>join<span class="operator">(</span><span class="string">"|"</span><span class="operator">))); }</span><span class="comment">
// Update only property 'm_text' of 'blog_isdirty'
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>update_optimized<span class="operator">(</span>blog_isdirty<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">() &amp;&amp; !</span> blog_isdirty<span class="operator">.</span>isDirty<span class="operator">());</span>
qx<span class="operator">::</span>dump<span class="operator">(</span>blog_isdirty<span class="operator">);</span><span class="comment">
// Test 'isDirty()' method with a container
</span><span class="keyword"> typedef</span> qx<span class="operator">::</span>dao<span class="operator">::</span>ptr<span class="operator">&lt;</span> QList<span class="operator">&lt;</span>author_ptr<span class="operator">&gt; &gt;</span> type_lst_author_test_is_dirty<span class="operator">;</span>
type_lst_author_test_is_dirty container_isdirty<span class="operator"> =</span> type_lst_author_test_is_dirty<span class="operator">(</span><span class="keyword">new</span> QList<span class="operator">&lt;</span>author_ptr<span class="operator">&gt;());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_all<span class="operator">(</span>container_isdirty<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">() &amp;&amp; !</span> container_isdirty<span class="operator">.</span>isDirty<span class="operator">() &amp;&amp; (</span>container_isdirty<span class="operator">-&gt;</span>count<span class="operator">() ==</span><span class="int"> 3</span><span class="operator">));</span>
author_ptr author_ptr_dirty<span class="operator"> =</span> container_isdirty<span class="operator">-&gt;</span>at<span class="operator">(</span><span class="int">1</span><span class="operator">);</span>
author_ptr_dirty<span class="operator">-&gt;</span>setlastname<span class="operator">(</span><span class="string">"author name modified at index 1 =&gt; container is dirty !!!"</span><span class="operator">);</span>
bDirty<span class="operator"> =</span> container_isdirty<span class="operator">.</span>isDirty<span class="operator">(</span>lstDiff<span class="operator">);</span>
qAssert<span class="operator">(</span>bDirty<span class="operator"> &amp;&amp; (</span>lstDiff<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 1</span><span class="operator">));</span><span class="flow">
if</span><span class="operator"> (</span>bDirty<span class="operator">) {</span> qDebug<span class="operator">(</span><span class="string">"[QxOrm] test dirty 2 : container is dirty =&gt; '%s'"</span><span class="operator">,</span> qPrintable<span class="operator">(</span>lstDiff<span class="operator">.</span>join<span class="operator">(</span><span class="string">"|"</span><span class="operator">))); }</span>
author_ptr_dirty<span class="operator"> =</span> container_isdirty<span class="operator">-&gt;</span>at<span class="operator">(</span><span class="int">2</span><span class="operator">);</span>
author_ptr_dirty<span class="operator">-&gt;</span>setfirstname<span class="operator">(</span><span class="string">"firstname changed"</span><span class="operator">);</span>
bDirty<span class="operator"> =</span> container_isdirty<span class="operator">.</span>isDirty<span class="operator">(</span>lstDiff<span class="operator">);</span>
qAssert<span class="operator">(</span>bDirty<span class="operator"> &amp;&amp; (</span>lstDiff<span class="operator">.</span>count<span class="operator">() ==</span><span class="int"> 2</span><span class="operator">));</span><span class="flow">
if</span><span class="operator"> (</span>bDirty<span class="operator">) {</span> qDebug<span class="operator">(</span><span class="string">"[QxOrm] test dirty 3 : container is dirty =&gt; '%s'"</span><span class="operator">,</span> qPrintable<span class="operator">(</span>lstDiff<span class="operator">.</span>join<span class="operator">(</span><span class="string">"|"</span><span class="operator">))); }</span><span class="comment">
// Update only property 'm_name' at position 1, only property 'm_birthdate' at position 2 and nothing at position 0
</span> daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>update_optimized<span class="operator">(</span>container_isdirty<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">() &amp;&amp; !</span> container_isdirty<span class="operator">.</span>isDirty<span class="operator">());</span>
qx<span class="operator">::</span>dump<span class="operator">(</span>container_isdirty<span class="operator">);</span><span class="comment">
// Fetch only property 'm_text' of blog
</span> QStringList lstColumns<span class="operator"> =</span> QStringList<span class="operator">() &lt;&lt;</span><span class="string"> "text"</span><span class="operator">;</span>
QList<span class="operator">&lt;</span>blog_ptr<span class="operator">&gt;</span> lst_blog_with_only_text<span class="operator">;</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>fetch_all<span class="operator">(</span>lst_blog_with_only_text<span class="operator">,</span> NULL<span class="operator">,</span> lstColumns<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">() &amp;&amp; (</span>lst_blog_with_only_text<span class="operator">.</span>size<span class="operator">() &gt;</span><span class="int"> 0</span><span class="operator">));</span><span class="flow">
if</span><span class="operator"> ((</span>lst_blog_with_only_text<span class="operator">.</span>size<span class="operator">() &gt;</span><span class="int"> 0</span><span class="operator">) &amp;&amp; (</span>lst_blog_with_only_text<span class="operator">[</span><span class="int">0</span><span class="operator">].</span>get<span class="operator">() !=</span> NULL<span class="operator">))
{</span> qAssert<span class="operator">(</span>lst_blog_with_only_text<span class="operator">[</span><span class="int">0</span><span class="operator">]-&gt;</span>gettitle<span class="operator">().</span>isEmpty<span class="operator">()); }</span>
qx<span class="operator">::</span>dump<span class="operator">(</span>lst_blog_with_only_text<span class="operator">);</span><span class="comment">
// Dump all registered classes into QxOrm context (introspection engine)
</span> qx<span class="operator">::</span>QxClassX<span class="operator">::</span>dumpAllClasses<span class="operator">();</span><span class="comment">
// Call a custom SQL query or a stored procedure
</span> qx_query testStoredProc<span class="operator">(</span><span class="string">"SELECT * FROM t_author"</span><span class="operator">);</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>call_query<span class="operator">(</span>testStoredProc<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span>
testStoredProc<span class="operator">.</span>dumpSqlResult<span class="operator">();</span><span class="comment">
// Call a custom SQL query or a stored procedure and fetch automatically properties (with a collection of items)
</span> qx_query testStoredProcBis<span class="operator">(</span><span class="string">"SELECT * FROM t_author"</span><span class="operator">);</span>
authorX<span class="operator">.</span>clear<span class="operator">();</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>execute_query<span class="operator">(</span>testStoredProcBis<span class="operator">,</span> authorX<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span> qAssert<span class="operator">(</span>authorX<span class="operator">.</span>count<span class="operator">() &gt;</span><span class="int"> 0</span><span class="operator">);</span>
qx<span class="operator">::</span>dump<span class="operator">(</span>authorX<span class="operator">);</span><span class="comment">
// Call a custom SQL query or a stored procedure and fetch automatically properties
</span> qx_query testStoredProcThird<span class="operator">(</span><span class="string">"SELECT name, category_id FROM t_category"</span><span class="operator">);</span>
category_ptr category_tmp<span class="operator"> =</span> category_ptr<span class="operator">(</span><span class="keyword">new</span> category<span class="operator">());</span>
daoError<span class="operator"> =</span> qx<span class="operator">::</span>dao<span class="operator">::</span>execute_query<span class="operator">(</span>testStoredProcThird<span class="operator">,</span> category_tmp<span class="operator">);</span>
qAssert<span class="operator">(!</span> daoError<span class="operator">.</span>isValid<span class="operator">());</span> qAssert<span class="operator">(</span>category_tmp<span class="operator">-&gt;</span>getcategory_id<span class="operator">() !=</span><span class="string"> ""</span><span class="operator">);</span>
qx<span class="operator">::</span>dump<span class="operator">(</span>category_tmp<span class="operator">);</span><span class="flow">
return</span><span class="int"> 0</span><span class="operator">;
}</span>
</pre>
</div>
<br /><br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2"
name="cpp_model_view_export_settings">Exporter en projet C++ de type model/view</a></p>
<div class="manual_div_content">
La biblioth<74>que QxOrm fournit <a href="../doxygen/html/group___qx_model_view.html"
target="_blank">le module QxModelView</a>.
Une documentation sur le module QxModelView est disponible dans <a
href="./manual.html#manual_90">le manuel utilisateur de la biblioth<74>que QxOrm</a>.
Le module <a href="../doxygen/html/group___qx_model_view.html" target="_blank">QxModelView</a>
permet d'utiliser <a href="http://doc.qt.io/qt-5/modelview.html" target="_blank">le moteur
model/view de Qt</a> avec toutes les classes enregistr<74>es dans le contexte QxOrm :
<ul>
<li><a href="./manual.html#manual_940">QML</a> : toute propri<72>t<EFBFBD> enregistr<74>e dans le contexte
QxOrm est accessible en QML : le module <a
href="../doxygen/html/group___qx_model_view.html" target="_blank">QxModelView</a>
permet ainsi de faciliter l'int<6E>raction entre QML et les bases de donn<6E>es ;</li>
<li><a href="./manual.html#manual_950">Qt widgets</a> : utilisation de <i>QTableView</i> ou
<i>QListView</i> par exemple pour afficher/modifier le contenu d'une table de la base de
donn<6E>es.
</li>
</ul>
<br />
L'application QxEntityEditor permet de g<>n<EFBFBD>rer un projet C++ de type model/view complet et pr<70>t
<20> <20>tre compil<69> : ainsi toutes les entit<69>s et leurs relations sont accessibles dans des vues QML
par exemple.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_model_view_export_settings_parameters">Param<EFBFBD>tres de l'export</a></p>
<div class="manual_div_content">
Les param<61>tres de l'export C++ de type model/view sont accessibles par le menu principal :
<i>Tools &gt;&gt; Export to C++ model/view project (settings)</i>.
Cet <20>cran de param<61>trage apparait automatiquement au 1er export si aucun param<61>tre n'a <20>t<EFBFBD>
enregistr<74> au niveau du projet.
Lorsqu'un export C++ model/view a d<>j<EFBFBD> <20>t<EFBFBD> r<>alis<69>, alors cette fen<65>tre de param<61>trage est
accessible uniquement par le menu principal : <i>Tools &gt;&gt; Export to C++ model/view
project (settings)</i> :
<br /><br />
<img alt="Export C++ model/view"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_model_view.png" />
<br /><br />
Cet <20>cran d'export est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>C++ model/view export settings</i> :</b>
<ul>
<li>Champ <20> <i>C++ model/view project location</i> <20> : r<>pertoire de destination qui
contiendra <a href="#cpp_model_view_export_settings_generated">tous les fichiers du
projet C++ model/view g<>n<EFBFBD>r<EFBFBD></a>. Il est possible de renseigner dans ce champ un
chemin relatif par rapport au fichier projet <i>*.qxee</i> ;</li>
<li>Champ <20> <i>C++ entities project location</i> <20> : lecture seule uniquement, indique le
r<>pertoire de destination <a href="#cpp_export_settings">du projet C++ g<>n<EFBFBD>r<EFBFBD></a>
(entit<69>s enregistr<74>es dans le contexte QxOrm) dont d<>pend le projet C++ model/view ;
</li>
<li>Champ <20> <i>Namespace for model/view</i> <20> : espace de nom utilis<69> pour les classes C++
g<>n<EFBFBD>r<EFBFBD>es de type model/view (ces classes impl<70>mentent l'interface <a
href="../doxygen/html/classqx_1_1_ix_model.html" target="_blank">qx::IxModel</a>) ;
</li>
<li>Champ <20> <i>Generate custom files</i> <20> : si coch<63>, le projet C++ g<>n<EFBFBD>r<EFBFBD> contient un
fichier personnalis<69> par entit<69>.
Par d<>faut, ces fichiers custom sont vides et ne seront jamais <20>cras<61>s par un nouvel
export C++.</li>
</ul>
<br />
<b>-- Section <i>Custom script (Javascript file) to change the default behaviour of the
export process</i> :</b> <a href="#js_engine">param<EFBFBD>trage du moteur de personnalisation
de l'export</a>.
<ul>
<li>Champ <20> <i>Custom script file</i> <20> : chemin d'acc<63>s au fichier Javascript permettant
de <a href="#js_engine">personnaliser l'export C++</a>. Si vide, aucune
personnalisation n'est appliqu<71>e (export par d<>faut).
Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier
projet <i>*.qxee</i>, par exemple <i>./my_script.js</i> si le fichier
<i>my_script.js</i> se trouve dans le m<>me r<>pertoire que le fichier projet
<i>*.qxee</i> ;
</li>
<li>Bouton <20> <i>Debug custom Javascript file</i> <20> : si un fichier Javascript est d<>fini,
un clic sur ce bouton d<>clenchera <a href="#js_engine_debug">le mode d<>bogage
Javascript</a> au prochain lancement d'export C++.
Au lieu d'utiliser ce bouton, il est <20>galement possible d'activer <a
href="#js_engine_debug">le mode d<>bogage Javascript</a> en maintenant la touche
<i>SHIFT</i> au moment de lancer un export C++.
</li>
</ul>
<br />
<b>-- Section <i>C++ model/view template files</i> :</b> cette section d<>finit le code C++
model/view pour les fichiers <i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i>.
Le moteur d'export utilise des mots-cl<63> (<i>placeholder</i> sous la forme <i>@@ACTION@@</i>)
pour remplacer le code par la valeur correspondante.
Cette notion de <i>placeholder</i> est la base du <a href="#js_engine">moteur de
personnalisation Javascript</a>.
Il est possible de renseigner <a href="#js_engine_placeholder">des <i>placeholder</i>
personnalis<69>s en prefixant par <i>@@CUSTOM_</i></a>, par exemple :
<i>@@CUSTOM_MY_ACTION@@</i>.
<ul>
<li>Option <20> <i>Default</i> <20> : si coch<63> (option par d<>faut), les mod<6F>les g<>n<EFBFBD>r<EFBFBD>s h<>ritent
de <a href="../doxygen/html/classqx_1_1_ix_model.html"
target="_blank">qx::QxModel&lt;T&gt;</a> (les mod<6F>les peuvent ex<65>cuter des requ<71>tes
SQL, <a href="./manual.html#manual_940">m<EFBFBD>me dans des vues QML</a>) ;</li>
<li>Option <20> <i>qx::QxModelService&lt;T, S&gt;</i> <20> : si coch<63>, les mod<6F>les g<>n<EFBFBD>r<EFBFBD>s
h<>ritent de <a href="../doxygen/html/classqx_1_1_qx_model_service.html"
target="_blank">qx::QxModelService&lt;T, S&gt;</a> (les mod<6F>les peuvent <a
href="./manual.html#manual_960">ex<EFBFBD>cuter des requ<71>tes client-serveur avec le module
QxService</a>, <a href="./manual.html#manual_940">m<EFBFBD>me dans des vues QML</a>) ;</li>
<li>Option <20> <i>Custom</i> <20> : si coch<63>, possibilit<69> de fournir son propre code C++ pour
g<>n<EFBFBD>rer les mod<6F>les (il est cependant conseill<6C> de commencer <20> copier/coller
<i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i> d'une des 2 autres options pour
r<>cup<75>rer les <i>placeholder</i> <20> utiliser).
</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_model_view_export_settings_generated">Pr<EFBFBD>sentation du projet g<>n<EFBFBD>r<EFBFBD></a></p>
<div class="manual_div_content">
Le projet C++ model/view g<>n<EFBFBD>r<EFBFBD> dispose de l'arborescence suivante :
<br /><br />
<img alt="Export C++ model/view output"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_model_view_output.png" />
<br /><br />
<ul>
<li>le dossier <20> <i>bin</i> <20> est vide par d<>faut, et contiendra le binaire compil<69>
(<i>*.dll</i> sous Windows, <i>*.so</i> sous Linux, etc...) ;</li>
<li>le dossier <20> <i>build</i> <20> est vide par d<>faut, il peut <20>tre utilis<69> pour produire
les fichiers <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>le dossier <20> <i>custom</i> <20> est aliment<6E> si l'option <20> <a
href="#cpp_model_view_export_settings_parameters"><i>Generate custom files</i></a> <20>
est coch<63>e ;</li>
<li>le dossier <20> <i>include</i> <20> contient les d<>finitions de tous les mod<6F>les du projet ;
</li>
<li>le dossier <20> <i>src</i> <20> contient les impl<70>mentations de tous les mod<6F>les du projet ;
</li>
<li>le fichier <20> <i>CMakeLists.txt</i> <20> peut <20>tre utilis<69> pour compiler le projet C++
avec <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>les fichiers <20> <i>*.gen.pri</i> <20> et <20> <i>*.gen.pro</i> <20> peuvent <20>tre utilis<69>s pour
compiler le projet C++ avec <a href="http://doc.qt.io/qt-5/qmake-manual.html"
target="_blank">qmake</a> ;</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2"
name="cpp_services_export_settings">Exporter en projet C++ de type services</a></p>
<div class="manual_div_content">
La biblioth<74>que QxOrm fournit <a href="../doxygen/html/group___qx_service.html"
target="_blank">le module QxService</a>.
Une documentation sur le module QxService est disponible dans <a
href="./manual.html#manual_80">le manuel utilisateur de la biblioth<74>que QxOrm</a>.
Le module <a href="../doxygen/html/group___qx_service.html" target="_blank">QxService</a> de la
biblioth<74>que QxOrm permet de cr<63>er rapidement un <b>serveur d'applications C++</b> performant
(notion de <i>services</i> avec <i>demande</i> du client et <i>r<EFBFBD>ponse</i> du serveur).
<a href="./tutorial_2.html">Un tutoriel est disponible sur le site QxOrm</a> afin de pr<70>senter
un exemple d'utilisation du module <a href="../doxygen/html/group___qx_service.html"
target="_blank">QxService</a>.
<br /><br />
L'application QxEntityEditor permet de g<>n<EFBFBD>rer un projet C++ de type services (un projet C++
pour g<>rer la couche cliente et un projet C++ pour publier les services c<>t<EFBFBD> serveur) complet et
pr<70>t <20> <20>tre compil<69> : ainsi toutes les entit<69>s et leurs relations peuvent <20>tre transf<73>r<EFBFBD>es sur
le r<>seau pour une application de type client/serveur.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_services_export_settings_parameters">Param<EFBFBD>tres de l'export</a></p>
<div class="manual_div_content">
Les param<61>tres de l'export C++ de type services sont accessibles par le menu principal :
<i>Tools &gt;&gt; Export to C++ services project (settings)</i>.
Cet <20>cran de param<61>trage apparait automatiquement au 1er export si aucun param<61>tre n'a <20>t<EFBFBD>
enregistr<74> au niveau du projet.
Lorsqu'un export C++ de type services a d<>j<EFBFBD> <20>t<EFBFBD> r<>alis<69>, alors cette fen<65>tre de param<61>trage
est accessible uniquement par le menu principal : <i>Tools &gt;&gt; Export to C++ services
project (settings)</i> :
<br /><br />
<img alt="Export C++ services"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_services.png" />
<br /><br />
Cet <20>cran d'export est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>C++ services export settings</i> :</b>
<ul>
<li>Champ <20> <i>C++ services project location</i> <20> : r<>pertoire de destination qui
contiendra <a href="#cpp_services_export_settings_generated">tous les fichiers du
projet C++ de type services g<>n<EFBFBD>r<EFBFBD></a>. Il est possible de renseigner dans ce champ
un chemin relatif par rapport au fichier projet <i>*.qxee</i> ;</li>
<li>Champ <20> <i>C++ entities project location</i> <20> : lecture seule uniquement, indique le
r<>pertoire de destination <a href="#cpp_export_settings">du projet C++ g<>n<EFBFBD>r<EFBFBD></a>
(entit<69>s enregistr<74>es dans le contexte QxOrm) dont d<>pend le projet C++ services ;</li>
<li>Champ <20> <i>Namespace for services</i> <20> : espace de nom utilis<69> pour les classes C++
g<>n<EFBFBD>r<EFBFBD>es de type services (ces classes permettent de <a
href="./manual.html#manual_80">transf<EFBFBD>rer les entit<69>s sur le r<>seau</a>, couche
cliente et serveur) ;</li>
<li>Champ <20> <i>Generate custom files</i> <20> : si coch<63>, le projet C++ g<>n<EFBFBD>r<EFBFBD> contient un
fichier personnalis<69> par entit<69>.
Par d<>faut, ces fichiers custom sont vides et ne seront jamais <20>cras<61>s par un nouvel
export C++.
Ces fichiers custom peuvent par exemple <20>tre utilis<69>s pour impl<70>menter des nouveaux
services ;</li>
<li>Champ <20> <i>Generate server application</i> <20> : si coch<63>, <a
href="#cpp_services_export_settings_server_app">un projet C++ d'exemple de type
serveur d'applications</a> est g<>n<EFBFBD>r<EFBFBD> et permet de charger et publier les services
c<>t<EFBFBD> serveur avec un syst<73>me de plugins ;</li>
<li>Champ <20> <i>Server application location</i> <20> : si l'option <20> <i>Generate server
application</i> <20> est coch<63>e, d<>fini le r<>pertoire de destination du projet
d'exemple <a href="#cpp_services_export_settings_server_app">serveur
d'applications</a>.</li>
</ul>
<br />
<b>-- Section <i>Custom script (Javascript file) to change the default behaviour of the
export process</i> :</b> <a href="#js_engine">param<EFBFBD>trage du moteur de personnalisation
de l'export</a>.
<ul>
<li>Champ <20> <i>Custom script file</i> <20> : chemin d'acc<63>s au fichier Javascript permettant
de <a href="#js_engine">personnaliser l'export C++</a>. Si vide, aucune
personnalisation n'est appliqu<71>e (export par d<>faut).
Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier
projet <i>*.qxee</i>, par exemple <i>./my_script.js</i> si le fichier
<i>my_script.js</i> se trouve dans le m<>me r<>pertoire que le fichier projet
<i>*.qxee</i> ;
</li>
<li>Bouton <20> <i>Debug custom Javascript file</i> <20> : si un fichier Javascript est d<>fini,
un clic sur ce bouton d<>clenchera <a href="#js_engine_debug">le mode d<>bogage
Javascript</a> au prochain lancement d'export C++.
Au lieu d'utiliser ce bouton, il est <20>galement possible d'activer <a
href="#js_engine_debug">le mode d<>bogage Javascript</a> en maintenant la touche
<i>SHIFT</i> au moment de lancer un export C++.
</li>
</ul>
<br />
<b>-- Section <i>C++ services template files</i> :</b> cette section d<>finit le code C++ des
services pour les fichiers <i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i> (client et
serveur).
Le moteur d'export utilise des mots-cl<63> (<i>placeholder</i> sous la forme <i>@@ACTION@@</i>)
pour remplacer le code par la valeur correspondante.
Cette notion de <i>placeholder</i> est la base du <a href="#js_engine">moteur de
personnalisation Javascript</a>.
Il est possible de renseigner <a href="#js_engine_placeholder">des <i>placeholder</i>
personnalis<69>s en prefixant par <i>@@CUSTOM_</i></a>, par exemple :
<i>@@CUSTOM_MY_ACTION@@</i>.
<ul>
<li>Option <20> <i>Default</i> <20> : si coch<63> (option par d<>faut), g<>n<EFBFBD>re les services (couche
cliente et serveur) par d<>faut : les entit<69>s peuvent <20>tre transf<73>r<EFBFBD>es sur le r<>seau et
les actions <i>CRUD</i> sur la base de donn<6E>es sont support<72>es ;</li>
<li>Option <20> <i>Custom</i> <20> : si coch<63>, possibilit<69> de fournir son propre code C++ pour
g<>n<EFBFBD>rer les services (il est cependant conseill<6C> de commencer <20> copier/coller
<i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i> de l'option par d<>faut pour
r<>cup<75>rer les <i>placeholder</i> <20> utiliser).
</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_services_export_settings_generated">Pr<EFBFBD>sentation du projet g<>n<EFBFBD>r<EFBFBD></a></p>
<div class="manual_div_content">
Le projet C++ de type services (client et serveur) g<>n<EFBFBD>r<EFBFBD> dispose de l'arborescence suivante
:
<br /><br />
<img alt="Export C++ services output"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_services_output.png" />
<br /><br />
<ul>
<li>le dossier <20> <i>bin</i> <20> est vide par d<>faut, et contiendra les binaires compil<69>s
(<i>*.dll</i> sous Windows, <i>*.so</i> sous Linux, etc...) pour la partie cliente et
serveur ;</li>
<li>le dossier <20> <i>build</i> <20> est vide par d<>faut, il peut <20>tre utilis<69> pour produire
les fichiers <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>le dossier <20> <i>client</i> <20> contient les fichiers <a
href="http://doc.qt.io/qt-5/qmake-manual.html" target="_blank">qmake</a> et <a
href="https://cmake.org/" target="_blank">CMake</a> pour compiler la couche cliente
du projet ;</li>
<li>le dossier <20> <i>custom</i> <20> est aliment<6E> si l'option <20> <a
href="#cpp_services_export_settings_parameters"><i>Generate custom files</i></a> <20>
est coch<63>e ;</li>
<li>le dossier <20> <i>include</i> <20> contient les d<>finitions de tous les services du projet
;</li>
<li>le dossier <20> <i>server</i> <20> contient les fichiers <a
href="http://doc.qt.io/qt-5/qmake-manual.html" target="_blank">qmake</a> et <a
href="https://cmake.org/" target="_blank">CMake</a> pour compiler la couche serveur
du projet ;</li>
<li>le dossier <20> <i>src</i> <20> contient les impl<70>mentations de tous les services du projet
;</li>
<li>le fichier <20> <i>CMakeLists.txt</i> <20> peut <20>tre utilis<69> pour compiler le projet C++
(client et serveur) avec <a href="https://cmake.org/" target="_blank">CMake</a> ;</li>
<li>les fichiers <20> <i>*.gen.pri</i> <20> et <20> <i>*.gen.pro</i> <20> peuvent <20>tre utilis<69>s pour
compiler le projet C++ (client et serveur) avec <a
href="http://doc.qt.io/qt-5/qmake-manual.html" target="_blank">qmake</a> ;</li>
<li>le fichier <20> <i>*.gen.json</i> <20> est utilis<69> par la couche serveur pour g<>n<EFBFBD>rer un
plugin pouvant <20>tre charg<72> dynamiquement par <a
href="#cpp_services_export_settings_server_app">le serveur d'applications</a>.</li>
</ul>
<br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="cpp_services_export_settings_server_app">Serveur d'applications g<>n<EFBFBD>rique</a></p>
<div class="manual_div_content">
Si l'option <20> <a href="#cpp_services_export_settings_parameters"><i>Generate server
application</i></a> <20> est coch<63>e, l'export C++ de type services g<>n<EFBFBD>re <20>galement un
exemple de serveur d'applications g<>n<EFBFBD>rique pouvant publier des services en chargeant des
plugins.
Tout comme les autres projets C++ g<>n<EFBFBD>r<EFBFBD>s par QxEntityEditor, le serveur d'applications
g<>n<EFBFBD>rique peut <20>tre compil<69> <a href="http://doc.qt.io/qt-5/qmake-manual.html"
target="_blank">qmake</a> et <a href="https://cmake.org/" target="_blank">CMake</a>.
Ce projet d'exemple dispose de l'arborescence suivante :
<br /><br />
<img alt="Export C++ services server app output"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_services_server_app_output.png" />
<br /><br />
Une fois compil<69>, l'ex<65>cutable se trouve dans le dossier <20> <i>bin</i> <20>.
Le lancement du serveur d'applications g<>n<EFBFBD>rique ouvre la fen<65>tre suivante :
<br /><br />
<img alt="Export C++ services server app"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_cpp_services_server_app.png" />
<br /><br />
Cet <20>cran est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>Plugins services</i> :</b>
<ul>
<li>Champ <20> <i>Plugins path</i> <20> : il est n<>cessaire de d<>finir le r<>pertoire contenant
les plugins <20> charger.
Ces plugins correspondent <20> <a href="#cpp_services_export_settings_generated">la couche
serveur du projet C++ de type services</a>.
Une fois charg<72>, les plugins publient des services pouvant <20>tre appel<65>s par les
applications clientes.
Si aucun plugin n'est charg<72> apr<70>s la s<>lection du r<>pertoire, il est possible de
d<>finir <a href="http://doc.qt.io/qt-5/deployment-plugins.html" target="_blank">la
variable d'environnement <b>QT_DEBUG_PLUGINS</b></a> afin d'avoir des logs sur
l'erreur de chargement de plugin (en g<>n<EFBFBD>ral, une d<>pendance du plugin non trouv<75>).
</li>
</ul>
<br />
<b>-- Section <i>Database connection parameters</i> :</b>
<ul>
<li>Cette section contient tous les param<61>tres n<>cessaires pour initialiser la connexion <20>
la base de donn<6E>es utilis<69>e par les services (utilisation de la classe <a
href="./manual.html#manual_310">qx::QxSqlDatabase</a>).</li>
</ul>
<br />
<b>-- Section <i>Server parameters</i> :</b>
<ul>
<li>Champ <20> <i>Port number</i> <20> : d<>fini le n<> de port utilis<69> par le serveur
d'applications pour publier les services. Les applications clientes devront se
connecter sur ce port pour effectuer des requ<71>tes au serveur ;</li>
<li>Champ <20> <i>Thread count</i> <20> : nombre de threads utilis<69>s par le serveur pour traiter
les requ<71>tes provenant des applications clientes ;</li>
<li>Champ <20> <i>Serialization type</i> <20> : type de s<>rialisation utilis<69> pour renvoyer les
r<>ponses du serveur au client ;</li>
<li>Champ <20> <i>Compress data</i> <20> : si coch<63>, les donn<6E>es renvoy<6F>es au client sont
compress<73>es ;</li>
<li>Champ <20> <i>Encrypt data</i> <20> : si coch<63>, les donn<6E>es renvoy<6F>es au client sont
crypt<70>es (possibilit<69> de d<>finir une cl<63> de cryptage) ;</li>
<li>Bouton <20> <i>Start server</i> <20> : bouton permettant de d<>marrer et arr<72>ter le serveur.
</li>
</ul>
<br />
<b>-- Section <i>Log last client-server reply-request transaction</i> :</b>
<ul>
<li>Affiche dans un flux XML ou JSON les d<>tails de la derni<6E>re transaction client-serveur
trait<69>e par le serveur d'applications.</li>
</ul>
<br />
<b>-- Section <i>Log last server error</i> :</b>
<ul>
<li>Si une erreur se produit sur le serveur d'applications, elle est automatiquement
loggu<67>e dans cette section.</li>
</ul>
<br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="ddl_export_settings">Exporter le
sch<63>ma de base de donn<6E>es SQL DDL</a></p>
<div class="manual_div_content">
L'application QxEntityEditor permet de g<>n<EFBFBD>rer le sch<63>ma de base de donn<6E>es dans un format DDL
SQL.
L'application QxEntityEditor supporte les bases de donn<6E>es les plus fr<66>quemment utilis<69>es :
SQLite, MySQL, MariaDB, PostgreSQL, Oracle et Microsoft SQL Server.
Le script DDL SQL g<>n<EFBFBD>r<EFBFBD> par QxEntityEditor peut <20>tre import<72> par la base de donn<6E>es pour cr<63>er
automatiquement toutes les tables, colonnes, cl<63>s primaires, relations, index, etc...
Les param<61>tres de l'export DDL SQL sont accessibles par le menu principal : <i>Tools &gt;&gt;
Export to DDL SQL script file (settings)</i> :
<br /><br />
<img alt="Export SQL DDL"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_ddl.png" />
<br /><br />
Cet <20>cran d'export est divis<69> en plusieurs sections :
<br /><br />
<b>-- Section <i>DDL export settings</i> :</b>
<ul>
<li>Champ <20> <i>File location</i> <20> : r<>pertoire de destination qui contiendra le script DDL
SQL g<>n<EFBFBD>r<EFBFBD> ;</li>
<li>Champ <20> <i>Database type</i> <20> : type de base de donn<6E>es qui sera utilis<69> pour importer
le sch<63>ma DDL SQL (SQLite, MySQL, MariaDB, PostgreSQL, Oracle ou Microsoft SQL Server) ;
</li>
<li>Champ <20> <i>Relationships</i> <20> : si coch<63>, des cl<63>s <20>trang<6E>res (foreign keys) sont cr<63><72>es
pour g<>rer les relations entre entit<69>s ;</li>
<li>Champ <20> <i>Schema</i> <20> : d<>fini le type d'export DDL : 1 fichier contenant toute la
structure du projet <i>*.qxee</i>, ou bien 1 fichier <a href="#tag_project_state">par
version du projet <i>*.qxee</i></a> (gestion de l'<27>volution du sch<63>ma de base de
donn<6E>es).</li>
</ul>
<br />
<b>-- Section <i>Mapping C++ type to database SQL type</i> :</b>
<ul>
<li>Liste permettant d'associer un type C++ (renseign<67> au niveau des propri<72>t<EFBFBD>s du projet
<i>*.qxee</i>) <20> un type SQL.
</li>
</ul>
<br />
<b>-- Section <i>Custom script (Javascript file) to change the default behaviour of the export
process</i> :</b> <a href="#js_engine">param<EFBFBD>trage du moteur de personnalisation de
l'export</a>.
<ul>
<li>Champ <20> <i>Custom script file</i> <20> : chemin d'acc<63>s au fichier Javascript permettant de
<a href="#js_engine">personnaliser l'export DDL</a>. Si vide, aucune personnalisation
n'est appliqu<71>e (export par d<>faut).
Il est possible de renseigner dans ce champ un chemin relatif par rapport au fichier
projet <i>*.qxee</i>, par exemple <i>./my_script.js</i> si le fichier <i>my_script.js</i>
se trouve dans le m<>me r<>pertoire que le fichier projet <i>*.qxee</i> ;
</li>
<li>Bouton <20> <i>Debug custom Javascript file</i> <20> : si un fichier Javascript est d<>fini, un
clic sur ce bouton d<>clenchera <a href="#js_engine_debug">le mode d<>bogage Javascript</a>
au prochain lancement d'export DDL.
Au lieu d'utiliser ce bouton, il est <20>galement possible d'activer <a
href="#js_engine_debug">le mode d<>bogage Javascript</a> en maintenant la touche
<i>SHIFT</i> au moment de lancer un export DDL.
</li>
</ul>
<br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="printer_settings">Imprimer le
diagramme d'entit<69>s</a></p>
<div class="manual_div_content">
L'application QxEntityEditor permet d'imprimer le diagramme d'entit<69>s dans un format PNG et/ou
PDF.
Les param<61>tres d'impression sont accessibles par le menu principal : <i>Tools &gt;&gt; Print the
entities diagram (settings)</i> :
<br /><br />
<img alt="Export print PNG/PDF"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_print.png" />
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2"
name="source_control_export_settings">Exporter le projet dans un r<>pertoire associ<63> <20> un
gestionnaire de code source (Git, Perforce, CVS, etc.)</a></p>
<div class="manual_div_content">
Un projet QxEntityEditor (fichier <i>*.qxee</i>) peut <20>tre g<>r<EFBFBD> par une <20>quipe de d<>veloppeurs :
le code source d'un projet QxEntityEditor peut <20>tre export<72>/import<72> (manuellement ou en ligne de
commande) avec les plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a>.<br />
<br />
Associ<63> <20> un gestionnaire de code source (Git, Perforce, CVS, etc.), ces 2 plugins permettent
ainsi :
<ul>
<li>plusieurs personnes peuvent travailler simultan<61>ment sur un m<>me projet ;</li>
<li>un projet peut facilement <20>tre versionn<6E> dans le gestionnaire de code source ;</li>
<li>chaque <20>l<EFBFBD>ment d'un projet peut <20>tre compar<61> (diff<66>rence entre 2 versions d'une m<>me
entit<69> par exemple).</li>
</ul>
Voici un exemple d'utilisation des plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a>, avec 2 d<>veloppeurs
nomm<6D>s 'dev A' et 'dev B' (l'exemple pouvant <20>tre <20>tendu <20> X d<>veloppeurs) :
<ul>
<li>dev A et dev B travaillent sur un m<>me projet QxEntityEditor (fichier <i>*.qxee</i>) ;
</li>
<li>dev A cr<63><72>/modifie/supprime certaines entit<69>s dans l'application QxEntityEditor ;</li>
<li>dev B cr<63><72>/modifie/supprime d'autres entit<69>s dans l'application QxEntityEditor ;</li>
<li>dev A et dev B exportent le projet <i>*.qxee</i> en utilisant le plugin <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> (manuellement
ou en ligne de commande) ;</li>
<li>une fois le projet export<72> dans un r<>pertoire, dev A et dev B enregistrent
(<i>check-in</i> ou <i>submit</i>) les fichiers JSON g<>n<EFBFBD>r<EFBFBD>s dans le gestionnaire de code
source (Git, Perforce, CVS, etc.) sur leur propre branche de travail ;</li>
<li>depuis le gestionnaire de code source, dev A et dev B int<6E>grent (<i>merge</i> ou
<i>integrate</i>) leur branche de travail sur la branche de d<>veloppement DEV (ou MAIN ou
MASTER ou LATEST); <b>Remarque :</b> m<>me si il y a des conflits <20> r<>soudre, ils seront
simples <20> corriger car le format JSON est lisible facilement ;
</li>
<li>dev A et dev B peuvent <20> pr<70>sent obtenir la derni<6E>re version des fichiers JSON (<i>get
latest</i> depuis le gestionnaire de code source) <20> partir de la branche DEV (ou MAIN
ou MASTER ou LATEST) : les fichiers JSON obtenus <b>contiennent <20> la fois les
modifications de dev A et dev B</b> ;</li>
<li>dev A et dev B peuvent importer ces fichiers JSON dans l'application QxEntityEditor en
utilisant le plugin d'import <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a> (manuellement ou
en ligne de commande).</li>
</ul>
Les param<61>tres du plugin d'export sont accessibles depuis le menu principal <i>Tools &gt;&gt;
Export to Source Control repository (Git, Perforce, CVS, etc.) as JSON files (settings)</i> :
<br /><br />
<img alt="Source Control export plugin settings"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_source_control_settings.png" />
<br /><br />
Le param<61>tre <20> renseigner correspond au r<>pertoire dans lequel seront g<>n<EFBFBD>r<EFBFBD>s les fichiers
JSON.<br />
Chaque <20>l<EFBFBD>ment du projet <i>*.qxee</i> (entit<69>s, propri<72>t<EFBFBD>s, relations, commentaires, etc.) est
export<72> dans un fichier JSON sp<73>cifique.<br />
Le r<>pertoire o<> sont export<72>s les fichiers JSON a la structure suivante :
<br /><br />
<img alt="Source Control output directory"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_source_control_output_directory.png" />
<br /><br />
<b>Remarque :</b> il est possible d'exporter un projet en ligne de commande sans d<>marrer
l'interface utilisateur de l'application QxEntityEditor.<br />
Exemple de ligne de commande :<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --no_gui --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEESourceControlExport --QxEESourceControlExport_path="&lt;path_to_your_export_output_directory&gt;"</pre>
</i>
</div>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="xml_export_settings">Exporter le
projet sous format XML ou JSON</a></p>
<div class="manual_div_content">
<b>
<font style="background-color:yellow">Remarque :</font>
</b> pour travailler avec un gestionnaire de code source (Git, Perforce, CVS, etc.), il est
conseill<6C> d'utiliser les plugins <a
href="#source_control_export_settings"><b>QxEESourceControlExport</b></a> et <a
href="#wnd_source_control_import"><b>QxEESourceControlImport</b></a> (au lieu de cr<63>er un
fichier unique).<br />
<br />
L'application QxEntityEditor permet d'exporter l'int<6E>gralit<69> d'un projet <i>*.qxee</i> dans un
format XML ou JSON.
Les param<61>tres d'export XML/JSON sont accessibles par le menu principal : <i>Tools &gt;&gt;
Export to XML or JSON file (settings)</i> :
<br /><br />
<img alt="Export XML/JSON"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_export_xml_json.png" />
<br /><br />
<b>Remarque : </b> un export XML ne peut pas <20>tre import<72> dans un projet <i>*.qxee</i>.
Par contre, un fichier JSON peut <20>tre utilis<69> pour importer les donn<6E>es dans un projet
<i>*.qxee</i> en utilisant le plugin d'import : <a href="#wnd_json_import">Importer un projet <20>
partir d'un fichier texte au format JSON</a>.
<br /><br />
</div>
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="js_engine">Moteur Javascript pour
personnaliser les exports</a></p>
<div class="manual_div_content_1">
L'application QxEntityEditor fournit un puissant moteur de personnalisation des exports.
Ce moteur utilise <a href="https://en.wikipedia.org/wiki/JavaScript" target="_blank">le langage
Javascript</a> pour <20>crire des scripts pour personnaliser les exports.
Ces scripts <a href="https://en.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> ont
acc<63>s <20> l'ensemble des param<61>tres d'un projet <i>*.qxee</i>, et peuvent <20>tre d<>bogu<67>s <20> l'aide d'un
<a href="#js_engine_debug">d<EFBFBD>bogueur int<6E>gr<67> <20> QxEntityEditor</a>.
Il est <20>galement possible <a href="#js_engine_functions_files">d'<27>crire de nouveaux fichiers lors
des exports</a>.
<br /><br />
<b>Remarque :</b> le dossier <i>./samples/</i> du package QxEntityEditor fournit 2 exemples de
scripts document<6E>s : <i>custom_script.js</i> et <a
href="#js_engine_example_q_property"><i>q_property.js</i></a>.
<br /><br />
<p class="manual_p_title_2"><a class="manual_a_title_2" name="js_engine_architecture">Architecture
et fonctionnement du moteur de personnalisation Javascript</a></p>
<div class="manual_div_content">
Tous les <a href="#export_plugins">plugins d'export</a> de l'application QxEntityEditor dispose
d'un param<61>trage nomm<6D> : <a href="#cpp_export_settings_parameters"><i>Custom script (Javascript
file) to change the default behaviour of the export process</i></a>.
Il est ainsi possible de param<61>trer un script <a href="https://en.wikipedia.org/wiki/JavaScript"
target="_blank">Javascript</a> utilis<69> au moment de l'export.
Le moteur d'export utilise des mots-cl<63> (<i>placeholder</i> sous la forme <i>@@ACTION@@</i>)
pour remplacer le code par la valeur correspondante.
Cette notion de <i>placeholder</i> est la base du <a href="#js_engine">moteur de
personnalisation Javascript</a>.
Il est possible de renseigner <a href="#js_engine_placeholder">des <i>placeholder</i>
personnalis<69>s en prefixant par <i>@@CUSTOM_</i></a>, par exemple :
<i>@@CUSTOM_MY_ACTION@@</i>.
Lors d'un export, l'application QxEntityEditor parcourt la liste de toutes les entit<69>s d<>finies
dans le projet <i>*.qxee</i>.
Chaque fois qu'un <i>placeholder</i> (sous la forme <i>@@ACTION@@</i>) est rencontr<74>, le script
<a href="https://en.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> est appel<65>
avec tous les param<61>tres n<>cessaires pour effectuer ou non une personnalisation.
<br /><br />
Voici un exemple de script <a href="https://en.wikipedia.org/wiki/JavaScript"
target="_blank">Javascript</a> minimal.
Ce script ne fait rien, il permet de montrer uniquement la structure minimale d'un <a
href="https://en.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> valide pour
QxEntityEditor :
<ul>
<li>une fonction point d'entr<74>e nomm<6D>e <i>customProcess()</i> ;</li>
<li><a href="#js_engine_input_params">un param<61>tre (contexte d'appel du script) nomm<6D>
<i>params</i></a> ;</li>
<li>en retour, la fonction <i>customProcess()</i> retourne le texte <20> <20>crire de l'export.
</li>
</ul>
<br />
<div style="width:900px; height:360px; overflow:auto; background-color:white">
<pre><span class="operator">({</span><span class="comment">
// Here is the entry point of the QxEntityEditor javascript engine
// This function is called for each placeholder defined in the C++ template section
</span>customProcess<span class="operator"> :</span> function<span class="operator">(</span>params<span class="operator">)
{</span><span class="flow">
try</span><span class="operator">
{</span><span class="comment">
// quit with 'params[0]' means : doesn't change the default export behaviour
</span><span class="flow"> return</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">];
}</span><span class="flow">
catch</span><span class="operator"> (</span>err<span class="operator">)
{</span><span class="flow"> return</span><span class="operator"> (</span><span class="string">"[CustomScriptError] an unexpected error occurred : "</span><span class="operator"> +</span> err<span class="operator">); }
}
});</span></pre>
</div>
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3" name="js_engine_input_params">Liste des
param<61>tres d'appel du moteur Javascript</a></p>
<div class="manual_div_content">
Le param<61>tre d'entr<74>e <i>params</i> de la fonction <i>customProcess()</i> est un tableau
contenant une liste de valeurs (ce qui correspond au contexte d'appel du script).
Voici un exemple de fonction qui peut <20>tre utilis<69>e dans vos scripts pour lister et donner
une signification aux valeurs d'entr<74>e :
<br /><br />
<div style="width:900px; height:550px; overflow:auto; background-color:white">
<pre>function printParams<span class="operator">(</span>params<span class="operator">)
{</span>
var log<span class="operator"> =</span><span class="string"> ""</span><span class="operator">;</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - default_value = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - project_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">1</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - project_file = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">2</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - plugin_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">3</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - current_file = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">4</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - action (or placeholder) = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">5</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">6</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_table_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">7</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">8</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_type = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">9</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_column_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">10</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_primary_key = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">11</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_name = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">12</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_id = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_id = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">14</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_id = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">15</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - output_location = "</span><span class="operator"> +</span> params<span class="operator">[</span><span class="int">16</span><span class="operator">];</span>
print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the custom script debugger window
</span> helper<span class="operator">.</span>print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
</span><span class="flow"> return</span> log<span class="operator">;
}</span></pre>
</div>
<br /><br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="js_engine_functions">Fonctions
disponibles par Javascript</a></p>
<div class="manual_div_content">
Le moteur de personnalisation des exports de QxEntityEditor supporte toutes les fonctionnalit<69>s
du langage <a href="https://en.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a>
(<i>ECMAScript 5</i>).
L'application QxEntityEditor fournit en plus une instance d'objet nomm<6D>e <i><b>helper</b></i>
qui peut <20>tre utilis<69>e pour acc<63>der <20> de nouvelles fonctionnalit<69>s.
Nous allons lister dans ce chapitre les cas d'usage les plus couramment utilis<69>s pour
personnaliser les exports.
<br /><br />
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="js_engine_functions_entity">Obtenir les informations associ<63>es <20> une entit<69></a></p>
<div class="manual_div_content">
Voici comment r<>cup<75>rer le param<61>trage de l'entit<69> courante,
<i><b>helper.getEntityDetails(entity_id)</b></i> :
<br /><br />
<div style="width:900px; height:500px; overflow:auto; background-color:white">
<pre>var entity_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
printEntityDetails<span class="operator">(</span>entity_id<span class="operator">);</span><span class="comment">
//...
</span>
function printEntityDetails<span class="operator">(</span>entity_id<span class="operator">)
{</span>
var details<span class="operator"> =</span> helper<span class="operator">.</span>getEntityDetails<span class="operator">(</span>entity_id<span class="operator">);</span><span class="flow">
if</span><span class="operator"> (</span>details<span class="operator">.</span>length<span class="operator"> ==</span><span class="int"> 0</span><span class="operator">) {</span><span class="flow"> return</span> details<span class="operator">; }</span>
var log<span class="operator"> =</span><span class="string"> ""</span><span class="operator">;</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">0</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_key = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">1</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_name = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">2</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_namespace = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">3</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_tablename = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">4</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_description = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">5</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_is_read_only = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">6</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_is_abstract = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">7</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_version = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">8</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_primary_key_property_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">9</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_list_of_properties_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">10</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_has_triggers = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">11</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_before_fetch = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">12</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_after_fetch = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_before_insert = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">14</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_after_insert = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">15</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_before_update = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">16</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_after_update = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">17</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_before_delete = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">18</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_trigger_on_after_delete = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">19</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_parent_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">20</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_soft_delete_column = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">21</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - entity_validator_method = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">22</span><span class="operator">];</span>
print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the custom script debugger window
</span> helper<span class="operator">.</span>print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
</span><span class="flow"> return</span> details<span class="operator">;
}</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="js_engine_functions_iterate_property">Parcourir la liste des propri<72>t<EFBFBD>s d'une
entit<69></a></p>
<div class="manual_div_content">
Voici comment parcourir la liste des propri<72>t<EFBFBD>s de l'entit<69> courante :
<br /><br />
<div style="width:900px; height:230px; overflow:auto; background-color:white">
<pre>var entity_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
var entity_details<span class="operator"> =</span> helper<span class="operator">.</span>getEntityDetails<span class="operator">(</span>entity_id<span class="operator">);</span>
var entity_list_of_properties_id<span class="operator"> = ((</span>entity_details<span class="operator">.</span>length<span class="operator"> &gt;</span><span class="int"> 0</span><span class="operator">) ?</span> entity_details<span class="operator">[</span><span class="int">10</span><span class="operator">] :</span><span class="string"> ""</span><span class="operator">);</span>
var entity_list_of_properties_array<span class="operator"> =</span> entity_list_of_properties_id<span class="operator">.</span>split<span class="operator">(</span><span class="string">"|"</span><span class="operator">);</span><span class="flow">
for</span><span class="operator"> (</span>var idx<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span> idx<span class="operator"> &lt;</span> entity_list_of_properties_array<span class="operator">.</span>length<span class="operator">;</span> idx<span class="operator">++)
{</span>
var property_id<span class="operator"> =</span> entity_list_of_properties_array<span class="operator">[</span>idx<span class="operator">];</span>
var property_details<span class="operator"> =</span> helper<span class="operator">.</span>getPropertyDetails<span class="operator">(</span>property_id<span class="operator">);</span><span class="comment">
// ...
</span><span class="operator">}</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="js_engine_functions_property">Obtenir les informations associ<63>es <20> une propri<72>t<EFBFBD></a>
</p>
<div class="manual_div_content">
Voici comment r<>cup<75>rer le param<61>trage d'une propri<72>t<EFBFBD>,
<i><b>helper.getPropertyDetails(property_id)</b></i> :
<br /><br />
<div style="width:900px; height:500px; overflow:auto; background-color:white">
<pre>function printPropertyDetails<span class="operator">(</span>property_id<span class="operator">)
{</span>
var details<span class="operator"> =</span> helper<span class="operator">.</span>getPropertyDetails<span class="operator">(</span>property_id<span class="operator">);</span><span class="flow">
if</span><span class="operator"> (</span>details<span class="operator">.</span>length<span class="operator"> ==</span><span class="int"> 0</span><span class="operator">) {</span><span class="flow"> return</span> details<span class="operator">; }</span>
var log<span class="operator"> =</span><span class="string"> ""</span><span class="operator">;</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">0</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_key = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">1</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_name = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">2</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_column_name = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">3</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_description = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">4</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_type = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">5</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_version = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">6</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_entity_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">7</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_read_only = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">8</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_primary_key = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">9</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_serializable = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">10</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_transient = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">11</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_obsolete = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">12</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_index = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_unique = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">14</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_allow_null = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">15</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_order_level = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">16</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_default_value = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">17</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_format = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">18</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_force_sql_type = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">19</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_force_sql_alias = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">20</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_min_value = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">21</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_max_value = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">22</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_min_length = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">23</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_max_length = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">24</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_reg_exp = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">25</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_accessibility = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">26</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_is_relationship = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">27</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_type = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">28</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_entity_target_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">29</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_inverse_property_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">30</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_foreign_key = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">31</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_foreign_key_owner = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">32</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_extra_table = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">33</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - property_relation_type_desc = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">34</span><span class="operator">];</span>
print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the custom script debugger window
</span> helper<span class="operator">.</span>print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
</span><span class="flow"> return</span> details<span class="operator">;
}</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="js_engine_functions_enum">Obtenir
les informations associ<63>es <20> une <20>num<75>ration</a></p>
<div class="manual_div_content">
Voici comment r<>cup<75>rer le param<61>trage de l'<27>num<75>ration courante,
<i><b>helper.getEnumerationDetails(enumeration_id)</b></i> :
<br /><br />
<div style="width:900px; height:500px; overflow:auto; background-color:white">
<pre>var enumeration_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">15</span><span class="operator">];</span>
printEnumerationDetails<span class="operator">(</span>enumeration_id<span class="operator">);</span><span class="comment">
//...
</span>
function printEnumerationDetails<span class="operator">(</span>enumeration_id<span class="operator">)
{</span>
var details<span class="operator"> =</span> helper<span class="operator">.</span>getEnumerationDetails<span class="operator">(</span>enumeration_id<span class="operator">);</span><span class="flow">
if</span><span class="operator"> (</span>details<span class="operator">.</span>length<span class="operator"> ==</span><span class="int"> 0</span><span class="operator">) {</span><span class="flow"> return</span> details<span class="operator">; }</span>
var log<span class="operator"> =</span><span class="string"> ""</span><span class="operator">;</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_id = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">0</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_key = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">1</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_name = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">2</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_namespace = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">3</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_description = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">4</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_version = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">5</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_use_qt_enum_macro = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">6</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_list_of_keys = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">7</span><span class="operator">];</span>
log<span class="operator"> =</span> log<span class="operator"> +</span><span class="string"> "\n - enumeration_list_of_values = "</span><span class="operator"> +</span> details<span class="operator">[</span><span class="int">8</span><span class="operator">];</span>
print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the custom script debugger window
</span> helper<span class="operator">.</span>print<span class="operator">(</span>log<span class="operator">);</span><span class="comment"> // print value to the standard output (for example, on Windows, use the 'DebugView' application to see all logs)
</span><span class="flow"> return</span> details<span class="operator">;
}</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="js_engine_functions_meta_data">Acc<EFBFBD>s aux m<>ta-donn<6E>es d'une
entit<69>/propri<72>t<EFBFBD>/<2F>num<75>ration</a></p>
<div class="manual_div_content">
L'application QxEntityEditor permet de d<>finir des m<>ta-donn<6E>es li<6C>es <20> une <a
href="#entity_params">entit<EFBFBD></a>, <a href="#property_params">propri<EFBFBD>t<EFBFBD></a> ou <a
href="#enumeration_params"><EFBFBD>num<EFBFBD>ration</a>.
Ces m<>ta-donn<6E>es peuvent <20>tre utilis<69>es par exemple pour d<>finir du param<61>trage
suppl<70>mentaire non fourni par d<>faut par QxEntityEditor.
Ces m<>ta-donn<6E>es sont accessibles dans le code C++ g<>n<EFBFBD>r<EFBFBD> (<a
href="./manual.html#manual_70">moteur d'introspection de la biblioth<74>que QxOrm</a>), et
sont accessibles <20>galement dans le moteur Javascript de QxEntityEditor.
Voici comment r<>cup<75>rer des m<>ta-donn<6E>es en Javascript :
<br /><br />
<div style="width:900px; height:250px; overflow:auto; background-color:white">
<pre>var entity_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">13</span><span class="operator">];</span>
var entity_meta_data<span class="operator"> =</span> helper<span class="operator">.</span>getEntityMetaData<span class="operator">(</span>entity_id<span class="operator">,</span><span class="string"> "MY_ENTITY_META_DATA_KEY"</span><span class="operator">);</span><span class="comment">
// ...
</span>
var property_meta_data<span class="operator"> =</span> helper<span class="operator">.</span>getPropertyMetaData<span class="operator">(</span>property_id<span class="operator">,</span><span class="string"> "MY_PROPERTY_META_DATA_KEY"</span><span class="operator">);</span><span class="comment">
// ...
</span>
var enumeration_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">15</span><span class="operator">];</span>
var enumeration_meta_data<span class="operator"> =</span> helper<span class="operator">.</span>getEnumerationMetaData<span class="operator">(</span>enumeration_id<span class="operator">,</span><span class="string"> "MY_ENUM_META_DATA_KEY"</span><span class="operator">);</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3"
name="js_engine_functions_env_var">Acc<EFBFBD>der aux variables d'environnement</a></p>
<div class="manual_div_content">
Voici comment acc<63>der aux variables d'environnement,
<i><b>helper.getEnvironmentVariable()</b></i> et
<i><b>helper.setEnvironmentVariable()</b></i> :
<br /><br />
<div style="width:900px; height:80px; overflow:auto; background-color:white">
<pre>var env_var<span class="operator"> =</span> helper<span class="operator">.</span>getEnvironmentVariable<span class="operator">(</span><span class="string">"QT_DIR"</span><span class="operator">);</span>
var set_env_var_ok<span class="operator"> =</span> helper<span class="operator">.</span>setEnvironmentVariable<span class="operator">(</span><span class="string">"MY_ENV_VAR"</span><span class="operator">,</span><span class="string"> "my_value"</span><span class="operator">);</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="js_engine_functions_files">Gestion
des fichiers : lecture et <20>criture</a></p>
<div class="manual_div_content">
Le moteur de personnalisation des exports Javascript de QxEntityEditor permet de lire des
fichiers, et permet d'<27>crire dans des fichiers.
Les classes Javascript <i><b>file</b></i> et <i><b>dir</b></i> permettent d'instancier des
objets Javascript pour effectuer des traitements sur les fichiers.
<br /><br />
La classe <i><b>file</b></i> propose la m<>me d<>finition que <a
href="http://doc.qt.io/qt-5/qfile.html" target="_blank">la classe Qt QFile</a> :
<br /><br />
<div style="width:900px; height:400px; overflow:auto; background-color:white">
<pre><span class="comment">/*
--- 'file' class methods available by script (QFile wrapper : http://doc.qt.io/qt-5/qfile.html) ---
bool copy(string fileName, string newName);
bool exists(string fileName);
bool link(string fileName, string linkName);
bool remove(string fileName);
bool rename(string oldName, string newName);
string readAll(string fileName);
void setFileName(string name);
string fileName();
bool open(int mode); // enum QIODevice::OpenMode, for example : 26 = (QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) = (2 + 8 + 16)
int error(); // enum QFile::FileError
void close();
bool atEnd();
string readLine();
void write(string text);
*/</span></pre>
</div>
<br /><br />
La classe <i><b>dir</b></i> propose la m<>me d<>finition que <a
href="http://doc.qt.io/qt-5/qdir.html" target="_blank">la classe Qt QDir</a> :
<br /><br />
<div style="width:900px; height:400px; overflow:auto; background-color:white">
<pre><span class="comment">/*
--- 'dir' class methods available by script (QDir wrapper : http://doc.qt.io/qt-5/qdir.html) ---
void setPath(string path);
string path();
string appPath();
string homePath();
string rootPath();
string tempPath();
string fromNativeSeparators(string pathName);
string toNativeSeparators(string pathName);
string cleanPath(string path);
bool isAbsolutePath(string path);
bool isRelativePath(string path);
bool match(string filter, string fileName);
bool mkdir(string dirName);
bool mkpath(string dirPath);
bool rmdir(string dirName);
bool rmpath(string dirPath);
bool exists(string name);
bool cdUp();
bool cd(string dirName);
string absoluteFilePath(string fileName);
string absolutePath();
string canonicalPath();
string dirName();
string filePath(string fileName);
void refresh();
string relativeFilePath(string fileName);
bool isAbsolute();
bool isReadable();
bool isRelative();
bool isRoot();
*/</span></pre>
</div>
<br /><br />
<b>Exemple :</b> lire le contenu d'un fichier :
<br /><br />
<div style="width:900px; height:80px; overflow:auto; background-color:white">
<pre>var f1<span class="operator"> =</span><span class="keyword"> new</span> file<span class="operator">();</span>
var f1_content<span class="operator"> =</span> f1<span class="operator">.</span>readAll<span class="operator">(</span><span class="string">"C:\\Temp\\my_file.txt"</span><span class="operator">);</span></pre>
</div>
<br /><br />
<b>Autre exemple :</b> <20>crire dans un fichier :
<br /><br />
<div style="width:900px; height:150px; overflow:auto; background-color:white">
<pre>var f2<span class="operator"> =</span><span class="keyword"> new</span> file<span class="operator">();</span>
f2<span class="operator">.</span>setFileName<span class="operator">(</span><span class="string">"C:\\Temp\\file_generated_by_script.txt"</span><span class="operator">);</span>
f2<span class="operator">.</span>open<span class="operator">(</span><span class="int">26</span><span class="operator">);</span><span class="comment"> // (QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text) = (2 + 8 + 16)
</span>f2<span class="operator">.</span>write<span class="operator">(</span><span class="string">"aaa"</span><span class="operator">);</span>
f2<span class="operator">.</span>write<span class="operator">(</span><span class="string">"bbb"</span><span class="operator">);</span>
f2<span class="operator">.</span>close<span class="operator">();</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="js_engine_functions_list">Obtenir
la liste des toutes les entit<69>s/<2F>num<75>rations d'un projet</a></p>
<div class="manual_div_content">
Voici comment r<>cup<75>rer la liste de toutes les entit<69>s et <20>num<75>rations d'un projet
<i>*.qxee</i> :
<br /><br />
<div style="width:900px; height:100px; overflow:auto; background-color:white">
<pre>var listOfAllEntities<span class="operator"> =</span> helper<span class="operator">.</span>getListOfAllEntities<span class="operator">();</span><span class="comment"> // 'listOfAllEntities' variable is an array, each item of this array contains : &lt;entity_id&gt;|&lt;entity_name&gt;
</span>var listOfAllEnums<span class="operator"> =</span> helper<span class="operator">.</span>getListOfAllEnums<span class="operator">();</span><span class="comment"> // 'listOfAllEnums' variable is an array, each item of this array contains : &lt;enum_id&gt;|&lt;enum_name&gt;</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_3"><a class="manual_a_title_3" name="js_engine_qxee_params">R<EFBFBD>cup<EFBFBD>rer
le param<61>trage de l'application (niveau global, projet et plugin)</a></p>
<div class="manual_div_content">
Voici comment r<>cup<75>rer tout le param<61>trage d<>fini au niveau de l'application (au format
JSON) :
<ul>
<li><a href="#global_settings">au niveau global</a> par la fonction :
<i>helper.getQxEEGlobalSettingsJson()</i> ;
</li>
<li><a href="#project_settings">au niveau projet</a> par la fonction :
<i>helper.getQxEEProjectSettingsJson()</i> ;
</li>
<li><a href="#cpp_export_settings_parameters">au niveau plugin</a> par la fonction :
<i>helper.getQxEEPluginSetingsJson()</i>.
</li>
</ul>
<br />
<div style="width:900px; height:300px; overflow:auto; background-color:white">
<pre>var globalSettings<span class="operator"> =</span> helper<span class="operator">.</span>getQxEEGlobalSettingsJson<span class="operator">();</span><span class="comment"> // the result is a string in JSON format ==&gt; so just use JSON.parse() function to get a javascript object instance
</span>var projectSettings<span class="operator"> =</span> helper<span class="operator">.</span>getQxEEProjectSettingsJson<span class="operator">();</span><span class="comment"> // the result is a string in JSON format ==&gt; so just use JSON.parse() function to get a javascript object instance
</span>var pluginSettings<span class="operator"> =</span> helper<span class="operator">.</span>getQxEEPluginSetingsJson<span class="operator">();</span><span class="comment"> // the result is a string in JSON format ==&gt; so just use JSON.parse() function to get a javascript object instance
</span>
print<span class="operator">(</span>globalSettings<span class="operator">);</span> helper<span class="operator">.</span>print<span class="operator">(</span>globalSettings<span class="operator">);</span>
print<span class="operator">(</span>projectSettings<span class="operator">);</span> helper<span class="operator">.</span>print<span class="operator">(</span>projectSettings<span class="operator">);</span>
print<span class="operator">(</span>pluginSettings<span class="operator">);</span> helper<span class="operator">.</span>print<span class="operator">(</span>pluginSettings<span class="operator">);</span>
globalSettings<span class="operator"> =</span> JSON<span class="operator">.</span>parse<span class="operator">(</span>globalSettings<span class="operator">);</span><span class="comment"> // Now 'globalSettings' is a javascript object instance
</span>projectSettings<span class="operator"> =</span> JSON<span class="operator">.</span>parse<span class="operator">(</span>projectSettings<span class="operator">);</span><span class="comment"> // Now 'projectSettings' is a javascript object instance
</span>pluginSettings<span class="operator"> =</span> JSON<span class="operator">.</span>parse<span class="operator">(</span>pluginSettings<span class="operator">);</span><span class="comment"> // Now 'pluginSettings' is a javascript object instance</span></pre>
</div>
<br /><br />
</div>
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="js_engine_placeholder">Ajout d'une
action (placeholder) personnalis<69>e dans le template d'export C++</a></p>
<div class="manual_div_content">
<a href="#export_plugins">Les plugins d'export C++</a> disposent d'un param<61>tre permettant de
d<>finir le code source des fichiers <i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i>.
L'application QxEntityEditor propose plusieurs template par d<>faut, et il est possible d'<27>crire
son propre template (<a href="#cpp_export_settings_parameters">option <20> <i>Custom</i> <20></a>).
Cette d<>finition des fichiers <i>Header</i> <i>*.h</i> et <i>Source</i> <i>*.cpp</i> utilisent
des mots-cl<63> (<i>placeholder</i> sous la forme <i>@@ACTION@@</i>) pour remplacer le code par la
valeur correspondante.
Cette notion de <i>placeholder</i> est la base du <a href="#js_engine">moteur de
personnalisation Javascript</a>.
Il est possible de renseigner <a href="#js_engine_placeholder">des <i>placeholder</i>
personnalis<69>s en prefixant par <i>@@CUSTOM_</i></a>, par exemple :
<i>@@CUSTOM_MY_ACTION@@</i>.
<br /><br />
Voici comment tester le code action courant (placeholder) dans le moteur Javascript :
<br /><br />
<div style="width:900px; height:200px; overflow:auto; background-color:white">
<span class="comment">/* you can define your own placeholder in the template, it must start
with @@CUSTOM_, for example : @@CUSTOM_MY_ACTION@@
==> then, in the custom script, check if you are processing your custom action with this
code : */</span>
<pre>var action<span class="operator"> =</span> params<span class="operator">[</span><span class="int">5</span><span class="operator">];</span><span class="flow">
if</span><span class="operator"> (</span>action<span class="operator"> ==</span><span class="string"> "CUSTOM_MY_ACTION"</span><span class="operator">)
{</span><span class="flow">
return</span><span class="string"> "quit with my custom code here"</span><span class="operator">;
}</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="js_engine_example_q_property">Exemple
de script : ajout automatique de la d<>finition Q_PROPERTY sur les propri<72>t<EFBFBD>s C++ g<>n<EFBFBD>r<EFBFBD>es</a>
</p>
<div class="manual_div_content">
Voici un exemple de script document<6E> (fourni dans le dossier <i>./samples/q_property.js</i> du
package QxEntityEditor) pour montrer comment ajouter automatiquement la d<>finition <a
href="http://doc.qt.io/qt-5/properties.html" target="_blank">Q_PROPERTY</a> pour chacune des
propri<72>t<EFBFBD>s du projet <i>*.qxee</i> :
<br /><br />
<div style="width:900px; height:600px; overflow:auto; background-color:white">
<pre><span class="operator">({</span><span class="comment">
/* ----------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
'q_property.js' : custom javascript file to customize QxEntityEditor C++ export process.
This script is an example to show how to use QxEntityEditor javascript engine to add a Q_PROPERTY definition for each property generated by QxEntityEditor.
More details about Q_PROPERTY macro on Qt web site : http://doc.qt.io/qt-5/properties.html
To use this javascript file :
1- go to the main menu of QxEntityEditor 'Tools &gt;&gt; Export to C++ project (settings)' ;
2- select the C++ template 'qx::IxPersistable + QObject' : now generated entities will inherit from QObject, which is required to use the Qt Q_PROPERTY macro ;
3- in the field 'Custom script file' : put the location of this 'q_property.js' custom javascript file ;
4- save the settings and start the C++ export process ;
5- check generated files : Q_PROPERTY should be added automatically by the export process.
----------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------- */</span><span class="comment">
// Here is the entry point of the QxEntityEditor javascript engine
// This function is called for each placeholder defined in the C++ template section
</span>customProcess<span class="operator"> :</span> function<span class="operator">(</span>params<span class="operator">)
{</span><span class="flow">
try</span><span class="operator">
{</span><span class="comment">
// We use here the @@MACRO_QX_PERSISTABLE_HPP@@ placeholder which is present in the default C++ template 'qx::IxPersistable + QObject'
// You could also create your own custom C++ template (based on 'qx::IxPersistable + QObject' template), and create your own placeholder (which must be prefixed by @@CUSTOM_), for example : @@CUSTOM_Q_PROPERTY@@
</span> var action<span class="operator"> =</span> params<span class="operator">[</span><span class="int">5</span><span class="operator">];</span><span class="flow">
if</span><span class="operator"> (</span>action<span class="operator"> !=</span><span class="string"> "MACRO_QX_PERSISTABLE_HPP"</span><span class="operator">) {</span><span class="flow"> return</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">]; }</span><span class="comment"> // quit with 'params[0]' means : doesn't change the default export behaviour
// Check if we have an entity
</span> var entity_id<span class="operator"> =</span> params<span class="operator">[</span><span class="int">13</span><span class="operator">];</span><span class="flow">
if</span><span class="operator"> ((</span>entity_id<span class="operator"> ==</span><span class="string"> ""</span><span class="operator">) || (</span>entity_id<span class="operator"> ==</span><span class="string"> "0"</span><span class="operator">)) {</span><span class="flow"> return</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">]; }</span><span class="comment"> // quit with 'params[0]' means : doesn't change the default export behaviour
// Get the list of properties
</span> var entity_details<span class="operator"> =</span> helper<span class="operator">.</span>getEntityDetails<span class="operator">(</span>entity_id<span class="operator">);</span>
var entity_list_of_properties_id<span class="operator"> = ((</span>entity_details<span class="operator">.</span>length<span class="operator"> &gt;</span><span class="int"> 0</span><span class="operator">) ?</span> entity_details<span class="operator">[</span><span class="int">10</span><span class="operator">] :</span><span class="string"> ""</span><span class="operator">);</span>
var entity_list_of_properties_array<span class="operator"> =</span> entity_list_of_properties_id<span class="operator">.</span>split<span class="operator">(</span><span class="string">"|"</span><span class="operator">);</span><span class="flow">
if</span><span class="operator"> (</span>entity_list_of_properties_array<span class="operator">.</span>length<span class="operator"> &lt;=</span><span class="int"> 0</span><span class="operator">) {</span><span class="flow"> return</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">]; }</span><span class="comment"> // quit with 'params[0]' means : doesn't change the default export behaviour
// Prepare output string
</span> var output<span class="operator"> =</span> params<span class="operator">[</span><span class="int">0</span><span class="operator">] +</span><span class="string"> "\n"</span><span class="operator">;</span><span class="comment">
// Iterate over each property
</span><span class="flow"> for</span><span class="operator"> (</span>var idx<span class="operator"> =</span><span class="int"> 0</span><span class="operator">;</span> idx<span class="operator"> &lt;</span> entity_list_of_properties_array<span class="operator">.</span>length<span class="operator">;</span> idx<span class="operator">++)
{</span><span class="comment">
// Get property details
</span> var property_id<span class="operator"> =</span> entity_list_of_properties_array<span class="operator">[</span>idx<span class="operator">];</span>
var property_details<span class="operator"> =</span> helper<span class="operator">.</span>getPropertyDetails<span class="operator">(</span>property_id<span class="operator">);</span><span class="comment">
// Here you could also get property meta-data that you can define in QxEntityEditor, property parameters screen, section 'List of meta-data'
// This is a way to manage your own property parameters which are not a part of QxEntityEditor
// It could be useful for example to manage some Q_PROPERTY settings like : RESET, NOTIFY, REVISION, DESIGNABLE, SCRIPTABLE, FINAL, etc...
// To get a property meta-data value, just write this code : var my_meta_data = helper.getPropertyMetaData(property_id, "MY_META_DATA_KEY");
// Get property type and name
</span> var property_type<span class="operator"> =</span> property_details<span class="operator">[</span><span class="int">5</span><span class="operator">];</span>
var property_name<span class="operator"> =</span> property_details<span class="operator">[</span><span class="int">2</span><span class="operator">];</span><span class="comment">
// Check if property type can be used with Q_PROPERTY macro
</span><span class="flow"> if</span><span class="operator"> (</span>list_of_compatible_property_type<span class="operator">.</span>indexOf<span class="operator">(</span>property_type<span class="operator">) == -</span><span class="int">1</span><span class="operator">) {</span><span class="flow"> continue</span><span class="operator">; }</span><span class="comment">
// Create Q_PROPERTY definition
</span> output<span class="operator"> +=</span><span class="string"> "\n Q_PROPERTY("</span><span class="operator"> +</span> property_type<span class="operator"> +</span><span class="string"> " "</span><span class="operator"> +</span> property_name<span class="operator"> +</span><span class="string"> " READ get"</span><span class="operator"> +</span> property_name<span class="operator"> +</span><span class="string"> " WRITE set"</span><span class="operator"> +</span> property_name<span class="operator"> +</span><span class="string"> ")"</span><span class="operator">;
}</span><span class="flow">
return</span> output<span class="operator">;
}</span><span class="flow">
catch</span><span class="operator"> (</span>err<span class="operator">)
{</span><span class="flow"> return</span><span class="operator"> (</span><span class="string">"[CustomScriptError] an unexpected error occurred : "</span><span class="operator"> +</span> err<span class="operator">); }
}
});</span><span class="comment">
// Here is a list of C++ types compatible with Qt Q_PROPERTY macro (C++ type can be converted to/from QVariant)
// You can of course register your own C++ types to be able to use them with Q_PROPERTY macro (using Qt Q_DECLARE_METATYPE() macro)
// So the following array is not fixed : you can add all C++ types you want...
</span>var list_of_compatible_property_type<span class="operator"> = [</span><span class="string"> "QBitArray"</span><span class="operator">,</span><span class="string"> "QBitmap"</span><span class="operator">,</span><span class="string"> "bool"</span><span class="operator">,</span><span class="string"> "QBrush"</span><span class="operator">,</span><span class="string"> "QByteArray"</span><span class="operator">,</span><span class="string"> "QChar"</span><span class="operator">,</span><span class="string"> "QColor"</span><span class="operator">,</span><span class="string"> "QDate"</span><span class="operator">,</span><span class="string"> "QDateTime"</span><span class="operator">,</span><span class="string"> "double"</span><span class="operator">,</span><span class="string">
"QUuid"</span><span class="operator">,</span><span class="string"> "QFont"</span><span class="operator">,</span><span class="string"> "QVariantHash"</span><span class="operator">,</span><span class="string"> "QIcon"</span><span class="operator">,</span><span class="string"> "QImage"</span><span class="operator">,</span><span class="string"> "int"</span><span class="operator">,</span><span class="string"> "QLine"</span><span class="operator">,</span><span class="string"> "QLineF"</span><span class="operator">,</span><span class="string"> "QVariantList"</span><span class="operator">,</span><span class="string"> "qlonglong"</span><span class="operator">,</span><span class="string">
"QVariantMap"</span><span class="operator">,</span><span class="string"> "QMatrix"</span><span class="operator">,</span><span class="string"> "QMatrix4x4"</span><span class="operator">,</span><span class="string"> "QPixmap"</span><span class="operator">,</span><span class="string"> "QPoint"</span><span class="operator">,</span><span class="string"> "QPointF"</span><span class="operator">,</span><span class="string"> "QPolygon"</span><span class="operator">,</span><span class="string"> "QPolygonF"</span><span class="operator">,</span><span class="string"> "QRect"</span><span class="operator">,</span><span class="string"> "QRectF"</span><span class="operator">,</span><span class="string">
"QRegExp"</span><span class="operator">,</span><span class="string"> "QRegion"</span><span class="operator">,</span><span class="string"> "QSize"</span><span class="operator">,</span><span class="string"> "QSizeF"</span><span class="operator">,</span><span class="string"> "QString"</span><span class="operator">,</span><span class="string"> "QStringList"</span><span class="operator">,</span><span class="string"> "QTime"</span><span class="operator">,</span><span class="string"> "uint"</span><span class="operator">,</span><span class="string"> "qulonglong"</span><span class="operator">,</span><span class="string"> "QUrl"</span><span class="operator">,</span><span class="string">
"QVector2D"</span><span class="operator">,</span><span class="string"> "QVector3D"</span><span class="operator">,</span><span class="string"> "QVector4D"</span><span class="operator"> ];</span></pre>
</div>
<br /><br />
</div>
<p class="manual_p_title_2"><a class="manual_a_title_2" name="js_engine_debug">Activation du
d<>bogueur Javascript int<6E>gr<67></a></p>
<div class="manual_div_content">
Le moteur Javascript de personnalisation des exports de QxEntityEditor int<6E>gre un d<>bogueur.
Cet environnement de d<>bogage dispose de toutes les fonctionnalit<69>s n<>cessaires pour vous aider
<20> d<>velopper et corriger vos scripts :
<ul>
<li>d<EFBFBD>finition de points d'arr<72>t (breakpoints) ;</li>
<li>mode pas <20> pas pour passer d'une ligne de code <20> une autre pendant l'ex<65>cution du script
;</li>
<li>visualisation des variables et de leur valeur au fil de l'ex<65>cution ;</li>
<li>affichage d'une fen<65>tre de logs.</li>
</ul>
<br />
Par d<>faut, le d<>bogueur est d<>sactiv<69> lors d'un export. Pour l'activer et afficher l'<27>cran
suivant, vous devez :
<ul>
<li>aller dans <a href="#cpp_export_settings_parameters">les param<61>tres d'export</a>, d<>finir
un script <20> utiliser, puis cliquer sur le bouton <20> <i>Debug custom Javascript file</i> <20> ;
</li>
<li>ou bien maintenir la touche <i>SHIFT</i> au lancement d'un export.</li>
</ul>
<br />
<img alt="JS debug" src="https://www.qxorm.com/qxentityeditor/resource/qxee_js_debug.png" />
<br /><br />
</div>
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="plugin_script">Ex<EFBFBD>cution de scripts
personnalis<69>s avant/apr<70>s ex<65>cution d'un plugin</a></p>
<div class="manual_div_content_1">
L'application QxEntityEditor permet de d<>finir des scripts de type <i>*.bat</i> (Windows),
<i>*.sh</i> (Linux) ou m<>me des ex<65>cutables <20> lancer avant ou apr<70>s ex<65>cution d'un plugin
QxEntityEditor.
Chaque script (ou processus) est appel<65> avec un param<61>tre d'entr<74>e : le chemin d'acc<63>s au fichier
projet <i>*.qxee</i>.
Cette fonctionnalit<69> peut <20>tre utilis<69>e par exemple pour :
<ul>
<li>int<EFBFBD>grer les fichiers g<>n<EFBFBD>r<EFBFBD>s par un export QxEntityEditor dans un gestionnaire de code
source (Git, Perforce, CVS, etc...) ;</li>
<li>d<EFBFBD>marrer la compilation d'un projet C++ g<>n<EFBFBD>r<EFBFBD> par QxEntityEditor ;</li>
<li>ex<EFBFBD>cuter des tests unitaires ou bien lancer une int<6E>gration continue avec un serveur Jenkins
par exemple ;</li>
<li>modifier des valeurs dans <a href="#qxee_database">la base de donn<6E>es SQLite d'un projet
<i>*.qxee</i></a> suite <20> un import de base de donn<6E>es.</li>
</ul>
<br />
Pour d<>finir les scripts ou ex<65>cutables <20> lancer suite <20> un processus d'import ou d'export de
QxEntityEditor, aller dans le menu principal : <i>Tools &gt;&gt; Plugins scripts</i>.
<br /><br />
<img alt="Plugin scripts"
src="https://www.qxorm.com/qxentityeditor/resource/qxee_plugin_scripts.png" />
<br /><br />
<b>Remarque :</b> pour d<>finir un script <20> ex<65>cuter dans cette liste, il est possible de renseigner
le chemin d'acc<63>s absolu au script, ou bien un chemin relatif par rapport au projet <i>*.qxee</i>.
Par exemple, en mettant le chemin relatif <i>./my_script.sh</i>, le fichier <i>my_script.sh</i>
doit se trouver dans le m<>me r<>pertoire que le fichier projet <i>*.qxee</i> de QxEntityEditor.
<br /><br />
</div>
<p class="manual_p_title_1"><a class="manual_a_title_1" name="qxee_command_line">Ex<EFBFBD>cuter
QxEntityEditor en ligne de commande</a></p>
<div class="manual_div_content_1">
L'application QxEntityEditor peut <20>tre d<>marr<72>e en ligne de commande. Nous allons d<>tailler dans ce
chapitre quelques exemples d'appels :
<br /><br /><br />
<b>-- Exemple n<>1 :</b> d<>marrer QxEntityEditor en sp<73>cifiant un projet <i>*.qxee</i> <20> charger
(param<61>tre <i>--project</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --project="c:\test\qxBlog.qxee"</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>2 :</b> d<>marrer QxEntityEditor sans afficher l'interface graphique (param<61>tre
<i>--no_gui</i>), en sp<73>cifiant un projet <i>*.qxee</i> <20> charger (param<61>tre <i>--project</i>) et
en d<>marrant automatiquement un processus d'export C++ (param<61>tre <i>--plugin</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --no_gui --project="c:\test\qxBlog.qxee" --plugin=QxEECppExport</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>3 :</b> d<>marrer QxEntityEditor en mode visionneuse (param<61>tre
<i>--viewer_mode</i>), ce mode permet d'ouvrir QxEntityEditor en mode lecture seule et permet de
charger des projets <i>*.qxee</i> sans cl<63> de licence :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --viewer_mode</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>4 :</b> d<>marrer QxEntityEditor avec affichage des logs SQL (param<61>tre
<i>--log_sql</i>), ce param<61>tre permet de tracer toutes les requ<71>tes SQL effectu<74>es sur <a
href="#qxee_database">la base de donn<6E>es SQLite du projet <i>*.qxee</i></a> :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --log_sql</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>5 :</b> d<>marrer QxEntityEditor en chargeant un projet <i>*.qxee</i> <20> partir d'un
fichier JSON :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEEJsonImport --QxEEJsonImport_file="&lt;path_to_your_json_file&gt;"</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>6 :</b> afficher la documentation de tous les param<61>tres en ligne de commande :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --?</pre>
</i>
</div>
<br />
Ce qui produit le r<>sultat suivant :
<br />
<div style="width:900px; height:600px; overflow:auto; background-color:white">
<i>
<pre>*** QxEntityEditor 1.2.5 application global command line parameters ***
--project="&lt;full path to *.qxee project file&gt;" : run QxEntityEditor defining a *.qxee project to load at startup
--no_gui : run QxEntityEditor without displaying the user interface
--viewer_mode : run QxEntityEditor in read-only mode, this parameter can be used to open large *.qxee projects without any registered license key
--log_sql : run QxEntityEditor tracing all SQL logs, this parameter logs all SQL queries executed to *.qxee SQLite database
--font : define application font (due to issues since macOS Catalina 10.15) with syntax &lt;family&gt;||&lt;pointSize&gt;||&lt;weight&gt;||&lt;italic&gt; (only &lt;family&gt; is required), for example : Courier New||14
--style_sheet : define application style sheet (more details here : https://doc.qt.io/qt-5/stylesheet-reference.html), for example : QWidget { background-color: black }
--plugin=&lt;plugin name&gt; : run QxEntityEditor and execute automatically a plugin process (see below for specific parameters per plugin)
*** Import plugin QxEEJsonImport ***
--QxEEJsonImport_file="&lt;full path to your json file&gt;" : [Required] run QxEntityEditor loading a *.qxee project from a JSON file
*** Import plugin QxEEMySQLImport ***
--QxEEMySQLImport_db_ip="&lt;DB IP&gt;" : [Required] Database server address (IP)
--QxEEMySQLImport_db_port="&lt;DB port&gt;" : [Required] Port number to connect to database
--QxEEMySQLImport_db_name="&lt;DB name&gt;" : [Required] Database name
--QxEEMySQLImport_filter_regexp="&lt;Regular Expression&gt;" : [Optional] Filter to select tables from database to import
--QxEEMySQLImport_login="&lt;DB Login&gt;" : [Optional] Login to connect to database
--QxEEMySQLImport_pwd="&lt;DB Password&gt;" : [Optional] Password to connect to database
--QxEEMySQLImport_namespace="&lt;Namespace&gt;" : [Optional] C++ namespace where imported classes will be located
--QxEEMySQLImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
--QxEEMySQLImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
--QxEEMySQLImport_import_default_value=0/1 : [Optional] Import columns default value
--QxEEMySQLImport_boost_optional=0/1 : [Optional] Add boost::optional&lt;T&gt; decoration if a column definition allows NULL value
--QxEEMySQLImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
--QxEEMySQLImport_relation_decoration=&lt;numeric value&gt; : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
--QxEEMySQLImport_relation_collection=&lt;numeric value&gt; : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
--QxEEMySQLImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
--QxEEMySQLImport_verbose=0/1 : [Optional] Display more details during the import process
*** Import plugin QxEEOdbcImport ***
--QxEEOdbcImport_dsn="&lt;ODBC DSN&gt;" : [Required] ODBC DSN to connect to database
--QxEEOdbcImport_db_type=&lt;numeric value&gt; : [Required] Database engine type (0=generic, 1=postgresql, 2=mysql, 3=oracle, 4=mssqlserver, 5=sqlite)
--QxEEOdbcImport_filter_regexp="&lt;Regular Expression&gt;" : [Optional] Filter to select tables from database to import
--QxEEOdbcImport_login="&lt;DB Login&gt;" : [Optional] Login to connect to database
--QxEEOdbcImport_pwd="&lt;DB Password&gt;" : [Optional] Password to connect to database
--QxEEOdbcImport_namespace="&lt;Namespace&gt;" : [Optional] C++ namespace where imported classes will be located
--QxEEOdbcImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
--QxEEOdbcImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
--QxEEOdbcImport_import_default_value=0/1 : [Optional] Import columns default value
--QxEEOdbcImport_boost_optional=0/1 : [Optional] Add boost::optional&lt;T&gt; decoration if a column definition allows NULL value
--QxEEOdbcImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
--QxEEOdbcImport_relation_decoration=&lt;numeric value&gt; : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
--QxEEOdbcImport_relation_collection=&lt;numeric value&gt; : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
--QxEEOdbcImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
--QxEEOdbcImport_verbose=0/1 : [Optional] Display more details during the import process
*** Import plugin QxEEPostgreSQLImport ***
--QxEEPostgreSQLImport_db_ip="&lt;DB IP&gt;" : [Required] Database server address (IP)
--QxEEPostgreSQLImport_db_port="&lt;DB port&gt;" : [Required] Port number to connect to database
--QxEEPostgreSQLImport_db_name="&lt;DB name&gt;" : [Required] Database name
--QxEEPostgreSQLImport_filter_regexp="&lt;Regular Expression&gt;" : [Optional] Filter to select tables from database to import
--QxEEPostgreSQLImport_login="&lt;DB Login&gt;" : [Optional] Login to connect to database
--QxEEPostgreSQLImport_pwd="&lt;DB Password&gt;" : [Optional] Password to connect to database
--QxEEPostgreSQLImport_namespace="&lt;Namespace&gt;" : [Optional] C++ namespace where imported classes will be located
--QxEEPostgreSQLImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
--QxEEPostgreSQLImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
--QxEEPostgreSQLImport_import_default_value=0/1 : [Optional] Import columns default value
--QxEEPostgreSQLImport_boost_optional=0/1 : [Optional] Add boost::optional&lt;T&gt; decoration if a column definition allows NULL value
--QxEEPostgreSQLImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
--QxEEPostgreSQLImport_relation_decoration=&lt;numeric value&gt; : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
--QxEEPostgreSQLImport_relation_collection=&lt;numeric value&gt; : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
--QxEEPostgreSQLImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
--QxEEPostgreSQLImport_verbose=0/1 : [Optional] Display more details during the import process
*** Import plugin QxEESQLiteImport ***
--QxEESQLiteImport_db_path="&lt;DB File Path&gt;" : [Required] SQLite database file path
--QxEESQLiteImport_filter_regexp="&lt;Regular Expression&gt;" : [Optional] Filter to select tables from database to import
--QxEESQLiteImport_namespace="&lt;Namespace&gt;" : [Optional] C++ namespace where imported classes will be located
--QxEESQLiteImport_delete_namespace=0/1 : [Optional] Delete all entities in the namespace before importing
--QxEESQLiteImport_import_comment=0/1 : [Optional] Import tables/columns comment to entities/properties description
--QxEESQLiteImport_import_default_value=0/1 : [Optional] Import columns default value
--QxEESQLiteImport_boost_optional=0/1 : [Optional] Add boost::optional&lt;T&gt; decoration if a column definition allows NULL value
--QxEESQLiteImport_organize_diagram=0/1 : [Optional] Organize diagram layout after import process
--QxEESQLiteImport_relation_decoration=&lt;numeric value&gt; : [Optional] Decoration used for relationships (0=no decoration, 1=boost::shared_ptr, 2=QSharedPointer, 5=std::shared_ptr)
--QxEESQLiteImport_relation_collection=&lt;numeric value&gt; : [Optional] Collection used for relationships (1=qx::QxCollection, 2=std::vector, 3=std::list, 8=QHash, 10=QList)
--QxEESQLiteImport_mapping_sql_to_cpp="sql1~cpp1;sql2~cpp2;etc..." : [Optional] List of mappings from SQL type to C++ type
--QxEESQLiteImport_verbose=0/1 : [Optional] Display more details during the import process
*** Export plugin QxEECppExport ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
--QxEECppExport_path="&lt;Export Path&gt;" : [Optional] C++ export path parameter
--QxEECppExport_template_type=&lt;numeric value&gt; : [Optional] C++ template type selected to build C++ files (0=no_inheritance, 1=ix_persistable, 2=qx_persistable, 3=ix_persistable_and_q_object, 4=custom)
--QxEECppExport_template_header="&lt;Template Header&gt;" : [Optional] Custom C++ template header file path (QxEECppExport_template_type parameter must be equal to 4, which means custom)
--QxEECppExport_template_source="&lt;Template Source&gt;" : [Optional] Custom C++ template source file path (QxEECppExport_template_type parameter must be equal to 4, which means custom)
--QxEECppExport_qxorm_relative_path=0/1 : [Optional] Relative path to QxOrm library
--QxEECppExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
--QxEECppExport_custom_javacript="&lt;Custom JS&gt;" : [Optional] Custom script (javascript file) to change the default behaviour of the export process
*** Export plugin QxEECppModelViewExport ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
--QxEECppModelViewExport_path="&lt;Export Path&gt;" : [Optional] C++ model/view export path parameter
--QxEECppModelViewExport_namespace="&lt;Namespace&gt;" : [Optional] Namespace where to put all model/view classes
--QxEECppModelViewExport_template_type=&lt;numeric value&gt; : [Optional] C++ model/view template type selected to build C++ files (0=default, 1=custom, 2=qx_model_service)
--QxEECppModelViewExport_template_header="&lt;Template Header&gt;" : [Optional] Custom C++ template header file path (QxEECppModelViewExport_template_type parameter must be equal to 1, which means custom)
--QxEECppModelViewExport_template_source="&lt;Template Source&gt;" : [Optional] Custom C++ template source file path (QxEECppModelViewExport_template_type parameter must be equal to 1, which means custom)
--QxEECppModelViewExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
--QxEECppModelViewExport_custom_javacript="&lt;Custom JS&gt;" : [Optional] Custom script (javascript file) to change the default behaviour of the export process
*** Export plugin QxEECppServicesExport ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
--QxEECppServicesExport_path="&lt;Export Path&gt;" : [Optional] C++ services export path parameter
--QxEECppServicesExport_namespace="&lt;Namespace&gt;" : [Optional] Namespace where to put all services classes
--QxEECppServicesExport_template_type=&lt;numeric value&gt; : [Optional] C++ services template type selected to build C++ files (0=default, 1=custom)
--QxEECppServicesExport_template_header="&lt;Template Header&gt;" : [Optional] Custom C++ template header file path (QxEECppServicesExport_template_type parameter must be equal to 1, which means custom)
--QxEECppServicesExport_template_source="&lt;Template Source&gt;" : [Optional] Custom C++ template source file path (QxEECppServicesExport_template_type parameter must be equal to 1, which means custom)
--QxEECppServicesExport_generate_custom_files=0/1 : [Optional] Generate a custom directory with custom files for each entity
--QxEECppServicesExport_custom_javacript="&lt;Custom JS&gt;" : [Optional] Custom script (javascript file) to change the default behaviour of the export process
--QxEECppServicesExport_generate_server_app=0/1 : [Optional] Generate a sample server application
--QxEECppServicesExport_server_app_path="&lt;Server App Path&gt;" : [Optional] Server application location
*** Export plugin QxEEGenericDDLExport ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
--QxEEGenericDDLExport_path="&lt;Export Path&gt;" : [Optional] DDL export path parameter
--QxEEGenericDDLExport_db_type=&lt;numeric value&gt; : [Optional] Database type (0=default, 1=sqlite, 2=mysql, 3=postgresql, 4=oracle, 5=mssqlserver)
--QxEEGenericDDLExport_relation_as_fk=0/1 : [Optional] Export relationships as foreign keys in database
--QxEEGenericDDLExport_schema_type=&lt;numeric value&gt; : [Optional] Way to export database schema (0=full, 1=evolution, 2=full_and_evolution)
--QxEEGenericDDLExport_custom_javacript="&lt;Custom JS&gt;" : [Optional] Custom script (javascript file) to change the default behaviour of the export process
*** Export plugin QxEEPrinter ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process !!!
*** Export plugin QxEEXmlExport ***
!!! Note : this plugin loads automatically previous parameters values before starting the export process, but you can use following parameters to override them !!!
--QxEEXmlExport_path="&lt;Export Path&gt;" : [Optional] XML or JSON export path parameter
--QxEEXmlExport_as_json=0/1 : [Optional] Export project as JSON format
</pre>
</i>
</div>
<br />
<b>Remarque :</b> pour faire apparaitre les logs g<>n<EFBFBD>r<EFBFBD>s par l'application QxEntityEditor :
<ul>
<li><b>Windows :</b> utiliser un outil externe comme par exemple <a
href="https://docs.microsoft.com/en-us/sysinternals/downloads/debugview"
target="_blank">DebugView</a> ;</li>
<li><b>Linux :</b> d<>marrer QxEntityEditor depuis un terminal ;</li>
<li><b>Mac OS X :</b> d<>marrer QxEntityEditor depuis un terminal en allant dans le sous-dossier
<i>QxEntityEditor.app</i>, par exemple : <i>cd QxEntityEditor.app/Content/MacOS/</i>, puis :
<i>./QxEntityEditor</i>
</li>
</ul>
<br /><br />
<b>-- Exemple n<>7 :</b> importer en ligne de commande un sch<63>ma de base de donn<6E>es par ODBC (plugin
<i>QxEEOdbcImport</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --no_gui --project="&lt;project_path&gt;" --plugin=QxEEOdbcImport --QxEEOdbcImport_db_type=1 --QxEEOdbcImport_dsn="&lt;your_dsn&gt;" --QxEEOdbcImport_login="&lt;your_login&gt;" --QxEEOdbcImport_pwd="&lt;your_password&gt;" --QxEEOdbcImport_delete_namespace=1</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>8 :</b> importer en ligne de commande un sch<63>ma de base de donn<6E>es PostgreSQL
(plugin <i>QxEEPostgreSQLImport</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --no_gui --project="&lt;project_path&gt;" --plugin=QxEEPostgreSQLImport --QxEEPostgreSQLImport_db_ip="&lt;ip&gt;" --QxEEPostgreSQLImport_db_port=5432 --QxEEPostgreSQLImport_db_name="&lt;dbname&gt;" --QxEEPostgreSQLImport_login="&lt;your_login&gt;" --QxEEPostgreSQLImport_pwd="&lt;your_password&gt;" --QxEEPostgreSQLImport_delete_namespace=1</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>9 :</b> exporter en ligne de commande un projet QxEntityEditor associ<63> <20> un
gestionnaire de code source Git, Perforce, CVS, etc. (plugin <i>QxEESourceControlExport</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --no_gui --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEESourceControlExport --QxEESourceControlExport_path="&lt;path_to_your_export_output_directory&gt;"</pre>
</i>
</div>
<br /><br />
<b>-- Exemple n<>10 :</b> importer en ligne de commande un projet QxEntityEditor associ<63> <20> un
gestionnaire de code source Git, Perforce, CVS, etc. (plugin <i>QxEESourceControlImport</i>) :
<br />
<div style="width:900px; height:auto; overflow:auto; background-color:white">
<i>
<pre>QxEntityEditor --project="&lt;path_to_your_qxee_project_file&gt;" --plugin=QxEESourceControlImport --QxEESourceControlImport_path="&lt;path_to_the_root_source_control_json_file&gt;"</pre>
</i>
</div>
<br /><br />
</div>
</div>
</td>
</tr>
</tbody>
</table>
<br>
<hr style="width: 80%" align="center" size="1" color="#100D5A">
<table border="0" style="width: 80%" align="center">
<col>
<col>
<col>
<tbody>
<tr>
<td align="left" valign="middle">
<img alt="QxOrm" src="./resource/logo_qxorm_small.png" width="168" height="40">
</td>
<td align="center" valign="middle">
<font size="2"><EFBFBD> 2011-202XDL Teamty - <a href="mailto:ic-east.com">ic-east.com</a></font>
</td>
<td align="right" valign="middle">
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="2K4Z58ZYAYJ6S">
<input type="image" src="./resource/paypal_support_qxorm_library.gif" border="0" name="submit"
alt="Support QxOrm library - PayPal">
<img alt="" border="0" src="https://www.paypalobjects.com/fr_FR/i/scr/pixel.gif" width="1" height="1">
</form>
</td>
</tr>
</tbody>
</table>
</body>
</html>