<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://projects.info.unamur.be/~dbm/mediawiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>https://projects.info.unamur.be/~dbm/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dbm</id>
		<title>LIBD - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="https://projects.info.unamur.be/~dbm/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dbm"/>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Sp%C3%A9cial:Contributions/Dbm"/>
		<updated>2026-04-14T17:22:56Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.18.1</generator>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2024-09-27T09:28:21Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.1''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A Python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2024-09-15T11:11:02Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://bit.ly/3x0fj2i [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://bit.ly/3x0fj2i [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2024-09-15T11:09:24Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://bit.ly/3x0fj2i [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2024-09-15T11:05:00Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://bit.ly/3x0fj2i [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2024-09-15T10:59:18Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.1''' [[DUNOD2015_SQLfast|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A Python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2024-09-15T10:38:07Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.1''' [[DUNOD2015_SQLfast|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A Python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-05-26&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:TUTORIELS</id>
		<title>LIBD:TUTORIELS</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:TUTORIELS"/>
				<updated>2024-08-01T16:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* [T14-01] Data matters most - But where has all the semantics gone? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Tutoriels / Tutorials&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[LIBD:Publications|&amp;lt;''Retour à la page des publications / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T14-01] Data matters most - But where has all the semantics gone?'''===&lt;br /&gt;
'''Jean-Luc Hainaut, February, 2014, 53 pages, English'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/Stevens/Stevens_2014.rar full text]]&lt;br /&gt;
:Lecture given for the 22th Sevens Award. WCRE-CSMR joint conferences, Antwerpen 2014.&lt;br /&gt;
&lt;br /&gt;
:The role of databases may sometimes appear controversial since they are mere basic services for a significant part of the software engineering community (the transparent &amp;quot;persistence layer&amp;quot;) while they are the central component of business application for the database community. In this lecture, we examine the evolution of the balance database/program both in time (from the early sixties to a foreseenable future) and in space (technologies, communities) from the data semantics point of view. In particular we analyze and compare how and where data semantics has been located and implemented in each of these contexts. Current development practices tend to migrate semantics from the database (as was usual in the eighties and nineties) to the application logic (e.g., O/RM, NoSQL DB managers), a trend that may be seen of regression that reminds us the infancy of business application development where files were dedicated to one application. &lt;br /&gt;
:Finally, the lecture defines how  data semantics can be recovered in these scenarios..&lt;br /&gt;
&lt;br /&gt;
:'''Contents'''. ''Introduction''; ''Understanding data semantics''; ''Data models''; ''Tracing data semantics''; ''Recovering hidden data semantic''; ''Is data semantics recovery that important, actually?''; ''Summary and conclusions''.&lt;br /&gt;
&lt;br /&gt;
==='''[T02-01] First steps in Database design'''===&lt;br /&gt;
'''Jean-Luc Hainaut, September, 2002, 38 pages, English'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf full text]]&lt;br /&gt;
:Construction pas à pas d'une petite base de données à l'aide de l'atelier DB-MAIN. Le tutoriel parcourt les principaux processus des méthodes classiques de conception de bases de données, depuis l'analyse conceptuelle jusqu'à la génération du code SQL et de la documentation. Durée moyenne : 1 heure.&lt;br /&gt;
&lt;br /&gt;
:Step-by-step building of a small database with the DB-MAIN CASE tool. This tutorial walks through the main database design processes, from conceptual analysis down to SQL code and documentation generation. Expected duration: 1 hour.&lt;br /&gt;
&lt;br /&gt;
:'''Contents'''. Lesson 1: ''Capturing the conceptual schema of the database''. Lesson 2: ''Generating a report of the conceptual schema''. Lesson 3: ''Producing the relational schema of the database''. Lesson 4: ''Producing the physical schema of the database''. Lesson 5: ''Generating the SQL code that creates the database''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T02-02] Introduction to Database Engineering '''===&lt;br /&gt;
'''Jean-Luc Hainaut, March, 2002, 334 pages, English'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf full text]]&lt;br /&gt;
:Douze leçons couvrant les principaux aspects de la construction d'une base de données à l'aide de l'atelier DB-MAIN. &lt;br /&gt;
&lt;br /&gt;
:Twelve lessons on systematic database design through the DB-MAIN CASE tool. &lt;br /&gt;
&lt;br /&gt;
:'''Contents'''. Lesson 1: ''Building our first database''. Lesson 2: ''A closer look at schemas''. Lesson 3: ''Multi-product projects''. Lesson 4: ''Conceptual Modeling''. Lesson 5: ''Logical and Physical Modeling''. Lesson 6: ''Advanced Conceptual Modeling''. Lesson 7: ''Conceptual Analysis (1)''. Lesson 8: ''Conceptual Analysis (2)''. Lesson 9: ''Logical Design''. Lesson 10: ''Logical Design (2)''.  Lesson 11: ''Logical Design (3)''. Lesson 11: ''Physical design''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T09-01] Legacy and Future of Database Reverse Engineering'''===&lt;br /&gt;
'''Jean-Luc Hainaut, Keynote, WCRE 2009, Lille, October 2009, 89 pages, English'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DBRE/WCRE09-Keynote-2009-10-16.zip full text]]&lt;br /&gt;
:Présentation des acquis actuels et des défis de la rétro-ingénierie des bases de données. Elle rappelle l'évolution des problèmes et des techniques durant les trois dernières décennies. La nécessité du processus de rétro-ingénierie est illustrée par la migration d'une base de données et la comparaison des stratégies ''physique'' et ''conceptuelle''.  Parmi les défis à résoudre, la présentation étudie plus particulièrement les nouvelles formes de données, l'approche transformationnelle, l'automatisation du processus, le changement d'échelle des problèmes classiques, l'usage croissant d'SQL dynamique, les problèmes induits par l'usage croissant des ORM. Destinée à la communauté WCRE (Rétro-ingénierie logicielle), cette présentation rappelle quelques particularités importantes du domaine des bases de données. &lt;br /&gt;
&lt;br /&gt;
:This presentation describes the experience learned and the new challenges in database reverse engineering. It recalls the evolution of problems and techniques during the last three decades. The necessity of reverse engineering is motivated through the ''physical'' and ''conceptual'' strategies of system migration. Among the challenges to address in the future, the presentation particularly develops the new forms of data, the transformational (or model-based) approach, process automation, the increasing complexity and size of classical problems, the use of dynamic SQL and the increasing use or ORM's. Also targeting the software engineering community, the presentation recalls some basic facts about databases.&lt;br /&gt;
&lt;br /&gt;
:'''Contents''': 1. ''Context, cultures and history''. 2. ''Databases: facts and challenges''. 3. ''Database reverse engineering motivation: the migration process''. 4. ''Database reverse engineering methodology''. 5. ''Database reverse engineering: A case study''. 6. ''Database reverse engineering: new challenges''. 7. ''Conclusions''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T09-02] Transformational Database Engineering'''===&lt;br /&gt;
'''Jean-Luc Hainaut, Tutoriel, BDA 2009, Namur, Octobre 2009, 112 slides, English'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/Transformation/Tutorial-BDA-2009.zip full text]]&lt;br /&gt;
:Ce tutoriel présente de manière pratique l'approche transformationnelle de l'ingénierie des bases de données. Il justifie les avantages de l'approche, particulièrement dans un contexte organisationnel dans lequel les données sont prises en charge par plusieurs systèmes de gestion incompatibles. Il étudie les propriétés de préservation sémantique des transformations puis propose une classification des transformations selon la nature des structures impliquées et selon la granularité des opérations. Il montre que les principaux processus d'ingénierie peuvent être modélisés par l'approche transformationelle. Il illustre enfin ces principes par les fonctions transformationneles de l'atelier DB-MAIN. Une première version de ce tutorial avait été présentée à l'Ecole d'été GTTSE à Braga en 2005&amp;lt;.&lt;br /&gt;
&lt;br /&gt;
:This tutorial presents some practical aspects of the transformational approach to database engineering. It shows its advantages in contexts in which data are managed by several independent and incompatible data manager systems. It studies the semantics-preservation properties of transformations and proposes a classification of the main transformations, according to the nature of data structures and to the granularity of the operations. It shows that the most important database engineering processes can be modeled by this approach. Finally, it illustrates these principles by their implementation in the DB-MAIN CASE tool. A first version of this tutorial was used in the GTTSE Summer School in Braga, 2005.&lt;br /&gt;
&lt;br /&gt;
:'''Contents'''.  1. ''Introduction''. 2. ''Modeling data structures''. 3. ''Schema transformations''. 4. ''Semantics preservation properties of transformations''. 5. ''Typology of practical elementary transformations''. 6. ''Typology of practical complex transformations''. 7. ''Transformational modeling of database engineering processes''. 8. ''Conclusions and perspectives''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T09-03] Introduction à la sécurité des bases de données'''===&lt;br /&gt;
'''Jean-Luc Hainaut, Tutoriel, Namur, 2009, 141 slides, français '''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/Securite-des-BD/Securite-BD.ppt full text]]&lt;br /&gt;
:Support du chapitre ''Sécurité des bases de données'' du cours d' ''Ingéniertie des bases de données avancées'' et de ''Certificat en management de la sécurité des systèmes d'information'' [http://www.infosafe.be/pourquoi/fundp-ichec.html [InfoSafe]].&lt;br /&gt;
&lt;br /&gt;
:Slideshow of the lecture on ''Database Security'' of the course ''Advanced Database Engineering'' and of the InfoSafe certificate [http://www.infosafe.be/pourquoi/fundp-ichec.html [InfoSafe]].&lt;br /&gt;
&lt;br /&gt;
:'''Contenu'''. 1. ''Motivations et introduction''. 2. ''Eléments de bases de données''. 3. ''Intégrité des données''. 4. ''Disponibilité des données''. 5. ''Confidentialité des données et données privées''. 6. ''Protection contre les intrusions (vol et fraude)''. 7. ''Conclusions''. 8. ''Références''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T02-03] Introduction pratique aux bases de données temporelles'''===&lt;br /&gt;
'''Jean-Luc Hainaut, Virginie Detienne, novembre 2002, 116 pages, français'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/Intro-BD-temporelles/IntroPratique-BDT.pdf full text]]&lt;br /&gt;
:Présentation et discussion, au travers d'une étude de cas construite pas à pas, des principes des bases de données temporelles. On étudie la représentation de la dimension temporelle des données (monotemporel physique et logique, le bitemporel est simplement évoqué), la gestion de données temporelle sous la forme d'une base de données active en SQL2 and l'exploitation de données temporelle (y compris la projection, la jointure et l'agrégation temporelles).&lt;br /&gt;
&lt;br /&gt;
:Presentation and discussion, through a case study developed step-by-step, of the basics in temporal databases. The tutorial studies the temporal dimension of data (transaction time and valid time are developed but bitemporal is just mentioned), the management of temporal data through an SQL2 active database and its exploitation (including temporal projection, join and agregation).  &lt;br /&gt;
&lt;br /&gt;
:'''Contenu'''. 1. ''Introduction''. 2. ''Description du projet''. 3. ''Représentation des données historiques''. 4. ''Gestion des données historiques (temps physique ou transaction time)''. 5. ''Gestion des données historiques (temps logique ou valid time)''.  6. ''Interrogation d’une base de données historiques''. 7. ''Projection temporelle d’une table historique (version simplifiée)''. 8. ''Projection temporelle généralisée''. 9. ''Jointure de tables historiques''. 10. ''L’agrégation temporelle''. 11. ''Normalisation d’une table historique''. 12. ''Variantes d’historiques''. 13. ''Historique d’associations''. 14. ''Suggestions d’extension''. 15. ''PROJET : Les composants du projet''. 16. ''PROJET : Les structures de données''.  17. ''PROJET : La gestion des données''. 18. ''PROJET : Quelques applications représentatives''. 19. ''Bibliographie''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[T98-01] Les aspects informatiques de l'Euro et de l'An 2000'''===&lt;br /&gt;
'''Jean-Luc Hainaut, Jean Henrard, mars 1998, 39 pages, français'''&lt;br /&gt;
[[http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/Y2K-EURO/Les_aspects_informatiques_de_l_Euro_et_de_l_An_2000.pdf full text]]&lt;br /&gt;
:Présentation et discussion des problèmes que devait entraîner au début des années 2000 le passage à l'an 2000 et à l'Euro. Ces problèmes étaient dus à l'usage d'un codage trop concis des dates et des montants monétaires. Pour les dates, le siècle était souvent par défaut &amp;quot;19&amp;quot; et donc non représenté explicitement. Pour les montants monétaires, les centimes étaient en général ignorés, ou réduits à une seule décimale. &lt;br /&gt;
&lt;br /&gt;
:Presentation and discussion of the problems induced by year 2000 and the Euro some years ago. The origin of both problems was the conciseness of dates and monetary amounts representation. E.g., the default century often was &amp;quot;19&amp;quot; and therefore ignored. Consequently, comparing two dates provided wrong answers whenever these dates are from different centuries. For instance, while 1995 &amp;lt; 2001, the concise form actually leads to 95 &amp;gt; 01, which may make many programs wreak avoc, or, worse, yield wrong results. &lt;br /&gt;
&lt;br /&gt;
:'''Contenu'''. 1. ''Position du problème''. 2. ''L'impact''. 3. ''Le processus de protection''. 4. ''Les techniques d'analyse''. 5. ''Conclusion''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[LIBD:Publications|&amp;lt;''Retour à la page des publications / Back''&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:RAPPORTS</id>
		<title>LIBD:RAPPORTS</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:RAPPORTS"/>
				<updated>2024-08-01T16:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;Page en développement&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;TECHNICAL REPORTS / RAPPORTS TECHNIQUES&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[LIBD:Publications|&amp;lt;''Return to Publications page''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Miscelleaneous - Divers'''==&lt;br /&gt;
