{"id":4716,"date":"2020-02-11T16:46:45","date_gmt":"2020-02-11T15:46:45","guid":{"rendered":"http:\/\/gpmfactory.com\/?p=4716"},"modified":"2020-02-11T16:48:24","modified_gmt":"2020-02-11T15:48:24","slug":"saisie-codes-postaux-pour-oracle-apex","status":"publish","type":"post","link":"https:\/\/gpmfactory.com\/index.php\/2020\/02\/11\/saisie-codes-postaux-pour-oracle-apex\/","title":{"rendered":"Saisie Codes Postaux pour Oracle APEX"},"content":{"rendered":"\n\n\n<h3 class=\"wp-block-heading\">Objectif<\/h3>\n\n\n\n<p>L&rsquo;objectif est de disposer d&rsquo;une liste de valeurs des codes postaux\/Communes dans un formulaire afin de contr\u00f4ler la saisie du nom de la commune et v\u00e9rifier la coh\u00e9rence avec le code postal. On profite des am\u00e9liorations importantes qui ont \u00e9t\u00e9 apport\u00e9es sur les <strong>listes de valeurs<\/strong> dans la version <strong>19.1 et 19.2 d&rsquo;Oracle APEX<\/strong>, avec notamment le support de plusieurs colonnes en r\u00e9ception.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Approches<\/h3>\n\n\n\n<p>La premi\u00e8re approche triviale consiste \u00e0 importer <a href=\"https:\/\/www.data.gouv.fr\/fr\/datasets\/api-codes-postaux\/\">la liste des communes<\/a> depuis un site officiel puis \u00e0 la charger dans une table.  <\/p>\n\n\n\n<p>La deuxi\u00e8me approche a recours \u00e0 un web service REST. <br>L\u2019int\u00e9r\u00eat est d&rsquo;\u00e9viter la maintenance suppl\u00e9mentaire d&rsquo;un objet dans la database. Nous allons utiliser cette m\u00e9thode.<\/p>\n\n\n\n<p>Le site  <a href=\"https:\/\/geo.api.gouv.fr\/\">https:\/\/geo.api.gouv.fr\/<\/a>  fournit une <a href=\"https:\/\/api.gouv.fr\/api\/api-geo\">API<\/a> en open data qui r\u00e9pond au besoin. Le probl\u00e8me est que la liste des codes postaux pour une commune est fournie sous la forme d&rsquo;un tableau (<em>nested array<\/em>). Or dans la version 19.2, un <em>web module<\/em> ne prend pas en compte les <em>nested array<\/em>. Il faudrait par exemple un proxy pour <em>aplatir<\/em> la structure json.<\/p>\n\n\n\n<p><a href=\"https:\/\/datanova.laposte.fr\/\">La poste<\/a>, \u00e0 travers son portail datanova, fournit \u00e9galement une <a href=\"https:\/\/datanova.laposte.fr\/explore\/dataset\/laposte_hexasmal\/\">API<\/a> en open data. le r\u00e9sultat obtenu est exploitable avec APEX et c&rsquo;est ce web service que nous allons utiliser dans la suite.<\/p>\n\n\n\n<p>Voici un exemple d&rsquo;appel avec, comme crit\u00e8re de recherche, les noms de communes qui commencent par \u00ab\u00a0toul\u00a0\u00bb<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">https:\/\/datanova.laposte.fr\/api\/records\/1.0\/search\/?dataset=laposte_hexasmal&amp;q=toul<\/pre>\n\n\n\n<p>Pour information, il existe un autre site <em>https:\/\/vicopo.selfbuild.fr<\/em> qui  fournit une API ne pr\u00e9sentant pas l&rsquo;inconv\u00e9nient cit\u00e9 dans le site pr\u00e9c\u00e9dent.  Sa forme est tr\u00e8s simple: <em>https:\/\/vicopo.selfbuild.fr\/cherche\/{critere}<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Impl\u00e9mentation<\/h3>\n\n\n\n<p>C&rsquo;est la version d&rsquo;APEX 19.2 qui est utilis\u00e9e dans ce qui suit. C&rsquo;est \u00e0 partir de celle-ci que l&rsquo;on peut baser une LOV sur un web module.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Cr\u00e9ation d&rsquo;un web module <\/h4>\n\n\n\n<p>On cr\u00e9e dans Oracle APEX  un web module bas\u00e9 sur le endpoint  https:\/\/datanova.laposte.fr\/api\/records\/1.0\/search\/  et on ajoute deux param\u00e8trex de type  <em>Query String variable<\/em> :<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>dataset<\/strong> valeur fixe= <strong>laposte_hexasmal<\/strong> <\/li><li><strong>q<\/strong> valeur dynamique<\/li><\/ul>\n\n\n\n<p>Important: On pr\u00e9cise au niveau du second param\u00e8tre (<strong>q<\/strong>) que sa valeur sera pr\u00e9f\u00e9rentiellement utilis\u00e9e pour une recherche. (il s&rsquo;agit d&rsquo;une nouveaut\u00e9 dans la version 19.2): <strong><em>Use for Row Search<\/em><\/strong> <\/p>\n\n\n\n<p>L&rsquo;impact de ce r\u00e9glage est que APEX remplira automatiquement ce param\u00e8tre selon le contexte de la recherche: Si le web module est utilis\u00e9 pour un report, alors ce qui est saisi dans la zone <em>Search <\/em>alimentera le param\u00e8tre <strong>q<\/strong>. <br>Si le web module est utilis\u00e9 pour une LOV, alors ce qui est saisi dans le champs associ\u00e9 \u00e0 cette LOV sera utilis\u00e9 comme valeur de param\u00e8tre <strong>q<\/strong>. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><img loading=\"lazy\" decoding=\"async\" width=\"477\" height=\"251\" src=\"http:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-4.png\" alt=\"\" class=\"wp-image-4737\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-4.png 477w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-4-300x158.png 300w\" sizes=\"auto, (max-width: 477px) 100vw, 477px\" \/><\/figure><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Cr\u00e9ation d&rsquo;une liste de valeurs multi-colonnes<\/h4>\n\n\n\n<p>On indique que la source de donn\u00e9es de la nouvelle liste de valeurs est le web module cr\u00e9\u00e9 pr\u00e9c\u00e9demment.<\/p>\n\n\n\n<p>A partir de la version 19.2, il est possible d&rsquo;afficher plusieurs colonnes dans une popup LOV et on peut \u00e9galement injecter ces valeurs de colonnes dans plusieurs champs simultan\u00e9ment. Nous mettons \u00e0 profit cette fonctionnalit\u00e9 pour alimenter \u00e0 la fois le nom de la ville et la valeur du code postal.<br>Bien v\u00e9rifier que les colonnes soient visibles dans le tableau des colonnes retourn\u00e9es par la LOV. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Prise en compte dans un formulaire<\/h4>\n\n\n\n<ul class=\"wp-block-list\"><li>indiquer que le champs VILLE est bas\u00e9 sur une Popup Lov<\/li><li>Choisir la liste de valeur.<\/li><li>Pr\u00e9ciser le nombre de caract\u00e8re minimum \u00e0 entrer avant de d\u00e9clencher une recherche dans la LOV, autrement dit, avant de d\u00e9clencher un appel du Web Module.<\/li><li>Designer les autres colonnes qui seront aliment\u00e9es par la LOV. <\/li><\/ul>\n\n\n\n<p>L&rsquo;alimentation du code postal se d\u00e9clare en remplissant la propri\u00e9t\u00e9 \u00ab\u00a0champs suppl\u00e9mentaire\u00a0\u00bb sous la forme de couples s\u00e9par\u00e9s par un point-virgule: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\"colonne LOV: champs; colonne LOV: champs; ... \"<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Limitations<\/h4>\n\n\n\n<p><\/p>\n\n\n\n<p>Si la LOV est de type <em>Popup Lov<\/em>, Il faut activer l&rsquo;option <em>Entr\u00e9e manuelle<\/em>. La cons\u00e9quence que la popup se comportera comme un <em>combo box<\/em>. Sans cela, la lecture d&rsquo;un enregistrement existant tombe en erreur. C&rsquo;est dommage car cela oblige, d&rsquo;un point de vue ergonomique, \u00e0 cliquer sur la fl\u00e8che vers le bas pour faire appara\u00eetre la liste de valeurs.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"703\" height=\"412\" src=\"http:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-1.png\" alt=\"\" class=\"wp-image-4722\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-1.png 703w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-1-300x176.png 300w\" sizes=\"auto, (max-width: 703px) 100vw, 703px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Remarque sur les certificats<\/h4>\n\n\n\n<p>Sur une instance APEX install\u00e9e manuellement, il faut que le certificat du site appel\u00e9 en REST soit enregistr\u00e9 dans le <em>wallet <\/em>de la database. Dans le cas contraire, on re\u00e7oit une erreur de ce type:<\/p>\n\n\n\n<p>Remarque: Lors de la r\u00e9cup\u00e9ration du certificat, il a fallu que je choisisse la version du certificat encod\u00e9 en Base64, sinon cela ne fonctionnait pas sur une database Oracle 18c express.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"506\" src=\"http:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-2.png\" alt=\"\" class=\"wp-image-4723\" srcset=\"https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-2.png 530w, https:\/\/gpmfactory.com\/wp-content\/uploads\/2020\/02\/image-2-300x286.png 300w\" sizes=\"auto, (max-width: 530px) 100vw, 530px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Annexes<\/h2>\n\n\n\n<p>Il est possible de r\u00e9cup\u00e9rer le certificat directement sur le serveur avec une commande openssl, ce qui \u00e9vite le recours \u00e0 un navigateur. Cependant, je n&rsquo;ai pas pu obtenir un format adapt\u00e9 au wallet Oracle. Peut-\u00eatre s&rsquo;agit il du format Base64 non respect\u00e9 ?<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">openssl x509 -in cert.pem -text -noout<\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Objectif L&rsquo;objectif est de disposer d&rsquo;une liste de valeurs des codes postaux\/Communes dans un formulaire afin de contr\u00f4ler la saisie du nom de la&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"ppma_author":[150],"class_list":["post-4716","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"authors":[{"term_id":150,"user_id":1,"is_guest":0,"slug":"admin8700","display_name":"Patrick","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/209d5ed69b74d288390621ab4c1d3773?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4716","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/comments?post=4716"}],"version-history":[{"count":20,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4716\/revisions"}],"predecessor-version":[{"id":4745,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/posts\/4716\/revisions\/4745"}],"wp:attachment":[{"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/media?parent=4716"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/categories?post=4716"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/tags?post=4716"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/gpmfactory.com\/index.php\/wp-json\/wp\/v2\/ppma_author?post=4716"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}