Category: FileMaker

  • COVID-19-Triage disponible pour tous les hôpitaux

    COVID-19-Triage disponible pour tous les hôpitaux

    Devant le succès de l’application personnalisée dont nous vous parlions la semaine dernière, réalisée dans l’urgence pour l’hôpital Sint-Elisabeth de Zottegem (Belgique), nous avons décidé d’améliorer l’application et de la rendre disponible pour tous les hôpitaux.
    Elle s’appelle COVID-19-Triage, et permet de gérer un arbre de décision sur iOS. L’arbre de décision lui-même peut être édité sur n’importe quel éditeur de texte, puis communiqué au personnel soignant, qui peut naviguer dans cet arbre sur iPhone ou iPad.

    C’est tout simple, c’est gratuit, et apparemment ça aide à sauver des vies.

    C’est ici.

  • Covid-19 – arbre de décision pour un service hospitalier

    Covid-19 – arbre de décision pour un service hospitalier

    Comme vous le savez peut-être, 1-more-thing est particulièrement impliquée dans le combat contre le Covid-19. Nous avons notamment monté le projet 1app2recover dans le but d’aider les gouvernements à organiser une sortie du confinement quand ce sera possible.

    Mais il y a parfois des efforts plus directs et plus modestes par leur ampleur qui permettent d’aider très immédiatement les vrais héros de cette lutte : le personnel des services hospitaliers d’accueil des malades Covid-19.

    Hier matin, je trouve dans ma boîte mail un message de Chris Kubica (@chris_kubica), de join::table (@JoinTableTeam), un groupement qui met en relation des développeurs FileMaker avec des organisations sans but lucratif, pour participer à des projets bénévolement (pro-bono)

    Un consultant, Joop Verelzen, de GDPR, travaille auprès d’un hôpital a besoin d’aide pour un projet.

    Je me mets en relation avec lui, et il m’envoie cette photo :

    Hôpital : decision tree

    On y voit un médecin ou un infirmier qui a vraisemblablement décroché un poster du mur, avec un arbre de décision pour orienter les patients.

    On imagine comme la chose s’est faite dans l’urgence, mais aussi à quel point l’utilisation doit être contraignante, ne serait-ce que parce qu’il faut être devant le poster pour savoir quoi faire.

    Ni de une ni de deux, je me mets au travail, et une heure plus tard (ça va vite avec FileMaker) je renvoie à Joop ma copie : une application installable sur FileMaker Pro (que l’hôpital utilise déjà) ou sur FileMaker Go ou en Web Direct pour une mobilité dans le service.

    Elle permet au médecin de modifier l’arborescence facilement et de naviguer de manière très simple dans cet arbre.

    Ci-dessous une petite video sur la solution technique.

    Bien sûr si cette mini-application peut aider un autre hôpital, elle est disponible !

    PS : contrairement à ce que je croyais, l’hôpital en question est en Belgique et non aux Pays-Bas.

  • filemaker2tableau, une nouvelle façon de connecter vos bases FileMaker avec Tableau

    filemaker2tableau, une nouvelle façon de connecter vos bases FileMaker avec Tableau

    Parfois, un leader ne peut se contenter de ce qui est simplement à disposition. En tant que 1-more-thing, leader mondial dans l’intégration FileMaker/Tableau, nous avons ressenti le besoin de développer notre propre connecteur.

    Aujourd’hui, nous avons le plaisir de vous annoncer la mise à disposition gratuite et en Open Source de notre connecteur FileMaker pour Tableau : filemaker2tableau !

    Ce connecteur se base sur la dernière version du Web Data Connector (WDC) de Tableau et bénéficie d’une interface simple et intuitive pour relier vos données FileMaker avec vos tableaux de bord Tableau Software. vous gagnerez ainsi du temps dans la phase de préparation de vos sources de données.

    Les avantages en comparaison du connecteur natif fourni par Claris sont nombreux :

    • Auto-complétion de la liste des bases de données
    • Auto-complétion de la liste des modèles disponibles dans un fichier
    • Connexion “multi-table” : connectez plusieurs modèles à la fois pour tout importer en une fois !

    Pour l’installer, rien de plus simple :

    • Téléchargez la dernière version sur GitHub (et oui c’est gratuit et open source !): https://github.com/1-more-thing/fm2tableau/releases/latest
    • Décompressez son contenu dans un sous dossier du repertoire web de votre serveur FileMaker:
      • Windows :
        C:/program Files/FileMaker/FileMaker Server/HTTPServer/conf
      • macOS:
        /Library/FileMaker Server/HTTPServer/htdocs/httpsRoot
    • Accédez au connecteur dans Tableau en utilisant l’adresse de votre serveur et le nom du dossier dans lequel le connecteur a été installé (ex: https://mon.filemaker.server/fm2tableau)

    Notes importantes :

    • Le connecteur doit être installé sur le serveur FileMaker qui publie les données (restrictions CORS)
    • L’authentification oAuth n’est pas encore supportée (mais ça va venir)
    • Les prérequis sont les même que pour le connecteur natif de FileMaker Server (dataAPI activé sur le serveur et comptes avec le privilège fmrest activé pour l’accès aux données)

    Connectez FileMaker et Tableau en 30 secondes

    filemaker2tableau video

  • Quelle semaine !

    Quelle semaine !

    Eh bien ! il y a des semaines où il s’en passe, des choses !

    Bien sûr, la grande nouvelle de la semaine dernière, c’est la sortie de Claris Connect.

    Nos vidéos en français et en anglais on battu des records en nombre de vues, et ont été re-publiées par certains media spécialisés comme

    MacGénération

    ou mac4ever

    Dans la foulée, nous avons reçu le “grade” de Claris Connect Partner de la part de Claris International, qui atteste du fait que nous avons suivi les formations correspondantes et sommes capables de vous conseiller efficacement sur les plans techniques et commerciaux à propos de la plateforme Claris Connect.

    Marketplace

    Mais les bonnes nouvelles ne venant jamais seules, deux de nos produits occupent les deux premières place du FileMaker Marketplace mondial !

     

    #1 : Nutshell Console est un outil qui s’installe sur un serveur FileMaker et permet d’une part de configurer et d’administrer facilement certains aspects de FileMaker Server inaccessibles par la console d’administration standard, mais d’autre part, et surtout, Nutshell Console permet de tirer des statistiques, de monitorer l’activité du serveur et de détecter facilement les causes d’un problème ou d’un ralentissement.

    #2 : FM Audit Log 2.0 est une solution native FileMaker que les développeurs peuvent implémenter dans leurs applications afin de garder une trace de toutes les modifications de données. Compatible avec FileMaker Pro, FileMaker Go et FileMaker Web Direct, FM AuditLog Pro 2.0 permet également de revenir en arrière (roll-back)

     

  • Claris Connect : la nouvelle plateforme d’intégration/orchestration

    Claris Connect : la nouvelle plateforme d’intégration/orchestration

    Claris a officialisé aujourd’hui la sortie de sa plateforme d’intégration et d’orchestration : Claris Connect.

    Lors de la DevCon 2020, Brad Freitag (@bradfreitag), CEO de Claris International, annonçait le rachat par Apple/Claris de la startup italienne Stamplay.

    Quelques mois plus tard, Claris Connect est né ! Cette plateforme permet de créer et d’automatiser des flux de données très complexes en quelques instants seulement… et sans compétence technologique particulière.

    Ce qui demandait il y a encore peu des jours de développement pour intégrer différents services web peut désormais se faire très facilement, en incluant de la logique, de la gestion d’erreur, des transformations…

    Giuliano Iacobelli
    Giuliano Icacobelli (@Giuliano84), fondateur de Stamplay & Fabrice Nordmann (@FabriceN), 1-more-thing

    Mais pour mieux comprendre, le mieux est sans doute encore de regarder cette vidéo de présentation en français, par Romain Dunand (@airmoi).

    Dans cet exemple, nous intégrerons un site sous WordPress avec le plugin Woocommerce, FileMaker Server et Office 365. Notez que Claris Connect est tout à fait indépendant du logiciel FileMaker, qui n’est utilisé ici qu’à titre d’exemple.

  • FileMaker lance son Marketplace

    FileMaker lance son Marketplace

    C’est aujourd’hui que Claris lance son FileMaker Marketplace. Et devinez qui a les honneurs de la première page ?

    Nutshell Console bien sûr ! Le produit phare de la saison, cité à de nombreuses reprises lors de la dernière DevCon à Orlando.

    Mais au-delà de cette petite satisfaction, nous sommes très enthousiastes à l’idée de ce FileMaker Marketplace. Pour l’instant, le contenu est encore limité quoiqu’on y trouve déjà de bons contenus (apps, formation…), mais nous sommes surtout convaincus qu’à terme il contribuera à offrir à la plateforme une visibilité incomparable à celle qu’elle connaît aujourd’hui.

    Nous avons même quelques projets qui pourraient intéresser les développeurs. Si cela vous intéresse, n’hésitez pas à prendre contact avec nous ou à nous rencontrer lors des conférences européennes à venir (défilez en bas de la page pour les conférences européennes)

  • FileMaker Inc. devient Claris

    FileMaker Inc. devient Claris

    Un petit mot en direct de la FileMaker DevCon, la conférence annuelle des développeurs FileMaker qui se tient cette année à Orlando, et à laquelle participent pour 1-more-thing Romain Dunand et votre serviteur.

    Brad Freitag, le nouveau CEO -qui avait occupé préalablement pendant six ans le poste de directeur des ventes— a fait quelques annonces fracassantes à l’occasion du keynote inaugural.

    La plus frappante est le changement de nom de la société FileMaker Inc. qui (re)devient Claris (le nom complet est Claris International Inc.). Il est important de noter que le nom du produit demeure FileMaker, ce changement de nom a donc un impact limité sur notre quotidien et celui de nos clients. Toutefois, cela représente une belle opportunité de marketing et de rafraichissement de l’image de notre plateforme, et cela lui donnera plus de visibilité.

    Giuliano Iacobelli
    Giuliano Icacobelli, fondateur de Stamplay & Fabrice Nordmann, 1-more-thing

    Mais la raison pour laquelle ce changement devait avoir lieu est en revanche extrêmement excitante : Claris aura désormais d’autres choses à vendre ! En effet, Brad Freitag a annoncé l’acquisition récente de Stamplay, une startup dont la technologie est parfaitement en ligne avec le positionnement “Workplace Innovation Platform” de FileMaker. Claris Connect, le nom sous lequel seront déclinés les produits de Stamplay permettra d’aller encore plus loin et plus vite dans l’orchestration de toutes les technologies et tous les services utilisés par une entreprise. Nous sommes absolument ravis de cette stratégie sur laquelle nous ne manquerons pas de revenir.

     

     

     

    Devcon Keynote Nutshell Console
    Brad Freitag, CEO de Claris, présente Marketplace et… Nutshell Console

    Enfin, nous avons eu le plaisir de voir notre produit, Nutshell Console, mis à l’honneur par Brad Freitag à l’occasion de l’annonce du Marketplace. Nutshell Console a d’ailleurs été cité plusieurs fois lors des sessions de la première journée, confirmant sa place de produit phare de cette saison de la grande série FileMaker. Pour fêter cela, Nutshell est d’ailleurs en promotion pendant la conférence (30% de réduction sur la première année avec le code fmdevcon19)

  • FileMaker Devcon Istanbul

    FileMaker Devcon Istanbul

    Nous sommes heureux de sponsoriser la première édition de la conférence FileMaker Devcon Istanbul, qui se tiendra les 22 et 23 juin prochains.

    Nous souhaitons bonne chance aux organisateurs Cabitaş, et que cette édition soit la première d’une longue série.

    Nous profitons également de l’occasion pour faire connaître nos partenaires Winsoft International, éditeur basé à Grenoble et qui édite les versions internationales de FileMaker, notamment pour les langues orientales ou s’écrivant de droite à gauche. Leur technologie permet notamment de concevoir des modèles “en miroir” indispensables pour travailler en Arabe ou en Hébreu.

  • Quick Find: the forgotten feature

    Quick Find: the forgotten feature

    Released with FileMaker 11, more than 8 years ago in 2010, Quick Find is probably one of the most underestimated features in FileMaker.

    For some reason, there wasn’t even much emphasis in the product marketing when it was released. Platform evengelists would mention it as a ‘Google-like search engine within FileMaker’, product documentation said ‘search in all fields of current layout’, but it was never said clearly how powerful this feature is.

    And it is extremely powerful.

    First of all, let’s sum up the various implementations of Quick Find in the product.

    • Quick Find search field in the toolbar. This is probably the first thing one would mention while thinking about Quick Find: the Toolbar includes a search field where the user can type criteria and trigger the find hitting Enter. There’s already something to mention about it: this search field is available only in browse mode. It would, I think, make perfect sense to have it also in find mode. It is common to see users first think they want to find something and therefore switch to Find mode, then only to realise they could use Quick Find. They have then to go back to browse mode before they can use it, which is a bit odd and might be a reason why Quick Find isn’t as seamless as it could.
    • Perform Quick Find script step. Does the same as hitting enter while the search field is active, except the criteria can be specified. It is therefore trivial to build your own Quick Find interface, and it works in Find mode too!
    • In layout mode, Quick Find badges at the bottom right of layout objects. The Magnifying glass can be green or orange, depending on how fast FileMaker presumes the find will be. Basically, it’s green for indexed or indexable fields of current table, and orange for unindexed or related fields. Note that I wrote ‘layout object’ and not field: a text object including merge fields can be included in Quick Find index. Other types of objects can’t, even if they include layout level calculations (button bars, web viewers, tab panels) or merge fields (buttons).
    • In the inspector behaviour panel, a checkbox labeled ‘Include field for Quick Find’ is active when a field or a text object containing merge fields is active. Very unfortunately, FileMaker has decided from the beginning that every new field object added to the layout would be included by default in Quick Find. This is, from my point of view, the main reason why this feature is underestimated and, I would say, rather dangerous. Because the first Quick Find performed on a layout will trigger the indexing of all indexable fields included in the Quick Find, having all these fields included will cause a huge, unnecessary index. Quick Find is powerful because you can select which fields are included, but having them selected by default weakens the feature itself: who would like to search in a phone number or in a boolean in the context of a Quick Find? It ends up in returning irrelevant data, and causes the index to grow incredibly.
    • In the layout format dialog, a checkbox labeled ‘Enable Quick Find’, checked by default allows to disable Quick Find on the layout. The badges mentioned above are then greyed out, and the Quick Find search field is disabled in browse mode. Next to this checkbox, a button says ‘Reset Quick Find’, which basically will include all fields for Quick Find, because this is the default setting)
    • Finally, still in layout mode, in the View/Show menu, you can enable or disable the layout badges. By default they are disabled, which is a pity because this is your only chance to avoid having too many fields included in the Quick Find. These show options have to be adjusted before you upload the file on a server, otherwise you’ll have to set them again for every session.

    Tips and tricks

    Here are a few things you should know before we come to the core of this blog post

    • Quick Find doesn’t support operators like *, …, //, =, ==, etc.
    • There is no ‘constrain found set’ or ‘omit record’ equivalents. You can’t use Quick Find to fine tune a previously found set of records.
    • Error trapping is different for Quick Find than with a simple Perform Find. Namely, if you get a 401 error (no records found), the previous found set is preserved, whereas with Perform Find you end up with 0 (zero) record. So if you’re used to trapping the error with Get ( FoundCount ) = 0 instead of Get ( LastError ) = 401 , you’ll have to adapt your scripts for Quick Find.
    • Fields on the right hand side of the layout and therefore not visible in form and list views can be included in Quick Find. A very clear and easy way to manage fields that are included in Quick Find is to select all objects from the left (visible) part of the layout and uncheck the ‘Include field for Quick Find’ box, and on the right part, add a Quick Find zone with only the fields you want to search, and of course include them in Quick Find.
    • If your solution hides the toolbar completely and you’re sure the users won’t use the toolbar Quick Find search field, you can push this logic a bit further and disable Quick Find on the layout and create dedicated layouts with only the fields you want to perform Quick Find on. This way you’re sure than even if you add some fields to your main layout, they won’t be included in Quick Find, because it’s disabled there.

    Now the big thing

    But wait, didn’t I write that the power of Quick Find was underestimated? so where’s this power I was talking about?

    Well, it’s simply the way Quick Find does search. Because we’ve had the classic Find mode and Perform Find script step for so long, many overlooked the Quick Find feature thinking it was just like a find, but on many fields at a time.

    Say I have a Contact table with firstName, lastName, occupation, city, of which firstName is the only field not included in the Quick Find. And I’m looking for a plumber in Cincinatti. What you would do with the classic find is

    • go to find mode
    • enter ‘plumber’ in the occupation field
    • enter ‘Cincinnati’ in the city field
    • hit enter to perform the find

    In the old days, if one wanted to propose a ‘Google-like’ search (even before we’d heard of Google), he could add an indexed calculation field to the table like

    city & " " & lastName & " " & occupation

    and enter ‘plumber Cincinatti’ in find mode, and that’s because FileMaker considers individual words in the same field as criteria with an AND operator.

    But with Quick Find, you don’t have to create this field because what Quick Find does is NOT

    • go to find mode
    • enter ‘plumber cincinatti’ in lastName
    • new request (OR)
    • enter ‘plumber cincinatti’ in occupation
    • new request (OR)
    • enter ‘plumber cincinatti’ in city
    • perform find

    If it was this, then no records would be found because none of the fields contains the 2 words.

    What Quick Find does just cannot be done with Perform Find. It takes each word and does all possible combinations. So with ‘plumber Cincinatti’, it takes the first word (plumber) and finds all records where one of the 3 fields contains ‘plumber’ and then among those, it finds all records where one of the 3 fields contains ‘Cincinatti’. This explanation has nothing to do with HOW it does it (the process is probably very different from this). I’m only trying to explain WHAT it does.

    But the magic doesn’t stop here. This combinatory search also works with related records! So you can for instance search for ‘plumber Cincinatti approved supplier’ where ‘approved supplier’ is a value to be found in the related company table. The only thing you have to do is insert that field on the layout and make sure it’s included in the Quick Find.

    In the attached sample file, you will see a search engine that gets results from multiple tables. In the old days, you would have had to draw complex relationships with a bunch of ≤ and ≥ criteria, calculated fields and all. Look now how simple it is to perform Quick Finds, get the results to a global field and display the result with a simple relationship.

    I hope you learned something with this blog post. Please feel free to drop a line here under in the comments.

    [vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. 1MT_QuickFind.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • Master/Detail and Detail/Master

    Master/Detail and Detail/Master

    One of the most important features of FileMaker 17 is the “current found set portal”. It makes it easy and fast to display the list of found records on the layout (Master/Detail).

    Not only does it display them, but it allows to browse records with a single click, without having to write a script or add a button.

    Besides, it reflects the sort order, which means you can now design a real Master/Detail view.

    In this demo file, I’ll show you a few tips, among which:

    • how to use the new Get ( ActiveRecordNumber ) function to highlight the current record in the portal
    • use the found set portal to browse records, and a simple button bar to act as a sortable column header

    But also, on a second layout called Detail / Master, you will see what happens if we inverse the perspective and use the current found set portal as the main item of the layout body. We can suddenly use ‘list views’ on a form layout. Benefits:

    • avoid the annoying “No record message” of FileMaker list view when user clicks on the body
    • edit the record in a form without leaving the list view (right pane)
    • add an action / navigation bar on the whole list height (left pane)
    • you can now adjust the window and control its height

    There is a missing feature though: no sub summary layout parts.

    Enjoy!

    [vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. 1MT_MasterDetail.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • Client Side Virtual List

    Client Side Virtual List

    [vc_row bg_color=””][vc_column][vc_column_text]Last June at dotfmp 2018 in Berlin, we had the great honnor to welcome an esteemed Californian member of the FileMaker developer community, Kevin Frank (@FileMakerHacks)

    Besides being a long time friend -I remember the old times when participating in our ‘Friday Night Chat’ at 3AM CET wasn’t an issue for my young, fast-recovering body- he’s always been and still is one of the most talented and clever writers on the topic of FileMaker. I love (I somehow share, I hope) his kind of scientific approach to FileMaker, and his blog FileMaker Hacks is an endless source of information and inspiration.

    At dotfmp, he presented two sessions in a row about virtual lists. I’m not going to repeat everything he said there because some of it is available on FileMaker Hacks already, and I wouldn’t pretend here to be able to fill the gap between what can be read there and what you perceive while listening to someone in person.

    But the magic at dotfmp is that it is an unconference. And the schedule evolves all the time, so a session can be extended in another, or a discussion can be scheduled almost on the spot and everyone notified, thanks to the great web tools Egbert Friedrich (@dotfmp) and Andries Heylen (@AndriesHeylen) have put together.

    Kevin’s virtual list sessions made me think I should show something on the subject, so Laurent Spielmann (@laurent_at_joes) and I pushed a new session to the calendar, and here it goes (thanks to Heidi, room moderator and keeper of the keys 😉 )

    Laurent and I have spent a large part of our time during the two last years working on a big project. The application manages tens of gigabytes, super intensive activity (24/7, 120 users), constant imports from various data sources, 4 servers, 40 files… a beast.

    Why a virtual list?

    InterfaceTo make a long story short, the application is about booking management and all the customer support that goes with it.

    In the main interface used by the greater part of users, there’s a portal showing all the interactions with the customers, providers…

    There is a lot of different things in there: incoming and outgoing e-mail, sms, notes, internal messages… a lot. Each is also displaying data more that 1 table occurrence away (user, department…)

    Because FileMaker portals (and list views) can only represent records, as opposed to a result of a query on various tables (union), we would usually tend to denormalize data and store all these different things in the same table. But with such an amount of data, this would be unimaginable. Not only is the data split accross multiple tables, but also accross multiple files.

    As a result, a virtual list is a good option for the UI.

     

    Previous situation

    In fact, the solution we had designed in the first place was not really a virtual list. It was a somehow-but-not-really-virtual list. For each record in one of the data tables, we would create a record with a minimal amount of data in a UI table. Basically, it contained the booking ID (booking being the main record from which we need to see the related data), and the UID of the related record.

    All the rest (displayed data, tooltips, data used in conditional formatting…) was obtained using unstored calculations. So a record of our interface table could display information coming from an inconming e-mail, an outgoing sms and so on.

    So in a way, this list was virtual because the data it displayed was not stored in its table but using unstored calculations. But on the other side it wasn’t virtual because the records really existed. A booking record had n related records in the view table.

    After a year and a half of production, this almost empty table was about 13 gigabytes (most of which was index). We had to do something.

    previous situation

    Why not a really virtual list?

    At this point, you might wonder why we hadn’t chosen a truly virtual list.

    There are two reasons that combine.

    1. avoid data transfert over the network. An approach of the virtual list is to get all the required data in one or more global fields, and then parse it in different fields or repetitions using unstored calculations. In this application, it is common to load a record of which you see only a few related records, without scrolling to see all related data. Therefore there is no need to download all the data into a global field. With 120 users on the network, downloading so much unnecessary data would have been a problem. So we knew that even if we would go for a virtual list (every user would look at the same records, but each record would display something different, depending on which booking is loaded), the data would have to be unstored and related (i.e. data for an incoming e-mail would still reside in the incoming e-mail table)
    2. given 1, the number of users also has an impact on the unstored calculations. If 120 users are looking at the same records (but viewing different related data), experience tells us an application becomes sluggish. This would not be the case if the data was not related but entirely in the virtual list. But as explained above, it was not possible in our case.

    And suddenly came… FileMaker 16

    Just when we needed to tackle this file size issue, FileMaker 16 was released. And with it the solution to our problem.

    The feature that helped us is the ability to define an External FileMaker Data Source as a variable. To me, it’s the most important change in recent years. It widens the horizon tremendously, with all sorts of uses and contexts.

    In this instance, we used it to eliminate the ‘too many users issue’ by loading the virtual list on each client.

    Here are the steps that we took:

    Change in the data model

    This steps doesn’t apply to most situations. It was necessary in ours, but I could write another blog post just on it.

    In the previous situation we had millions of records with basically foreign keys (one for the booking, one for each source of related data). The rest was all unstored calculated fields.

    We wanted to get rid of them and have only one record per booking with all the required information. We could even have added this to the booking table, but the plan was NOT to make this table heavier (and there are plenty of other reasons why we wouldn’t do that, but they’re off topic).

    So we went for a CLOB-like approach. In our new table, we had of course the booking ID (foreign key), and another text field in which we needed to store everything we need for the virtual list.

    So say that each row of our portal had a id_user, potentially some keys among: id_provider, id_customer, id_incomingEmail, id_outgoingEmail, id_incomingSMS…

    We defined a format, using pipe as separator “|” for fields (which makes it a not-a-CLOB, one could argue), and ¶ for records.

    So for 1 booking we could have


    |user345|||outSMS||
    ||||inEmail2048|||

    and so on. So each row of the future portal would have to look up to 1 line only.

    This is off topic, but once we agreed on the format, we wrote a script to transform our existing data into this new.

    The first time we ran it and measured performance, we concluded that a fast computer would need about 9 months to process all.

    So we tried to optimise. The time fell to 4 months. Better. Not good enough. We were not in an emergency, but I can’t let a computer working for 4 months just to transform some data. No way. No, no, no.

    Then I asked the community. What language would you use to do this? I had the intuition that Python was a good option. Indeed, several people suggested it to me. That was reassuring.

    But two developers that I value immensely, David Wikstrom (@CamelCasedata) and Clément Hoffmann raised their hands and said “R”.

    David wrote a small application in R, and it took exactly 8 minutes to do the job FileMaker was doing in 4 months. So just to say: never let the system beat you. There’s always a way.

    So now instead of having between 1 and 250 records for each booking in the old view table, we have exactly one.

    Of course, this change in the data model had immediate impact: we also needed to modify the processes that used to create/edit/delete records. Now it should only work in this single record (add a line, remove a line, edit a line). But this was quite trivial.

    New situation

    The Local File

    Thank you for reading this all the way, but so far there is really nothing about a ‘Client Side Virtual List’, and this blog entry looks more and more like some link bait.

    Don’t worry, here it comes.

    We created a new file that was to be open (hidden) by the client. It has references to all hosted files it needs to get its data from or resolve unstored calculations. The external references point to the server with an absolute path. (fmnet:/<server>/<filename>)

    As the file will not contain any other data than IDs, we went for a very straight forward security policy with a auto-login defined in the file options.

    The file (Localfile.fmp12), with no data at all was then inserted in a container of the Settings table (a single record table) of the main file.

    Since FileMaker 16, you can define a FileMaker External Data Source using a variable, meaning that each user for instance can have his own source.

    So we defined in the main file (the one with the portal), a variable data source pointing to the client temporary folder, followed by the local file name.

    Note: you need to do this before any call to that datasource is made, even implicitely. Namely, it means that not only should you declare this variable in your startup script, but also you can’t have any reference to the external source in the startup script, because at runtime, FileMaker will resolve all external references when the script begins. Any call to this external source should happen in a subscript.

    Startup script

    1. Startup script begins
    2. A variable is declared: Set Variable [ $$localPath ; Get ( TemporaryPath ) & “Localfile.fmp12”]
    3. Perform script [ Install local file ]
    4. Do other things without any reference to the local file, otherwise the existence of the other file will be resolved in 1. With no chance to declare a variable (2.), and therefore leading to a ‘file missing’ situation.

    Subscript (Install local file)

    1. Go to layout [ Settings ]
    2. Export Field Contents [ containerField ; $$localPath ] // the container field contains the client side file.

    That’s it! Now all we have to do is to load the virtual list. For this we use a simple lookup.

    Then a loop creates as many records as we need to display. And we can delete them on next run (remember it runs locally, there is no impact on other users because they’re working on their own file). The load script is triggered onRecordLoad on the main file.

    An optimisation we made was to split the virtual list into several (1 per ‘column’) before we create the records. This made the system even faster.[/vc_column_text][/vc_column][/vc_row][vc_row color=”color7″ text_color=”color4″ global_atts=”yes” style=”padding-x: 5px; padding-top: 25px; align: center; ” bg_color=””][vc_column width=”1/4″][ish_icon icon=”icon-download” align=”center”][/vc_column][vc_column width=”3/4″][vc_column_text global_atts=”yes” css_class=”btn btn-primary”]Download a sample file here. ClientSideVirtualList.zip

    Please share if you liked this post.[/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_row_inner][vc_column_inner width=”1/1″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row]

  • dotfmp Developer Challenge

    dotfmp Developer Challenge

    At recent dotfmp conference in Berlin (did I already mention this is the best FileMaker conference I know?), a developer challenge was orgnised.

    The challenge was to find the fastest way to download data from a FileMaker hosted database to a FileMaker Pro Client over the network.

    The table had 50K records (10 fields) of which only 10K had to be downloaded.

    But the important thing was that data, once on the client, had to be in any structured, workable, searchable form, not necessarily records/fields.

    @AndriesHeylen and I came up with a solution that I believe was considered interesting by the audience, so I’ll share it here, not to say that this is the best way or that I would necessarily use it in production, but I think it’s valid and it’s a good opportunity to visit some nice tricks.

    I’ll write this post in a kind of story-telling style, because I think the path we followed was as interesting as the solution, if not more.

    To rephrase the challenge, here is what needed to be done:

    1. select 10 000 records among 50 000 (any would do)
    2. transform the data stored in a table into something more appropriate for the next steps
    3. make the data transit over the network from the server to the client
    4. ‘render’ this data as a structured array, if that was not already the case, depending on what we would do during step 2.

    For each of this tasks we had many options in front of us. So because we hadn’t the time to explore them all (oh yes, I forgot to mention that we had approximately 45 minutes to solve this… while eating in a nice Vietnamese restaurant on Kastanienallee)

    So our first approach was to brainstorm about each step independently, so we would only see later how our favorite (supposedly fastest) techniques would combine nicely.

    Before we begin, let’s mention that there was one ‘obvious’ solution that was doing the whole thing: declaring a variable on the client, using ExecuteSQL function.
    ExecuteSQL ( "SELECT * FROM Datset FETCH FIRST 10000 ROWS ONLY" ; "#F#" ; "#R#" )
    Where #F# is a custom field separator and #R# a record separator.
    We didn’t follow that path because… there was no fun, and we still had 44 minutes to go.

    For step 1, selecting the records, we thought about 2 different ways:

    • through the found set
    • through a query

    A SQL query could be used in the context of an ODBC import (Import records from ODBC), but there’s a no go for this: the only output of Import records is… creating/updating records. We knew that this would take too long, so this ‘easy to solve’ first step showed us immediately that our strategy was not perfect.

    Before we could brainstorm on each step independently, we needed to exlude ways that we knew for sure would slow down the process.

    We identified 3 potential bottlenecks that we wanted to avoid

    • A – pre-formatting the data on the server using unstored calculation. Even with a simple calc this would be expensive, and it would make the solution not scalabale.
    • B – parsing data on the client, including creating records: data had to be ready to use or should not need more than a global transformation, not a per record or per field one.
    • C – sending a long text string over the network: we assumed it would take longer than if the string was encapsulated in a file

    Given this, we browsed the 4 steps

    1 – Select the 10K records

    To select the 10K records we could only use the foundset since the SQL Query could happen only in Import Records, and we didn’t want to import records (B)
    So we would run a script like:
    Go to layout [ Data ]
    Show all records
    Go to record [ First ]
    Omit multiple [ 10000 ]
    Show omitted only

    2 – Export records

    To avoid A and C, we thought the best way was to Export records to a text file (CSV)

    This made it clear that the main process (including step 1) should be a server side script because the export would be much faster on the server.

    We chose CSV because we believe this is the fastest, but we knew there was a glitch there: the result would not be very easy to use because the flavor of CSV FileMaker uses for its exports, using comas, double quotes and separator for multiline contents is not easy to parse using FileMaker calculation functions (certainly doable, but not easy)

    So we thought that if we had time (there was still 25 minutes to go), we would use XML/XSLT instead. It wouldn’t make a big difference in terms of performance.

    3 – Make the data transit over the network

    What we know (or think we know, which are two different things) is that sending a long string as a script result would take long. So we wanted to return a text file instead (C). Now that I’m writing this post and that I have much more time, I wonder if we shouldn’t have simply returned the text file as a script result (script results, as script parameters or variables can be of type container). But while on a hurry we went for something different: we created a ‘transfers’ table with a container field and an indexed ID field (serial number)

    So after exporting (2) our process:

    • creates a new record in ‘transfers’
    • inserts the file into the container (using Insert from URL and the file protocol, because Insert File is not server compatible)
    • exits the server side script with the ID of the transfer record as a result (token)
    • the calling (client side) script gets the token using Get ( ScriptResult )
    • goes to the transfers layout
    • finds the transfer record

    I should mention that inserting a file using insert from URL ate a full 5 minute of our time, therefore ruining our hopes to order desert. This was due to a change in FileMaker 16 that we had forgotten: to convert the path to where we export the records to into a URL from which we can insert the file, we have to remove the system drive. But since version 16, Get ( SystemDrive ) returns empty on FileMaker Server on macOS, so we have to extract it from the Temporary Folder path.

    4 – Extract the data into a variable

    OK, so now the client has a text file. It’s stored in a container field of the current record, but it could have been available as a script result.

    What we now have to do is to read this text file and ‘extract’ its content into a string.

    To do this we simply use this not so simple calculation :

    Base64Decode ( Base64Encode ( transfers::file ))

    In fact we could also use simply TextDecode ( transfers::file ; "UTF-8" ), but it only occurred to me later on. And as a matter of fact, we had several questions about the former expression while presenting our solution, so I’ll try to give a bit of explanation.

    Base64 is a encoding algorithm that allows encoding any data. This is very much used to embed binary files in a text, like for example an image in a html e-mail when you don’t want the image visualisation to rely on an internet connection. It is not an encryption method, although a base 64 encoded text is not readable by a human being (that I know, that is to say).

    So basically Base64Encode and Base64Decode are two inverse functions, which means that

    Base64Decode ( Base64Encode ( "abc")) = "abc"

    But it’s not as easy as this and I’ll try to give a clearer explanation that the one I gave when I was asked in Berlin.

    In this process, a text can be in 3 different states:

    • 1⃣ a string (data of type text in FileMaker)
    • 2⃣ Base64 encoded text
    • 3⃣ encapsulated in a text file

    Base64Encode ( data ) converts a string or a file to a Base64 encoded text depending on the parameter it receives (1⃣➡2⃣ or 3⃣➡2⃣)
    Base64Decode ( text {; fileNameWithExtension } ) converts a Base64 encoded text to a string (2⃣➡1⃣) or to a file (2⃣➡3⃣) depending on whether you pass a filename or not.
    So the two functions are inverse, but on two different operations.

    base64 encode Decode diagram
    In our example, Base64Encode translates a file into Base64 (3⃣➡2⃣) and Base64Decode translates the base64 encoded string into a string (2⃣➡1⃣).

    But again, TextDecode (released with FileMaker 16) is the best option.

    That was it, we had 4 minutes left, so just the time to wrap all this in 2 scripts (client side and server side), and add some performance measurement using get ( CurrentTimeUTCMilliseconds ) while paying the restaurant bill, fold the mac and head to the conference room where the solution had to be presented.

    Running on a local machine (with FileMaker Server and Pro Advanced on the same computer), the whole process was taking 0.4 seconds. On a local network (WIFI, quite busy and unstable, it took between 0.6 and 0.8 seconds). Not bad.

    Please do not hesitate to share your ideas or leave a simple comment below.

    client side script

     

    server side script

     

    Download the FileMaker file here: dotFMPcdotFMPchallenge (Admin / 1234)

  • Data Migration Tool : repensons le versioning

    Data Migration Tool : repensons le versioning

    Notre approche en tant que développeurs d’applications sur mesure est d’apporter des solutions évolutives à nos clients.
    Leurs besoins progressent, et ils souhaitent adapter rapidement leur outil à la réalité de leur métier et de leur structure.

    Mises à part quelques petites adaptations mineures qui peuvent être “reportées” en direct dans le fichier de production, la plupart du temps, pour pouvoir mettre en oeuvre de nouvelles fonctionnalités, nous devions nous lancer dans une aventure parfois fastidieuse : le versioning.

    Ceci est bientôt de l’histoire ancienne

    Souvenez-vous de ce à quoi pouvait ressembler un versioning :

    Table par table, nous importions les données dans la nouvelle version.
    En préparation de cet import, il avait fallu régler les correspondances de rubriques entre la table source de production et la table destination du nouveau fichier. L’interface que FileMaker propose pour régler l’import est sans doute le plus indigeste des interfaces de la plateforme : difficulté de positionner les rubriques qui “glissent” de haut en bas, contrôle de correspondance uniquement visuel… cette étape de configuration peut s’avérer gourmande en temps de développement (dans cet article de juin 2010 sur la mise à jour des données, nous revenons sur la méthodologie que nous adoptions dans pareille situation).

    Après avoir réglé la séquence d’import, nous devions penser à mettre à jour les éventuels compteurs basés sur des numéros de série.

    D’autres couches de l’application contiennent également des données qui avaient pu évoluer et être modifiées par les utilisateurs au cours de leur usage du fichier à mettre à jour :

    • la sécurité, dans laquelle des comptes ont pu être créés, modifiés, supprimés;
    • les listes de valeurs personnalisées dont certaines ont pu être adaptées par des utilisateurs disposants des droits pour ce faire.

    Vue la complexité et la lenteur du processus de versioning, nous options souvent pour procéder à ces manoeuvres la nuit, le week-end… prévoyant selon le nombre d’enregistrements à transférer de nombreuses heures où avancerait lentement la barre de progression de la fenêtre d’import.

    Parfois nous n’avions pas le choix, suite à une corruption de fichier, nous devions repartir d’une clone sain et injecter les données de production, en espérant ne pas interrompre trop longtemps le travail en cours des utilisateurs bloqués.

    Un gain de temps considérable

    Avec la version 17 de FileMaker, ceci va changer radicalement ! Mais c’est en dehors de l’application qu’il faut aller chercher cette excitante nouveauté. En accompagnement de FileMaker 17 (dans le package de la Developer Subscription), nous trouvons un petit outil léger en ligne de commande…léger mais d’une puissance telle qu’il va nous permettre de revoir fondamentalement le rythme de mise à jour de nos applications.
    (On peut s’interroger sur la raison d’une attente si longue dans l’histoire de la plateforme pour bénéficier d’un tel outil – Fabrice se souvient que ses demandes à FileMaker pour un système du genre remontent à plus de 10 ans, et les développeurs étaient nombreux à appuyer dans ce sens.)

    Le DMT, data migration tool, est donc un outil en ligne de commande qui permet d’injecter en un temps record les couches de données d’un fichier source vers un clone de la même base, et ce avec un tout petit minimum de préparation de notre part.

    Comme pour le iOS SDK, cet outil vient de le “package” qui accompagne la Developer Subscription (89€HT/an)(Un package qui devient encore plus attractif avec le nouveau modèle de licence…allez jeter un oeil)

    Comment utiliser le DMT

    (Attention, veuillez prendre connaissance de l’article relatif à un bug important de la version actuelle de l’outil) 

    Le principe est simple :

    1. Réalisez un clone de la base de données de destination. Précision importante : un clone est une copie du fichier, dénuée des parties données (enregistrements et données locales). Un clone est un clone tant que le fichier n’est pas ouvert. Dès son ouverture, FileMaker y écrit des paramètres locaux (langue, format de date,…) et il perd dès lors son caractère de clone.
    2. en ligne de commande, appeler l’outil FMDataMigration, identifier la source, le clone et la destination
    FMDataMigration -src_path <path> -clone_path <path> [<other options>]

    Et c’est réglé ! … un journal affiche la progression, les résultats et erreurs éventuelles.

    FmDataMigrationTool Process

    Un cas vécu : le temps de versionning d’un fichier comportant environ 40 tables et des millions d’enregistrements est passé de 3h00 à 10 minutes !!  Et c’est évidement sans compter le temps gagné à ne pas devoir paramétrer la séquence d’importation des données pour chacune des tables.

    Au final, nous récupérons non seulement les enregistrements, mais aussi les comptes utilisateurs et les modifications dans les listes de valeurs personnalisées, ainsi que les polices de caractères intégrées au fichier.

    Ce qui est transféré

    (en fonction des options cfr infra) :

    • les comptes utilisateurs
    • les enregistrements
    • les listes de valeurs personnalisées
    • le numéro de série suivant des rubriques entrée automatique numéro de série
    • les index
    • les ID d’enregistrements
    • les paramètres régionaux (formats de date, langue par défaut…)

    Paramètres de la ligne de commande

    (en gras les paramètres obligatoires)

    -src_path :  le chemin du fichier source
    -src_account : un compte accès intégral dans le fichier source (par défaut = Admin)
    -src_pwd : le mot de passe du compte (par défaut = vide)
    -src_key : l'éventuelle clé d'encryption du fichier source
    
    -clone_path :  le chemin du fichier clone
    -clone_account : un compte accès intégral dans le fichier clone (par défaut = Admin)
    -clone_pwd : le mot de passe du compte (par défaut = vide)
    -clone_key : l'éventuelle clé d'encryption du fichier clone
    
    -target_path : le chemin du fichier de destination (par défaut = chemin de la source avec ajout de 'migrated' )
    -ignore_valuelists : par défaut le DMT va recopier les valeurs des listes de valeurs personnalisées du fichier source. Ajoutez cette option pour ne garder que les valeurs du fichier clone
    -ignore_accounts : par défaut le DMT va recopier les comptes du fichier source ainsi que la clé d'encryption. Ajoutez cette option pour ne garder que les comptes du fichier clone
    -ignore_fonts : par défaut le DMT va recopier les polices du fichier source. Ajoutez cette option pour ne garder que les polices du fichier clone
    
    -v : (verbose) mode avec log de progression qui décrit étape par étape ce que le DMT est en train de faire
    -q : (quiet) mode silencieux
    -force : permet d'écraser un fichier de destination déjà existant

    Quelques remarques et points d’attention:

    Comment se fait la correspondance ?

    Rapidité mais prudencePour la correspondance des tables et rubriques, FM Data Migration Tool procède d’abord par nom et ID identique, puis s’il ne trouve pas par nom identique, puis enfin par ID interne correspondant. Cela signifie par exemple que si vous renommez la rubrique RUBOld en RUBNew et puis que vous créez une rubrique nommée RUBOld, les données de la source contenue dans la rubrique RUBOld seront transférées dans la nouvelle rubrique RUBOld.

    Des conteneurs

    L’outil est prévu pour que le fichier résultat soit ensuite placé au même endroit qu’à l’origine. Ce point doit être pris en considération dans le cas de stockage externe de conteneurs : l’outil ne gère pas de déplacement ou de conversion de ces fichiers.

    Clone tu resteras

    Petit rappel : un  clone reste un clone tant qu’il n’a pas été ouvert !

    Réparation du code ?

    Le DMT n’est pas un outil de réparation. Si on a dans la source une donnée corrompue, elle le restera après versioning.

    Attention plug-in

    Lors du versioning, le DMT “réévalue” les valeurs des rubriques calculs stockées. Ceci peut poser un gros problème si ces calculs font appel à des fonctions issues de plug-in. Le DMT n’ayant pas accès aux plug-in, les résultats de ces calculs sera un ? dans tous les enregistrements. Il faudra par la suite évaluer à nouveau ces calculs en entrant dans la définition de la base de données et en éditant la formule de calcul (y ajouter un espace suffit).

    Sécurité : login et mot de passe

    Dans les instructions en ligne de commande, il faut passer en clair un login et mot de passe du fichier clone et du fichier source. Ce login et mot de passe peut être soit celui d’un compte disposant de l’accès intégral au fichier…dans ce cas, vous exposez aux regards indiscrets et laissez dans l’historique du terminal un mot de passe critique. Soit vous pouvez mentionner un compte et mot de passe qui est associé à un jeu de privilège qui dispose d’un privilège étendu dont le nom commence par “fmmigration”. Le nom du privilège étendu doit être rigoureusement le même dans le fichier source et dans le clone (sensible à la casse).  Le jeu de privilège ne doit disposer d’aucun droit particulier dans la base de données (ni lecture des données, ni accès aux modèles, scripts,…). C’est sans aucun doute la manière la plus sûre de gérer cet aspect sécurité lors de l’usage du DMT.
    Dans l’exemple ci-dessous. Nous avons créé un compte “mig” dont le mot de passe est “123456”; ce compte est associé au jeu de privilège “Mig” qui n’a aucun droit de lecture, d’accès au modèle, scripts,..dans la base. Ce jeu de privilège dispose d’un privilège étendu dont le nom commence par fmmigration : “fmmigrationTest”.

    La commande devient la suivante :

     ./FMDataMigration -src_path Old.fmp12 -src_account mig -src_pwd 123456  -clone_path New.fmp12 -clone_account mig -clone_pwd 123456

    Pour disposer de l’outil Data Migration Tool

    Comme pour le iOS SDK, cet outil vient de le “package” qui accompagne la Developer Subscription (89€HT/an)

     

    Enjoy !

  • FileMaker Server 17 : conservez bien le certificat de licence

    FileMaker Server 17 : conservez bien le certificat de licence

    Parmi les changements liés aux nouvelles licences FileMaker, il y a une petite chose à laquelle vous devez faire attention.

    Si vous avez un contrat de licence annuel ou sous maintenance, vous avez déjà dû recevoir un e-mail de la part de FileMaker dont le sujet est :

    “Plateforme FileMaker 17 – Disponibilité de la version avec maintenance”

    Comme chaque année, il vous permet d’accéder aux liens de téléchargement de la nouvelle version pour une période de 30 jours, ainsi qu’à votre nouvelle clef de licence. (Celle-ci, c’est une nouveauté appréciable, ne devrait plus changer à l’avenir.)

    téléchargment Certificat De Licence

    Mais attention ! il y a une nouveauté à télécharger : le certificat de licence de FileMaker Server. Or si passé les 30 jours il est toujours possible de retrouver un installateur de FileMaker Pro Advanced ou FileMaker Server en téléchargeant une version démo, il n’est en revanche pas possible de retrouver ce certificat de licence, sinon bien sûr en appelant le service technique.

    Téléchargez-le et conservez-le donc bien !

    Pour rappel, si vous passez par notre intermédiaire pour acheter/louer vos licences, vous bénéficiez d’un service de récupération rapide de votre clef de licence*… à condition de nous informer de celle-ci. N’oubliez donc pas de nous communiquer votre nouvelle clef.

    *pour cela, il suffit d’écrire à malicence@1-more-thing.com depuis une adresse e-mail référencée.

  • Événement gratuit : Présentation de FileMaker 17

    Événement gratuit : Présentation de FileMaker 17

    [Mise à jour : à cause de 22 personnes dont 11 belges courant après un ballon, la date est reculée de deux jours Pendant un Uruguay-Arabie Saoudite]

    La nouvelle version de FileMaker vient de sortir, avec son lot de nouveautés, son nouveau modèle de licences, et de bonnes pistes pour entrevoir la direction prise par la plateforme.

    Venez découvrir ces nouveautés autour d’un verre le 18 20 juin 2018 à 17:00, avenue de la Couronne 382, 1050 Bruxelles.

    Merci de vous inscrire ci-dessous.

    [contact-form-7 id=”12958″ title=”Inscription à Présentation FM 17″]

     

    Ajoutez l’événement à votre agenda

  • Vidéo : les nouveautés de FileMaker 17

    Vidéo : les nouveautés de FileMaker 17

    C’est un rituel si bien ancré qu’on ne sait plus si ce que l’on attend le plus est la sortie d’une nouvelle version de FileMaker ou la vidéo de 1-more-thing qui la décortique 😉

    Sans plus attendre, voici la version 17. 50 minutes de pur bonheur, d’actrices glamour, d’effets spéciaux et de suspens…

    N’hésitez pas à commenter ci-dessous. Et si vous voulez voir tout cela en action, inscrivez-vous pour assister à une présentation en chair et en os.

     

  • RGPD en fête à Bruxelles !

    RGPD en fête à Bruxelles !

    [vc_row bg_color=””][vc_column][vc_column_text]Jeudi 1/3, c’était la fête dans nos locaux bruxellois, pour célébrer la prochaine entrée en vigueur le 25 mai prochain, du RGPD, le nouveau Règlement Général sur la Protection des Données.

    Fêter de nouvelles contraintes réglementaires imposées par l’Europe, voilà qui est pour le moins singulier, non ?

    RGPD salleSi nous avions choisi de donner un côté festif à l’événement, c’est parce que nous pensons, en tant que citoyens européens, que c’est une bonne chose de disposer d’un cadre juridique pour protéger nos données personnelles de l’appétit de certains  pour qui la quantité de données collectées prévaut souvent sur le droit de chacun au respect de sa vie privée.

    Par ailleurs nous considérons que cette obligation peut être vue comme une belle opportunité.

    Florence RDPDL’opportunité d’une part de se repencher sur la manière dont vous traitez, stockez, et même protégez les données personnelles dans les applications que nous développons pour vous.

    D’autre part, une opportunité de profiter de l’occasion pour réexaminer nos procédures et vérifier si elles sont bien en conformité avec les principes définis par le RGPD.

    À 18 heures donc, nos valeureux clients et invités, défiant le froid, la neige et les embouteillages, sont venus se réchauffer chez nous, et surtout s’informer sur cette nouvelle réglementation européenne. Florence de Villenfagne, consultante ICTLex et formatrice au Data Protection Institute, était notre invitée et a exposé le cadre juridique du RGPD ainsi que les principales implications.

    Sa présentation a été particulièrement appréciée. Elle avait pris le temps de s’enquérir des activités de chacun avant son intervention, et a pu ainsi proposer des exemples précis et très parlant.

    Tanguy Collès, désormais “certifié” DPO par le Data Protection Institute a ensuite pris la parole et a présenté les différents axes selon lesquels 1-more-thing évoluait afin de proposer le meilleur conseil possible à nos clients autour du RGPD.

    Il a abordé les aspects contractuels, juridiques, organisationnels et techniques. Nous avons vu que de grandes parties du RGPD était déjà présentes dans les règlementation antérieures, et que 1-more-thing avait déjà une bonne culture de la protection des données. Mais nous avons aussi vu qu’il fallait prendre un certain nombre de mesures -techniques et non techniques- pour se mettre en conformité.

    Après une session de questions/réponses, nous nous sommes déplacés dans l’open space, avons un peu poussé les bureaux, et donné corps au côté festif de notre soirée. Il serait difficile de décrire en détail cette deuxième partie de soirée, mais en deux mots : c’était très bon et très sympa ! Et pour ceux qui étaient là et qui ont demandé le nom du traiteur, voici ses coordonnées :

    Cerisaie S.A.
    Traiteur Evénementiel
    info@cerisaie.be

    T. +32 10 230 130
    Rue Laid Burniat, 3
    1348 Louvain-la-Neuve

    [/vc_column_text][/vc_column][/vc_row][vc_row bg_color=””][vc_column width=”1/1″][vc_gallery interval=”2″ images=”12509,12508,12507,12506,12505,12504,12503,12502,12501,12500,12499,12498,12497,12496,12495,12494,12493,12492,12491,12490,12489,12488,12487,12486,12485,12484,12483,12243″ img_size=”full”][/vc_column][/vc_row]

  • Tri Dynamique avec AppleScript

    Tri Dynamique avec AppleScript

    Deuxième épisode de la mini série consacrée au tri dans FileMaker.

    Introduction

    Configurer les différents tris possibles dans un mode liste, en cliquant sur les libellés en tête des colonnes, peut s’avérer rapidement laborieux à faire, d’autant plus si votre solution comporte de nombreux modèles en mode liste avec le même système de tri.

    En effet, FileMaker ne propose malheureusement aucun mécanisme natif permettant de choisir les rubriques de tri de manière dynamique, ce qui force à concevoir des scripts de tri remplis de très nombreuses conditions afin de lancer le bon tri suivant l’en-tête de colonne cliquée, et donc la valeur passée en paramètre au script de tri.

    Par bonheur, quelques techniques existent pour contourner partiellement cette limitation et ainsi bénéficier d’un choix dynamique pour les rubriques de tri.

    Dans cet article nous allons explorer l’une de ces techniques, elle ne concernera que les développeurs et utilisateurs de FileMaker (FM) sous environnement macOs, car elle est basée sur la technologie AppleScript (AS).

    Exécuter du code AppleScript dans et depuis FileMaker Pro est possible depuis les toutes premières versions du logiciel, cela reste encore l’un de ses points forts sous macOS (même si, pour des raisons de compatibilité avec d’autres plate-formes, il est hélas souvent délaissé dans les projets professionnels).

    Nous allons donc voir comment mettre rapidement en place un script de tri dynamique et générique, utilisable tel quel dans tous vos modèles liste, avec juste un zeste de code AppleScript.

    Préparation

    Pour commencer, de quoi allons nous avoir besoin ?

    De très peu de choses : juste de deux rubriques globales de travail, qui peuvent être crées dans n’importe quelle table, mais qui trouveraient une place naturelle dans une table “Paramètres” (ou “Settings”).

    Voici quelques explications à propos de ces deux rubriques (le suffixe “_g” est pour signaler leur portée globale) :

    1. Tout d’abord, une rubrique de type texte, nommée par exemple “tri_rubrique_g”, qui contiendra le nom complet (table::rubrique) de la rubrique de tri ;
    2. Ensuite, une rubrique de type nombre, nommée “tri_ordre_g” par exemple, qui contiendra une valeur booléenne indiquant l’ordre de tri : 0 = ordre descendant , 1 = ordre ascendant (pour s’assurer d’avoir toujours une valeur booléenne, on peut activer une entrée auto calculée avec le code suivant : ObtenirCommeBooleen ( Contenu ) ) ;

    Le principe est simple : on passe le nom complet (table::rubrique) de la rubrique à trier en paramètre au script FileMaker de tri, si ce nom est identique à celui déjà mémorisé dans la rubrique globale “tri_rubrique_g”, alors on inverse tout simplement l’ordre de tri de la rubrique “tri_ordre_g”.

    Si le nom passé en paramètre est différent de celui mémorisé, alors on mémorise ce nouveau nom dans la rubrique “tri_rubrique_g” et on règle la valeur de l’ordre de tri “tri_ordre_g” à 1 (tri ascendant par défaut).

    Bon, pas trop compliqué jusqu’à là… voyons maintenant quel code AppleScript nous allons utiliser et comment l’exécuter…

    AppleScript

    FileMaker propose deux mécanismes pour exécuter un code AppleScript au sein d’un script avec l’action “Exécuter AppleScript” (présent dans la section “Divers” de la liste des actions) :

    1. “AppleScript Calculé” : il s’agit d’y inscrire le code AppleScript comme si c’était du simple texte, FileMaker fera une interprétation puis une compilation à la volée du code avant son exécution, à chaque fois que le script FileMaker sera lancé. Dans ce mode, le passage de paramètres au code AppleScript est plutôt simple, il se fait par simple concaténation à l’intérieur du code ;
    2. “AppleScript Natif” : il s’agit d’y inscrire le code AppleScript brut, qui sera compilé une seule fois à la validation du dialogue, puis il sera prêt à être exécuté tel-quel à chaque lancement du script FileMaker. Ici, le passage de paramètres au code AppleScript est un peu plus compliqué à mettre en place, il faudra par exemple prévoir des rubriques dédiées (nous ne verrons pas ce cas de figure ici).

    Nous allons donc utiliser du code AppleScript calculé, plus simple à implémenter avec le passage des paramètres.

    Plusieurs techniques sont possibles, comme :

    1. Utiliser le code AppleScript directement dans le dialogue de l’action de script (solution la plus directe, souvent suffisante) ;
    2. Placer le code AppleScript dans une rubrique globale et utiliser des balises pour être remplacées par les bons paramètres ;
    3. Placer le code AppleScript dans une fonction personnalisée, puis utiliser les paramètres de la fonction FileMaker pour passer les paramètres à AppleScript.

    Comme ici nous travaillons en local, la solution 2 avec la rubrique globale est celle que nous allons utiliser, plus simple d’accès pour notre démo. En revanche, pour une utilisation avec des fichiers hebergés dans un serveur, la solution 3 avec une fonction personnalisée semble la plus appropriée.

    Dans tous les cas, le code AppleScript demeure le même, seule la technique du passage des paramètres diffère.

    Voyons donc notre code AppleScript avec quelques commentaires (précédés de deux tirets “–“) pour bien comprendre le rôle de chaque instruction :

    -- Structure 'try' de contrôle au cas où une erreur se produisait pendant l'exécution
    try
     
        -- On récupère les valeurs de la rubrique et de l'ordre de tri dans des variables AS
        -- Pour ce faire, on utilise deux balises, délimitées par deux caractères dièse "##",
        -- qui seront remplacées par les valeurs issues des rubriques globales de travail
    
        -- Le nom complet (table::rubrique) de la rubrique de tri
        set sRubrique to "##tri_rubrique##"
    
        -- Le numéro booléen correspondant à l'ordre de tri
        set nOrdre to ##tri_ordre##
     
        -- On active FileMaker pour lancer le tri
        tell current application
     
            -- On récupère la bonne propriété d'ordre de tri à utiliser
            set pOrdre to contents of item (nOrdre + 1) of {descending, ascending}
     
            -- On lance le tri dans le modèle actif sur la bonne rubrique et le bon ordre
            sort current layout by field sRubrique in order pOrdre
     
        end tell
    
    on error err_mssg number err_num
     
        -- On affiche un dialogue d'infos si une erreur se produit lors de l'exécution
        display dialog ("" & err_num & " : " & err_mssg)
    end try
    

    Les deux balises “##tri_rubrique##” et “##tri_ordre##” seront remplacées avec la fonction “Substituer()”, au sein du script FileMaker, par les valeurs issues des rubriques globales de travail “tri_rubrique_g” et “tri_ordre_g” respectivement.

    Voyons maintenant de quoi il sera fait le code de notre script FileMaker…

    Script FileMaker

    Nous allons commencer par initialiser une variable “$rubrique” avec la valeur passée en paramètre au script. En effet, chaque bouton qui fera appel à ce script de tri, passera en paramètre le nom complet (table::rubrique) de la rubrique de tri.

    Si le paramètre est vide, alors on annule le tri.

    Comme expliqué plus haut, on défini l’ordre de tri selon que la valeur de la variable “$rubrique” et le contenu de la rubrique globale “tri_rubrique_g”, si elles sont identiques, alors on se contente d’inverser l’ordre de tri, sinon, on règle l’ordre de tri à la valeur par défaut = 1 (tri ascendant).

    Ensuite on rensigne la rubrique globale “tri_rubrique_g” avec la variable “$rubrique”, on peut désormais faire le remplacement des balises “##” dans le code AppleScript avant de lancer son exécution.

    Voici le code du script FileMaker complet avec les commentaires :

    # Commandes de contrôle… comme d'hab…
    Gestion erreurs [ Oui ]
    Autor. annulation utilisateur [ Non ]
    # 
    # On récupère le paramètre de script et on efface tout éventuel espace de bord inutile
    Définir variable [ $rubrique ; Valeur: SupprimerEspace ( Obtenir ( ParamètreScript ) ) ] 
    # 
    # Si une touche morte est enfoncée ou si la rubrique de tri est vide, alors on initialise les rubriques globales, on annule le tri et on active le premier enregistrement
    Si [ ( Obtenir ( TouchesSpécialesActives ) ) Or ( EstVide ( $rubrique ) ) ] 
        Définir rubrique [ Settings::tri_rubrique_g ; "" ] 
        Définir rubrique [ Settings::tri_ordre_g ; 1 ] 
        Annuler tri des enreg.
        Afficher enreg/requête/page [ Premièr(e) ]
        Fin de script [ Résultat de texte: "Annulation du tri…" ] 
    Fin de si
    # 
    # On défini et mémorise l'ordre de tri dans sa rubrique globale selon la rubrique de tri choisie : si même rubrique, alors on inverse l'ordre de tri, sinon on utilise la valeur par défaut 1 (ordre ascendant)
    Définir rubrique [ Settings::tri_ordre_g ; ObtenirCommeBooleen ( Si ( EstEgal ( $rubrique ; Settings::tri_rubrique_g ) ; Not Settings::tri_ordre_g ; 1 ) ) ] 
    # 
    # On mémorise la nouvelle rubrique de tri choisie dans sa rubrique globale
    Définir rubrique [ Settings::tri_rubrique_g ; $rubrique ] 
    # 
    # On valide tout ça…
    Valider enreg./requêtes [ Avec boîte de dialogue: Non ] 
    # 
    # On initialise une variable avec le code AppleScript à exécuter, en remplaçant au passage les balises par les vraies valeurs de travail
    Définir variable [ $applescript ; Valeur: Substituer ( 	Settings::tri_applescript_g ; 	[ "##tri_rubrique##" ; Settings::tri_rubrique_g ] ; 	[ "##tri_ordre##" ; Settings::tri_ordre_g ] ) ] 
    # 
    # On exécute le tri avec un AppleScript calculé
    Exécuter AppleScript [ $applescript ] 
    # 
    # À la fin du tri, on active le premier enregistrement
    Afficher enreg/requête/page [ Premièr(e) ]
    # 
    Fin de script [ Résultat de texte: "Tri effectué…" ] 
    # 
    # Code récupéré grâce au plugin MBS
    

    Petite subtitilité ergonomique, nous avons ajouté un test sur les éventuelles touches spéciales actives lors du clic sur les boutons de tri, cela permet d’annuler le tri par simple clic d’un en-tête de colonne avec une touche morte enfoncée (commande, contrôle, option ou shift), cela évite de passer par un bouton dédié (même si cela reste toujours intéressant à proposer, surtout nécessaire si votre solution est utilisée avec FileMaker Go).

    Voyons maintenant comment implémenter tout ceci dans notre modèle…

    Implémantation

    Nous allons donc construire un modèle liste, dans notre fichier de démo (communes de France), nous avons placé 4 rubriques, à savoir :

    1. Code postal de la commune ;
    2. Nom de la commune ;
    3. Une date calculée aléatoirement entre les années 2000 et 2020 ;
    4. Un numéro d’index aléatoire de 1 à 999.

    Nous disposons donc, pour nos tests de tri, de deux rubriques de type texte (1 et 2) et de deux rubriques de type nombre (3 et 4).

    Chaque en-tête de colonne sera donc un bouton qui lancera notre script FileMaker de tri, en passant comme paramètre le nom complet (table::rubrique) de la rubrique à trier (nous utilisons ici la fonction native ObtenirNomRubrique ( table::rubrique ) pour s’assurer d’avoir toujours le nom correct, quelque soient les modifications ultérieures).

    Nous pouvons ajouter une mise en forme conditionnelle qui, en comparant le nom de la rubrique à trier avec celui existant dans la rubrique globale “tri_rubrique_g”, pourra changer l’aspect du bouton pour bien visualiser sur quelle colonne le tri a bien été effectué.

    Nous pouvons également ajouter un indicateur de l’ordre de tri, dans notre fichier de démo nous utilisons la valeur de la rubrique globale “tri_ordre_g” comme affichage booléen avec deux caractères unicode représentant des flêches, une vers le haut “▲” (tri ascendant), l’autre vers le bas “▼” (tri descendant). L’affichage de cet indicateur sera géré par un masquage conditionnel sur le même principe, mais inversé, que celui de la mise en forme conditionnelle.

    Voilà, nous avons pratiquement fini, il suffit d’ajouter des sous-récapitulatifs après tri sur les rubriques dont nous désirons faire des regroupements, tel qu’illustré par Tanguy dans le premier opus de cette mini série sur le tri.

    Conclusion

    AppleScript offre beaucoup de possibilités avec FileMaker, comme celle présentée ici, même si d’autres solutions de tri dynamiques existent pour ce type d’utilisations en mode liste, certains natives FileMaker.

    En tout cas, n’hésitez-pas à décortiquer le fichier de démo en pièce jointe ci-dessous, pour bien visualiser et comprendre toutes les techniques décrites ici, vous pourrez ensuite nous faire part de toutes vos questions et remarques dans les commentaires ci-dessous.

    Téléchargez le fichier de démo ici : Fmp-file-icon 1MT_Tri_S02E01.fmp12

     

  • Et j’ai trié,…trié… (couplet 1)

    Et j’ai trié,…trié… (couplet 1)

    Premier épisode de la mini série consacrée au tri dans FileMaker.

    Trier peut signifier regrouper les choses d’une même nature.

    Dans cette démonstration, nous verrons comment procéder à des regroupements de données au moyen de tris, dans nos interfaces ou lors d’exportations d’enregistrements.

    En exploitant les possibilités de regroupement par sous-récapitulatifs, l’utilisateur manipule les données afin de faire émerger des éléments d’analyse. En combinant les récapitulatifs aux tris sur base de statistiques, nos interfaces de rapports deviennent de véritables outils d’analyse.

    Au moyen des données du fichier d’exemple ci-joint  (résultats d’athlétisme pour les trois derniers Jeux Olympiques), nous montrons que les rapports peuvent offrir une vue analytique modulable très pertinente.

    Pour analyser, il suffit de regrouper…et pour regrouper, il suffit de trier. C’est aussi simple.

    PS: dans la vidéo, j’ai utilisé une terminologie assez spécifique à notre nomenclature 1-more-thing : je parle du “zkp”, comprenez “identifiant unique” – “clé primaire de la table”.

     

     

     

     

  • La sensibilité à la casse dans FileMaker

    La sensibilité à la casse dans FileMaker

    [vc_row bg_color=””][vc_column][vc_column_text]Voici peut-être un sujet un peu pointu, mais il ne fait jamais de mal d’interroger parfois les fondamentaux… essayons ici de faire le tour complet de la problématique de la casse en FileMaker.

    D’abord, pour ne pas se perdre tout de suite, qu’est-ce que la “casse” ?

    Ici, je parierais que beaucoup de ceux qui savent déjà ce qu’est la sensibilité à la casse ne savent pas d’où vient le mot.

    Ce terme nous vient de l’imprimerie, et plus précisément de la typographie : pour composer une page, il fallait attraper très rapidement des caractères en plomb. On les rangeait alors dans une sorte de caissette en bois compartimentée et que l’on appelait casse. Chaque compartiment contenait les plombs pour un caractère de la fonte (ou police). Or on ne les rangeait pas par ordre alphabétique mais par fréquence d’utilisation. Les minuscules étant bien plus employées que les majuscules, leurs compartiments devaient être proches du typographe, et donc en “bas-de-casse”, les majuscules en “haut-de-casse”.

    Pour ceux que cela amuse, je vous invite à réfléchir aux termes encore employés à l’ère de l’informatique : casse, fonte, valise de police…

    FileMaker comporte des fonctions de calcul qui nous permettent de manipuler la casse d’un texte :

    Ainsi que des fonctions qui permettent d’ajouter ou de retirer un style (dont la casse) :

    Mais… qu’est-ce donc que la sensibilité à la casse ? C’est très simple : selon les environnements et le contexte, on considérera qu’une majuscule a la même valeur qu’une minuscule (insensibilité à la casse) ou au contraire qu’elle a une valeur différente (sensibilité à la casse)

    Par exemple dans un dictionnaire français comprenant des noms propres, comme par exemple le Larousse, on ne fera pas de différence de classement entre une majuscule et une minuscule, ainsi un nom propre avec une majuscule se retrouvera parmi des noms communs, adjectifs ou autre adverbes en minuscules.

    dictionnaire

     

    Dans d’autres contextes, on fera nettement la différence.

    Bien souvent dans les langages informatiques, la plupart des traitements sont effectués avec sensibilité à la casse. Cela vient notamment du fait que les premiers ordinateurs travaillaient sur des jeux réduits de caractères (ASCII), et ne pouvaient se permettre de s’encombrer de considérations telles que a = A à chaque fois qu’ils devaient analyser un a.

    Mais FileMaker, qui comme vous le savez a été pensé pour des humains normaux (ou presque), fait l’effort depuis très longtemps de l’insensibilité à la casse. Ainsi, vous pouvez comparer des chaînes de caractères telles que “Milan” (la ville) et “milan” (le rapace), et constater une égalité :

    "Milan" = "milan"

    Ceci fonctionne aussi bien dans les calculs que dans les index (utilisés dans les liens, listes de valeurs ou recherches).

    D’ailleurs, on peut noter qu’il en est de même avec les caractères accentués : “à” = “a”, si toutefois la langue d’indexation est le français (en russe par exemple, le E (yé) et le Ë (yo) sont bien deux lettre différentes, avec chacune sa place dans l’alphabet et dans le dictionnaire. Mais il s’agit de caractères différents de l’alphabet latin, bien que visuellement similaires)

    On pourrait donc penser que “FileMaker n’est pas sensible à la casse”, un point c’est tout.

    Or ce serait bien ennuyeux si on en restait là.

    Il existe un nombre limité de cas où FileMaker est sensible à la casse (case sensitive en anglais), essayons d’en faire le tour.

    Tout d’abord, certaines fonctions de calcul le sont. On en cite souvent trois en oubliant que FileMaker continue d’évoluer et que ça n’est pas parce qu’en 1914 il y en avait trois qu’il y en a forcément trois aujourd’hui.

    Voici donc les trois “connues” :

    • Filtre ( TexteAFiltrer ; TexteFiltre ) – Filtre ( “AaBbZ” ; “aZ” ) retournera “aZ” et non “AaZ” : le A majuscule est éliminé par le filtre
    • EstEgal ( TexteOrigine ; TexteComparaison ) – EstEgal ( “monMotDePasseSuperSecret” ; “monmotdepassesupersecret” ) retournera 0 car les deux chaînes ne sont pas identiques, alors que, rappelons-le, “monMotDePasseSuperSecret” = “monmotdepassesupersecret” retournera 1 (l’opérateur de comparaison = n’est pas sensible à la casse). Soit dit en passant, si votre mot de passe est super secret, préférez une comparaison de hash MD5 plutôt que de stocker le mot de passe en clair dans la base de données !
    • Substituer ( Texte ; ChaîneRecherchée ; ChaîneRemplacée ) – Substituer ( “Bébé” ; “b” ; “d” ) retournera “Bédé” et non “dédé”; car B et b sont deux caractères différents pour cette fonction sensible à la casse.

    Et donc on aurait ainsi fait le tour de la question ? Que nenni…

    Depuis FileMaker 12, la fonction ExecuterSQL ( RequêteSQL ; séparateurRubrique ; séparateurLigne{; arguments…} ) –  entrouvre la porte au langage de requête SQL au sein de FileMaker (d’un point de vue strict, cette porte était déjà entrouverte pour les connexions ODBC ou les plugins). Or SQL est en grande partie sensible à la casse, même si là encore, l’implémentation de FileMaker est assez tolérante.

    Soit une table “maTable” contenant les colonnes “champ1” avec les valeurs A1, A2, A3, et “Champ2″ et les valeurs  B1, B2, B3 :[/vc_column_text][ish_table align=”center” header_bg_color=”color7″ header_text_color=”color4″ border_color=”color7″]

    ID champ1 Champ2
    1 A1 B1
    2 A2 B2
    3 A3 B3

    [/ish_table][vc_column_text]La formule suivante :

    ExecuteSQL ( "SELECT champ1 from matable where champ2 = 'B3'" ; "" ; "" )

    retournera bien “A3”. Autrement dit, le nom des tables et des colonnes n’est pas sensible à la casse, mais c’est maintenant le cas de la plupart des implémentations SQL. Les mots clef comme SELECT, FROM ou WHERE dans cette requête sont toujours insensibles à la casse. Par convention, on les écrit en majuscules, sauf ici où j’ai voulu illustrer l’insensibilité à la casse.

    en revanche, la même formule dans laquelle on changera le critère ainsi :

    ExecuteSQL ( "SELECT champ1 from matable where champ2 = 'b3'" ; "" ; "" )

    retournera du vide, car “b3” n’est pas égal à “B3” dans une requête SQL.

    Astuce : si ce comportement vous dérange, vous pouvez utiliser la fonction SQL lower :

    ExecuteSQL ( "SELECT champ1 from matable where lower ( champ2 ) = 'b3'" ; "" ; "" )

    Donc il y a bien quatre et non trois fonctions sensibles à la casse…

    … est-ce tout ?

    Non ! depuis FileMaker 16, de nouvelles fonctions sont apparues :

    Au passage, on remarquera que FileMaker a apparemment décidé de ne plus traduire le nom des fonctions de calcul. Le traducteur a dû être sensible à la casse… sociale.

    Donc essayons cette formule :

    Uniquevalues ( list ( "a" ; "b" ; "B" ; "A" ; "à" ; "À" ) ; 1 ; "" )

    le résultat est :

    a
    b

    donc aucune sensibilité à la casse.

    en modifiant légèrement, pour explorer :

    Uniquevalues ( list ( "A" ; "a" ; "b" ; "B" ; "A" ; "à" ; "À" ) ; 1 ; "" )

    le résultat est

    A
    b

    donc on voit que le A majuscule est retourné à la place du a minuscule parce qu’il est trouvé en premier, mais comme on n’est pas ici sensible à la casse, le a minuscule n’est pas retourné en plus.

    Mais… n’avais-je pas sous-entendu que ces fonctions étaient justement sensibles à la casse ?

    Et bien… c’est qu’elles peuvent l’être !

    Le dernier paramètre (facultatif) de ces fonction est locale, et il permet justement de préciser dans quelle “langue” on veut trier ou dédoublonner.

    Or s’il est une langue que nous parlons vous et moi couramment, c’est bien… l’Unicode.

    Dans l’aide, vous constatez que deux variantes peuvent être utilisées : Unicode_Raw et Unicode_Standard.

    Uniquevalues ( list ( "a" ; "b" ; "B" ; "A" ; "à" ; "À" ) ; 1 ; "Unicode_Raw" )

    retourne

    a
    b
    B
    A
    à
    À

    autrement dit chaque caractère est différent (accentué, non accentué, majuscule, minuscule…). Voici donc deux nouvelles fonctions (SortValues et UniqueValues) sensibles à la casse !

    Uniquevalues ( list ( "a" ; "b" ; "B" ; "A" ; "à" ; "À" ) ; 1 ; "Unicode_Standard" )

    retourne

    a
    b
    à

    on voit qu’on perd la sensibilité à la casse mais pas celle aux accents.

    Je crois que nous avons fait le tour de la question de la sensibilité à la casse dans FileMaker. J’espère que vous aurez appris quelque chose. N’hésitez pas à prolonger la discussion dans les commentaires ci-dessous.[/vc_column_text][/vc_column][/vc_row]