&lt;br /&gt;
'''[TR12-01]''' Jean-Luc Hainaut, ''Modelling and Metamodelling'', draft technical report, June 2012, 44 pages [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/40th/40th-02(independent).pdf [full text]] &lt;br /&gt;
:'''Description'''. This document is a short report that describes some of the contributions of the Database Engineering research group of the PReCISE research center of the University of Namur (aka called LIBD) during the last four decades. It focuses on the models, metamodels, languages and API that have been developed in various domains of Database Engineering. The detail of these results can be found on the research group website. This version is an incomplete draft of the final version. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
'''[&amp;lt;span id=&amp;quot;TR11-01&amp;quot;&amp;gt;TR11-01&amp;lt;/span&amp;gt;]''' Anthony Cleve, Jean-Luc Hainaut. &amp;lt;u&amp;gt;Inter-artefact Analysis for Information System Understanding&amp;lt;/u&amp;gt;, DB-MAIN Technical report, January 2011, 14 pages. [http://www.fundp.ac.be/recherche/publications/page_view/XXXXX/ [description]]&lt;br /&gt;
:'''Description'''. Today's information systems are becoming increasingly large and complex, especially because they are made of various inter-dependent artefacts of different nature, belonging to distinct paradigms and abstraction levels. This complexity makes it difficult to \emph{understand} the system in such contexts as quality analysis, reverse engineering, maintenance and evolution. This exploratory paper identifies the pressing necessity of multi-artefact analysis for information system understanding. It presents a generic conceptual framework where inter-artefact dependencies are exploited in order to improve the effectiveness of comprehension processes. It approaches the problem of system understanding from an integrated perspective, and advocates for more intense cross-fertilization between currently isolated research communities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR10-02]''' Jean-Luc Hainaut, Anne-France Brogneaux, Anthony Cleve, ''Base de modèles pour les itinéraires de soins'', draft technical report, GISELE project, February 2009 &lt;br /&gt;
:'''Description'''. Le projet GISELE est consacré à la modélisation et à la validation d’itinéraires de soins en cancérologie.  Ce document est un rapport technique qui propose un schéma conceptuel pour la base de modèles du logiciel Gisele destiné à la gestion et à la vali-dation d’itinéraires de soins. Il décrit les phases successives de l’analyse des besoins avant de procéder à l’intégration des concepts relevés en un schéma conceptuel global. Les choix de modélisation sont justifiés soit par des raisons de qualité du schéma projeté soit pour leur adéquation aux spécificité du domaine modélisé. En particulier, à plusieurs occasions, un arbitrage a dû être fait entre l’expressivité du schéma et sa généricité. Le critère d’évolutivité du schéma, et donc de la base de modèles, a souvent été prédominant. &lt;br /&gt;
:Ce rapport décrit la modélisation des différents composants d’un itinéraire de soins, notamment les processus et leurs tâches, les points de décision, les enchaînements entre tâches. S’inspirant des modèles publiés dans la littérature (en particulier le standard BPMN), il les simplifie et les généralise de manière à permettre la représentation des situations standard mais aussi des cas de figures plus complexes tels que les workflows dynamiques par exemple. &lt;br /&gt;
:Les itinéraires de soins sont ensuite inscrits dans leur contexte, celui de la structure organisationnelle pour laquelle (et dans laquelle) ils sont appliqués. Cette structure est constituée d’unités organisationnelles, qui comprennent également les personnes, qu’il s’agisse du personnel soignant ou des patients. On y décrit les hiérarchies et les rôles qui définissent cette structure. &lt;br /&gt;
:Les processus consomment des ressources qui sont fournies par la structure organisationnelle. Ces ressources sont classées en types et font l’objet de contraintes de disponibilité ou de partageabilité par exemple.&lt;br /&gt;
:Les processus produisent et utilisent des données. Celles-ci peuvent être locales à un processus ou externes, telle une base de données. Le domaine médical fait usage de données de natures très diverses, y compris sur support non électronique. Il convient de modéliser ces différentes variantes et de définir les informations qu’elles apportent et les propriétés techniques dont la connaissance permet d’y accéder. Les données sont transmises selon diverses modalités. Par exemple, les processus se transmettent des données lors de leur exécution.&lt;br /&gt;
:La trace des exécutions d’un processus peut constituer une source d’information importante, par exemple pour expliquer ou contrôler certains comportements de l’organisation ou encore pour induire des modification du processus. &lt;br /&gt;
:L’évolution des besoins de l’organisation et du contexte des processus va entraîner l’évolution conjointe de la définition de ces processus. On modélise ces évolutions ainsi que les états successifs de ces définitions. Un processus en cours d’exécution mais dont la définition est modifiée pose des problèmes spécifiques qui doivent être décrits et modélisés avec précision.&lt;br /&gt;
:Un processus représentant un mode de résolution d’une classe de problèmes doit pouvoir être spécialisé à un contexte spécifique, voire à un individu. Il faut donc modéliser la spécialisation et la personnalisation d’un processus.&lt;br /&gt;
:Tous les aspects d’un processus complexe n’intéressent pas chaque intervenant de l’organisation. On définira pour ceux-ci des vues du processus ne reprenant que les concepts pertinents.&lt;br /&gt;
:La dimension temporelle est omniprésente dans les processus ainsi que dans les concepts de l’environnement de ceux-ci (données, traces, évolution). Le temps doit donc faire l’objet d’une description cohérente au travers de tous ces concepts. &lt;br /&gt;
:La sensibilité des données et les processus du domaine médical exige un contrôle strict des accès. On analysera plusieurs politiques de sécurité et on proposera pour chacune une modélisation appropriée.&lt;br /&gt;
:Conformément à l’objectif du projet, la validation d’un itinéraire de soins doit pouvoir être réalisé selon différents critères. Les critères et les procédures de validation ainsi que leurs résultats doivent être modélisés.&lt;br /&gt;
:Le schéma global intégrera ces aspects de manière cohérente. Il sera validé par l’étude de la représentation sans pertes des itinéraires de soins ayant fait l’objet des études de validation par les autres équipes du projet.&lt;br /&gt;
:Ce document est suivi d’un second rapport technique consacrés à la base de modèles : ''2. Implémentation et utilisation de la base de modèles''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR10-01]''' Jean-Luc Hainaut, ''Conceptual interpretation of foreign keys'', DB-MAIN Technical report, May 2010, 60 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/Conceptual-interpretation-of-FK-(stand-alone).pdf [full text]]&lt;br /&gt;
:'''Description'''. Foreign keys form a major structuring construct in relational databases and in standard files.  In reverse engineering processes, they have long been interpreted as the implementation of many-to-one relationship types.  Though one could naively think they are useless, or at least unnecessary, in hierarchical and network models, foreign keys also appear very frequently in IMS, CODASYL, TOTAL/IMAGE and even in OO databases.  Besides the standard version of foreign key, according to which a set of columns (fields) in a table (file) is used to designate rows (records) in another table, a careful analysis of existing (both modern and legacy) databases puts into light a surprisingly large variety of non standard forms of foreign keys.  Most of them are quite correct, and perfectly fitted to the requirements the developer had in mind.  However, their conceptual interpretation can prove much more difficult to formalize than the standard forms.&lt;br /&gt;
:The aim of this study  is to classify, to analyze and to interpret some of the most frequent variants of foreign keys that have been observed in operational files and databases.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR03-01]''' Jean-Luc Hainaut, ''Introduction aux SGBD CODASYL DBTG 71'', DB-MAIN Technical report, September 2003, 60 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/CODASYL.pdf [full text]]&lt;br /&gt;
:'''Description'''. Ce document a pour objectif d'introduire le lecteur aux principes des Systèmes de Gestion de Bases de Données (SGBD) s'inspirant des recommandations de CODASYL qui ont été publiées en 1971 (CODASYL,71).  Il n'a pas la prétention de se substituer à ce rapport, ni a fortiori à la documentation accompagnant les SGBD concernés. Ceci d'autant plus que les réalisateurs de SGBD ont souvent pris quelques libertés par rapports aux recommandations CODASYL, et qu'en outre ces dernières pêchent souvent par imprécision, ambiguïté et même contradiction.  Signalons encore que si les SGBD installés se réfèrent en général aux recommandations présentées dans ce document, il en existe d'autres qui s'inspirent de recommandations plus récentes, émanant de CODASYL ou de l'ANSI.  Le rapport CODASYL 71 restant muet quant à la spécification des paramètres d'implantation physique des données, nous présenterons les principes proposés par le SGBD DBMS-20 de DEC, qui appartient à la famille d'IDMS de CULLINET. Précisons enfin que nous n'aborderons pas le problème de la conception d'une base de données CODASYL ni celui de la programmation sur bases de données.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR84-01]''' Jean-Luc Hainaut, ''Le modèle d'accès généralisé'', Technical report, Janvier 1984, 66 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/Le-modele-d-acces-generalise.pdf [full text]]&lt;br /&gt;
:'''Description'''. Ce document décrit en détail le modèle d'accès généralisé (MAG), destiné à la représentation de structures de données au niveau logique, indépendamment de la technologie avec laquelle celles-ci sont implémentées. La première partie décrit les objets du modèle : type d'articles, item, type de chemins d'accès, fichier, base de données, clé d'accès et structure d'ordre. Les parties suivantes étudient respectivement l'utilisation du MAG comme expression de la sémantique des structures de données, le langage de désignation de données, les contraintes d'intégrité et les primitives de manipulation de données. Exemples et bibliographie clôturent le rapport. Ce document a servi de base à l'ouvrage [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - 2. Conception de la base de données'', Masson, 1986]&lt;br /&gt;
&lt;br /&gt;
=='''TimeStamp - Understanding, Developing, Processing Temporal Databases (1997-2002)'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR02-01]''' Virginie Detienne, Jean-Luc Hainaut. ''TimeStamp: Volume 1 - Introduction aux bases de données temporelles'', rapport final du projet ''TimeStamp'', janvier 2002, 174 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/TimeStamp/TimeStamp-Volume-1.pdf [full text]] &lt;br /&gt;
:'''Description'''. Les données temporelles font partie des systèmes d’information de nombreux secteurs industriels et administratifs. Elle décrivent les états passés (données historiques), courants et futurs de l’entreprise. Outre leur gestion classique, elles sont notamment utilisées dans le domaine de l’aide à la décision, leur consultation permettant de livrer les lois d’évolution de certains paramètres de l’organisme, tels que l’évolution des ventes, la rotation des employés,...&lt;br /&gt;
:Malheureusement, l’introduction de la dimension temporelle dans les bases de données les rendent rapidement très complexes, tant au niveau de la gestion que de l’exploitation. De plus, les technologies des bases de données actuellement utilisées (SQL-2 par exemple) offrent peu de support à la gestion de telles données.&lt;br /&gt;
:Pour répondre à ces difficultés l’objectif du projet TimeStamp est de présenter une méthodologie et des outils d’aide à la gestion et la consultation des données temporelles. &lt;br /&gt;
:Le volume d’introduction aux bases de données temporelles décrit les particularités de ce type de données, ainsi que la manière de les structurer et de les gérer. Il démontre également la nécessité d’avoir recours à une méthodologie et à des outils pour faciliter le traitement des données temporelles.&lt;br /&gt;
:L’article &amp;quot;CASE Tool Support for Temporal Database Design&amp;quot; donne un aperçu de l’utilité des outils de gestion des bases de données temporelles. Les modèles, la méthodologie, et les outils y sont présentés de manière succincte.&lt;br /&gt;
:Le tutoriel &amp;quot;Introduction pratique aux bases de données temporelles&amp;quot; décrit les caractéristiques des données temporelles et initie le lecteur aux principes des structures de données temporelles et de leur traitement en SQL.&lt;br /&gt;
:Enfin, les exposés qui ont été présentés à des responsables de bases de données de diverses industries et administrations, décrivent succinctement les particularités des données temporelles et les outils destinés à faciliter leur gestion et leur exploitation.&lt;br /&gt;
&lt;br /&gt;
'''[TR02-02]''' Virginie Detienne, Jean-Luc Hainaut. ''TimeStamp: Volume 2 - Méthodologie et exploitation des bases de données temporelles'', rapport final du projet ''TimeStamp'', janvier 2002, 290 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/TimeStamp/TimeStamp-Volume-2.pdf [full text]] &lt;br /&gt;
:'''Description'''. Le volume de &amp;quot;Méthodologie et exploitation des bases de données temporelles&amp;quot; est destiné aux utilisateurs des outils de gestion et de traitement des données temporelles. Il est composé de manuels comprenant la définition des concepts, et la description précise de l’utilisation des outils. Ces descriptions sont illustrées par des études de cas.&lt;br /&gt;
:Le volume est composé de deux parties. La première concerne la méthodologie de développement des bases de données temporelles, tandis que la seconde est consacrée au traitement des données temporelles.&lt;br /&gt;
:'''Méthodologie de développement d’une base de données temporelles'''&lt;br /&gt;
:Les modèles temporels conceptuel, logique et physique, utilisés dans le cadre du projet sont d’abord définis. &lt;br /&gt;
:Une méthode de génération de bases de données temporelles est ensuite proposée. La création des bases de données s’appuyant sur cette méthodologie peut être réalisée de manière semi-automatique à l’aide d’outils spécifiques de l’Outil CASE DB-Main. L’utilisation de ces outils est décrite en détails et illustrée par un exemple.&lt;br /&gt;
:Différents index ont été testés lors de la consultation des données temporelles. Il en résulte des recommandations de choix d’index.&lt;br /&gt;
:'''Traitement des données temporelles'''&lt;br /&gt;
:Une API de type ODBC (T-ODBC) a été réalisée afin de faciliter la consultation des données. Elle permet de manipuler les structures temporelles à l’aide d’un langage dérivé de TSQL2, nommé mini-TSQL, en offrant un cadre similaire à celui offert par ODBC. Un manuel de l’utilisateur décrit l’API et définit le langage mini-TSQL.&lt;br /&gt;
&lt;br /&gt;
'''[TR02-03]''' Virginie Detienne, Jean-Luc Hainaut. ''TimeStamp: Volume 3/1 - Documents techniques - Rapports techniques de recherche'', rapport final du projet ''TimeStamp'', janvier 2002, 340 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/TimeStamp/TimeStamp-Volume-3-1.pdf [full text]] &lt;br /&gt;
:'''Description'''. Le volume &amp;quot;Documents techniques&amp;quot; analyse diverses matières en profondeur. Il décrit les différentes pistes de réflexion qui ont été abordées, justifie les choix effectués, donne des explications techniques,... Il est destiné aux personnes désireuses d’approfondir certains sujets évoqués dans les Volumes 1 et 2, ainsi que celles qui souhaitent avoir des informations techniques concernant les outils.&lt;br /&gt;
:Le volume est divisé en deux parties. La première comprend des rapports techniques de recherches, tandis que la seconde offre la documentation technique des outils.&lt;br /&gt;
:'''Rapports techniques de recherche'''&lt;br /&gt;
:Divers thèmes sont abordés dans la première partie.&lt;br /&gt;
:Les données bitemporelles sont d’abord étudiées. On analyse la façon de représenter des données bitemporelles non valides, passées, courantes et futures. &lt;br /&gt;
:La structuration des données est ensuite analysée. Les données temporelles peuvent être localisées dans les tables selon différentes stratégies, de façon à optimiser des critères tels que l’occupation d’espace mémoire, la performance des requêtes,... Différentes structures de données sont analysées et trois d’entre elles sont sélectionnées pour la suite des travaux. Ce sont ces trois structures qui sont gérées par l’outil de génération de bases de données temporelles de DB-Main.&lt;br /&gt;
:Les propriétés temporelles des éléments d’un schéma conceptuel doivent être conservées lors des transformations. L’héritage du caractère temporel des éléments d’un schéma est analysé pour différentes transformations.&lt;br /&gt;
:Pour être cohérent, un schéma conceptuel temporel doit répondre à certains critères qui sont, notamment, liés à l’aspect temporel des données. Ces différentes règles sont décrites et justifiées.&lt;br /&gt;
:Un schéma logique temporel peut comprendre des tables d’entités et des tables d’associations. Les historiques de ces deux types de tables ont des propriétés différentes et ne se gèrent pas de la même manière. Les règles concernant les historiques d’associations sont discutées et définies.&lt;br /&gt;
:Différents modèles ont été décrits dans le cadre du projet TimeStamp. Ils sont comparés avec d’autres modèles répertoriés dans la littérature.&lt;br /&gt;
:Les langages classiques n’ont pas été conçus pour accéder aux bases de données temporelles. Dans le cadre du projet TimeStamp, un nouveau langage a été spécifiquement élaboré pour consulter ce type de bases de données (mini-TSQL2). :De plus, de nouvelles fonctions de type ODBC (T-ODBC) ont été implémentées afin de permettre l’exécution des requêtes formulées au moyen de ce langage. Les sémantique et syntaxe de mini-TSQL2 sont définies. L’amélioration d’ODBC en T-ODBC est justifiée et décrite. Des opérateurs temporels sont également spécifiés.&lt;br /&gt;
:'''Documentation technique des outils'''&lt;br /&gt;
:''voir partie suivante''.&lt;br /&gt;
&lt;br /&gt;
'''[TR02-04]''' Virginie Detienne, Jean-Luc Hainaut. ''TimeStamp: Volume 3/2 - Documents techniques - Documentation technique des outils'', rapport final du projet ''TimeStamp'', janvier 2002, 170 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/TimeStamp/TimeStamp-Volume-3-2.pdf [full text]]&lt;br /&gt;
:'''Description'''. Les outils de génération de bases de données temporelles sont d’abord décrits. Des patterns de génération de triggers destinés à la gestion de l’aspect temporel des bases de données sont proposés. Une étude sur les performances de ces bases de données générées est ensuite effectuée.&lt;br /&gt;
:Les outils d’exploitation des bases de données temporelles sont à leur tour documentés.&lt;br /&gt;
:On décrit d’abord un générateur de scripts SQL de population d’une base de données temporelles, qui est utilisé dans le but d’effectuer des tests sur des bases de données temporelles volumineuses.&lt;br /&gt;
:Des tests de performance de requêtes d’exploitation types sont ensuite réalisés.&lt;br /&gt;
:Enfin, la documentation technique de l’API T-ODBC est fournie. Elle décrit les caractéristiques des différents modules.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''InterDB - Integration of Legacy Heterogeneous Databases (1995-2002)'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''TBA soon''' [ [full text]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''Active databases - Bases de données actives (2000-2002)'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR01-01]''' Anne-France Brogneaux, Jean-Luc Hainaut. ''Bases de données actives et règles de comportement - Eléments méthodologiques et étude de cas'', rapport final du projet ''Active Database'', février 2001, 152 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/ActiveDB-Methodologie.pdf [full text]]&lt;br /&gt;
:'''Description'''. Dans cette étude de cas, nous allons développer un système de bases de données actives permettant de gérer les quelques grandes opérations d’une entreprise de vente par correspondance. Cette entreprise, comme la plupart des entreprises, est soumise à un certain nombre de contraintes. Parmi elles, nous nous attacherons aux règles de comportement.&lt;br /&gt;
:Une règle de comportement, aussi appelée règle de gestion, détermine la façon dont un objet réagit de lui-même (sans intervention de l’utilisateur) à un événement quelconque survenant lors de l’exécution de l’application dont il fait partie. L’objet est à prendre ici dans un sens très large : du plus abstrait (un objet métier, comme un client, un bon de commande, une facturation, etc.) au plus concret (une table, voire une colonne de table). Les événements, suivant le niveau d’abstraction de l’objet sur lequel ils portent, peuvent aussi être très divers : un événement système, une action d’un utilisateur, une instruction de l’application, un message, un événement sur la base de données, un événement calendrier, etc. Les règles de comportement peuvent être très complexes et influencer d’autres objets, qui se verront à leur tour obligés de réagir selon leurs propres règles de comportement.&lt;br /&gt;
:L’objectif de cette étude de cas sera donc de partir de la description d’un domaine d’application, d’isoler les règles de comportement s’y rapportant, et de concevoir le système de base de données active implémentant le domaine d’application et les règles.&lt;br /&gt;
&lt;br /&gt;
'''[TR01-02]''' Anne-France Brogneaux, Jean-Luc Hainaut. ''Validation de règles actives - Etat de l’art et prototypes d’outils'', rapport final du projet ''Active Database'', février 2001, 36 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/ActiveDB-Validation.pdf [full text]]&lt;br /&gt;
:'''Description'''. La littérature concernant les règles et bases de données actives est extrêmement abondante, contrairement aux outils d’aide à la conception, qui eux, sont très peu nombreux et très ciblés. Le domaine de la validation de réseaux de règles actives est particulièrement délicat. Dans cette première partie, nous ferons une synthèse de ce qui existe dans le domaine des bases de données actives, et plus particulièrement de la validation des règles qui les composent. Après une brève introduction situant les notions de règle et de base de données actives, nous nous attacherons aux questions concernant la représentation et la validation de systèmes de bases de données actives. La seconde partie de ce document présentera les prototypes développés autour de l’atelier DB-MAIN et permettant de représenter une  base de données active, de l’analyser et de la valider. La troisième et dernière partie présente une bibliographie détaillée principalement axée sur la validation et  la représentation des systèmes actifs.&lt;br /&gt;
&lt;br /&gt;
'''[TR01-03]''' Anne-France Brogneaux, Jean-Luc Hainaut. ''Générateur SQL paramétrique'', rapport final du projet ''Active Database'', février 2001, 57 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/ActiveDB-Generateur-SQL.pdf [full text]]&lt;br /&gt;
:'''Description'''. Le générateur SQL paramétrique est un module annexe à DB-MAIN exécuté à partir d’un schéma physique d’une base de données relationnelle, afin d’obtenir le code de création de la base de données et de la gestion des contraintes d’intégrités liées à ce schéma. Le générateur est déclaré paramétrique car il permet à l’utilisateur un choix très fin des paramètres de génération : choix du SGBD cible, choix des contraintes à générer, choix des techniques de codage. Il ne s'agira donc pas uniquement de traduire la totalité des contraintes dans le DDL du SGBD cible choisi, qui est en général impuissant à traduire un certain nombre de contraintes complexes, mais à exprimer ces contraintes selon diverses techniques, ce qui donnera des fragments procéduraux additionnels. Les différentes contraintes du schéma pourront donc être codées selon six techniques différentes : les commentaires (qui ne sont pas vraiment une technique d'implémentation, mais qui peuvent être utilisés pour signaler l'existence d'une contrainte), les techniques natives, les checks, les views with check option, les triggers, et les stored procedures.&lt;br /&gt;
:La structure de ce document est la suivante. Dans cette première partie, nous allons passer en revue les quelques éléments techniques nécessaires à la génération, essentiellement les différents mécanismes offerts par les SGBD pour gérer les contraintes d’intégrité. Ensuite, nous nous attacherons plus précisément au fonctionnement du générateur proprement dit. Dans la seconde partie, nous nous attarderons sur la description des contraintes d’intégrité contenues dans un schéma physique d’une base de données relationnelle, leur conséquence sur les actions sur la base de données, et la façon dont elles sont exprimées dans l’atelier DB-MAIN. Enfin, dans la dernière partie, nous passerons à la génération proprement dite du code SQL pour les contraintes décrites dans la deuxième partie, et pour le SGBD Oracle, le seul a être implémenté pour le moment.&lt;br /&gt;
&lt;br /&gt;
'''[TR03-02]''' Anne-France Brogneaux, Jean-Luc Hainaut. ''Une approche complète de représentation des relations ISA en SQL2'', rapport final du projet ''Active Database'', mars 2003, 19 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/Gestion-Relations-ISA-en-SQL.pdf [full text]]&lt;br /&gt;
:'''Description'''. Les relations is-a sont des constructions de base proposées dans la plupart des modèles conceptuels de systèmes d’information. Mais très peu de systèmes de gestion de bases de données permettent de les représenter complètement. Trois techniques neutres de transformation des relations is-a sont traditionnellement proposées : la matérialisation, où chaque sous-type est représenté par un type d’entités indépendant relié au surtype par un type d’associations un-à-un, l’héritage ascendant, où seul le surtype est représenté, et l’héritage descendant, où seuls les sous-types sont représentés. Chacune de ces techniques a des avantages et des inconvénients. Après l’élimination des relations is-a, il faut encore traduire le schéma conceptuel en structures conformes au modèle relationnel. Enfin, il faut coder ces structures. A chacune de ces étapes, plusieurs écueils peuvent se rencontrer, qui ne sont pas toujours évités, ni même évitables. &lt;br /&gt;
:Si on prend comme exemple l’atelier logiciel DB-MAIN, on constate que ces écueils sont bien réels. Il propose, comme transformation neutre, la transformation par matérialisation : les types d’entités sont préservés, et la relation is-a est remplacée par autant de types d’associations un-à-un qu’il y a de sous-types. Ensuite, ces types d’associations peuvent être transformés en attributs de référence. Si la relation is-a était soumise à une contrainte de totalité, disjonction ou partition, des attributs indicateurs de sous-types, facultatifs, sont créés dans le surtype afin de supporter la contrainte d’existence (at-least-one, exclusivity, exactly-one) correspondant à la contrainte définie sur les sous-types. A ce stade, la modélisation est incomplète : la sémantique des attributs indicateurs de sous-types n’est pas indiquée, à savoir que l’indicateur de sous-type ne reçoit une valeur (à déterminer) que si l’entité courante appartient au sous-type désigné par cet attribut. Une fois ce schéma logique obtenu, c’est à l’utilisateur de générer le code correspondant. Sans indication de la sémantique complète de la structure résultant de la relation is-a, ce code sera forcément incomplet. &lt;br /&gt;
:Même dans les cas où les structures proposées pour traduire les relations is-a sont complètes et correctes, on constate que la tâche de l’utilisateur est loin d’être aisée. En effet, quelle que soit la transformation choisie (matérialisation, héritage ascendant ou héritage descendant), l’encodage et la manipulation des données sont fastidieux. Prenons par exemple le cas de la matérialisation, où, dans le meilleur des cas, il faudra insérer une ligne dans deux tables, dans un ordre prédéfini afin de respecter les contraintes référentielles, pour créer une seule entité. De même, dans le cas de l’héritage descendant sans disjonction des sous-types, des données devront être dupliquées dans plusieurs tables afin de décrire une seule et même entité. Sans parler de la complexité des contraintes s’appliquant à de telles structures, transformant souvent en parcours du combattant la simple création d’une entité dans la base de données.&lt;br /&gt;
:Pour tenter de répondre à toutes ces remarques, nous proposons une démarche qui englobe l’ensemble du processus de conception d’une base de données relationnelle : de la normalisation d’un schéma conceptuel contenant des relations is-a à la génération d’un code opérationnel et complet, prenant en compte toutes les contraintes inhérentes à ces structures, en passant par la conception logique et la conception physique. Notre objectif est double : d’une part, proposer la transformation automatique des relations is-a en structures compatibles avec le modèle relationnel d’Oracle (schémas et code implémentant ces schémas), et d’autre part, fournir à l’utilisateur un système intuitif, demandant peu d’investissement de sa part par rapport à l’utilisation habituelle d’une base de données relationnelle.&lt;br /&gt;
&lt;br /&gt;
'''[TR96-01]''' Joël Bergmann. ''Spécification et génération de SIAD dans l'atelier DB-MAIN - Volume 1'', Master Thesis, Institut d'informatique, Université de Namur, juin 1996, 170 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/Bergmann-vol-1.pdf [full text]]&lt;br /&gt;
:'''Description'''. The Entity-Relationship Model (ER model) is currently one of the most used conceptual models for analysing and modeling information systems. This thesis extend the specification of the ER model by adding means to define derivable information : the ER model is endowed with the ability to modelize the fact that certain information in a schema can be inferred from others. The resulting model is called Deductive ER Model. We also describe how to make a deductive ER schema executable by translating automatically the definition rules of derivable information into SQL statements. The submission of these statements on a operational database enables the calculation of the deduced values. The Deductive ER Model has been implemented into the DB-MAIN CASE tool which is dedicated to database application engineering. The integration of the Deductive ER Model in DB-MAIN allows the specification and the generation of little DSSs. Thanks to these, the managers can query, at a conceptual level, the production data in order to deduce the information they need to make their decisions.&lt;br /&gt;
&lt;br /&gt;
:A l'heure actuelle, le modèle Entité-Association (modèle EA) est un des modèles conceptuels le plus utilisé pour l'analyse et la modélisation des systèmes d'information. Ce mémoire étend la spécification du modèle EA pour permettre la modélisation d'informations dérivables : on dote le modèle EA de la possibilité d'exprimer que certaines informations d'un schéma peuvent être inférées à partir d'autres. Le modèle ainsi obtenu est appelé modèle EA déductif. On décrit aussi comment rendre un schéma EA déductif exécutable en transformant automatiquement les règles de définition des informations dérivables en requêtes SQL. La soumission de ces requêtes sur une base de données de production permet le calcul effectif des valeurs déduites. Le modèle EA déductif a été implémenté dans l'atelier d'ingénierie de bases de données DB-MAIN. L'intégration du modèle EA déductif dans DB-MAIN permet de spécifier et de générer des SIAD aux possibilités modestes. Grâce à ceux-ci, les gestionnaires peuvent interroger, à un niveau conceptuel, les données de production afin d'en déduire les informations dont ils ont besoin pour prendre leurs décisions.&lt;br /&gt;
&lt;br /&gt;
'''[TR96-02]''' Joël Bergmann. ''Spécification et génération de SIAD dans l'atelier DB-MAIN - Volume 2'', Master Thesis, Institut d'informatique, Université de Namur, juin 1996, 112 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/ActiveDB/Bergmann-vol-2.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=='''PHENIX - Database Reverse Engineering (1989-1993)'''==&lt;br /&gt;
&lt;br /&gt;
'''[TR93-01]''' M. Chandelon, M. Joris, B. Mignon, C. Tonneau, J-L Hainaut, F. Bodart, E. Cardon, F. Osaer, P. Verscheure, R. Van Hoe, J. Vandamme, M. Vanwormhoudt, &lt;br /&gt;
DATABASE REVERSE ENGINEERING - Volume I:  General concepts and Introduction, Final report of the PHENIX project, April 1993, 138 pages [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/PHENIX/Phenix-Vol1-(2012).pdf [full text]]&lt;br /&gt;
:'''Description'''. (TBA).&lt;br /&gt;
&lt;br /&gt;
'''[TR93-02]''' M. Chandelon, M. Joris, B. Mignon, C. Tonneau, J-L Hainaut, F. Bodart, E. Cardon, F. Osaer, P. Verscheure, R. Van Hoe, J. Vandamme, M. Vanwormhoudt, &lt;br /&gt;
DATABASE REVERSE ENGINEERING - Volume II:  Reverse engineering, Final report of the PHENIX project, April 1993, 300 pages [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/PHENIX/Phenix-Vol2-(2012).pdf [full text]]&lt;br /&gt;
:'''Description'''. (TBA).&lt;br /&gt;
&lt;br /&gt;
'''[TR93-03]''' M. Chandelon, M. Joris, B. Mignon, C. Tonneau, J-L Hainaut, F. Bodart, E. Cardon, F. Osaer, P. Verscheure, R. Van Hoe, J. Vandamme, M. Vanwormhoudt, &lt;br /&gt;
DATABASE REVERSE ENGINEERING - Volume III:  Technical appendices, Final report of the PHENIX project, April 1993, 100 pages [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/PHENIX/Phenix-Vol3-(2012).pdf [full text]]&lt;br /&gt;
:'''Description'''. (TBA).&lt;br /&gt;
&lt;br /&gt;
'''[TR93-04]''' M. Chandelon, M. Joris, B. Mignon, C. Tonneau, J-L Hainaut, F. Bodart, E. Cardon, F. Osaer, P. Verscheure, R. Van Hoe, J. Vandamme, M. Vanwormhoudt, &lt;br /&gt;
Phenix Symposium on Database Reverse Engineering, Proceedings. June 1992, 275 pages [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/PHENIX/Phenix-Symposium.pdf [full text]]&lt;br /&gt;
:'''Description'''. (TBA).&lt;br /&gt;
&lt;br /&gt;
=='''The SPHINX DBMS - Le SGBD SPHINX (1971-1978)'''==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR78-01]''' Jean-Luc Hainaut, Baudouin Le Charlier, et al. ''Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages'', Rapport final du projet CIPS I2/15 ''Grandes banques de données administratives'', Institut d'informatique, Université de Namur, janvier 1978, 168 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Evaluation.pdf [Project evaluation (just for the pleasure!]]&lt;br /&gt;
:'''Description'''. First volume of the final report of a 6-year research projet (1971-1977) devoted to the development of models, languages and DBMS for administrative applications. This volume describes the Entity-relationship conceptual model, the binary logical access model, the data definition language (DDL), the data manipulation language (DML) and the user query language (N.U.L) of the SPHINX DBMS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR78-02]''' Jean-Luc Hainaut, Baudouin Le Charlier, et al. ''Système de conception et d'exploitation de bases de données - Volume 2 : Manuels de référence des langages'', Rapport final du projet CIPS I2/15 ''Grandes banques de données administratives'', Institut d'informatique, Université de Namur, janvier 1978, 122 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
:'''Description'''. Second volume of the final report of a 6-year research projet (1971-1977) devoted to the development of models, languages and DBMS for administrative applications. This volume describes the three languages of the SPHINX DBMS: the data definition language (DDL), the data manipulation language (DML) and the user query language (N.U.L).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR78-03]''' Jean-Luc Hainaut, Baudouin Le Charlier, et al. ''Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès'', Rapport final du projet CIPS I2/15 ''Grandes banques de données administratives'', Institut d'informatique, Université de Namur, janvier 1978, 110 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
:'''Description'''. Third volume of the final report of a 6-year research projet (1971-1977) devoted to the development of models, languages and DBMS for administrative applications. This volume describes the physical data structures of the database. The binary logical access model is mapped on a low-level DBMS (Siemens's SESAM) used as the physical layer ensuring data storage, indexing, valubased querying, concurrency and recovery.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR78-04]''' Jean-Luc Hainaut, Baudouin Le Charlier, et al. ''Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX'', Rapport final du projet CIPS I2/15 ''Grandes banques de données administratives'', Institut d'informatique, Université de Namur, janvier 1978, 230 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
:'''Description'''. Fourth volume of the final report of a 6-year research projet (1971-1977) devoted to the development of models, languages and DBMS for administrative applications. This volume describes the internals of the SPHINX DBMS. Its sections describes the DDL compiler, the DML compiler, inter-task communications, the SPHINX API, the SPHINX runtime kernel (the ''server''), the NUL query system, recovery, as well as the main exploitation procedures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''[TR78-05]''' Jean-Luc Hainaut, Baudouin Le Charlier, et al. ''Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'applications'', Rapport final du projet CIPS I2/15 ''Grandes banques de données administratives'', Institut d'informatique, Université de Namur, janvier 1978, 102 pages, [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
:'''Description'''. Fourth volume of the final report of a 6-year research projet (1971-1977) devoted to the development of models, languages and DBMS for administrative applications. This volume describes two applications of the SPHINX system. The first one is a data dictionary system through which database schemas can be entered interactively, queried and generated in SPHINX DDL. The second application is a management simulator for a manufacturing enterprise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[LIBD:Publications|&amp;lt;''Return to Publications page''&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Publications</id>
		<title>LIBD:Publications</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Publications"/>
				<updated>2024-08-01T16:25:47Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;b&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;PUBLICATIONS&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:ARTICLES|1. Papers / Articles]]'''===&lt;br /&gt;
