Le Merge sous SQL DB2

Je viens de publier sur le site XDocs400.com un nouvel article que j’ai intitulé « Le MERGE sous SQL DB2« .

Cela faisait un moment que je voulais écrire un article concernant cette instruction SQL, apparue sur la V7R1 de DB2 for i, mais comme j’étais sur plusieurs dossiers « chauds », je ne trouvais tout simplement pas le temps de le faire. Enfin, je n’ai pas beaucoup de mérite à publier cet article maintenant, vu que ce n’est finalement qu’un extrait du cours « DB2 SQL avancé » sur lequel je planchais en fin d’année dernière.

Je tenais beaucoup à publier cet article, car le MERGE SQL est certainement une des instructions les plus intéressantes pour les développeurs d’applications de gestion, qui ont souvent à écrire des choses du genre : « si cette donnée existe dans la base alors je la mets à jour, sinon je l’ajoute ». Le MERGE SQL permet de faire cela très simplement, et bien plus encore, comme vous le pourrez le constater en lisant ce nouveau dossier. Et c’est tellement pratique à utiliser, que je m’en sers maintenant dans tous mes développements, que ce soit en PHP, en RPG ou en PL/SQL (procédures stockées DB2). Il est vrai que j’ai la chance de travailler en ce moment pour des clients dont les serveurs sont en V7R1, ce qui n’est pas le cas de tous mes confrères, malheureusement.

Le seul inconvénient que je verrais dans l’utilisation du MERGE, c’est l’impossibilité de récupérer un « result set » des données impactées par l’instruction. En effet, vous savez peut être (ou peut être pas) que vous pouvez obtenir un « result set » des données modifiées par un DELETE, un INSERT ou un UPDATE, en utilisant la syntaxe SQL DB2 suivante : SELECT * FROM FINAL TABLE (INSERT …).

Cette technique utilisant la clause « FINAL TABLE » peut être très utile pour récupérer la liste des identifiants créés par un INSERT SQL, ou tout simplement le dernier identifiant généré par une série d’INSERT, vous pouvez dans ce cas écrire quelque chose dans ce genre : SELECT MAX(ID) FROM FINAL TABLE (INSERT …).

Le MERGE SQL ne peut pas être combiné avec la clause « FINAL TABLE », donc vous ne pourrez pas récupérer le result set résultant d’un MERGE. C’est à mon avis un inconvénient mineur au vu des possibilités qu’apporte le MERGE.

J’ai d’autres sujets tout aussi intéressants en préparation sur ma « boilerplate » (comme disent les anglais), que je publierai prochainement sur XDocs400.com, comme par exemple :

  • comment contrôler que toutes les jobd pointent bien sur des bibliothèques existantes
  • comment récupérer l’intégralité des postes du scheduler IBMi dans une table (réactualisation en RPG Free d’un vieil article publié sur XDocs400.com)

Ca c’est pour les sujets chauds à paraître dans les semaines à venir. J’en ai aussi d’autres en préparation, mais qui ont besoin de mûrir encore un peu, alors je ne m’étendrai pas davantage, je vous en reparlerai au fil de l’eau.

Sur ce blog, vous trouverez aussi prochainement quelques articles consacrés au langage Javascript (dans le contexte du HTML5), et à différentes techniques assez géniales que j’ai découvertes au cours de mes recherches sur ce langage (notamment sur les polyfills, sortes de librairies destinés à pallier les carences des vieux navigateurs).

Restez à l’écoute.

A très bientôt

Grégory

Générer des jeux de données à partir de rien avec SQL DB2 et la récursivité

Je viens de publier sur le site Xdocs400.com, un nouvel article que j’ai intitulé:

« Générer des jeux de données à partir de rien avec SQL DB2 et la récursivité »

Les techniques que je présente dans cet article sont relativement simples, mais elles apportent beaucoup de souplesse au développeur SQL.

Je pense que j’y consacrerai un autre article prochainement, car il y a encore beaucoup à dire sur ce sujet.

 

Récupérer la liste des travaux verrouillant une table DB2

J’avais publié en avril 2013, sur le site XDocs400.com, un article dans lequel j’expliquais comment récupérer la liste des travaux IBM i verrouillant une table DB2. Suite à la migration de mon blog sur un autre serveur et surtout sur un autre gestionnaire de blog, le lien vers l’article complémentaire suivant était rompu, c’est la raison pour laquelle je le republie aujourd’hui.

La technique – que j’ai présentée dans l’article posté sur le site XDocs400.com – consiste à écrire un programme RPG qui va faire appel à une API IBM, pour générer une liste des verrouillages dans une table DB2 temporaire. Un paramètre optionnel permet d’indiquer au programme RPG si l’on souhaite qu’il nous renvoie les informations sous la forme d’un « result set ».