:Journal and conference papers. Book chapters. Encyclopedia entries. / Articles de journaux et d'actes de conférences. Chapitres d'ouvrages. Entrées d'encyclopédie. &lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:Ouvrages|2. Books / Ouvrages]]'''===&lt;br /&gt;
:Books published / Ouvrages publiés&lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:OUVRAGES-WEB|3. Web Books / Ouvrages publiés sur le web]]'''===&lt;br /&gt;
&lt;br /&gt;
:Books available on the web / Ouvrages diffusés sur le web&lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:THESES|4. Theses / Thèses]]'''===&lt;br /&gt;
&lt;br /&gt;
:Theses published / Thèses soutenues et publiées&lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:RAPPORTS|5. Technical Reports / Rapports techniques]]'''===&lt;br /&gt;
&lt;br /&gt;
:Technical and research reports not published in journal or conference proceedings / Rapports techniques et de recherche non publiés&lt;br /&gt;
&lt;br /&gt;
==='''[[LIBD:TUTORIELS|6. Tutorials / Tutoriels]]'''===&lt;br /&gt;
&lt;br /&gt;
:Educational materials including slideshows / Documents à vocation didactique, y compris diaporamas utilisés dans des conférences ou séminaires &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Back to Welcome page / Retour à la page d'accueil&amp;gt;]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2024-08-01T15:23:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;SQLfast manual&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Classifying objects&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: The book of which you are the hero&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Four hours to save the library&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Blockchains&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Active databases&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Conway's Game of Life&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Kings of France - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Kings of France - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Directory management&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures, a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine renders SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7 (conversion to Python 3 in progress). Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*'''SQLfast manual and case studies'''&lt;br /&gt;
&lt;br /&gt;
:The external documentation comprises two important volumes. The first one is the '''SQLfast manual''', an introduction to the development of database applications. The second one is a collection of case studies illustrating the use of database programming to solve large families of problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''Volume 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:'''Volume 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:'''Case studies in preparation'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T17:45:00Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T17:41:07Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T17:39:47Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T17:36:13Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;SQLfast manual&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Classifying objects&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: The book of which you are the hero&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Four hours to save the library&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Blockchains&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Active databases&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Conway's Game of Life&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Kings of France - Part 1&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Kings of France - Part 2&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;Case study: Directory management&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures, a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine renders SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7 (conversion to Python 3 in progress). Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*'''SQLfast manual and case studies'''&lt;br /&gt;
&lt;br /&gt;
:The external documentation comprises two important volumes. The first one is the '''SQLfast manual''', an introduction to the development of database applications. The second one is a collection of case studies illustrating the use of database programming to solve large families of problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''Volume 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:'''Volume 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:'''Case studies in preparation'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T17:16:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures, a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine renders SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7 (conversion to Python 3 in progress). Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*'''SQLfast manual and case studies'''&lt;br /&gt;
&lt;br /&gt;
:The external documentation comprises two important volumes. The first one is the '''SQLfast manual''', an introduction to the development of database applications. The second one is a collection of case studies illustrating the use of database programming to solve large families of problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''Volume 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:'''Volume 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:'''Case studies in preparation'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T17:10:41Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures, a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine renders SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7 (conversion to Python 3 in progress). Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
--&amp;gt;&lt;br /&gt;
*'''SQLfast manual and case studies'''&lt;br /&gt;
&lt;br /&gt;
:The external documentation comprises two important volumes. The first one is the '''SQLfast manual''', an introduction to the development of database applications. The second one is a collection of case studies illustrating the use of database programming to solve large families of problems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''Volume 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:'''Volume 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T16:48:11Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures, a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLpy module)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''SQLpy''' is a Python module intended to programmers who are not willing to code in the SQLfast language though interested in some of the features of the SQLfast environment. As a new tool, ''SQLpy'' is rapidly evolving. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T14:59:53Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI (including the display of bitmap images, vector graphics, both static and dynamic), comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLfast environment)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complex hypertext, multimedia systems, that may include executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLpy module)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''SQLpy''' is a Python module intended to programmers who are not willing to code in the SQLfast language though interested in some of the features of the SQLfast environment. As a new tool, ''SQLpy'' is rapidly evolving. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T14:59:37Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
For more technical detail, please consult the [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [tools page]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T14:57:14Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [page des outils ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-11T14:55:31Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
On trouvera plus de détails techniques dans la [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils&amp;amp;action=submit [page des outils ]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T10:50:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI (including the display of bitmap images, vector graphics, both static and dynamic), comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLfast environment)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complexe hypertext, multimedia systems, including executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools: error reporting; variable dumping, powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
:*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
:*'''Date''': 2012-&lt;br /&gt;
:*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
:*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
:*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
:**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
:**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
:**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
:**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLpy module)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''SQLpy''' is a Python module intended to programmers who are not willing to code in the SQLfast language though interested in some of the features of the SQLfast environment. As a new tool, ''SQLpy'' is rapidly evolving. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T10:39:32Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI (including the display of bitmap images, vector graphics, both static and dynamic), comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLfast environment)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complexe hypertext, multimedia systems, including executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex data display formats (3 tabular, csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, headers, text, etc.) These formats are defined by generic parameters and can be dynamically extended.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (currently dbf, csv)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, 2 list boxes, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*SQL user-defined function&lt;br /&gt;
::*user-defined and builtin technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*user-defined and builtin functional SQLfast procedures (e.g., data loading, data checking, report generation, rebuilding SQL-DDL code of an unknown database), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access, FCA_Engine), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, ETL, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*calling external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in data dictionary comprising up to 10 system tables,&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
::*error reporting&lt;br /&gt;
::*variable dumping&lt;br /&gt;
::*powerful tracing subsystem for SQLfast commands, SQL queries and SQL triggers; trace analysis through SQL queries,&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
*'''&amp;lt;big&amp;gt;Technical detail (SQLpy module)&amp;lt;/big&amp;gt;'''&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:'''SQLpy''' is a Python module intended to programmers who are not willing to code in the SQLfast language though interested in some of the features of the SQLfast environment. As a new tool, ''SQLpy'' is rapidly evolving. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-11T10:06:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI (including the display of bitmap images, vector graphics, both static and dynamic), comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail'''&lt;br /&gt;
:An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language (based on the SQLite3 interface)&lt;br /&gt;
:*new SQL functions, including additional numeric, character and time functions, cryptography, 40 ''list management'' functions, file/web functions, temporal algebra operator&lt;br /&gt;
:*dynamic columns: columns created through their usage instead of by DDL commands&lt;br /&gt;
:* about 100 system parameters to customize the interface and the behaviour of SQLfast engine&lt;br /&gt;
:*additional languages: &lt;br /&gt;
::*'''SQLdraw''': specification of vector graphics, static (still drawing) and dynamic (animated)&lt;br /&gt;
::*'''SQLtuto''': description of help documents, guides and tutorials; allows the building of complexe hypertext, multimedia systems, including executable code fragments;&lt;br /&gt;
::*'''LTemp''': algebraic temporal operators: temporal, coalescing, aggregation, interval normalization&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments and complete instructions. The SQLfast pre-processor can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, return, shutdown, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, bitmap, charts, static and dynamic vector graphics)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, list box, text, bitmap images, vector graphics, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-10T08:49:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI (including the display of bitmap images, vector graphics, both static and dynamic), comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-09T15:54:53Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
&lt;br /&gt;
::: 2022-09-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2022-12-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java, C# or Python in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[http://bit.ly/3FCGGma This document (in English)] and [http://bit.ly/3Pz3yaN this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows and Linux machines (through Wine). Its default database manager is SQLite3. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python with Tkinter, SQLite3 and PIL modules. Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows from Vista to Win11 (64 bits). All the resources needed are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 5 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''Main references and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast.&lt;br /&gt;
**The latest stable version of SQLite3 DBMS is included in the SQLfast distribution (file ''sqlite3.ddl'' in the SQLfast folder). As soon as a new version is available in [http://www.sqlite.org/download.html the SQLite download site], just replace the current file with the last version..&lt;br /&gt;
**&amp;lt;u&amp;gt;SQLfast manual - Database application programming&amp;lt;/u&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
**&amp;lt;u&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/u&amp;gt; [http://bit.ly/3uUvLPV [full text]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-09T15:11:25Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2020-11-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3Wm8IZT [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java or C# in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_EN.pdf This document (in English)] and [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_FR.pdf this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows, OS X and Linux machines (only the Windows version is available at present time). Its default database manager is SQLite 3 but versions for MySQL and MS Access are being developed.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python 2.7, Tkinter and an integrated RDBMS (SQLite 3 in the standard distribution). Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows 7, 8 and 10. All the resources needed by the basic version (built on SQLite 3) are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 3 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast. [http://www.python.org/download/ [download page]]&lt;br /&gt;
**SQLite3 DBMS is included in the SQLfast software. &amp;lt;!-- However, it can be useful to download the very last version (3.8.10 or later). Download it from [http://www.sqlite.org/download.html [SQLite3]]. Locate section &amp;lt;i&amp;gt;Precompiled Binaries for Windows&amp;lt;/i&amp;gt;. In June 2015, the file was named &amp;lt;i&amp;gt;sqlite-dll-win32-x86-3081002.zip&amp;lt;/i&amp;gt;. Open the archive and copy the &amp;lt;i&amp;gt;sqlite.dll&amp;lt;/i&amp;gt; file in directory &amp;lt;i&amp;gt;Python 2.7/DLLs&amp;lt;/i&amp;gt; of the Python directory. --&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;, 78 pages, PReCISE Research Center publication, draft version, August 27, 2019. [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&amp;lt;/font&amp;gt;&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;SQLfast: Database processing made easy - Manual and Case studies&amp;lt;/u&amp;gt;, Volumes 1 (SQLfast manual) and 2 (Case studies), 900 pages. These chapters are continuously updated, so that it is recommended to check them regularly to get their last versions. &lt;br /&gt;
:Both volumes are described below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[http://bit.ly/3Wm8IZT [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-09T14:47:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2020-11-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [http://bit.ly/3uUvLPV [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java or C# in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_EN.pdf This document (in English)] and [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_FR.pdf this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows, OS X and Linux machines (only the Windows version is available at present time). Its default database manager is SQLite 3 but versions for MySQL and MS Access are being developed.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python 2.7, Tkinter and an integrated RDBMS (SQLite 3 in the standard distribution). Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows 7, 8 and 10. All the resources needed by the basic version (built on SQLite 3) are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 3 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast. [http://www.python.org/download/ [download page]]&lt;br /&gt;
**SQLite3 DBMS is included in the SQLfast software. &amp;lt;!-- However, it can be useful to download the very last version (3.8.10 or later). Download it from [http://www.sqlite.org/download.html [SQLite3]]. Locate section &amp;lt;i&amp;gt;Precompiled Binaries for Windows&amp;lt;/i&amp;gt;. In June 2015, the file was named &amp;lt;i&amp;gt;sqlite-dll-win32-x86-3081002.zip&amp;lt;/i&amp;gt;. Open the archive and copy the &amp;lt;i&amp;gt;sqlite.dll&amp;lt;/i&amp;gt; file in directory &amp;lt;i&amp;gt;Python 2.7/DLLs&amp;lt;/i&amp;gt; of the Python directory. --&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;, 78 pages, PReCISE Research Center publication, draft version, August 27, 2019. [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&amp;lt;/font&amp;gt;&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;SQLfast: Database processing made easy - Manual and Case studies&amp;lt;/u&amp;gt;, Volumes 1 (SQLfast manual) and 2 (Case studies), 900 pages. These chapters are continuously updated, so that it is recommended to check them regularly to get their last versions. &lt;br /&gt;
:Both volumes are described below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case21-Test-databases.pdf [full text]]&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-09T14:40:50Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (570 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-09T14:40:31Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming''' (570 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-09T14:39:46Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-08T10:42:27Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2023-06-08&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2023-06-07T17:24:01Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.1''' [[DUNOD2015_SQLfast|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-08&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-05-26&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-07T17:22:30Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:'''Attention''', dans certaines configurations, le navigateur ''Edge'' de Microsoft refuse de télécharger des fichiers ''zip''. Dans un tel cas, utiliser plutôt ''Firefox'' ou ''Chrome''.&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les principaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution d'une grande variété de problèmes. Dans ce cadre, ces outils sont actuellement utilisés pour développer une série d'études de cas de natures variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes. Ils ciblent à la fois les utilisateurs débutants et professionnels.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requête SQL, script SQLfast, dialogue, appel de procédure) peut être exécuté par un simple clic à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les guides et tutoriels, des bases de données de test, un jeu de scripts), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
:Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionnaire des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux '''programmeurs Python''' un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 16 formats sont disponibles) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code source du module ''SQLpy.py'' &lt;br /&gt;
*son manuel utilisateur, largement illustré ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Download'''&lt;br /&gt;
&lt;br /&gt;
:'''Warning''', in some configurations, the Microsoft ''Edge'' browser refuses to download ''zip'' files. In such case, use ''Firefox'' or ''Chrome'' instead.&lt;br /&gt;
&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Dictionary of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast - Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' [''&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQL queries and, more generally, SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation. They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, bitmap and vector graphic images, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: the folder ''SQLfast'' extracted from the ''.zip'' archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, query prototyping, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python since 2012. The current distribution includes ''SQLite3'', which offers a rich version of SQL2/SQL3 (including recursive CTE and ''window'' function) and GUI library ''Tkinter''. The current version has been compiled for MS Windows 64 bits (from Vista to Win11). SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small ''pdf'' documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''. These tutorials mainly comprise exercises. However, the introductory chapter, ''A short introduction to SQL'', is recommended for beginners.&lt;br /&gt;
:These tutorials are ''active'': the sample queries can be executed through a simple click.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes graphical environment and the main functions of SQLfast at the ''Expert'' level. It takes the user step-by-step through the creation, execution, correction and recording of their first. Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN.pdf'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference guides on the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the ''Expert'' Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of the ''pdf'' document ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial description language. This language allows the users to modify and develop help documents, guides and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This pdf e-book is the complete manual and tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''. The tutorials of the ''Basic'' and ''Expert'' levels are stored in subdirectories '''Lev0_Tutorials''' and '''Lev1_Tutorials''' respectively. The tutorials can be modified, deleted and added by the users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes about 40 of the most powerful functions of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (often equivalent to more than one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats, from tabular to LaTex, are available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*the installation of the PIL module is no longer required (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' and''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and applications of the FCA techniques (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions (''SQLfast-xx-EN.zip'' and ''SQLfast-xx-FR.zip''), depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions (''SQLfast-xx-EN.zip'' et ''SQLfast-xx-FR.zip''), selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-07T11:31:44Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-09-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2022-12-12&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2022-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (en anglais) [''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' et '''SQLpy''' sont les princiaux résultats techniques d'un projet didactique destiné à explorer et démontrer la puissance des concepts, des technologies et des méthodes relatives aux bases de données pour la résolution de problèmes. Ces outils sont actuellement utilisés pour développer une série d'études de cas de natures (très) variées destinées à évaluer la puissance de ces concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''environnement logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications interactives complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 80 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''l'environnement logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Une des particularités de SQLfast est son '''moteur de tutoriels'''. Un tutoriel (ou guide ou document d'aide) est un hypertexte multimédia écrit dans le langage ''SQLtuto'' (sorte de micro-HTML maîtrisable en quelques minutes). Ce document est ''actif'', c'est-à-dire que tout fragment de code (requêtes SQL, scripts SQLfast, IHM, appel de procédure) peut être exécuté à partir du tutoriel dans lequel il apparaît. Il permet notamment de développer très facilement des systèmes de cours actifs complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exécution de scripts complexes et l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite3'' et la bibliothèque graphique standard ''Tkinter''. La version actuelle a été compilée pour les machines MS Windows 64 bits (de Vista à Win11). Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de guides et tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : intégrée et externe :&lt;br /&gt;
:*la documentation intégrée, accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast, sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatifs au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''. Ces tutoriels sont constitués principalement d'exercices. Cependant, le chapitre introductif, ''Une brève introduction à SQL'', est recommandé aux débutants.&lt;br /&gt;
Ces tutoriels sont ''actifs'' : les exemples de requêtes sont directement exécutables par un simple clic.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres secondaires et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes et paramètres des langages SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de guides, de documents d'aide et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels actifs relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut une quarantaine des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre persistante indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend :&lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur, largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La '''version 1.2''' de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLfast''' and '''SQLpy''' are the main technical outcomes of a didactic project intended to explore and demonstrate the power of database concepts, technologies and methods for general problem solving. These tools are currently being used to develop a series of (very) varied case studies designed to assess the power of these concepts ([https://bit.ly/3x0fj2i '''SQLfast Case Studies''']).&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or guide or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML that can be learned in a few minutes). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. In particular, it allows the development of complex active course systems quite easily. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-06T17:31:20Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
::: 2023-06-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2022-04-14: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2021-10-16: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2021-05-05: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
::: 2020-10-04: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2019-08-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-02-01: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2018-08-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2020-11-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java or C# in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_EN.pdf This document (in English)] and [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_FR.pdf this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows, OS X and Linux machines (only the Windows version is available at present time). Its default database manager is SQLite 3 but versions for MySQL and MS Access are being developed.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python 2.7, Tkinter and an integrated RDBMS (SQLite 3 in the standard distribution). Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows 7, 8 and 10. All the resources needed by the basic version (built on SQLite 3) are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 3 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast. [http://www.python.org/download/ [download page]]&lt;br /&gt;
**SQLite3 DBMS is included in the SQLfast software. &amp;lt;!-- However, it can be useful to download the very last version (3.8.10 or later). Download it from [http://www.sqlite.org/download.html [SQLite3]]. Locate section &amp;lt;i&amp;gt;Precompiled Binaries for Windows&amp;lt;/i&amp;gt;. In June 2015, the file was named &amp;lt;i&amp;gt;sqlite-dll-win32-x86-3081002.zip&amp;lt;/i&amp;gt;. Open the archive and copy the &amp;lt;i&amp;gt;sqlite.dll&amp;lt;/i&amp;gt; file in directory &amp;lt;i&amp;gt;Python 2.7/DLLs&amp;lt;/i&amp;gt; of the Python directory. --&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;, 78 pages, PReCISE Research Center publication, draft version, August 27, 2019. [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&amp;lt;/font&amp;gt;&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;SQLfast: Database processing made easy - Manual and Case studies&amp;lt;/u&amp;gt;, Volumes 1 (SQLfast manual) and 2 (Case studies), 900 pages. These chapters are continuously updated, so that it is recommended to check them regularly to get their last versions. &lt;br /&gt;
:Both volumes are described below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case21-Test-databases.pdf [full text]]&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. Managing a small library: The human factor&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-06T16:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2017-09-25: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2020-11-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java or C# in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_EN.pdf This document (in English)] and [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_FR.pdf this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows, OS X and Linux machines (only the Windows version is available at present time). Its default database manager is SQLite 3 but versions for MySQL and MS Access are being developed.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python 2.7, Tkinter and an integrated RDBMS (SQLite 3 in the standard distribution). Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows 7, 8 and 10. All the resources needed by the basic version (built on SQLite 3) are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 3 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast. [http://www.python.org/download/ [download page]]&lt;br /&gt;
**SQLite3 DBMS is included in the SQLfast software. &amp;lt;!-- However, it can be useful to download the very last version (3.8.10 or later). Download it from [http://www.sqlite.org/download.html [SQLite3]]. Locate section &amp;lt;i&amp;gt;Precompiled Binaries for Windows&amp;lt;/i&amp;gt;. In June 2015, the file was named &amp;lt;i&amp;gt;sqlite-dll-win32-x86-3081002.zip&amp;lt;/i&amp;gt;. Open the archive and copy the &amp;lt;i&amp;gt;sqlite.dll&amp;lt;/i&amp;gt; file in directory &amp;lt;i&amp;gt;Python 2.7/DLLs&amp;lt;/i&amp;gt; of the Python directory. --&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;, 78 pages, PReCISE Research Center publication, draft version, August 27, 2019. [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&amp;lt;/font&amp;gt;&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;SQLfast: Database processing made easy - Manual and Case studies&amp;lt;/u&amp;gt;, Volumes 1 (SQLfast manual) and 2 (Case studies), 900 pages. These chapters are continuously updated, so that it is recommended to check them regularly to get their last versions. &lt;br /&gt;
:Both volumes are described below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case21-Test-databases.pdf [full text]]&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 30. Classifying objects&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;June 2023.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case30-FCA.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we explore a particular way of classifying objects based on their attributes. This technique, called Formal Concept Analysis, or FCA for short, examines the composition of these objects and extracts concepts, that is, classes of objects that share the same set of attributes. By considering the inclusion relationship of the concept object sets, the concepts can be organized as a hierarchy.&amp;lt;br&amp;gt;&lt;br /&gt;
::Several techniques have been designed to extract concepts from a set of source objects and to build their hierarchy. We analyze the reasoning underlying these techniques and we develop one of the most popular of them, the Chein algorithm. We first translate this iterative algorithm into a Python procedure then we express it as an SQL script. &amp;lt;br&amp;gt;&lt;br /&gt;
::We propose a third, much simpler and faster technique that produces a remarkable subset of the Chein concept hierarchy. It appears that this technique, which can be coded as a single SQL query or in a small Python procedure, is more appropriate to database schema processing, specifically to conceptual schema normalization and to reverse engineering legacy databases. &amp;lt;br&amp;gt;&lt;br /&gt;
::The study develops four parametric applications to experiment with these algorithms and to evaluate their performance in time and space.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': symbolic classification, Formal Concept Analysis (FCA), Galois lattice, set operators, performance evaluation, database optimization, algorithm optimization. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. The human factor (Managing a small library)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 7. Schema-driven code generation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 13. Bis repetita non (always) placent (Detecting and controlling redundancies)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 16. Lies, damned lies, and statistics&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 17. Database security&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 18. Data analysis and cleaning&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 19. Database reverse engineering&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 20. Database prototyping&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 22. Database Performance&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': Database performance tuning. Index types. The roles of cache memories. Performance evaluation pitfalls. Optimizing select queries. Optimizing data modification queries. Optimizing group by and order by queries. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 23. Object/Relational mapping &amp;lt;i&amp;gt;vs&amp;lt;/i&amp;gt; Active database&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 25. Geographic information systems&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 26. Text processing&amp;lt;/b&amp;gt;, writing in progress &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 29. Bill of material&amp;lt;/b&amp;gt;, rewriting in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': Introduction. The BOM database. The part list of a part. Closure of a BOM. A Tale of Two Worlds. Computing the unit cost of all parts. Updating a BOM. Simulating recursive queries through SQLfast. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 30. Classification (Formal Concept Analysis)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 32. Databases and the internet&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 33. Worflow management - Building a workflow engine&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils</id>
		<title>LIBD:Outils</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=LIBD:Outils"/>
				<updated>2023-06-06T16:23:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''OUTILS / TOOLS'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Accueil|&amp;lt;''Retour à la page d'accueil / Back''&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQLfast===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
::'''SQLfast is a software environment that allows non expert users to easily create, examine, modify, query and process relational databases through a user friendly graphical interface. The SQLfast environment also provides a simple but rich programming language intended primarily to casual users with no or little experience in database programming.''' &lt;br /&gt;
::'''SQLfast is portable, self-contained, self-documented, ready to run and requires no installation. Launching it just requires double-clicking on SQLfast.exe, nothing more. The software, the manuals and the tutorials are available [https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast here]'''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: '''Manuals and case studies last updates'''&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Classifying objects&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case30-FCA.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Active databases&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::: 2020-09-23: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Temporal databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Blockchains&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case34-Blockchains.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: From data bulk loading to database book writing&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Conway's Game of Life&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::: 2017-09-25: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Interactive SQL interpreter&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Four hours to save the library&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Schema-less databases - Part 3&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 1&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::: 2017-09-10: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Kings of France - Part 2&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: The book of which you are the hero&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Directory management&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case15-Directory-Management.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case study: Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt; &amp;lt;/font&amp;gt; [https://projects.info.unamur.be/dbm/SQLfast/Case-Studies/SQLfast-Case31-Shortest-path.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
::: 2020-11-29: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;SQLfast manual&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [full text]]&lt;br /&gt;
::: 2020-11-28: &amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''Type''': High-level database programming interface and software environment for casual and non expert users&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast language''' &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast is a language allowing easy database processing and manipulation. The core of the SQLfast language is &amp;lt;b&amp;gt;SQL&amp;lt;/b&amp;gt;, the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for interaction with script users, text generation, file manipulation, decision and iteration. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The main goal of SQLfast is to allow the &amp;lt;b&amp;gt;rapid and easy development&amp;lt;/b&amp;gt; of &amp;lt;b&amp;gt;small database applications&amp;lt;/b&amp;gt; by &amp;lt;b&amp;gt;casual, non expert&amp;lt;/b&amp;gt; users. It does not compete with standard programming languages, such as C, Java or C# in which large and complex database applications are written. By automating most tedious and obscure parts of database programming and user interaction, it allows script writers to concentrate on the problem logic. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_EN.pdf This document (in English)] and [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/Code_Comparison_FR.pdf this one (in French)] compare the SQLfast language with standard programming languages for querying a database, interacting with the user and downloading a file. They show that '''a single SQLfast statement''' replaces from '''80 to 100 statements''' written in Java or Python.&lt;br /&gt;
:Despite its simplicity, the SQLfast language includes powerful features such as the full SQL language, variables, GUI, comprehensive control structures (procedures, recursive calls, if-else, for-endfor, while-endwhile, etc.), a versatile text generator, dynamic statement and script execution, external program interface, transactions, automatic metadata management, file management, web access, SMTP protocol, base64 and SHA256 conversion, debugging and much more. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''Description of the SQLfast software environment'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:The &amp;lt;b&amp;gt;SQLfast environment&amp;lt;/b&amp;gt; does not require any installation. Once the SQLfast archive has been downloaded, the SQLfast folder is extracted and copied anywhere, from the desktop to a USB flash memory. SQLfast is selfcontained. There is no need to install a database manager nor GUI libraries, to compile modules to adapt them to the user equipment, to create accounts and to define access rights. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Due to its simplicity, its ease of use and its power, SQLfast is intended to audiences that have little time and/or knowledge to develop professional programs. In particular, it can be used by:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert users&amp;lt;/b&amp;gt;: SQLfast provides an easy way to write small data processing tools customized to their exact needs, without resorting to complex programming or using powerful but complex softwares. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;non-expert&amp;lt;/b&amp;gt; but &amp;lt;b&amp;gt;motivated users&amp;lt;/b&amp;gt;: SQLfast is quite appropriate for the development of small and simple single-user applications for, e.g., library management, statistical analysis, simple data mining, data extraction and transformation (ETL), geographic information systems, photo album, text analysis, still and animated graphical display of data, and so on. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;expert users&amp;lt;/b&amp;gt;: SQLfast is a fine environment for fast database application prototyping.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;students&amp;lt;/b&amp;gt;: the SQLfast language basically is SQL but it is also an ideal support to practical work in database introductory and advanced courses. It allows students to play with SQL in a secure, off-line, environment and also to develop in a few lines powerful scripts without the burden of learning and using standard programming languages. In addition, the graphical interface provides a user friendly way to approach database concepts '''without even using SQL''': databases can be built, examined and their contents can be viewed, queried, modified through direct manipulation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;teachers&amp;lt;/b&amp;gt;: SQLfast includes a powerful tutorial engine that allows instructors to develop and use didactic material. An SQLfast tutorial is a hypertext comprising formatted text, images, SQL and SQLfast code (that can be executed from within the tutorial), internal and external links. The standard distribution already includes several dozens of tutorials in three domains: ''SQLfast user manuals'', ''SQL learning'' and ''database programming''. New tutorials can be written and integrated in minutes through the '''SQLtuto''' language.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:SQLfast runs on Windows, OS X and Linux machines (only the Windows version is available at present time). Its default database manager is SQLite 3 but versions for MySQL and MS Access are being developed.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:Finally, an important feature of the SQLfast environment is its &amp;lt;b&amp;gt;extendability&amp;lt;/b&amp;gt;: new functions and new resources can be developed and integrated quite easily.&lt;br /&gt;
&lt;br /&gt;
*'''Technical detail''': An SQLfast script (or program) is not limited in size: it can include just one statement but also several millions of statements. The environment is developed in Python 2.7, Tkinter and an integrated RDBMS (SQLite 3 in the standard distribution). Its main design objectives are to hide the complexity of database programming (connections, cursors, transactions, metadata management, etc.), of graphical interactions and of data exchange with external sources (e.g., files, web data and email) to provide very high level functions and to provide a secure user-friendly execution environment. The SQLfast language and environment comprise the following components:&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*the full SQL language&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*variables in which data coming from a database, external files, computations, GUI or web sites can be stored. Variables are typeless and have no size limit. A variable can contain data of any kind but also script fragments. The SQLfast ''macro processor'' can (recursively) replace variable references by their values.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*control structures (if-then-else, for-endfor, while-endwhile, procedure call, error management, libraries, external applications, stop, pause)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reading/writing in external files, encoding/decoding into secure formats (hexadecimal, base64), secure hashing, encryption&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*large object management (text, video, sound, BLOB, geographic objects, charts, drawings)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*generation of complex formats (csv, xml, html, rtf, LateX, JSON, Key-value, SQL, tuples, etc.) These formats are defined by generic parameters.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*import processors for standard formats (e.g., dbf, csv, Access, ESRI shapefiles)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a rich extensible GUI: &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*elementary boxes: messages, data entry forms, radio buttons, check buttons, text, images, drawing, charts, etc.&lt;br /&gt;
::*composite dialogue boxes: made of an arbitrary number of elementary boxes&lt;br /&gt;
::*extensible through Python external libraries&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*an integrated graphical engine to render SQLdraw scripts to produce still and animated drawing (charts, drawing, maps, animated simulation, etc.). SQLdraw scripts can be generated or manually produced through graphical SQLdraw Editor. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*extensibility mechanisms: &lt;br /&gt;
::*technical SQLfast scripts (e.g., parameters setting), &lt;br /&gt;
::*functional SQLfast procedures (e.g., data loading, data checking, report generation), &lt;br /&gt;
::*Python external libraries (e.g., string manipulation, file management, geometric algorithms, web access), &lt;br /&gt;
::*Python external applications (e.g., data import, interactive data conversion, complex dialogues, map digitizer, graphical engine), &lt;br /&gt;
::*language extension (through script precompilation)&lt;br /&gt;
::*external programs (web browsers, image processors, media processors, Office suite, etc.)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a built-in schema database (data dictionary)&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*a tutorial engine, that can be called from the graphical interface or from within any script&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*reflexivity: an SQLfast script can generate, examine, modify and execute SQLfast scripts, including itself.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*development and debugging tools&lt;br /&gt;
&lt;br /&gt;
*'''Requirements''': Windows 7, 8 and 10. All the resources needed by the basic version (built on SQLite 3) are included in the distribution.&lt;br /&gt;
&lt;br /&gt;
*'''Date''': 2012-&lt;br /&gt;
*'''Status''': ongoing. Version 3 available.&lt;br /&gt;
*'''Availability''': From the [[DUNOD2015_SQLfast|SQLfast web page]].&lt;br /&gt;
&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
**SQLfast environment for Windows. [[DUNOD2015_SQLfast|Get it from the SQLfast web page]].&lt;br /&gt;
**Python 2.7. Not required to execute SQLfast. Must be used to develop extensions to SQLfast. [http://www.python.org/download/ [download page]]&lt;br /&gt;
**SQLite3 DBMS is included in the SQLfast software. &amp;lt;!-- However, it can be useful to download the very last version (3.8.10 or later). Download it from [http://www.sqlite.org/download.html [SQLite3]]. Locate section &amp;lt;i&amp;gt;Precompiled Binaries for Windows&amp;lt;/i&amp;gt;. In June 2015, the file was named &amp;lt;i&amp;gt;sqlite-dll-win32-x86-3081002.zip&amp;lt;/i&amp;gt;. Open the archive and copy the &amp;lt;i&amp;gt;sqlite.dll&amp;lt;/i&amp;gt; file in directory &amp;lt;i&amp;gt;Python 2.7/DLLs&amp;lt;/i&amp;gt; of the Python directory. --&amp;gt;&lt;br /&gt;
**&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Dictionary of SQLfast commands and parameters&amp;lt;/b&amp;gt;, 78 pages, PReCISE Research Center publication, draft version, August 27, 2019. [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Commands.pdf [full text]]&amp;lt;/font&amp;gt;&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;SQLfast: Database processing made easy - Manual and Case studies&amp;lt;/u&amp;gt;, Volumes 1 (SQLfast manual) and 2 (Case studies), 900 pages. These chapters are continuously updated, so that it is recommended to check them regularly to get their last versions. &lt;br /&gt;
:Both volumes are described below. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- &lt;br /&gt;
*''Volume 1'': '''SQLfast Manual - Introduction to database programming''' The complete SQLfast tutorial'''. This tutorial comprises two volumes. The first one, the '''SQLfast manual''' is an introduction to database concepts and programming through SQLfast. It progressively introduces the reader to the basics of SQLfast, from elementary data manipulation through very short scripts to complex features such as metadata-based script generation, recursive programming and language extension. A large appendix collects &lt;br /&gt;
*''Volume 2'': '''Problem solving with databases - Case studies'''. This second volume currently exists as a series of case studies demonstrating how to solve a wide variety of problems with databases. It also includes some representative applications: database creation and loading, database exploration, database migration, library management, interactive SQL interpreter, a photo album manager and browser, a statistics manager and viewer, a bill of material manager, a GIS (based on ESRI shapefiles), analysis of an undocumented database, topological sorting of a relational schema, GALOIS lattice generation, automatic GUI generation, automated SQL trainer, ontology-based text indexing and retrieval, Conway's Game of Life (cellular automata), Kings of France (tree processing), schema-less (NoSQL) databases, SQL code injection, etc. Selected draft chapters are already available. &lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------- Part I - INTRODUCTION TO DATABASE PROGRAMMING WITH SQLfast --------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ---------------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 1: SQLfast MANUAL - INTRODUCTION TO DATABASE PROGRAMMING'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Manual.pdf [get the full text here]]&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Table of contents&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 1. Introduction&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': What is SQLfast?. The target audiences of SQLfast. Installing and starting SQLfast	. The levels of the SQLfast interface. Starting SQLfast with the Basic interface. Selecting another level. Starting SQLfast with the Expert interface (Level 1). The example databases: ORDERS.db and CLICOM.db. SQLfast resources and documentation.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 2. Basic scripts&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Preparing the work. Writing and running an SQLfast script. Saving the current script. Loading and modifying a script. Other ways to execute a script. Representing scripts and results in this tutorial. How to write SQLfast statements?. Questions on this first script?. A second script. just as simple. Using variables - First encounter. Variable’s way of life. Interactive SQLfast scripts. To quote or not to quote. SQLfast sessions. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 3. Creating a database&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': How to create a new database. How (not) to loose data. Creating and loading the ORDERS database. Calling secondary scripts (first look). The schema of the ORDERS.db database. A new skill: writing blank lines. Temporary tables. In memory databases. Upper case or lower case?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 4. Updating data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Extending user-driven data selection. Data modification statements: a short reminder. Inserting rows into a table. About single quotes in SQL values. Updating rows of a table. Variables in statement customization. Variables in full statement specification. Improving data entry box layout. Dialogue box for updating values. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 5. SQL in a nutshell&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Creating and modifying the schema of a database. Single table extraction queries. Subqueries. SQL functions. Aggregate (statistical) functions. Joining tables. Set operators. Data grouping. Generalization of the select and from clauses. Data modification. SQL views. Stored procedures and triggers. About SQLite. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 6. More on variables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Time variables and statements. Measuring elapsed time. Oh! Wait a minute!. Variable delimiters - Reminder. We can change the delimiters. Sometimes variable substitution must be disabled. Beware substitution ambiguity. Numeric computation. Character string computation. Set or compute?. Multi-variables assignment. Simulating an array. Variables and SQLfast procedures. What is a variable value after all?. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 7. Taking decisions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Alternative execution of a script. Skipping statements. If-else-endif block structure. Better controlling user values. Conditions. If. goto. labels and variables. Complement: more on goto and label statements. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 8. Reading data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Can we process individual rows?. Forcing a query to return one row only. Can we force a query to returns two rows?. Queries that return no row. Looping in the database. Embedded loops. A more elegant script. SQLfast arrays revisited. Empty sets, null values and statistics. Summary.  &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 9. Looping - The final chapter&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL for loop. Range for loop. File for loop. While loop. Forced loop iteration. Forced loop exit. While (True) loop. Correct loop structure. Variables in loops and if statements. How does a loop work, actually?. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 10. SQLfast expressions&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Value of a variable. Binary values. Syntax of SQLfast expressions. Numeric functions. Character string functions. Logical functions. Temporal functions. File/web functions. General functions. User defined functions (UDF). Functions from external libraries. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 11. Output channels, files and directories&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast output window: the default output channel. The (SQLfast) output window. User output files. The standard output file. Output variables. Closing an output channel. Setting the default output channel and output mode. Clearing the output window. Example: playing with output channels. Managing files and directories. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 12. Dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': The SQLfast GUI. Standard data entry box. Controlling user action. Update a data set. Text entry box. Selecting one item among several. Selecting items among several. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 13. Displaying data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Information message box. Displaying a list of values on the screen. Displaying a text. Displaying a picture. Displaying drawings. Won't you please, please help me. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 14. Advanced dialogues&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Multicolumn data entry and selection. Logical field grouping. Logical button grouping. No label please!. Application: building a 2D menu. Data entry through selection in a predefined value list. Predefined values from the database. Displayed vs returned values. Customizing standard buttons. Composite dialogue boxes. Heterogeneous composite boxes. Of styles and colors. Example of complex composite box. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 15. Large data objects&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Beyond elementary data items. Displaying large character strings. Reading and writing (large) text files. Reading and writing large binary files. Storing large objects in a database. About binary values. Binary data encoding/decoding. A touch of cryptography. Where to store large objects. Loading large volumes of data. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 16. Writing data tables - Part 1&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': An in-depth look at output tables. Changing the layout of an output table. CSV output format. Key-Value output format. List output format. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 17. Writing data tables - Part 2&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': XML output format. HTML output format. Tuple output format. RTF output format. SQL output format. LateX output format. JSON output format.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 18. Importing and exporting data&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': External data import. CSV data import/export. dBase data import. SQL-DML data import/export. JSON data export/import. Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 19. Recursive programming&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQL recursive queries. SQL recursive queries: the Staff application. Recursive queries against cyclic data. Can recursive queries compute everything?. Tree traversal ordering. SQL recursive triggers. Loop-based SQLfast implementation of recursive procedures. SQLfast recursive scripts. Comparison and conclusions. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 20. Metadata - Walking on the wild side&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. The SQLfast dictionary tables. Dictionary or no dictionary?. Examining the schema of an unknown database. From metadata to data. Complement: SQL group_concat function. Summary. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 21. SQLdraw: vector graphics&amp;lt;/b&amp;gt;, writing in progress. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 22. Extending SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. SQLfast utilities. Python external applications and libraries. User-defined functions (UDF). SQLfast language extension. Foreign applications. Developing custom-made external applications and libraries. Developing custom-made UDF for SQLfast and SQL. SQL queries in UDF. Complements: standard external SQLfast function libraries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 23. Aid to SQLfast development&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Chapter contents'': Introduction. Two SQLast language levels. Examining the contents of variables and parameters. Enabling/disabling script output display. Tracing script execution. Tracing selected code sections. Tracing trigger execution. Analyzing and processing traces.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 24. Storing transient data - The SQLfast lists&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Transient data: temporary  tables or SQLfast lists? SQLfast lists. Creating an SQLfast list. Manipulation of SQLfast lists. Set-theoretic manipulations of SQLfast lists. List-based for loop. Standard versions of SQLfast list functions. Three application examples.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 25. Dynamic columns and schema-less tables&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Dynamic columns. Practical syntax. Metadata of dynamic columns. Technical note. Performance: static vs dynamic columns. Dynamic columns in DBMS (MariaDB)). Summary.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Chapter 26. Developing a tutorial&amp;lt;/b&amp;gt;&lt;br /&gt;
::''Chapter contents'': Introduction. Opening a tutorial. A tutorial is a formatted text. Adding images. Navigating within and between tutorials. Code snippets. Embedded scripts. Embedded script variants. Embedded scripts as a programming system. Inserting video and audio messages. Embedded wrappers. What is the role of a tutorial, after all?. Summary. Technical complement: about wrappers.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Appendix. A basket of examples&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
::''Appendix contents'': Introduction. Consulting customers. Interactive data loading. Comparing the contents of two tables. Displaying the contents of two table in a single table. Dumping a database in XML format (version 1). Dumping a database in XML format (version 2). Data-driven multiple aggregations (table pivoting). Data mining. Condorcet voting paradox. Paged reading of data. Raising temperature. Managing a file of parameters. Dynamic branching. Simulating arrays in SQLfast. Smart writing of data table. Checking functional dependencies in a table. Image selection tool. Managing a photo album. A picture viewer. Collecting web statistics. Computing missing data in incomplete statistical series.  The Travelling Salesman problem. Ordering. ''and more ...''&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Index&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- ------------- Part II - PROBLEM SOLVING WITH DATABASES - Case studies -------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;big&amp;gt;'''Part 2: PROBLEM SOLVING WITH DATABASES - CASE STUDIES'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 1. Four hours to save the library&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case01-Small-library.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This case study describes the emergency writing of a small application that was to implement the core functions of the management of a small library. The challenge was to replace the current software, lost in a recent crash of the server. All that was left after the accident was the last backup of the database, unfortunately in an unknown format.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': rapid application development, application prototyping, application architecture, GUI&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 3. Interactive SQL interpreter&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 25, 2017.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case03-Interactive-SQL.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': An interactive SQL interpreter is this kind of graphical interface through which one enters an SQL query and that displays the result of its execution in a text window. They are used, for instance, to learn SQL or to test and tune SQL queries that are to be integrated in application programs. There are many of them available for free on the internet or included in relational DBMS. In this study, we will build, step by step, our own SQL interpreter by implementing the functions and features we want to use, notably (but not exclusively) to train students in writing SQL queries.&lt;br /&gt;
::Starting from a very tiny interpreter (just 7 character long!) we will build a series of more comprehensive and versatile versions, up to the last one, that will be able, not only to execute the queries submitted by the user, but also to evaluate their correctness.&lt;br /&gt;
::All these versions are available as two ready to run applications..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': SQL interpreter, GUI, learning SQL, query evaluation, multiset, set operator&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 4. Schema-less databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case04-Schemaless-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document is the first of a series of three case studies that explore alternative data models that organize the data in structures that provide more flexibility than standard relational tables. We observe that this flexibility makes it easier to dynamically modify the schema of the database but, as an unfortunate consequence, the schema is less expressive. In some of these data models, the schema is practically devoid of any information, hence the name schema-less.&lt;br /&gt;
::In this study, we explore two extreme data models. In the Universal table model, according to which the data of all the source tables are stored in a single table comprising the union of the columns of the source tables. In the second model, called Column-oriented model, each column of the source tables is implemented in an independent table. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, universal table model, universal relation, column-oriented data model, Cassandra, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 5. Schema-less databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case05-Schemaless-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a third family of alternative data models, namely the Key-Value data structure. In these models, the information is represented by triples that each defines the value of an attribute of an entity. Several approaches are described, with increasing levels of genericity.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, NoSQL, schema-less database, key-value model, triple, triplestore, RDF, SPARQL, description logic, A-BOX, OWL, Redis, Berkley DB, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 6. Schema-less databases - Part 3&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case06-Schemaless-DB(3).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This document studies a fourth family of alternative data models, namely the object (or document) models. In these models, the information is represented by complex objects in which properties can be multivalued and composite.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': non-relational data model, key-value model, object model, NoSQL, schema-less database, multivalued property, composite property, document-oriented DBMS, MongoDB, CouchDB, Azure, Datastore Oracle, metadata, index, data migration, schema conversion&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 8. Active databases&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case08-Active-DB.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study shows how advanced data structures of SQL can be used to built smarter databases, in particular active databases, that are able to react to external stimuli. It starts with a short reminder of the SQL data structures, including some of these advanced constructs, namely check constraints,  views, generated columns and triggers. Then,  it presents some usual applications of active databases, such as integrity control, redundancy management, updatableviews, data modification logging, alerters, type-subtype implementation, repair rules, temporal databases and access control. Finally, it explores, through a simple but representative business application, the power of active databases as compared with traditional  application development. In this application, we observe the impact of moving the control of business rules from the programs to  the database. This unusual application architecture requires special static and dynamic validation techniques. In its conclusion, this study briefly sketches the history of the trigger concept and evaluates the benefits and disadvantages of its use in application development.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': ECA rules, trigger, business rules, active database, DAG, finding circuits, advanced SQL, data structure, check predicate, updatable view, derived data, inventory management, 2-tier architecture, 3-tier architecture&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 9. Temporal databases - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case09-Temporal-DB(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study we examine various ways to organize the data describing the evolution of a population of entities. The basic model consists in storing the successive states of each entity, completed by the time period during which the state was observable. We distinguish between the transaction time, that refers to the data modification time in the database and the valid time, referring to modification events of entities in the real world. This study particularly develops entity-based, attribute-based, event-based and document-oriented temporal database models. In these models, data management is ensured by triggers that automate as far as possible entity creation, modification and deletion operations. &lt;br /&gt;
::The next study will be devoted to temporal database querying and transformation.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal data type, temporal database, active databases, history, entity type, time point, time period, time interval,  evolution, event, state, transaction time, valid time, bitemporal data, julian day, document-oriented model, JSON, trigger&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 10. Temporal databases - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;August 27, 2019.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case10-Temporal-DB(2).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this second part of the study of temporal data, we examine the various ways to query and transform them. We first examine simple temporal and non temporal queries, providing themselves temporal and non temporal results. Then, we extend to the temporal dimension the main families of queries of standard, non temporal, SQL: projection (entity-based and generalized), inner join and outer join, aggregation (count, max, min, average, sum). We also describe the SQLfast temporal library ''LTemp'' that offers a series of operators intended to write concise and efficient temporal scripts. The various temporal data models described in part 1 are revisited in order to develop conversion algorithms from one model to each of the other ones. Finally, we address the problem of performance by comparing the various algorithms of the temporal operators.  To get realistic execution time measures we apply these algorithms to larger temporal databases. The last section is devoted to a short description of the SQL:2011 standard, that introduces some (but not all) concepts of temporal databases. &lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': temporal relations, temporal query, temporal projection, coalescing, temporal inner join, temporal outer join, temporal aggregation, stable interval, temporal data  model conversion, temporal operator performance, SQL:2011, ''LTemp'' library&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 11. Kings of France - Part 1&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case11-Kings-of-France(1).pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study describes the French royal dynasty since Hughes Capet in 941. Its underlying goal is to study some properties and algorithms of widespread tree data structures. This first document of a series of two analyzes the dynasty of Kings of France, stores it in a database and extracts some simple information from it. The next study will be devoted to the derivation of more complex information.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, interval, ordering relation, temporal query, de Morgan law. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 12. Kings of France - Part 2&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;September 10, 2017.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France(2).pdf [full text]] [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case12-Kings-of-France-Draw.pdf [technical complement]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this chapter, we continue the exploitation of the KINGS database through more advanced tree processing applications, based notably on recursive scripts. The central concept from which most of these applications will derive is the transitive closure of table BRANCH, which comprises all direct and indirect ancestor/descendant couples. From it, we will build queries that count the descendants of a member, others that display the hierarchy of these descendants in various graphical way and a transitive reduction query that recovers the contents of table MEMBER from its closure. The last application, tree projection, extracts from table MEMBER a subset in which only kings appear..&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': genealogy, tree, cyclic data structure, transitive closure, transitive reduction, tree projection, recursive CTE, recursive query, tree drawing, tree traversal, depth-first traversal, breadth-first traversal, SQLdraw.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 14. The book of which you are the hero&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case14-Game-Books.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': Game books are traditional text-based adventure games made up of a collection of pages (episodes) connected by references (branches). An episode comprises a text that describes a situation or an action and one or several branches that allow the gamer to jump to other episodes. Many of them are now available as pdf or html documents. In this study, we implement a simple game engine that automates such game books. This engine is based on a game database that can also be used to automatically generate stories.&lt;br /&gt;
::Actually, this project is a nice opportunity to examine in some detail the concept of graph (a game book basically is a set of nodes and a set of edges) and to develop exploration and transformation algorithms. In particular, we study the structure of a game graph, we identify its abnomalies, we extract its circuits, we build and count the different possible runs from the starting episode to an exit episode, we search for unreachable episodes and dead-end branches and we identify episodes that can be merged.&lt;br /&gt;
::A representative heroic fantasy game book has been encoded and all the algorithms developed in the study are provided as SQLfast scripts.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': computer game, game engine, story generation, graph, cyclic graph, acyclic graph, graph transformation, Marimont algorithm, reachability, circuit, elementary circuit, transitive closure, cyclic kernel, set comparison.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 15. Directory management&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case15-Directory-Management.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': The contents of storage media, such as hard disks and flash disks, both internal and external, are organized into a hierarchical structure made up of directories and files. &lt;br /&gt;
::This chapter shows that, when such structures are stored in a database, processes can be designed easily to examine directories, to analyze their contents, to describe their evolution and to discover potential problems. In particular, small applications will be developed to extract statistics, to display the structure and contents of a directory, do identify and describe potentially duplicate files and directories within a root directory or between two directories. &lt;br /&gt;
::The problem of fast clone detection, that is, of set of files that have exactly the same contents, is also analyzed and solved.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': directory structure, tree modeling, tree analysis, statistics, tree evolution, duplicate files, clone detection, secure hashing, SHA256, database performance, CTE, recursive queries.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 21. Test Database Generation&amp;lt;/b&amp;gt;, obsolete version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case21-Test-databases.pdf [full text]]&lt;br /&gt;
::''Chapter contents'': Database performance evaluation. Generating high volume of synthetic data. Integrating heterogeneous data sources. Data cleaning. Data anonymization. Random data extraction. Executing very large scripts. Query performance.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 27. Conway's Game of Life&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case27-Life-Game.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This study is about games, worlds, life and death, borderline SQL applications and dramatic database optimization. The goal of the project is to implement the graphical animation of Conway’s cellular automata, aka Game of Life. A game of life is made up of an infinite array of cells in which live a population of small animals, each of them occupying one cell. The transition of one state of the population to the next one is specified by a set of simple computing rules. The goal of the game is to observe and study the evolution of the population. A game of life is implemented as a table in a database in which each row contains the coordinates and the content of a cell. The algorithms developed in this study load the initial state of a population then compute the next states thanks to the evolution rules. Finally, they visualize this evolution as an animated cartoon. The contribution of this study is twofold. It stresses the importance of database and algorithm optimization (the last version is 1,400 times faster than the first one) and it shows that relational databases and SQL may be quite efficient to develop matrix manipulation procedures (the SQL version is nearly 7 times faster than the equivalent Python program).&lt;br /&gt;
::This study is also a tribute to E. F. Codd, the inventor of the relational model of databases, who first studied self-replicating cellular automata.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': cellular automata, replicating system, Conway, glider,  Codd, matrix manipulation, algorithm optimization, database optimization, declarative algorithm, table indexing, in-memory database, CTE, recursive query, vector graphics, SQLdraw, animated simulation, Python.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 28. From data bulk loading to database book writing&amp;lt;/b&amp;gt;, draft version, &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case28-Topo-sort.pdf [full text]]&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': When data have to be loaded in a database from an external source, the order in which tables are filled is important as far as referential integrity is concerned. This order is determined by the directed graph formed by tables and foreign keys. From this graph one have to derive a linear ordering that represent one of the valid order in which table data are loaded. This derivation is called topological sorting, for which this chapter discusses and implements a simple algorithm. However, things are a bit more complex when the graph is not acyclic, as is often the case for database loading. Therefore, the chapter studies ways to transform a graph that includes circuits into a purely acyclic graph. These techniques are also applied to the ordering of topics when planning the writing of a book.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': data loading, database schema, (non) acyclic graph, topological sorting, strongly connected components, graph contraction, condensation of a graph, transaction management.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 31. Path finders, rovers and Ariadne's thread&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case31-Shortest-path.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': This chapter tackles a widespread optimization problem: computing the shortest path between two cities. The solving technique is based on Dijkstra’s algorithm. It also is applied to two similar applications domains, namely maze solving and controlling a rover on a hostile planet. A general purpose, application independent, solving tool is developed.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': optimization, shortest path, Dijkstra’s algorithm, maze solving, rover control. &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;b&amp;gt;Case 34. Blockchains&amp;lt;/b&amp;gt;, draft version. &amp;lt;i&amp;gt;November 2020.&amp;lt;/i&amp;gt; [https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/SQLfast-Case34-Blockchains.pdf [full text]]&amp;lt;/font&amp;gt;.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Objective&amp;lt;/b&amp;gt;'': In this study, we examine some fundamental aspects of blockchains, particularly the security of data and the way(s) it is achieved through cryptographic transformations. Basically, a blockchain is a historical database in which the description of operations, generally called transactions, are stored in chronological order. Once recorded, the data of a transaction can never be deleted nor modified. &lt;br /&gt;
::The document first introduces the elements of cryptography necessary to build a blockchain, notably secure hashing, and symmetric and asymmetric key encryption. Then, it describes the distinctive aspects of blockchains independently of its application domain and applies them to cryptocurrencies. Finally an experimental toolbox, comprising a collection of functions designed to manage and explore blockchains, is built step by step.&lt;br /&gt;
::''&amp;lt;b&amp;gt;Keywords&amp;lt;/b&amp;gt;'': blockchain, blockchain explorer, proof of work, distributed database, cryptocurrency, trust, security, cryptography, RSA, AES, secure hashing. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;'''Case studies in preparation'''&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------------------------------------------------------------------ --&amp;gt;&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 2. The human factor (Managing a small library)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': . --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 7. Schema-driven code generation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 13. Bis repetita non (always) placent (Detecting and controlling redundancies)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 16. Lies, damned lies, and statistics&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 17. Database security&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 18. Data analysis and cleaning&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 19. Database reverse engineering&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 20. Database prototyping&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 22. Database Performance&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': Database performance tuning. Index types. The roles of cache memories. Performance evaluation pitfalls. Optimizing select queries. Optimizing data modification queries. Optimizing group by and order by queries. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 23. Object/Relational mapping &amp;lt;i&amp;gt;vs&amp;lt;/i&amp;gt; Active database&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 25. Geographic information systems&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 26. Text processing&amp;lt;/b&amp;gt;, writing in progress &lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 29. Bill of material&amp;lt;/b&amp;gt;, rewriting in progress.&lt;br /&gt;
&amp;lt;!-- ::''Chapter contents'': Introduction. The BOM database. The part list of a part. Closure of a BOM. A Tale of Two Worlds. Computing the unit cost of all parts. Updating a BOM. Simulating recursive queries through SQLfast. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 30. Classification (Formal Concept Analysis)&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 32. Databases and the internet&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 33. Worflow management - Building a workflow engine&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&lt;br /&gt;
:*&amp;lt;b&amp;gt;Case 34. Agent modeling and simulation&amp;lt;/b&amp;gt;, writing in progress.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
===DB-MAIN===&lt;br /&gt;
*'''Type''': CASE and MetaCASE environment&lt;br /&gt;
*'''Description''': Graphical CASE tool that supports most database engineering processes. Provides functions for conceptual information analysis, logical design, physical design, code generation, schema integration, schema normalization, quality evaluation, schema mapping, reverse engineering (for a dozen legacy and modern DBMS), schema analysis, code analysis (a.o., depency graphs, pattern searching and program slicing), data analysis, schema transformation. High speed kernel and graphical interface written in C++. New functions can be developed in Voyager 2 (the DB-MAIN external language) or in Java. DB-MAIN includes a method engine and features to extend its meta-schema. It allows the representation of data structures of various paradigms and at any level of abstraction. It relies on the GER (Generic Entity-relationship model) and on transformational operators.&lt;br /&gt;
*'''Requirements''': MS Windows, Linux.&lt;br /&gt;
*'''Date''': 1993-2014+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': Free of charge (except for advanced processors). See below&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
:*DB-MAIN '''v6''' (free, max 500 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-v65d-(education).zip DB-MAIN v6.5d.zip]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v6.zip Manuel DB-MAIN v65d]&lt;br /&gt;
:*DB-MAIN '''v8''' (free, max 2000 objects)&lt;br /&gt;
:**Software: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/DB-MAIN-82b(demo-2000).zip DB-MAIN v8.2b]&lt;br /&gt;
:**Quick help: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/db_main-v8.chm db_main v8.chm]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v8.zip Manuel-DB-MAIN-v8.zip]&lt;br /&gt;
:*DB-MAIN '''v9''' (nouvelle interface, gratuit, sans limitation du nombre d'objets)&lt;br /&gt;
:**Software: [http://www.db-main.eu site DB-MAIN]&lt;br /&gt;
:**Manual: [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-10/Manuel-DB-MAIN-v9.zip Manuel-DB-MAIN-v9.zip]&lt;br /&gt;
:*First Steps with DB-MAIN (short tutorial)&lt;br /&gt;
:**Hlp version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.hlp 1st-Step.hlp]&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.pdf 1st-Step.pdf]&lt;br /&gt;
:**Chm version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/First-Steps/1st-Step.chm 1st-Step.chm]&lt;br /&gt;
:*Introduction to database design with DB-MAIN (long tutorial)&lt;br /&gt;
:**Pdf version: [http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/DB-Design/MiniTut-2002.pdf MiniTut-2002.pdf]&lt;br /&gt;
:*Visit also the DB-MAIN official site [http://www.db-main.eu www.db-main.eu] or the site of ReveR s.a. [http://www.rever.eu www.rever.eu], now in charge of the maintenance and evolution of DB-MAIN.&lt;br /&gt;
&lt;br /&gt;
===TRAMIS/Master===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': TRAMIS/Master was an extension of ORGA distributed by the small French company CONCIS. In particular, the following features were added:&lt;br /&gt;
:*support for conceptual analysis&lt;br /&gt;
:*a larger transformation toolbox&lt;br /&gt;
:*evaluation functions (notably volume estimation)&lt;br /&gt;
:*the specification database was implemented in MDBS (a CODASYL-like DBMS)&lt;br /&gt;
*'''Requirements''': MS-DOS; MS Windows 3.11; MDBS&lt;br /&gt;
*'''Date''': 1986-1991&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut,Mario Cadelli,Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;TRAMIS:a transformation-based database CASE tool&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/41408/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Mario Cadelli, Bernard Decuyper and Olivier Marchand. &amp;lt;u&amp;gt;Database CASE Tool Architecture : Principles for Flexible Design Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 4th International Conference on Advanced Information System Engineering'' (CAiSE’92), Lecture Notes in Computer Science, Volume 593, pages 187-207, Springer-Verlag, 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39252/ [description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===ORGA===&lt;br /&gt;
*'''Type''': CASE environment&lt;br /&gt;
*'''Description''': ORGA was a companion CASE tool of the industrial IDA environment developed by the team of professor F. Bodard in the 80's and distributed (as well as ORGA) by METSI, a small French company in Information system design. IDA was mainly devoted to the conceptual specification of various aspects of Information systems. The goal of ORGA was the translation of information conceptual schemas into DDL code according to three data models, namely relational (SQL-87), CODASYL DDL (IDS2) and standard files (COBOL). In modern words, ORGA supported the logical design and code generation processes. Three key features of ORGA:&lt;br /&gt;
:*the architecture of ORGA relies on a transformational toolbox. The conceptual/logical conversion was based on three transformation plans, one for each target data model. In addition, the user was allowed to apply elementary transformations to refine the logical schema.  In modern words, ORGA supported Model-Driven Engineering.&lt;br /&gt;
:*ORGA was developed in C and the specification database was managed through libraries emulating dBASE III structures [http://fr.wikipedia.org/wiki/DBase] [http://en.wikipedia.org/wiki/DBase].&lt;br /&gt;
:*The methodological principles of ORGA were developed in the (French) book [http://info.fundp.ac.be/~dbm/mediawiki/index.php/MASSON1986 ''Conception assistée des applications informatiques - Conception de la base de données''], published by Masson (now DUNOD) in 1986.&lt;br /&gt;
*'''Requirements''': MS-DOS; hard disk (recommended!)&lt;br /&gt;
*'''Date''': 1984-1985&lt;br /&gt;
*'''Status''': discontinued; principles integrated into TRAMIS/Master then in DB-MAIN  &lt;br /&gt;
*'''Availability''': software no longer available &lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
** see TRAMIS/Master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===PHENIX===&lt;br /&gt;
*'''Type''': Reverse Engineering CASE environment&lt;br /&gt;
*'''Description''': PHENIX was a CASE tool devoted to the reverse engineering of the file structures of large COBOL applications. It was developed with powerful knowledge management systems (which were very popular in the 80's and 90's), a decision which accounted for the poor performance of the code analyzer. In particular, it included:&lt;br /&gt;
:*a code analyzer that detected program patterns&lt;br /&gt;
:*a large transformation toolbox&lt;br /&gt;
:*an inference engine to detect and identify implicit constructs.&lt;br /&gt;
*'''Requirements''': Unix, LeLisp, SMECI, Aida/Masai&lt;br /&gt;
*'''Date''': 1989-1992&lt;br /&gt;
*'''Status''': discontinued; principles integrated into DB-MAIN &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Transformation-based Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on Entity-Relationship Approach (ER’93)'', Lecture Notes in Computer Science, Volume 823, pages 364-375, Springer-Verlag, 1994. [http://www.fundp.ac.be/recherche/publications/page_view/42756/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Muriel Chandelon, Catherine Tonneau and Michel Joris. &amp;lt;u&amp;gt;Contribution to a Theory of Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of the 1st Working Conference on Reverse Engineering'' (WCRE’93), pages 161-170, IEEE Computer Society, 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39255/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut, Catherine Tonneau, Michel Joris and Muriel Chandelon. &amp;lt;u&amp;gt;Schema Transformation Techniques for Database Reverse Engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 12th International Conference on the Entity-Relationship Approach'' (ER’93), pages 353-372, E/R Institute Publish., 1993. [http://www.fundp.ac.be/recherche/publications/page_view/39256/ [description]]&lt;br /&gt;
**Michel Joris, R. Hoe, Jean-Luc Hainaut, Muriel Chandelon, Tonneau Catherine and Bodart François. &amp;lt;u&amp;gt;PHENIX : methods and tools for database reverse engineering&amp;lt;/u&amp;gt;, in ''Proceedings of 5th International Conference on Software Engineering and Applications'', EC2 Publish., 1992. [http://www.fundp.ac.be/recherche/publications/page_view/39254/ [description]]&lt;br /&gt;
**Jean-Luc Hainaut. &amp;lt;u&amp;gt;Database Reverse Engineering, Models, Techniques and Strategies&amp;lt;/u&amp;gt;, in ''Proceedings of the 10th International Conference on the Entity-Relationship Approach'' (ER’91), pages 729-741, ER Institute, 1991. [http://www.fundp.ac.be/recherche/publications/page_view/42757/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-ER/ER-1991/ER-1991(tutorial).pdf [full text]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===VisiComp===&lt;br /&gt;
*'''Type''': Graphical computer simulator &lt;br /&gt;
*'''Description''': VisiComp (name inspired by VisiCalc) is a graphical simulator for an educational computer. This computer has a very simple architecture: a main memory of up to 100 cells (each accomodating a signed 5-digit number), the standard handful of registers (P-counter, instruction register, logical register, accumulator + its extension register), 37 instructions organized into 7 instruction families, 10 addressing modes, a sequential input device, a sequential output device, bootstrap (kind of MBR). The simulator also includes a monitor that manages and controls all the parts of the computer (interactive + script interpreter), configuration files, input file loader, etc. The computer has been used to illustrate architecture and programming principles such as Von Neuman architecture, basic program structures, I/O buffering, recursion, relocatable programs, bootstrapping and even a complete business application (order management and invoicing with 3 files, almost as powerful as SAP!) The simulator and its additional components required at runtime no more than 12 KB (12,000 bytes!) in RAM. It was developed in TRS-80 Basic then in CP/M Basic.  &lt;br /&gt;
*'''Requirements''': TRS-80 Model 1 - Level 2 (16 KB RAM); CP/M; BASIC language processor;&lt;br /&gt;
*'''Date''': 1982&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': Source code available on paper&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Jean-Luc Hainaut, ''THE VISIBLE COMPUTER - A graphical computer simulator''. Technical report, 1982. 75 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/The-Visible-Computer/The-Visible-Computer.pdf [full text]] This document results from the scanning of poorly printed pages. It is incomplete and probably includes too many errors. In addition, it will probably be considered fairly naive. Consider that it was written 30 years ago and that computer technology has considerable evolved since then, to such an extent that is has become quite complex and impossible to describe in detail to plain lay readers. &lt;br /&gt;
**Source code available on paper. &lt;br /&gt;
**'''Note''': just for the fun, I have developed a new graphical interface for Visicomp in Python/Tkinter. It would take no more than 2-3 weeks to add the logic behind. Anyone interested?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===NDBS===&lt;br /&gt;
*'''Type''': Database Management System&lt;br /&gt;
*'''Description''': NDBS (Network Database System) is an educational database management environment allowing Turbo-Pascal programs to manage and use complex data in an efficient, though very intuitive, way. NDBS comprised a runtime library (database handler), a DDL compiler, a 4GL Query Language, a data dictionary, a report generator, a SQL/NDBS converter, an import/export tool, etc. As far as we now, the only industrial use was by an Indian Statistics department, which developed several applications programs based on NDBS. The last version (under the name Pyramid) was developed by D. Rossi, then Master student in the University of Namur. Two original aspects: (1) the data model was a variant of the ER model, (2) the physical engine was a fairly strict implementation of the principles developed in the course of Database Technology I gave in the 80's. &lt;br /&gt;
*'''Requirements''': Windows; written in Turbo-Pascal&lt;br /&gt;
*'''Date''': 1986-1996&lt;br /&gt;
*'''Status''': discontinued  &lt;br /&gt;
*'''Availability''': source code (but I must search floppy disks for it).&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''[TR86-01]'''Jean-Luc Hainaut, ''NDBS - A simple database system for small computers''. Technical report, 1986. 144 pages. [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/NDBS/NDBS.pdf [full text]] This text has been recovered from various materials written in the eighties (Mac Word documents) and roughly assembled into a unique FrameMaker document. The result would require in-depth polishing, but, to be frank, I currently have no spare time to carry out this task. Sometimes in the near future perhaps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SQL-Script Interpreter===&lt;br /&gt;
*'''Type''': Interpreter for an SQL-based scripting language&lt;br /&gt;
*'''Description''':  Empty Access application (*.mdb) that allows users to execute SQL scripts on any database. Includes a simple dialog box with two buttons: select a script file and execute it. For information, MS Access provides two ways to execute SQL statements: as Access queries (simple but single queries only) and embedded in VB programs (powerful but complex). This tool allows one to execute in one click a script made up of a sequence of SQL statements, but also much more complex scripts with variables, macros, loops, alternatives and interaction with users. This application has been frozen in 2012 since the development of SQLfast (see above). &lt;br /&gt;
*'''Requirements''': Microsoft Access&lt;br /&gt;
*'''Date''': 2005-2011+&lt;br /&gt;
*'''Status''': ongoing&lt;br /&gt;
*'''Availability''': available online&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**'''Software (mdb)''': [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/SQL-Interpreter-FR-(v4).mdb SQL-Interpreter-FR-(v4).mdb]&lt;br /&gt;
**'''Documentation :'''&lt;br /&gt;
***Installation (French) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/Installer-SQL-interpreter-(v4).pdf Installer-SQL-interpreter-(v4).pdf]&lt;br /&gt;
***SQL Script Language(English) : [http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2009/Chapitres/Chapitre-06/The-SQL-Script-Language.pdf The-SQL-Script-Language.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===SPHINX===&lt;br /&gt;
*'''Type''': Database Management System, Natural Language interface, Data dictionary&lt;br /&gt;
*'''Description''': SPHINX is a database management system based on the ER model. It was developed in the 70's as a result of large national project devoted to the development and management of large administrative databases. SPHINX comprised several components: &lt;br /&gt;
:*a runtime database handler&lt;br /&gt;
:*a high-level DML language integrated to COBOL &lt;br /&gt;
:*NUL: an incremental user-oriented query language&lt;br /&gt;
:*a meta-system (based on SPHINX) &lt;br /&gt;
*'''Requirements''': Siemens BS-2000; SESAM data manager (one of the first schema-less inverted-file data manager);&lt;br /&gt;
*'''Date''': 1971-1977&lt;br /&gt;
*'''Status''': discontinued &lt;br /&gt;
*'''Availability''': software no longer available&lt;br /&gt;
*'''References and resources''':&lt;br /&gt;
**Baudouin Le Charlier and Jean-Luc Hainaut. &amp;lt;u&amp;gt;Modèles, Langages et Systèmes pour la conception et l’exploitation de bases de données&amp;lt;/u&amp;gt;, in ''Actes du congrès AFCET 1978'', pages 179-189, Editions Hommes et Techniques, 1978. [http://www.fundp.ac.be/recherche/publications/page_view/42760/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-AFCET/AFCET-1978/AFCET-1978-Congres.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe and Henri Hennebert. &amp;lt;u&amp;gt;NUL: A Navigational User’s Language for a Network Structured Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the 1976 ACM SIGMOD International Conference on Management of Data'', pages 135-142, ACM, 1976. [http://www.fundp.ac.be/recherche/publications/page_view/59571/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-SIGMOD/SIGMOD-1976/Sigmod-1976.pdf [full text]]&lt;br /&gt;
**Claude Deheneffe, Henri Hennebert and Walter Paulus. &amp;lt;u&amp;gt;A Relational Model for a Data Base&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP congress 74'', pages 1022-1025, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/59570/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(CDE-HHE-WPA).pdf [full text]]&lt;br /&gt;
**Jean-Luc Hainaut and Baudouin Le Charlier. &amp;lt;u&amp;gt;An Extensible Semantic Model of Data Base and Its Data language&amp;lt;/u&amp;gt;, in ''Proceedings of the IFIP Congress 74'', pages 1026-1030, North-Holland, 1974. [http://www.fundp.ac.be/recherche/publications/page_view/41411/ [description]] [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Articles-Conferences/conferences-IFIP/IFIP-1974/IFIP-74-(JLH-BLE).pdf [full text]]&lt;br /&gt;
**'''[TR78-01]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 1 : Modèles et Langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-1.pdf [full text]]&lt;br /&gt;
**'''[TR78-02]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 2 : Manuel de référence des langages&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-2.pdf [full text]]&lt;br /&gt;
**'''[TR78-03]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 3 : Une implémentation du modèle d'accès&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-3.pdf [full text]]&lt;br /&gt;
**'''[TR78-04]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 4 : Le système SPHINX, Utilisation, fonctionnement et description interne&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-4.pdf [full text]]&lt;br /&gt;
**'''[TR78-05]'''Jean-Luc Hainaut, Baudouin Le Charlier, et al., &amp;lt;u&amp;gt;Système de conception et d'exploitation de bases de données - Volume 5 : Exemples d'application&amp;lt;/u&amp;gt;. Rapport final du projet CIPS I2/15, Institut d'informatique, Université de Namur, 1978.  [http://www.info.fundp.ac.be/~dbm/Documents/Publications-LIBD/Technical-Reports/SPHINX/SPHINX-Volume-5.pdf [full text]]&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T17:36:17Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T17:35:29Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04) [pending]'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T17:35:10Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04) [pending]'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2023-06-04T17:34:52Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.1''' [[DUNOD2015_SQLfast|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-04&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-05-26&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T14:54:33Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.0''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04) [pending]'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T14:53:38Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.0''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T14:53:06Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.0''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T11:11:32Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* SQLfast versions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.1 (2023-06-04)'''&lt;br /&gt;
&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T11:08:53Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* ENGLISH VERSION */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.1''' (English documentation) [&amp;lt;i&amp;gt;last update 2023-06-04&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T11:07:25Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.1 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.0 (2022-12-12)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T11:07:01Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.0 (2023-06-04)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v5.0   (2022-12-12) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.0 (2022-12-12)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast</id>
		<title>DUNOD2015 SQLfast</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=DUNOD2015_SQLfast"/>
				<updated>2023-06-04T11:05:39Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : /* VERSION FRANCAISE */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
 &amp;lt;table style=&amp;quot;width:90%&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast: A database workbench'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''SQLfast : Un atelier de bases de données'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#ENGLISH VERSION|English version]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;'''[[#VERSION FRANCAISE|Version française]]'''&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== VERSION FRANCAISE ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Je suis pressé !&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Téléchargements'''&lt;br /&gt;
&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Logiciel SQLfast v5.1''' (documentation en français) ['''&amp;lt;i&amp;gt;dernière maj 2023-06-04&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[http://bit.ly/3V15zhk '''SQLfast-FR.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Module Python SQLpy v1.2''' ['''&amp;lt;i&amp;gt;dernière maj 2022-12-16&amp;lt;/i&amp;gt;''']&lt;br /&gt;
::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide d'installation de SQLfast''' (4 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-12-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FZ0yBq '''SQLfast_Installation_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''&amp;lt;/font&amp;gt; '''Manuel SQLfast : Database application programming with SQLfast''' (548 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Dictionnaire des commandes SQLfast''' (82 pages, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutoriels'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Basic''' (34 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uZdpxg '''Getting_started_BASIC_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Premiers pas avec SQLfast - Niveau Expert''' (20 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3ja6UVE '''Getting_started_EXPERT_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Guide de survie SQLfast - Modèles typiques de scripts''' (60 pages, en français) [''&amp;lt;i&amp;gt;dernière maj 2020-11-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3BBtz3F '''Survival_guide_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* '''Etudes de cas''' (une nouvelle étude, en anglais) [''&amp;lt;i&amp;gt;dernière maj 2020-09-20&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies'''] &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Compléments techniques'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparaison du code SQLfast et des codes Java / Python''' (en français) [''&amp;lt;i&amp;gt;dernière maj 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Pz3yaN '''Code_Comparison_FR.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Onze bases de données temporelles de tailles diverses''' (matériaux complémentaires de l'étude de cas ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;dernière maj 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Versions de SQLfast'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.0 (2022-12-12)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. Qu'est-ce que SQLfast ?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le nom '''SQLfast''' désigne,&lt;br /&gt;
:*d'une part, un '''langage''' permettant de rédiger des scripts de manipulation de bases de données relationnelles,&lt;br /&gt;
:*et d'autre part, un '''logiciel''' permettant à des utilisateurs tant novices qu'experts de développer, tester et exécuter des requêtes SQL, et plus généralement des scripts SQLfast de toute nature et de complexité quelconque. &lt;br /&gt;
Langage et logiciel SQLfast  ont été conçus pour couvrir une large gamme de scénarios d'utilisation, depuis l'apprentissage (autonome ou supervisé) des bases de données et du langage SQL jusqu'au développement et à l'exploitation d'applications complexes.&lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' est une extension de SQL. Ses instructions comprennent, d'une part, les commandes SQL et d'autre part, des instructions d'échange de données avec l'utilisateur (boîtes de dialogue), des variables, des instructions de contrôle (if, for, while, procédures), des métadonnées ainsi que de riches bibliothèques de fonctions et d'interaction avec l'environnement. Un script peut être constitué d'une seule requête SQL mais des scripts complexes, tels que des gestionnaires de bibliothèques ou des générateurs de prototypes, peuvent comporter plusieurs milliers d'instructions. &lt;br /&gt;
&lt;br /&gt;
Le '''langage SQLfast''' a été conçu dans un objectif de simplicité d'utilisation. A l'instar de son noyau, SQL, il offre une courbe d'apprentissage linéaire : un problème simple sera résolu en quelques lignes, dont la rédaction ne nécessite que quelques minutes d'apprentissage. &lt;br /&gt;
Les arcanes des interactions avec les données (BD, fichiers, images) ainsi que ceux des dialogues avec l'utilisateur sont entièrement cachés car gérés par le moteur SQLfast. &lt;br /&gt;
La consultation des données d'une table nécessite '''1 instruction en SQLfast''' (''select * from CLIENT'') mais '''près de 40 instructions en Java/JDBC'''. De même, une boîte de saisie de données constituée de trois champs est définie en '''1 instruction SQLfast''' et exige '''plus de 100 instructions Python/Tkinter'''. Ou encore, le téléchargement d'un fichier est obtenu par '''1 instruction SQLfast''' mais par '''près de 100 instructions Python/urllib2'''. Un document ([http://bit.ly/3Pz3yaN Code_Comparison_FR.pdf]) compare le code SQLfast avec le code standard dans ces trois cas de figure.&lt;br /&gt;
&lt;br /&gt;
SQLfast est un logiciel dit ''portable'', qui ne nécessite pas d'installation à proprement parler et qui ne modifie pas les paramètres du système sur lequel il fonctionne. Il peut notamment être installé, avec une collection de bases de données et de scripts, sur une clé USB transportable d'une machine à l'autre.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' offre une interface graphique conviviale permettant aux utilisateurs novices d'apprendre et d'expérimenter le développement de requêtes SQL et plus généralement de scripts SQLfast. Il dispose d'une fonction d'aide programmable permettant la rédaction et l'intégration au logiciel de tutoriels personnalisés. Son interface se décline en deux variantes :&lt;br /&gt;
*''Basic'' : familiarisation avec le concept de base de données, apprentissage du langage SQL, utilisation légère et occasionnelle d'une base de données.&lt;br /&gt;
*''Expert'' : apprentissage de la programmation sur bases de données à l'aide du langage SQLfast, développement et exploitation d'applications interactives en SQLfast.&lt;br /&gt;
&lt;br /&gt;
Le '''logiciel SQLfast''' est économe en ressources. Avec tous ses composants (y compris les bibliothèques graphiques, le SGBD, les fichiers d'aide, des bases de données de test, un jeu de scripts et des tutoriels), il n'occupe guère plus de 30 Mo sur disque et tourne sans accroc sur des machines de faible puissance. Il est cependant évident que l'exploitation intensive de grandes bases de données nécessitera des ressources plus importantes.&lt;br /&gt;
&lt;br /&gt;
SQLfast est développé en Python, mais son utilisation ne nécessite pas la présence de l'environnement Python. Il inclut le SGBD ''SQLite 3'' et la bibliothèque graphique standard ''Tkinter''. La version actuellement disponible fonctionne sous MS Windows. Elle fonctionne également sous Linux à l'aide de Wine (quelques ajustements relatifs aux ''paths'' par défaut et au codage des caractères peuvent s'avérer nécessaires).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installation et démarrage&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le ''package'' d'installation est une archive comprenant le logiciel SQLfast, un document décrivant son installation et deux petits manuels introductifs en français.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : le logiciel'''. L'archive contient un répertoire nommé (sans surprise !) ''SQLfast''. L'installation consiste à placer ce répertoire sur un support quelconque tel que le disque C ou D, simplement sur le bureau ou encore sur une clé USB. Dès que la copie est réalisée, SQLfast est prêt à fonctionner (exécuter ''SQLfast.exe''). Le logiciel comprend également sa propre documentation et une série de tutoriels consacrés à l'utilisation de SQLfast, au langage SQL et à la programmation des bases de données.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Guide d'installation'''. Ce document fournit quelques conseils pour l'installation du logiciel.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
*'''SQLfast : Premiers pas en SQLfast (niveau ''Basic'')''' et '''SQLfast : Premiers pas en SQLfast (niveau ''Expert'')'''. Ces documents aident l'utilisateur débutant à faire ses premiers pas en SQLfast''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. Documentation sur SQLfast&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il existe deux sources principales de documentation concernant l'outil et les langages SQLfast : interne et externe :&lt;br /&gt;
:*la documentation intégrée accessible par la fonction d'aide du logiciel : '''bouton Help''' au niveau Basic et '''menu Help''' au niveau Expert.&lt;br /&gt;
:*le manuel de SQLfast sous forme d'un ouvrage au format ''pdf''. &lt;br /&gt;
&lt;br /&gt;
*'''4.1 Bouton Help du logiciel SQLfast au niveau &amp;quot;Basic&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un petit menu comportant, en plus de l'écran ''About SQLfast'', trois items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la rédaction, l'exécution et la correction de requêtes SQL. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQL. Cette collection de documents est régulièrement étendue et mise à jour. Ces tutoriels dérivent du contenu de l'ouvrage ''Bases de données - Concepts, utilisation et développement, 5e édition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Menu Help du logiciel SQLfast au niveau &amp;quot;Expert&amp;quot;'''.&lt;br /&gt;
:Ce bouton ouvre un menu comportant, en plus de l'écran ''About SQLfast'', quatre items.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started''' (''Premiers pas'' en français). Ce document décrit brièvement l'environnement offert par la fenêtre principale du logiciel SQLfast, ses fenêtres et leurs principales fonctions. Il introduit pas à pas l'utilisateur à la création, à l'exécution, à la correction et au sauvetage d'un premier script. Ce tutoriel a également été traduit en document pdf (voir section 1 ci-dessus; aussi inclus dans l'archive à télécharger).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide''' (''Guide de survie'' en français). Collection d'une cinquantaine de modèles de scripts commentés permettant d'aborder en confiance la résolution de problèmes de toute nature, depuis la simple consultation d'une base de données jusqu'à la génération de code à partir des métadonnées d'une base de données. Ce document est également disponible au format pdf (voir section 1 ci-dessus).&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Documents de référence relatifs au logiciel et au langage SQLfast. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Description détaillée de la fenêtre principale, de ses fenêtres secondaires et de leurs fonctions.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Liste des principales instructions et paramètres du langage SQLfast, accompagnés d'une brève description et d'exemples. Ce document (en anglais) constitue une synthèse du document ''Dictionnaire des commandes SQLfast'' disponible sur le site de l'outil ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description et exemples de ''SQLtuto'', le langage de rédaction de documents Help et de tutoriels. Ce langage permet à l'utilisateur de modifier les documents existants et de développer ses propres documents, notamment des tutoriels personnels.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portefeuille de tutoriels relatif au langage SQLfast. Cette collection de documents dérive de l'ouvrage ''Manuel de SQLfast'' (''Introduction to database programming'').&lt;br /&gt;
&lt;br /&gt;
*'''4.3 Le manuel de SQLfast'''. Un manuel/tutoriel détaillé (en anglais), sous forme pdf, consacré à l'utilisation du langage et à la résolution de problèmes de nature variée est disponible en ligne [http://bit.ly/3Wm8IZT '''Ici''']. En outre, une série d'études de cas sont disponibles [https://bit.ly/3x0fj2i '''[ici]'''].&lt;br /&gt;
&lt;br /&gt;
Les documents d'aide de SQLfast sont disponibles en français et en anglais (du moins le seront-ils lorsque leur rédaction et leur traduction seront terminées). &lt;br /&gt;
Les documents en français sont localisés dans le répertoire '''SQLfast/SQLfastHelp_FR'''. Les tutoriels intégrés sont localisés dans le sous-répertoire '''Lev0_Tutorials''' pour le mode ''Basic'' et '''Lev1_Tutorials''' pour le mode ''Expert'' au sein de ce répertoire. Ces documents peuvent être modifiés et complétés par l'utilisateur en fonction de ses besoins.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. Le module SQLpy&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' est un module destiné à fournir aux programmeurs Python un moyen facile de développer rapidement de petites applications interactives et/ou orientées données tout en ignorant les arcanes des modules standard ''tkinter'' et ''sqlite3''. Il inclut certaines des fonctions les plus puissantes du langage et de l'environnement SQLfast. SQLpy comprend trois parties : ''GUI'', ''Console'' et ''Base de données''.&lt;br /&gt;
&lt;br /&gt;
*La partie '''GUI''' est une collection de fonctions de création de boîtes de dialogue composées des widgets les plus courants du module Python ''tkinter''. Elle comprend huit familles de boîtes : Infobox, Entrybox, Textbox, Picturebox, Listbox (deux variantes), Checkbox et Radiobox. La boîte Compositebox combine un nombre quelconque d'instances de ces types de base. Chaque boîte est créée par une seule invocation au module SQLpy équivalente à une centaine d'instructions Python/tkinter. &lt;br /&gt;
&lt;br /&gt;
*La '''Console''' est une fenêtre indépendante dans laquelle du texte peut être écrit (et lu) par le programme et par l'utilisateur. Elle est similaire à la console système Python, sauf qu'elle est entièrement contrôlée par le programme Python et par l'utilisateur.&lt;br /&gt;
&lt;br /&gt;
*La partie '''Base de données''' fournit un accès simplifié aux ressources d'une base de données relationnelle (par exemple, pas de connexion, pas de curseurs). Outre les opérations élémentaires habituelles (CRUD), elle comprend quelques fonctions puissantes, telles que l'exportation du contenu d'une base de données, l'importation et l'analyse de données externes, le formatage du résultat des requêtes &amp;quot;select&amp;quot; (une collection extensible de 15 formats est disponible) et l'extraction de métadonnées.&lt;br /&gt;
&lt;br /&gt;
La distribution comprend &lt;br /&gt;
*le code du module SQLpy.py &lt;br /&gt;
*son manuel utilisateur largement illustré&lt;br /&gt;
*un petit programme Python qui illustre l'utilisation des fonctions du module&lt;br /&gt;
*comme illustration, une réécriture en ''Python/SQLpy'' de l'application développée dans l'étude cas '''Four hours to save the library'''.&lt;br /&gt;
&lt;br /&gt;
La version 1.2 de SQLpy comprend les extensions suivantes :&lt;br /&gt;
*l'installation préalable du module graphique PIL n'est plus nécessaire. En revanche, en cas d'absence, les types de fichiers sont réduits à ceux de ''tkinter'', soit ''gif'', ''pgm'' et ''ppm''.&lt;br /&gt;
*les boîtes composites (''CompositeBox'') peuvent désormais inclure plusieurs instances de ''SelectList2''.&lt;br /&gt;
&lt;br /&gt;
Le module et sa documentation sont disponibles [https://bit.ly/3FVFI5P '''ici'''].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ENGLISH VERSION ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;1. Fast track&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:*'''Download'''&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast 5.0''' (English documentation) [&amp;lt;i&amp;gt;last update 2022-12-12&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3BC97je '''SQLfast.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLpy Python module v1.2''' [&amp;lt;i&amp;gt;last update 2022-12-16&amp;lt;/i&amp;gt;]&lt;br /&gt;
:::[https://bit.ly/3FVFI5P '''SQLpy.zip''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Manuals'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast installation guide''' (4 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wrcl0Y '''SQLfast_Installation_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''SQLfast Manual: Database application programming with SQLfast''' (548 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-10-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3Wm8IZT '''SQLfast-Manual.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Catalogue of SQLfast commands''' (82 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3uUvLPV '''SQLfast-Commands.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Tutorials'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Basic Level''' (32 pages, English) [&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;''&amp;lt;/font&amp;gt;]&lt;br /&gt;
:::[http://bit.ly/3HNqGR4 '''Getting_started_BASIC_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Getting started with SQLfast Expert Level''' (20 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-29&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3HFwKLz '''Getting_started_EXPERT_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast survival guide - Typical script models''' (60 pages, English) [''&amp;lt;i&amp;gt;last update 2020-11-28&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3j953R4 '''Survival_guide_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW&amp;lt;/i&amp;gt;'''&amp;lt;/font&amp;gt; '''Case studies''' (a new study on ''Active Databases'') [''&amp;lt;i&amp;gt;last update 2020-09-23&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://bit.ly/3x0fj2i '''SQLfast Case Studies''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Technical complements'''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''Comparing SQLfast and Java / Python codes''' (9 pages, English) [''&amp;lt;i&amp;gt;last update 2017-11-08&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[http://bit.ly/3FCGGma '''Code_Comparison_EN.pdf''']&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*''' Eleven temporal databases of various sizes''' (complement of case study ''Temporal databases - Part 2''. [''&amp;lt;i&amp;gt;last update 2019-08-01&amp;lt;/i&amp;gt;'']&lt;br /&gt;
:::[https://staff.info.unamur.be/dbm/Documents/Tutorials/SQLfast/TDB-Large.zip '''TDB-Large.zip (93 Mo)''']&lt;br /&gt;
&lt;br /&gt;
'''SQLfast versions'''&lt;br /&gt;
*'''&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;v5.0 (2022-12-12)&amp;lt;/font&amp;gt;''' [[#SQLfast versions|description]]&lt;br /&gt;
*v4.1   (2022-07-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v4.0   (2020-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.2   (2019-09-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1.1 (2019-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.1   (2019-02-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0.1 (2018-12-04) [[#SQLfast versions|description]]&lt;br /&gt;
*v3.0   (2018-11-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.3 (2018-03-02) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.2 (2017-10-17) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1.1 (2017-10-06) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.1   (2017-09-10) [[#SQLfast versions|description]]&lt;br /&gt;
*v2.0   (2017-04-01) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.2 (2016-05-22) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.2.1 (2016-05-09) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.1 (2016-01-14) [[#SQLfast versions|description]]&lt;br /&gt;
*v1.0.0 (2015-12-18) [[#SQLfast versions|description]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- --------------------------------  2. What is SQLfast?  ------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;2. What is SQLfast?&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The name SQLfast denotes,&lt;br /&gt;
:*on the one hand, a '''programming language''' allowing the rapid and easy development of interactive, data-centered scripts, &lt;br /&gt;
:*and, on the other hand, a graphical, user-friendly '''software environment''' to develop, test and run SQLfast scripts. &lt;br /&gt;
The language and its environment have been designed to encompass a wide range of usage scenarios, from database self-study by beginners to the development and exploitation of complex database applications such as library management and prototype generation.  They target both novice and professional users.&lt;br /&gt;
&lt;br /&gt;
The core of the SQLfast language is '''SQL''', the universal language for database definition and manipulation. Any sequence of SQL statements is a valid SQLfast script, whatever its length. SQLfast also comprises statements that provide for graphical user interaction, text generation, file manipulation, decision, iteration, web access, metadata processing and much more.&lt;br /&gt;
&lt;br /&gt;
The main design goal of the SQLfast language is '''simplicity'''. Just like its kernel, SQL, it exhibits a smooth learning curve: a simple problem can be solved by a simple script of 2-3 statements, the writing of which requires a few minutes of learning. The complexity of data interaction (DB, web, files, images, etc.) and that of GUI are fully hidden from the script writer. For instance, extracting and formatting data from the database requires '''about 40 Java/JDBC statements''' but only '''one SQLfast statement'''. A 3-field data entry dialogue box is built through '''more than 100 Python/Tkinter statements''' but requires '''one SQLfast statement''' only. In the same way, downloading a file from the web needs '''one SQLfast statement''', against '''more than 100 Python/urllib2 statements'''.&lt;br /&gt;
[http://bit.ly/3FCGGma This document] compares the SQLfast code for these three examples with their equivalent standard code. &lt;br /&gt;
&lt;br /&gt;
One of the distinctive features of SQLfast is its '''tutorial engine'''. A tutorial (or help document) is a multimedia hypertext written in the ''SQLtuto'' language (think of it as a micro-HTML). This document is ''active'', in that, any code fragment (SQL queries, SQLfast scripts, GUI, calling a procedure) can be executed from within the tutorial in which it appears. Developing complex, illustrated and active course systems is therefore quite easy. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is portable and its installation cannot be simpler: folder SQLfast extracted from the .zip archive that contains its complete distribution, can be copied anywhere and is ready to run. In addition, SQLfast does not modify any system parameter.&lt;br /&gt;
&lt;br /&gt;
To address the large range of usage it is intended for, SQLfast offers two interfaces:&lt;br /&gt;
&lt;br /&gt;
*''Basic'': familiarisation with database concepts, direct graphical manipulation of data, learning SQL, analyzing data, solving small problems.&lt;br /&gt;
*''Expert'': learning database programming, developing and running small applications, solving more complex problems, developing and running complex (possibly standalone) applications. &lt;br /&gt;
&lt;br /&gt;
The SQLfast software is both small (32 MB) and self-contained. Its standard distribution includes a graphical library, a RDBMS, a large, extendible, function library, sample databases, help files, tutorials and a large portfolio of example scripts, ranging from two-statement elementary scripts to one thousand statements interactive DB interface generator. &lt;br /&gt;
&lt;br /&gt;
SQLfast has been developed in Python. The current distribution includes SQLite 3, which offers a rich version of SQL2/SQL3 (including recursive CTE and window function) and GUI library Tkinter. It has been compiled for MS Windows. SQLfast runs smoothly on Linux under Wine (some parameters may need to be adapted, such as default ''paths'' and character coding).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ------------------  3. Installing SQLfast and Getting started  ----------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;3. Installing SQLfast and Getting started&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The distribution ''package'' is available as a 'zip' archive. It comprises the SQLfast software (including 80 guides and tutorials, sample databases and more than 300 scripts) and three small documents: an ''Installation guide'' and the ''Getting started'' guides for the ''Basic'' and ''Expert'' levels.&lt;br /&gt;
&lt;br /&gt;
*'''SQLfast software'''. This archive contains a folder named ''SQLfast''. The installation merely consists in extracting this folder and placing it anywhere in the computer. SQLfast is then ready to run: just double-clicking on ''SQLfast.exe'' file. The archive is available [https://bit.ly/3BC97je '''here'''].&lt;br /&gt;
*'''SQLfast installation guide'''. This (practically useless!) document provides some hints on how to prepare SQLfast for execution. It can also be found [http://bit.ly/3Wrcl0Y '''here'''].&lt;br /&gt;
*'''Getting started in SQLfast'''. How to start with SQLfast. It can also be found [http://bit.ly/3HNqGR4 '''here'''] for the ''Basic'' level and [http://bit.ly/3HFwKLz '''here'''] for the ''Expert'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----------------------------  4. SQLfast Documentation  ------------------------ --&amp;gt;&lt;br /&gt;
&amp;lt;!-- -------------------------------------------------------------------------------- --&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;4. SQLfast Documentation&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are two main sources of documentation describing the SQLfast software and languages: integrated and external.&lt;br /&gt;
:*the ''integrated documentation'' is accessed through button '''Help''' at the Basic level and through '''Help''' menu function at the '''Expert''' Level.&lt;br /&gt;
:*the ''external documentation'' comprises a series of ''pdf'' documents, the most useful of which are the ''SQLfast manual'' ('''SQL-Manual.pdf''') and the ''SQLfast command dictionary'' ('''SQLfast-Commands.pdf''').&lt;br /&gt;
&lt;br /&gt;
*'''4.1 Help button at the &amp;quot;Basic&amp;quot; Level'''.&lt;br /&gt;
:This button opens a short menu with three items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the basic graphical environment and the main functions of SQLfast. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions.  Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials on the SQL language. Partly translated from the French reference book ''Bases de données - Concepts, utilisation et développement, 5th Edition, Dunod 2022''.&lt;br /&gt;
&lt;br /&gt;
*'''4.2 Help menu at the &amp;quot;Expert&amp;quot; Level'''.&lt;br /&gt;
:This button opens a menu with four items, in addition to the ''Welcome'' screen ('''About SQLfast''').&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Getting started'''. This document describes the expert graphical environment and the main functions of SQLfast.  Also available as a ''pdf'' document of the external documentation..&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Survival guide'''. A collection of about fifty commented SQLfast programming models, from simple data querying to code generation based on metadata. Can be used, assembled and customized to develop real applications.  Also available as a ''pdf'' document of the external documentation ([http://bit.ly/3j953R4 '''Survival_guide_EN'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; SQLfast references'''. Portfolio of reference documents about the SQLfast software and languages. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast environment'''. Detailed technical description of the windows of SQLfast and of their functions at the Expert Level. Also available as a ''pdf'' document of the external documentation.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLfast commands'''. Dictionary of the SQLfast statements, functions and parameters. This integrated document is a summary of ''Dictionary of SQLfast commands and parameters'' ([http://bit.ly/3uUvLPV '''SQLfast commands'''])&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
::*'''SQLtuto language'''. Description of the tutorial language. This language allows users to modify and develop help documents and tutorials for the SQLfast environment.&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:*'''Help &amp;gt; Tutorials'''. Portfolio of tutorials about SQL and the SQLfast language. These lessons are derived from the ''SQLfast Manual''.&lt;br /&gt;
&lt;br /&gt;
*'''4.3 The SQLfast Manual'''. This e-book is a manual/tutorial on the SQLfast language and on database programming. It is available [http://bit.ly/3Wm8IZT '''here''']. In addition, a series of case studies is available [https://bit.ly/3x0fj2i '''[here]'''].&lt;br /&gt;
&lt;br /&gt;
Most integrated documents are available in ''English'' and in ''French''. The English documents are located in the directory '''SQLfast/SQLfastHelp_EN'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td align=left valign=middle style=&amp;quot;background-color:rgb(28,148,198);width:800px&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font face=&amp;quot;Helvetica&amp;quot; color=white&amp;gt;&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;5. The SQLpy module&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;/font&amp;gt;&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''SQLpy''' is a module intended to provide '''Python programmers''' with a another way to rapidly and easily develop small interactive and data intensive applications while ignoring the intricacies of the ''tkinter'' and ''sqlite3'' standard modules. It includes some of the most powerful facilities of the '''SQLfast''' language and environment. SQLpy comprises three parts: ''GUI'', ''Console'' and ''Database''.&lt;br /&gt;
&lt;br /&gt;
*The '''GUI''' part offers a collection of functions that create dialog boxes made up of the most common widgets of the ''tkinter'' Python module. It includes eight box families: Infobox, Entrybox, Textbox, Picturebox, Listbox (two variants), Checkbox and Radiobox. The Compositebox combines any number of instances of these basic types. Each box is created by a single Python statement (equivalent to one hundred native Python/tkinter instructions).&lt;br /&gt;
&lt;br /&gt;
*The '''Console''' is an independent window in which text can be written (and read) by the program and the user. It is somewhat similar to the Python system console except that it is entirely controlled by the Python program.&lt;br /&gt;
&lt;br /&gt;
*The '''Database''' part provides a simplified access to the resources of a relational database (e.g., no connection, no cursors). Besides usual elementary operations (CRUD), it includes some powerful functions, such as exporting the content of a database, importing and analyzing external data, formatting the result set of &amp;quot;select&amp;quot; queries (an extendible collection of 16 formats is available) and extracting metadata.&lt;br /&gt;
&lt;br /&gt;
The distribution includes&lt;br /&gt;
*the code of the SQLpy module ('''SQLpy.py''')&lt;br /&gt;
*its user manual ('''SQLpy - User Manual.pdf''')&lt;br /&gt;
*a small Python program that illustrates the use of the SQLpy functions ('''SQLpy_Demonstrator.py''')&lt;br /&gt;
*as an illustration, a rewriting in ''Python/SQLpy'' of the SQLfast application associated with the case study ''Four days to save the library'' ('''Project_1_-_The_Library_(SQL).py''').&lt;br /&gt;
&lt;br /&gt;
The last version of SQLpy ('''SQLpy v1.2''') comprises the following extensions:&lt;br /&gt;
*it no longer requires the installation of the PIL module (but then, handles only the limited bitmap formats of ''tkinter'': ''gif'', ''pgm'' et ''ppm'')&lt;br /&gt;
*allows ''CompositeBox'' to include multiple instances of ''SelectList2'' elementary boxes (only one in version 1.1)&lt;br /&gt;
&lt;br /&gt;
The module and its documentation are available [https://bit.ly/3FVFI5P '''here'''] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SQLfast versions ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''v5.0 (2022-12-12)'''&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions for Python programmers''&lt;br /&gt;
::*'''SQLpy''' is a Python module that provides the Python programmer with nearly 40 of the most important SQLfast functions (including 12 high level GUI dialog boxes, 7 console management procedures and 17 database operations).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast utilities''&lt;br /&gt;
::*UTIL-SELECT-parameters-standard-3: new, more eye-catching output format for select queries (same as UTIL-SELECT-parameters-standard-1 with continuous lines).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*the code of the GUI engine has been rewritten (now similar to that of ''SQLpy'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*New ''optimistic'' execution mode for list processing UDF functions. The default coding mode of UDF functions is ''defensive'', the user being considering highly ''unreliable''. Their execution is (hopefully) secure but may be slow. With the ''optimistic'' coding, (almost) no arguments are validated nor converted. The execution of function is less secure but much  faster (2 to 10 times). The execution mode is specified by system variable '''itemSpeed''': 0 = secure, 1 = fast.&lt;br /&gt;
::*New UDF function '''translate''': transforms a character string through a '''character''' conversion dictionary (implementation of the SQL standard function, missing in SQLite).&lt;br /&gt;
::*New UDF function '''itemTranslate''': extension of the '''translate''' function; transforms a character string through a '''substring''' conversion dictionary.&lt;br /&gt;
::*New UDF function '''num2uni(N)''': given integer N, returns the unicode character of code-point N..&lt;br /&gt;
&lt;br /&gt;
:*''Guides and Help documents''&lt;br /&gt;
::The color rendering can be very different depending on the screen settings. It can now be customized by two new system variables:&lt;br /&gt;
::*'''colorHelp''': document background color (default ''grey96'')&lt;br /&gt;
::*'''colorHelpScript''': embedded script background color (default ''light yellow'')&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*two new dialog boxes: '''selectList''' (multiselection in a single list box) and '''selectList2''' (same as selectList but with dual list boxes)&lt;br /&gt;
::*'''askData''': the width of the entry fields is customizable for each box instance individually through local parameter '''/x'''&lt;br /&gt;
::*'''showMessage''' (aka '''pause'''):  the text style now is fully customizable thanks to three new '''infoFont''', '''infoWeight''' and '''infoWrap''' system variables&lt;br /&gt;
::*'''showPicture''': can now handle a wider variety of image formats (like ''gif'', ''jpg'', ''tiff'', etc.)&lt;br /&gt;
::*'''showDrawing''': the ''Print'' function stores the ''*ps'' files in the ''Files'' directory&lt;br /&gt;
::*'''askData''' and '''selectList''', the constant separator symbol is customizable via the '''constSeparator''' system variable (useful when the constants include the separator)&lt;br /&gt;
::*'''askCombo''' (composite boxes): in addition to layout operators '''|''' and '''||''', a new operator ('''|||''') removes the constraints of the former versions&lt;br /&gt;
&lt;br /&gt;
:*''Show schema''&lt;br /&gt;
::*display of the ''Summary'' and ''Full schema'' of ''in-memory'' databases&lt;br /&gt;
::*automatic generation of the DDL code of ''in-memory'' databases &lt;br /&gt;
&lt;br /&gt;
:*''New active tutorials''&lt;br /&gt;
::*New tutorial on '''SQL Data Analytics''' (60 pages, more than 60 executable SQL examples). This tutorial derives from the new Chapter 10 of the reference book. Available in two versions, French and English.&lt;br /&gt;
::*In the ''Basic interface'', English version: six new SQL tutorials (Cyclic structures, Data modification, Complements, SQL views, Recursive queries, OLAP).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--:*''Case studies''&lt;br /&gt;
::*'''Classifying objects''': tutorial and application of FCA (Formal Concept Analysis).&lt;br /&gt;
::*'''Pandemy''': tutorial on agent-base modeling. Application to pandemy evolution.&lt;br /&gt;
:*''Import-Export function''&lt;br /&gt;
::*The execution of statement '''import''' on '''csv''' source files generates a lot of diagnosis messages on the output channel. It can be silenced through system variable '''csv-mute''' (0 = default, 1 = mute)&lt;br /&gt;
::*New import format: ''filename.txt''.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
:*''and more ...''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.1 (2022-07-02)'''&lt;br /&gt;
:*''Tutorials''&lt;br /&gt;
::*New tutorial on Data Analytics (60 pages, more than 60 executable SQL examples) in two versions, French and English. This tutorial derives from the new Chapter 10 of the reference book.&lt;br /&gt;
::*Nouveau tutoriel sur l'Analyse de données (60 pages, plus de 60 exemples SQL exécutables) en deux versions, française et anglaise. Ce tutoriel est basé sur le nouveau chapitre 10 de l'ouvrage de référence.&lt;br /&gt;
:*''System''&lt;br /&gt;
::*Last stable version of SQLite (v3.38.5)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v4.0 (2020-12-05)'''&lt;br /&gt;
:*''The distribution''&lt;br /&gt;
::Available in two versions, depending on the default language of the documentation:&lt;br /&gt;
::Disponible en deux versions, selon la langue par défaut de la documentation: &lt;br /&gt;
:::*English, when downloaded from the English section of this page,&lt;br /&gt;
:::*Française, si téléchargée à partir de la section française de cette page.  &lt;br /&gt;
::''Note'': these versions are identical except for the value of parameter '''helpDirectory''' in initialization file ''SQLfast.ini''.&lt;br /&gt;
:*''Case studies''&lt;br /&gt;
::*'''Active Databases''': tutorial and application (92 pages). Includes an experiment on ''program-less'' business application architecture and a discussion on trigger validation.&lt;br /&gt;
::*'''Four hours to save the library''': this Case study has been translated into two executable tutorials, one as a narrative presentation of the case study and the other one devoted to the user of the application. Other case studies may be translated this way in the future.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast Manual''. Two new chapters&lt;br /&gt;
::*'''Chapter 23 - Aid to SQLfast script development''' (24 pages). Includes a discussion on how to generate execution traces and how to exploit them.&lt;br /&gt;
::*'''Chapter 26 - Developing a tutorial''' (34 pages). Includes an in-depth description of ''embedded scripts''.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New SQL object ''generated columns'' (columns the value of which is computed from other column values of the same row).&lt;br /&gt;
::*New statement '''trace on/off''', to start/disable tracing&lt;br /&gt;
::*New function '''webLib:disableCertficate''' to disable certificate verification &lt;br /&gt;
::*New output format for ''select'' result sets, ''UTIL-SELECT-parameters-for-headers.sql'', to generate the column names only &lt;br /&gt;
&lt;br /&gt;
:*''Show_Data subsystem''&lt;br /&gt;
::*Data windows now independent of (i.e., do not block any longer) the Main and Output windows.&lt;br /&gt;
::*Insertion of a series of rows with selected value propagation.&lt;br /&gt;
::*Data modification also allowed in Expert mode (algorithms rewritten to minimize access conflicts).&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast GUI''&lt;br /&gt;
::*Improved GUI in Main window, Show_Data, Show_Schema (notably, Entry and Message fields are resizable)&lt;br /&gt;
::*Parameter '''charSize''' now effective (character size in Main and Output windows, useful for high definition screens)&lt;br /&gt;
::*New item '''Help &amp;gt; Case studies''' to accommodate new case studies tutorials.&lt;br /&gt;
::*Menu '''Script''' restructured: items redundant with buttons removed, new item '''Tracing'''.&lt;br /&gt;
&lt;br /&gt;
:*''Dialog boxes''&lt;br /&gt;
::*Customized widget colors now allowed.&lt;br /&gt;
::*Data fields, text fields and composite boxes now resizable&lt;br /&gt;
::*Readability problems fixed in ''check'' and ''radio'' buttons against dark background (overwhelming another Tkinter idiosyncrasy!).&lt;br /&gt;
&lt;br /&gt;
:*''Help/tutorial''&lt;br /&gt;
::*The tutorials of the ''Basic'' level now include a short introduction to SQL (both in English and in French)&lt;br /&gt;
::*Insertion of ''jpeg/jpg'' images allowed in addition to the ''gif'' format.&lt;br /&gt;
::*Size of large images can be controlled through '''tutoImageMaxSize''' system variable.&lt;br /&gt;
::*New SQLtuto concept: ''embedded script''. &lt;br /&gt;
:::*An ''embedded script'' is an SQLfast procedure integrated to a tutorial document. Several attributes are associated with this script: ''Id'', ''name'', ''execute button'', ''legend''. All of these components can be hidden. An embedded script can call other scripts of the same document. This concept blurs the frontier between executable code and its documentation. It allows the creation of a tutorial that includes the code it describes. Many tutorials have been rewritten based on this feature. &lt;br /&gt;
:::* ''embedded scripts'' are controlled by four SQLtuto commands: &amp;lt;kbd&amp;gt;.script:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.endscript:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.loadscripts:&amp;lt;/kbd&amp;gt;, &amp;lt;kbd&amp;gt;.scriptMaxHeight:&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::*All the tutorials of the distribution have been rewritten to include embedded scripts. &lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationSeconds''': computes the interval between two timestamps, down to the millisecond.&lt;br /&gt;
::*'''printMessage''': from an SQL query (notably within a trigger body), writes a text in the output window.&lt;br /&gt;
::*'''writeFile''': from an SQL query (notably within a trigger body), creates a file and writes a text in it.&lt;br /&gt;
::*'''writeTrace''': from an SQL query (notably within a trigger body), inserts the trace of the execution of an SQLfast statement in tracing database ''TRACING.db''. &lt;br /&gt;
::*'''head''': returns the first word of a sentence.&lt;br /&gt;
::*'''tail''': returns a sentence, minus its head.&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast system''&lt;br /&gt;
::*Tracing subsystem: stores in a tracing database (''TRACING.db'') the complete data on SQLfast statement execution. Includes the statements executed by triggers (through UDF function ''writeTrace''). &lt;br /&gt;
::*Includes SQLite v3.33 (64 bits)&lt;br /&gt;
::*Several instances of SQLfast are allowed to simultaneously run on the same database.&lt;br /&gt;
::*New, much faster, implementation of ''SQL-for'' loops. Linear time instead of quadratic.&lt;br /&gt;
::*New system variables:&lt;br /&gt;
:::*'''traceActive, traceSQL, traceAppend, loaderDebug''': control the tracing subsystem&lt;br /&gt;
:::*'''tutoImageMaxSize''': sets the maximum size of bitmap images in tutorials&lt;br /&gt;
:::*widget colors setting: ''colorMainFrame'', ''colorInfoBox'', ''colorGeneralMessage'', ''colorBoxFrame'', ''colorBoxMessage'', ''colorEntry'', ''colorEntryField'', ''colorEntryDisplay'', ''colorTextUpdate'', ''colorTextDisplay'', ''colorCheck'', ''colorRadi''o, ''colorButton''.&lt;br /&gt;
&lt;br /&gt;
:*''bugs fixed''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Part 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: ''General/Play SQLdraw'' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.2 (2019-09-01)'''&lt;br /&gt;
:*''Case studies (Text and full applications)''&lt;br /&gt;
::*'''Blockchains''': tutorial (28 pages), application (11 modules)&lt;br /&gt;
::*'''Temporal databases''': Parts 1 and 2 (124 pages), application (27 modules)&lt;br /&gt;
&lt;br /&gt;
:*''Main window menu''&lt;br /&gt;
::*new operation: '''General &amp;gt; Play SQLdraw''' (display an SQLdraw script)&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast language''&lt;br /&gt;
::*New system variables: '''clock''', '''dateclock''', '''DBMSversion'''&lt;br /&gt;
::*'''print''' statement modified: now always writes in the output window, whatever the current output channel&lt;br /&gt;
::*'''showDrawing''': new functions in the graphical interface: ''Pause'', ''Resume'', ''Next-step'' &lt;br /&gt;
::*'''showPicture''': now displays ''gif'' and ''jpeg'' file&lt;br /&gt;
&lt;br /&gt;
:*''SQLfast functions (UDF)''&lt;br /&gt;
::*'''durationDays''': number of days between two dates or timestamps&lt;br /&gt;
::*'''toverlap''': check whether temporal closed-open intervals overlap&lt;br /&gt;
&lt;br /&gt;
:*''System''&lt;br /&gt;
::*new library '''LTemp''': temporal engine implementing main operators for temporal databases processing (projection, reduction, outer join, aggregation, valued stable intervals, normalization, etc.)&lt;br /&gt;
::*vector-graphics engine '''drawLib''':&lt;br /&gt;
:::*new command '''display''' &amp;lt;text&amp;gt;: displays a text in the message field of the interface&lt;br /&gt;
:::*new command '''delete''' &amp;lt;shape-name&amp;gt;: delete an arbitrary shape&lt;br /&gt;
:::*new command '''step''': defines a shape sequences&lt;br /&gt;
:::*commands '''rectangle''' and '''circle''' implemented&lt;br /&gt;
:::*engine rewritten: now displays about 20,000 large solid rectangles per second&lt;br /&gt;
::*new system variables&lt;br /&gt;
:::*'''clock''': time in day in format 'hh:m:ss'&lt;br /&gt;
:::*'''dateclock''': date + time in format 'yyy-mm-dd hh:m:ss'&lt;br /&gt;
&lt;br /&gt;
:*''Bug fixed in'': UDF setDCol, random_i(v1,v2), DBF import, CreateDB InMemory in Level 0, SQL update of dynamic columns, menu item General/Save as (no more crash for some non-Unicode text file), showText (now displays full first line), showPicture (no more crashes for very long file path), decoding dynaColumn parameter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1.1 (2019-05-22)'''&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*bug fixed in '''drop view''' execution (incorrect processing of view metadata).&lt;br /&gt;
::*bug fixed in '''import''' from '''dbf''' files (last field incorrectly decoded if variable-length numeric).&lt;br /&gt;
::*bug fixed in '''createDB InMemory''' in ''Basic'' level.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.1 (2019-01-31)'''&lt;br /&gt;
:*''Language'':&lt;br /&gt;
::*Multidatabase scripts: secondary databases can be attached to the main database.&lt;br /&gt;
:::format: &amp;lt;kbd&amp;gt;generic attach 'D:/SQLfast/Databases/CLICOM.db' as CLI;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
:::usage:  &amp;lt;kbd&amp;gt;select * from CLI.DETAIL;&amp;lt;/kbd&amp;gt;&lt;br /&gt;
::*New temporal system variables: clock (hh:mm:ss), dateclock (YYYY-MM-DD hh:mm:ss)&lt;br /&gt;
:*''Data dictionary'':&lt;br /&gt;
::*''System tables'': three new system tables: SYS_CHECK (''check'' constraints), SYS_TRIGGER (the properties of triggers) and SYS_TRIGGER_COMP (the SQL statements of the body of triggers).&lt;br /&gt;
::*''New properties'': key and constraint names, autoincrement columns.&lt;br /&gt;
:*''Generating the SQL-DDL schema''&lt;br /&gt;
::*''Expert level menu'': new menu item to force the rebuilding of the ''full schema'' of the current database.&lt;br /&gt;
::*''Generation process'': now generates check constraints, views, triggers, key and constraint names. &lt;br /&gt;
:*''Case study and documentation'': new case study on Blockchains.&lt;br /&gt;
::*''Documentation'': Principles of Blockchains and description of an experimental Blockchain toolkit (in English). Text: [].&lt;br /&gt;
::*''Scripts'': The code of the toolkit is available in ''SQLfast/Scripts/Case-Studies/Case_BlockChain'' of the standard distribution.&lt;br /&gt;
:*''System'': upgraded to SQLite v.3.25.03. (includes, a.o., '''window''' function and an '''upsert''' variant of the '''insert''' query)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0.1 (2018-12-04)'''&lt;br /&gt;
:*''Cryptography'': cryptographic functions have been added to the LStr library: secure hashing (hash, miningHash), symmetric cryptography (generateSYMkey, encryptSYM, decryptSYM), asymmetric cryptography (generateRSAkeys, encryptRSA, decryptRSA); document ''SQLfast-commands.pdf'' updated.&lt;br /&gt;
:*''Blockchain application''&lt;br /&gt;
::*''Scripts'': a didactic '''Blockchain toolkit''' has been added in directory ''Scripts/BD-2018/Chapitre-10/Blockchain''. Dialogues in French. An English version is ongoing as an ''SQLfast Case Study''.&lt;br /&gt;
:*''Documentation'': the documentation of the Blockchain toolkit has been added to Appendix 10 of the reference book ([http://www.info.fundp.ac.be/~dbm/Documents/Ouvrages/Dunod-2018/Chapitres/Chapitre-10/JLH-A10-BD-non-relationnelles.pdf ''Chapitre 10, Annexe'']). In French. An English version is ongoing as an ''SQLfast Case Study''. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v3.0 (2018-11-01)'''&lt;br /&gt;
:*''SQL extension'': &lt;br /&gt;
::*''List processing'': complete module, including (multi-)set operators and predicates, joins (joining two lists) and list-based loop (&amp;lt;kbd&amp;gt;for e = [items A;B;C;D];&amp;lt;/kbd&amp;gt;). This feature simplifies complex queries based on set-algebra and speed up their execution.&lt;br /&gt;
::*''Dynamic columns'': the basis of NoSQL databases.  An undeclared column is created as soon as it receives a value (through insert or update). For instance, the following sequence is valid: &amp;lt;kbd&amp;gt;create table T(A int, B int); insert into T(A,B,C) values (1,2,3); update T set D = 4 where E is null; select A,B,C,E,F from T;&amp;lt;/kbd&amp;gt;. Metadata functions return the list of non null dynamic columns of a row or of a table.&lt;br /&gt;
:*''SQLfast functionalities'':&lt;br /&gt;
::*''import statement'': CSV import is more robust: now copes with values including ''end-of-lines'' and with record comprising a variable number of fields.&lt;br /&gt;
::*''Basic level'': in-memory databases can now be created.&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''composite dialogue boxes'': now stretchable; their resizing is propagated to their elementary boxes.&lt;br /&gt;
::*result sets of select queries and Show Data windows now correctly display text values including ''end-of-lines''.&lt;br /&gt;
:*''Show Schema'':&lt;br /&gt;
::*''Summary schema'': now shows ''not null'' constraints.&lt;br /&gt;
::*''Full schema'': when missing, the SQL-DDL code is automatically rebuilt.&lt;br /&gt;
:*''Documentation'':&lt;br /&gt;
::*''Survival guide'': available in English (both *.help and *.pdf version)&lt;br /&gt;
::*''Survival guide'': extended to list processing and dynamic columns&lt;br /&gt;
::*''SQLfast manual (formerly SQLfast Tutorial)'': new Chapter 24 - ''Transient data: the SQLfast lists''&lt;br /&gt;
::*''SQLfast manual'': new Chapter 25 - ''Schema-less tables and dynamic columns''&lt;br /&gt;
::*''SQLfast manual'': Appendix - A basket of examples: new applications added (''Simulation of all (multi-)set operators'', ''Computing the powerset of a set'', ''The relational division'', ''Computing set inclusion relation'', etc.)&lt;br /&gt;
:*''System'':&lt;br /&gt;
::*several bugs fixed and minor improvements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.3 (2018-03-02)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': set-like operators (&amp;quot;itemUnion&amp;quot;, &amp;quot;itemExcept&amp;quot;, &amp;quot;itemInter&amp;quot;) similar to SQL set operators &amp;quot;union&amp;quot;, &amp;quot;except&amp;quot; and &amp;quot;intersect&amp;quot;. Multiset-like operators (&amp;quot;itemUnionAll&amp;quot;, &amp;quot;itemExceptAll&amp;quot;, &amp;quot;itemInterAll&amp;quot;) similar to SQL multiset operators &amp;quot;union all&amp;quot;, &amp;quot;except all&amp;quot; and &amp;quot;intersect all&amp;quot;.&lt;br /&gt;
::*''list processing'': set-like predicates (&amp;quot;itemEqual&amp;quot;, &amp;quot;itemInclude&amp;quot;).  Multiset-like predicates (&amp;quot;itemEqualAll&amp;quot;, &amp;quot;itemIncludeAll&amp;quot;).&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''Error box more readable'': stretchable and in &amp;quot;courier' font&lt;br /&gt;
::*''Stretchable dialogue boxes'': all the elementary boxes (showMessage, askData, askText, selectOne, selectMany, showData, showText, showPicture, showDrawing) now are stretchable.&lt;br /&gt;
&amp;lt;!--::*''Stretchable dialogue boxes'': composite boxes now are stretchable; their resizing is propagated to their elementary boxes.--&amp;gt;&lt;br /&gt;
:*''language'':&lt;br /&gt;
::*&amp;quot;print&amp;quot; can be used instead of &amp;quot;write&amp;quot;; Christmas gift for Python programmers!&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some bugs fixed&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.2 (2017-10-17)'''&lt;br /&gt;
:*''UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''Clarification of UDF architecture. &amp;quot;UserUDFlib_for_SQL.py&amp;quot; is the module in which new UDF to be used in SQL queries must be written by users. Similarly, new UDF for SQLfast statements (&amp;quot;if&amp;quot;, &amp;quot;while&amp;quot;, &amp;quot;compute&amp;quot;) must now be written in module &amp;quot;UserUDFlib_for_SQLfast.py&amp;quot;. The source and compiled versions of these modules are integrated to the distribution. NOTE: Chapters 10 and 22 of the tutorial are not updated yet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1.1 (2017-10-06)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSlice (extracting sublist) + itemSliceS; itemDelete (remove elements) + itemDeleteS; item and itemSlice now allow backward positions; itemSort, itemNSort,itemSortS and itemNSortS receive a new parameter to remove duplicates&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*Some minor bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*New case study ''Interactive SQL interpreters'' available. Its scripts have been included in the distribution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.1 (2017-09-10)'''&lt;br /&gt;
:*''New UDF functions (for SQLfast and SQL)'':&lt;br /&gt;
::*''list processing'': itemSort (sorting items), itemNSort (numeric sorting of items) + itemSortS, itemNSortS&lt;br /&gt;
:*''New external functions'':&lt;br /&gt;
::*''pretty printing of select queries'': LStr:PrettyPrint&lt;br /&gt;
:*''SQLfast language'':&lt;br /&gt;
::*''execApp'': arguments are passed by reference instead of by value (avoid &amp;quot;newline&amp;quot; problems)&lt;br /&gt;
::*''exceptions in UDF'': specific exception messages now transmitted in clear&lt;br /&gt;
:*''GUI'':&lt;br /&gt;
::*''data and text dialogue boxes'': now stretchable (except in askCombo)&lt;br /&gt;
::*''background color in predefined values'': the ugly gray color is back! Now fixed.&lt;br /&gt;
:*''system'':&lt;br /&gt;
::*New architecture of UDF functions. Built-in and user libraries are now distinct.&lt;br /&gt;
::*Several bugs fixed&lt;br /&gt;
:*''Case studies'':&lt;br /&gt;
::*The text of nine case studies have been rewritten and extended. Their scripts have been redeveloped and integrated in the distribution (new directory &amp;lt;i&amp;gt;SQLfast/Scripts/Case-Studies&amp;lt;/i&amp;gt;). They are available as complete, standalone, applications, ready to run.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v2.0 (2017-04-01)'''&lt;br /&gt;
:*''New functions (for SQLfast and SQL)'':  &lt;br /&gt;
::*''date/time processing'': normDate, datePattern, julianDate &lt;br /&gt;
::*''types'': isDate, isNotDate, isInteger, isNotInteger, utf8Compliant, latinCompliant, hexCompliant, base64Compliant&lt;br /&gt;
::*''string analysis and reduction'': startsWith, endsWith, countInst, deaccent,  reduce, simplify, shrink&lt;br /&gt;
::*''format'': thousandSep&lt;br /&gt;
::*''path/url processing'': urlExists, normalizePath, lastPathNode, pathPrefix, nodeExtension, pureNodeName&lt;br /&gt;
::*''structured text analysis'': ExtractTaggedString, NextSection &lt;br /&gt;
::*''list processing'': itemLen, item, itemIndex&lt;br /&gt;
::*''secure hashing (based on SHA256)'': hash (string digest), hashFile (file digest)&lt;br /&gt;
::*''group_concat2'': full ''group_concat'' aggregate function, equivalent to MySQL version. For SQL only.&lt;br /&gt;
:*''New SQLfast statements:'':&lt;br /&gt;
::*''web interaction'': webfileToFile, webpageToVariable&lt;br /&gt;
::*''multi-variable assignment'': set&lt;br /&gt;
::*''csv and dbf data exchange'': import&lt;br /&gt;
::*''secure hashing'': hashFile (file digest), from small to very large files&lt;br /&gt;
:*''New SMTP functions'':&lt;br /&gt;
::*''SQLfast'': openSMTPserver, sendMessage, closeSMTPserver, sendMessageImmediate&lt;br /&gt;
::*''SQL'': sendMail&lt;br /&gt;
:*''New coding statements and functions'': &lt;br /&gt;
::*''hash signature'': hash, hashFile&lt;br /&gt;
::*''encode/decode'': b64encode, b64decode, b64encode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, b64decod&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;, char2hex, hex2char, HEXencode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;,  HEXdecode&amp;lt;source&amp;gt;To&amp;lt;target&amp;gt;&lt;br /&gt;
::*''cryptography'': encrypt, decrypt&lt;br /&gt;
:*''Data windows'':  improved readability through new background, update/delete through double-click, showing temporary tables and views, coping with binary data &lt;br /&gt;
:*''Miscellaneous'':&lt;br /&gt;
::*Displaying binary data in result sets.&lt;br /&gt;
::*GUI: name of standard buttons can be customized&lt;br /&gt;
::*&amp;quot;About&amp;quot; box, more information and links, startup settings.&lt;br /&gt;
::*Welcome screen = &amp;quot;About&amp;quot; box.&lt;br /&gt;
:*''system'': upgraded to Python 2.7.12 and SQLite 3.17.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.2 (2016-05-22)'''&lt;br /&gt;
:*''system'': Bug fixed: the system path (where SQLfast directory is located) may now include non-ASCII characters. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.2.1 (2016-05-09)'''&lt;br /&gt;
:*''Data windows'': Data windows in '''Show data''' receive a new button: '''Select'''. Allows row filtering. Four filter building modes are provided (smart, strict, SQL condition, SQL predicate). &lt;br /&gt;
:*''Data windows'': New sorting criterion: ''natural'' (= ''unsorted'').&lt;br /&gt;
:*''Schema window'': In addition to the standard '''Summary''' format, a new '''Full schema''' option is provided. It also shows data types and all integrity constraints. If missing, the Full schema can be regenerated through script '''SQL-DDL-generation.sql'''.&lt;br /&gt;
:*''SQLfast language'': New statements '''displayHelp''' and '''closeHelp'''. Allow help documents to be displayed/closed dynamically from within a script.&lt;br /&gt;
:*''SQLfast language'': Concise version of '''ask''', '''askData''', '''ask-u''', '''askData-u''', '''showData'''. We can now write: '''ask A,B,C''' instead of '''ask A,B,C = A|B|C''';&lt;br /&gt;
:*''SQLfast language'': New SQL and SQLfast UDF functions: to provide ''approximate'' comparison ('''simplify''', '''shrink'''); to manipulate paths and urls ('''normalizePath''', '''lastPathNode''', '''pathPrefix''', '''nodeExtension''',  '''pureNodeName'''); to align a string in a fixed frame ('''frame''')&lt;br /&gt;
:*''SQLfast language'': Web processing is now allowed through statements '''webpageToVariable''' (download the HTML code of a page) and '''webfileToFile''' (download a file). New '''LStr''' functions '''NextSection''' and '''ExtractTaggedString''' can be used to extract data from HTML code.&lt;br /&gt;
:*''SQLfast language'': New time processing functions: '''julianday''' or '''jd''' (convert a date-time value into julian day code), '''addToDate''' (add/subtract days to a date), '''nextDate''' (next date), '''prevDate''' (previous date).&lt;br /&gt;
:*''GUI'': All secondary windows (Help, Schema, Data) are now persistent and independent of Main and Output windows.&lt;br /&gt;
:*''GUI'': Menu function and button '''Save''' have been split into '''Save''' and '''Save as'''.&lt;br /&gt;
:*''GUI'': Useless buttons are now disabled (e.g., '''Show schema''' disabled when no database is opened).&lt;br /&gt;
:*''system'': Various bugs fixed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.1 (2016-01-14)'''&lt;br /&gt;
:*''Data windows'': Fixing horizontal synchronization of title and data text areas in wide data windows.&lt;br /&gt;
:*''Data windows'': Geometry parameters of data windows can now be set in '''SQLfast.ini''' and modified in user scripts: '''maxTableNbr''' (initial maximum number of tables opened), '''maxRowNbr''' (maximum number of rows extracted per table), '''WmaxRowWidth''' (max width of data area), '''WmaxRowNbr''' (max height of data area).&lt;br /&gt;
:*''SQLfast language'': SQLite detects DDL errors involving more than one table in DML queries only. Foreign key errors are now coped with in statement '''createDictionary'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*'''v1.0.0 (2015-12-18)'''&lt;br /&gt;
:*First public release.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing DB access code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;35%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;65%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Java/JDBC&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&amp;lt;b&amp;gt;openDB&amp;lt;/b&amp;gt; CLICOM.db;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCLI,NOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; CLIENT;&amp;lt;/font&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;import java.net.URL;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.io.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import ...;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.sql.*;&amp;lt;br&amp;gt;&lt;br /&gt;
import java.util.*;&amp;lt;br&amp;gt;&lt;br /&gt;
String url = &amp;quot;jdbc:interbase://server1/ORDERS.gdb&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String user =&amp;quot;myLogin&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String pw=&amp;quot;myPassword&amp;quot;;&amp;lt;br&amp;gt;&lt;br /&gt;
String querySelect = &amp;quot;select NCLI,NOM from CLIENT&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
String CiD;&amp;lt;br&amp;gt;&lt;br /&gt;
String Cnam;&amp;lt;br&amp;gt;&lt;br /&gt;
Class.forName(&amp;quot;interbase.interclient.Driver&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
Connection conn = DriverManager.getConnection(url,user,pw);&amp;lt;br&amp;gt;&lt;br /&gt;
Statement stmt = conn.createStatement ();&amp;lt;br&amp;gt;&lt;br /&gt;
ResultSet rs1 = stmt.executeQuery (query1);&amp;lt;br&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot;NCLI, NOM&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
while (rs.next()) {&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;CiD = rs.getString(&amp;quot;CustID&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Cnam = rs.getString(&amp;quot;Name&amp;quot;);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;System.out.println(CiD + &amp;quot;, &amp;quot; + Cnam);&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;}&amp;lt;br&amp;gt;&lt;br /&gt;
rs.close();&amp;lt;br&amp;gt;&lt;br /&gt;
stmt.close();&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close();&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | NCLI | NOM       |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
 | B112 | HANSENNE  |&lt;br /&gt;
 | C123 | MERCIER   |&lt;br /&gt;
 | B332 | MONTI     |&lt;br /&gt;
 | F010 | TOUSSAINT |&lt;br /&gt;
 | K111 | VANBIST   |&lt;br /&gt;
 | S127 | VANDERKA  |&lt;br /&gt;
 | B512 | GILLET    |&lt;br /&gt;
 | B062 | GOFFIN    |&lt;br /&gt;
 | C400 | FERARD    |&lt;br /&gt;
 | C003 | AVRON     |&lt;br /&gt;
 | K729 | NEUMAN    |&lt;br /&gt;
 | F011 | PONCELET  |&lt;br /&gt;
 | L422 | FRANCK    |&lt;br /&gt;
 | S712 | GUILLAUME |&lt;br /&gt;
 | D063 | MERCIER   |&lt;br /&gt;
 | F400 | JACOB     |&lt;br /&gt;
 +------+-----------+&lt;br /&gt;
    &amp;lt;/td valign=top&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
 NCLI, NOM&lt;br /&gt;
 B112,MERCIER&lt;br /&gt;
 B332,MONTI&lt;br /&gt;
 F010,TOUSSAINT&lt;br /&gt;
 K111,VANBIST&lt;br /&gt;
 S127,VANDERKA&lt;br /&gt;
 B512,GILLET&lt;br /&gt;
 B062,GOFFIN&lt;br /&gt;
 C400,FERARD&lt;br /&gt;
 C003,AVRON&lt;br /&gt;
 K729,NEUMAN&lt;br /&gt;
 F011,PONCELET&lt;br /&gt;
 L422,FRANCK|&lt;br /&gt;
 S712,GUILLAUME&lt;br /&gt;
 D063,MERCIER&lt;br /&gt;
 F400,JACOB&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Comparing GUI code&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;img src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:src=&amp;quot;http://www.info.fundp.ac.be/~dbm/Documents/Tutorials/SQLfast/ThreeFieldBox.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td width=&amp;quot;45%&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;SQLfast&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&lt;br /&gt;
      &amp;lt;b&amp;gt;Python/Tkinter&amp;lt;/b&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
  &amp;lt;tr&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; oid = 30186;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; pid = PA60;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;set&amp;lt;/b&amp;gt; q   = 75;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;font color=blue&amp;gt;&amp;lt;b&amp;gt;ask-u&amp;lt;/b&amp;gt; oid,pid,q = [/bSaisie données DETAIL]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;{COMMANDE}|IdCom:[!&amp;lt;b&amp;gt;select&amp;lt;/b&amp;gt; NCOM &amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; COMMANDE]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;||{PRODUIT}|IdPro:|Quantité:[(1,2,5,10,20,50)];&amp;lt;/font&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td valign=top&amp;gt;&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;from&amp;lt;/b&amp;gt; Tkinter &amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; *&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; ttk&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;import&amp;lt;/b&amp;gt; sqlite3&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; setComboBoxColors():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl = ttk.Style()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;styl.map(&amp;quot;TCombobox&amp;quot;,fieldbackground  = &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;[('!readonly','!focus','white'),&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;('readonly', '!focus','white')] )&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;class&amp;lt;/b&amp;gt; EntryBox():&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; __init__(self,parent,title):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent = parent&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.title(title)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr = Frame(parent,relief=FLAT,bd=1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.initial_focus = self.body()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.mainFr.pack(padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.buttonbox()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.protocol(&amp;quot;WM_DELETE_WINDOW&amp;quot;,self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.mainloop()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; body(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1 = Message(self.mainFr,text=Comment,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=('Helvetica',9,'bold'),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,relief=SUNKEN,bd=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M1.grid(row=0,column=0,columnspan=4,padx=2,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=2,ipadx=1,ipady=1,sticky=N+W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2 = Message(self.mainFr,text=&amp;quot;COMMANDE&amp;quot;,font=(&amp;quot;Helvetica&amp;quot;,9,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;bold&amp;quot;),anchor=W, justify=LEFT,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M2.grid(row=1,column=0,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdCom:&amp;quot;).grid(row=2,column=0,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,state='readonly',&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;textvariable=self.fr0v1)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1.grid(row=2,column=1,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e1[&amp;quot;values&amp;quot;] = vList1&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3 = Message(self.mainFr,text=&amp;quot;PRODUIT&amp;quot;,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;font=(&amp;quot;Helvetica&amp;quot;,9,&amp;quot;bold&amp;quot;),anchor=W,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;justify=LEFT,bd=1,width=300)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;M3.grid(row=1,column=2,columnspan=2,pady=1,padx=3,sticky=W)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;IdPro:&amp;quot;).grid(row=2,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2 = Entry(self.mainFr,relief=SUNKEN,width=22)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.grid(row=2,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=3,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Label(self.mainFr,text=&amp;quot;Quantité:&amp;quot;).grid(row=3,column=2,sticky=E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3 = StringVar()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3 = ttk.Combobox(self.mainFr,width=15,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;height=20,textvariable=self.fr0v3)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3.grid(row=3,column=3,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pady=1,padx=3,sticky=W+E)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e3[&amp;quot;values&amp;quot;] = vList2&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v1.set(oid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0e2.insert(0,pid)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.fr0v3.set(q)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Return&amp;gt;&amp;quot;, self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.bind(&amp;quot;&amp;lt;Escape&amp;gt;&amp;quot;, self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;setComboBoxColors()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; buttonbox(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr = Frame(self.Parent)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok = Button(buttonFr,text=&amp;quot;OK&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.ok)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Ok.pack(side=LEFT, padx=5, pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can = Button(buttonFr,text=&amp;quot;Cancel&amp;quot;,relief=RAISED,&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;overrelief=SUNKEN,width=10,command=self.cancel)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;Can.pack(side=LEFT,padx=5,pady=5)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;buttonFr.pack()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; apply(self):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx1 = self.fr0e1.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx1 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList1[ndx1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = &amp;quot;&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(self.fr0e2.get())&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;ndx3 = self.fr0e3.current()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;if ndx3 &amp;gt; -1:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = vList2[ndx3]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;else:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;actVal = self.fr0v3.get()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result.append(actVal)&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; ok(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;OK&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.apply()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;b&amp;gt;def&amp;lt;/b&amp;gt; cancel(self,event=None):&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.result = [&amp;quot;Cancel&amp;quot;]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.destroy()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;self.Parent.quit()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;return&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
conn = sqlite3.connect('CLICOM.db')&amp;lt;br&amp;gt;&lt;br /&gt;
c = conn.cursor()&amp;lt;br&amp;gt;&lt;br /&gt;
c.execute('select NCOM from COMMANDE order by NCOM')&amp;lt;br&amp;gt;&lt;br /&gt;
vList1 = []&amp;lt;br&amp;gt;&lt;br /&gt;
for row in c:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;vList1.append(row[0])&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
root = Tk()&amp;lt;br&amp;gt;&lt;br /&gt;
root.withdraw()&amp;lt;br&amp;gt;&lt;br /&gt;
Comment = 'Saisie données DETAIL'&amp;lt;br&amp;gt;&lt;br /&gt;
vList2 = [1,2,5,10,20,50]&amp;lt;br&amp;gt;&lt;br /&gt;
BoxTitle = &amp;quot;[ User data entry ]&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
oid = &amp;quot;30186&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
pid = &amp;quot;PA60&amp;quot;&amp;lt;br&amp;gt;&lt;br /&gt;
q = 75&amp;lt;br&amp;gt;&lt;br /&gt;
d = EntryBox(root,BoxTitle)&amp;lt;br&amp;gt;&lt;br /&gt;
DIALOGbutton = d.result[0]&amp;lt;br&amp;gt;&lt;br /&gt;
if DIALOGbutton == 'OK':&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;oid = d.result[1]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;pid = d.result[2]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;q = int(d.result[3])&amp;lt;br&amp;gt;&lt;br /&gt;
print DIALOGbutton,oid,pid,q&amp;lt;br&amp;gt;&lt;br /&gt;
c.close()&amp;lt;br&amp;gt;&lt;br /&gt;
conn.close()&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
    &amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	<entry>
		<id>https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil</id>
		<title>Accueil</title>
		<link rel="alternate" type="text/html" href="https://projects.info.unamur.be/~dbm/mediawiki/index.php?title=Accueil"/>
				<updated>2023-06-04T11:03:45Z</updated>
		
		<summary type="html">&lt;p&gt;Dbm : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;LIBD&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratory of Database Applications Engineering&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Laboratoire d'ingénierie des applications de bases de données&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;The LIBD is a member of the &amp;lt;i&amp;gt;Data Engineering Group&amp;lt;/i&amp;gt; of the PReCISE Research Center&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;New / Nouveautés&amp;lt;/big&amp;gt;'''&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NOUVEAU'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''Bases de données - Concepts, utilisation et développement - 5e édition''' [[LIBD:Ouvrages|[Description et compléments]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;black&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-07-06&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''. &lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLfast: A database workbench v5.0''' [[DUNOD2015_SQLfast|[Software, documentation and Case studies]]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2023-06-04&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
:* &amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;'''&amp;lt;i&amp;gt;NEW'''&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt; '''SQLpy - A python module comprising the most powerful functions of SQLfast.''' [https://bit.ly/3LfUa8z|[Software, documentation and Case studies]] &amp;lt;br&amp;gt;''&amp;lt;font color=&amp;quot;blue&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Dernière mise à jour / Last update 2022-05-26&amp;lt;/i&amp;gt;&amp;lt;/font&amp;gt;''&lt;br /&gt;
&amp;lt;!-- --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--*'''[[LIBD:Presentation|Presentation of the LIBD (in English)]]'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/precise/ PReCISE Research Center / Centre de recherche PReCISE]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/nadi Namur Digital Institute]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://directory.unamur.be/entities/inf Faculty of Computer Science / Faculté d'informatique]'''&lt;br /&gt;
&lt;br /&gt;
*'''[https://www.unamur.be/ University of Namur / Université de Namur (UNamur)]'''&lt;/div&gt;</summary>
		<author><name>Dbm</name></author>	</entry>

	</feed>