Cliquez sur le lien suivant pour lire l’article dans sa globalité : Lien vers le dossier

Générer des Graphes en SVG avec PHP

J’avais lu il y a quelques temps un article très intéressant de Brian Venn (Software Engineer, IBM), publié sur le site DeveloperWorks, et qui s’intitulait :
« Render dynamic graphs in SVG »

Je vous encourage vivement à lire son article dont le lien est le suivant :

www.ibm.com/developerworks/xml/library/x-svggrph/

Les exemples de code fournis par Brian en complément de son article étaient écrits en Java, et j’ai eu envie de les réécrire en PHP, pour voir si je parvenais à un résultat intéressant.

J’ai obtenu un premier jet qui était un portage assez basique des classes Java écrites par Brian. Puis j’ai retravaillé ce code de manière à refactoriser certains éléments et à éliminer un peu de code redondant d’une classe à l’autre. J’ai également ajouté une interface pour améliorer la robustesse du code, et j’ai ajouté les méthodes setHeight() et setWidth() de manière à pouvoir définir dynamiquement les hauteurs et largeurs des graphes (elles étaient définies « en dur » dans la version proposée par Brian).

Au final, j’ai abouti à une classe modèle (SVGChartModel) servant de socle à trois classes instanciables permettant de générer les 3 types de graphes décrits par Brian Venn dans son article : SVGBarchart, SVGLineGraph et SVGScatterGraph.

La génération d’un graphe SVG se fait très simplement au sein d’un script PHP (ici le script barchart.php) :

$test = '10 20 30 40 50 60 70 100 25';
$graph = new SVGBarchart($test);
$graph->setWidth(800) ;
$graph->setHeight(600) ;
$graph->drawGraph();
echo $graph->render();

On note que les données sont ici transmises « en dur » via la variable $test, mais on peut les charger dynamiquement à partir de n’importe quelle source (XML, base de données, CSV…).

Ce script PHP est « appelé » dans une page HTML au moyen de la balise HTML « object », comme vous le verrez en analysant le code source joint à cet article.

Voici pour le principe général, pour le reste, je vous laisse le soin d’analyser le code PHP que je joins à cet article sous la forme d’un fichier Zip.

Exemple de graphes obtenus à partir des classes PHP jointes à cet article :

graphes_exemples

Code source à télécharger :

FichieSVGGraphDevWorksr ZIP

Lancement de script PHP en mode asynchrone sur IBMi

L’exécution de traitements en mode asynchrone est une problématique que les développeurs IBMi connaissent bien, avec l’utilisation des bonnes vieilles commandes SBMJOB (pour le lancement de travaux batchs) et WRKJOBSCDE (pour l’accès au planificateur de travaux).

Dans le contexte d’une application PHP s’exécutant dans un environnement IBM i, il est tout à fait possible d’utiliser ces même outils de soumission de travaux. Je vous indique la méthode de base ci-dessous, et ensuite je vous présenterai une méthode alternative, que je trouve beaucoup plus pratique, à savoir ZendJobQueue.

Cliquez ici pour lire l’article dans son intégralité.

Site en (re)construction

Bonjour,

Le site gregphplab.com fait peau neuve.

Pour ne rien vous cacher, je n’étais pas très satisfait par mon ancien gestionnaire de blog, alors j’ai profité du déménagement de mon site chez OVH pour passer simultanément à WordPress. Le temps de me familiariser avec l’interface utilisateur, et vous retrouverez rapidement les meilleurs articles de mon ancien blog, plus bien évidemment de nouveaux dossiers qui devraient vous plaire (enfin je l’espère :). En attendant, je vous invite à me retrouver sur le site XDocs400.com où j’ai commis de nombreux forfaits. Parmi les articles récents que j’ai publiés sur XDocs400.com, il y a notamment un article dans lequel j’explique comment émuler sous MySQL la technique des tables temporaires de DB2.

De plus, en attendant que j’aie réintroduit mes anciens articles, vous pouvez aller jouer dans les coulisses de mon site avec les quelques outils (il est vrai peu nombreux) que j’y ai déposés. Tiens, d’ailleurs je viens de me rendre compte qu’il y en a un (d’outil) qui ne fonctionne plus, suite au déménagement du site. On dirait bien que j’ai du pain sur la planche… 😉

Au fait, comme on est le 29 janvier, il n’est pas trop tard pour vous souhaiter une très très bonne année 2014.

Allez, à très vite pour de nouveaux sujets.

Grégory