4D et Power BI

Bonjour à tous,

Est-ce que quelqu’un a déjà utilisé Microsoft Power BI Desktop avec 4D?

Plus précisément, comment permettre à un utilisateur externe d’accéder à certaines données d’un serveur 4D avec Power BI?

Ne trouvant aucun connecteur 4D dans Power BI, j’ai dû utiliser le connecteur ODBC.

J’utilise 4D v17R5, j’ai donc utilisé le driver 4D ODBC v17 64 bit pour me créer une source de données que j’ai pu connecter ensuite dans Power BI.

Cela a fonctionné. Cependant, je me questionne sur la bonne façon de faire avec un utilisateur externe.

1- Dois-je fournir le driver 4D ODBC et les paramètres d’accès à chaque utilisateur?

2- Comment filtrer à la source les données que je ne veux pas que l’utilisateur voient dans Power BI?

2- Existe-il une autre option que l’ODBC pour connecter 4D à Power BI?

Je continue d’explorer mais si quelqu’un pouvait me donner une piste ou un lien vers une “best practice”.

Merci à l’avance.

Bonjour,

Nous n’utilisons pas PowerBI mais un autre outil d’analyse de données.

Nous avons écrit du code qui réplique le modèle de données 4D vers une base MySQL.
L’outil d’analyse est se connecte sur MySQL.

L’intérêt est que les requêtes SQL ne risquent pas de mettre le serveur de prod “à plat”.

Le code est générique est on utilise des fichier de mapping qui permettent table par table et champ par champ de

  • décider si la table et le champ sont envoyés sur MySQL
  • donner un nom différent dans mySQL (pour le champ ou la table).

L’export génère les scripts de création de table (avec les index), et envoi l’ensemble des données (pour les tables concernées) toutes les nuits.

On utilise MyConnect de Pluggers pour échanger avec MySQL.

On peut décider d’envoyer une nouvelle table ou un champ en modifiant le fichier de mapping.

HTH

: Bruno LEGAY

L’intérêt est que les requêtes SQL ne risquent pas de mettre le
serveur de prod “à plat”.
Hi hi hi, toi aussi ça t’as planté la base de prod ? :lol:

Sinon, techniquement parlant, on a adopté la même démarche, il n’y a que la dernière étape qui change, le “dump sql” est envoyé par ftp et l’outil d’analyse importe ce sql. Par contre : comment ton outil d’analyse fait pour traiter les évolutions (ajout/suppression/modif) du modèle 4D ?

Salut,

: Arnaud DE MONTARD

Par contre : comment ton outil d’analyse fait pour traiter les
évolutions (ajout/suppression/modif) du modèle 4D ?

tout les soirs on fait un truncate + drop des tables de MySQL et on les recréée (selon le mapping courant). C’est automatisé.

Donc on ne gère pas de script de delta.

On pourrait aussi le faire en mode dump je pense…

HTH

Ha, ok. En fait j’ai 2 bases destinataires (un extranet et une machine
à faire des stats), mais je ne maitrise la structure d’aucune - en
gros, elles ont été calquées à l’image de la notre à un instant t. Le
mapping des noms me permet de “faire comme si 4D n’avait pas bougé”,
mais il a des limites : ils n’ont pas les nouveaux champs/tables, et
s’il nous prend de supprimer/recycler un champ/table, on les plonge
dans des abimes de perplexité.

: Bruno LEGAY

tout les soirs on fait un truncate + drop des tables de MySQL et on
les recréée (selon le mapping courant). C’est automatisé.
Comment avoir des analyses qui continuent de marcher si le modèle change ?

Salut,

Ca sera peut-être plus clair avec un exemple…

Extrait du fichier de mapping (en xml) :
NOTE : on a une commande pour générer un fichier par défaut (ensuite
il faut “customiser”).

...

La table PAYS est synchronisée (elle s’appelle “pays” dans Mysql).
Tous les champs sont synchronisés avec des noms spécifiques dans MySQL
(sauf le champ “Obsolete”)

: Arnaud DE MONTARD

Comment avoir des analyses qui continuent de marcher si le modèle
change ?

Si on ajoute des champs, ça ne pose pas de problème.
Si on renomme les champs dans 4D ou une table ça ne pose pas de problème (le mapping se base réellement sur les numéro de table et de champs, les noms 4D sont la pour faciliter la compréhension).

C’est sûr que si on supprime des champs ou on change sérieusement le modèle, les analyses sont touchées. Mais on a conseillé de mettre en place des vues (dans MySQL) et il faut intervenir au niveau des vues pour limiter l’impact éventuel.

Le code de réplication est dans un composant.

Et le code ressemble à ceci :

<code 4D>
// chargement du mapping en mémoire
mysqlp_mappingLoad

mysqlp_errHndlrInstall

C_OBJET($vo_login)
$vo_login:=…

C_ENTIER LONG($vl_connexionRef)
Si (mysqlp_connexionOpen ($vo_login;->$vl_connexionRef))
mysqlp_dropTables ($vl_connexionRef)

mysqlp_createTables ($vl_connexionRef)

mysqlp_cloneIndexes ($vl_connexionRef)
mysqlp_cloneUniqueConstr ($vl_connexionRef)
mysqlp_cloneIntegrityConstr ($vl_connexionRef)

mysqlp_cloneTablesData ($vl_connexionRef)

mysqlp_connexionClose ($vl_connexionRef)

Fin de si

mysqlp_errHndlrDeinstall

// suppression du mapping en mémoire
mysqlp_mappingClear
</code 4D>

Pour les relations, les clé primaires, les indexes, les contraintes d’unicité, on se base sur ce qui est défini dans 4D.


DROP TABLE IF EXISTS pays;

CREATE TABLE pays (
id VARCHAR(4) NOT NULL DEFAULT ‘’,
codeInsee INT NOT NULL DEFAULT 0,
codeIso2 VARCHAR(2) NOT NULL DEFAULT ‘’,
codeIso3 VARCHAR(3) NOT NULL DEFAULT ‘’,
eee BOOLEAN NOT NULL DEFAULT FALSE,
nationalite VARCHAR(60) NOT NULL DEFAULT ‘’,
nom VARCHAR(40) NOT NULL DEFAULT ‘’,
nomLong VARCHAR(60) NOT NULL DEFAULT ‘’,
CONSTRAINT PK_pays PRIMARY KEY (id)
);

ALTER TABLE pays ADD INDEX (id);
ALTER TABLE pays ADD INDEX (codeIso2);

ALTER TABLE pays ADD UNIQUE (codeInsee);

ALTER TABLE commune ADD FOREIGN KEY (payId) REFERENCES pays(id);

On se skype si tu veux plus de détails et ça sera plus simple :wink:

Oui, c’est plus clair. Pour le mapping, c’est la même chose à part que je l’ai basculé en json (je suis plus à l’aise qu’en xml). Dans mon cas, comme je n’ai pas la possibilité de modifier le modèle de données “d’en face”, je n’envoie que des INSERT INTO, ils écrasent tout et importent. C’est plus contraignant pour nos évolutions, faut qu’on réfléchisse à réduire la dépendance…

Bonjour,

On dit que : “La nuit porte conseil” et j’ai compris que je devrai passer par le genre de scénario que toi et Arnaud avez expliqué.

Cependant, j’ai d’autres questions:

1- Est-que tous les utilisateurs de l’outil d’analyse ont accès aux mêmes données de la même structure MySQL?

2-Sinon, créez-vous une structure différente pour chaque client?

3-Qui contrôle l’outil d’analyse?

Cela serait comme avoir un mapping par client et une base MySQL par client si c’est ce dernier qui gère l’outil d’analyse.

Il est clair que je dois penser à exporter les donnés que nous cumulons. Mais vers quel destinataire? et dans quel format?

Que des heures de plaisirs :smiley:

En passant, merci pour les réponses

Salut,

En l’occurence le xml est pas mal, tu peux faire des commentaires :wink: et de la validation par schéma…

Autre idée :idea: : tu répliques dans un MySQL local mirroir de ton modèle 4D et ensuite tu mets en place avec des vues dans MySQL une “réplication” de cette base vers le modèle distant…

A+

: Yves BARRETTE

1- Est-que tous les utilisateurs de l’outil d’analyse ont accès aux
mêmes données de la même structure MySQL?
Pas sur de comprendre la question. Il faudrait peut-être mieux expliquer ton contexte.

Pour nous, on peut filtrer quelles tables sont exportées et au niveau de la table, filter quels champs sont exportés.
Dans notre besoin/contexte on exporte tous les enregistrement de la table (on pourrait facilement faire appel un callback qui pourrait faire un CHERCHER et réduire la sélection avant l’export). Par défaut, je fais un TOUT SELECTIONNER.

: Yves BARRETTE

2-Sinon, créez-vous une structure différente pour chaque client?
Si tu as plusieurs clients (tu es éditeur ?), tu peux créer une base MySQL par client si tu souhaite proposer un hébergement pour tous tes clients (les acteurs du cloud proposent des bases de données clé en main cf https://aws.amazon.com/fr/rds/) sinon, il devront installer une base MySQL chez eux sur leur réseau local (plus rapide, moins cher ?).

: Yves BARRETTE

3-Qui contrôle l’outil d’analyse?
C’est notre client qui gère la base MySQL et l’outil d’analyse. Il nous a donné les infos de connexion à la base MySQL (port, nom de la base, login et password).

Merci pour tes réponses.

Je visualise très bien ton fonctionnement avec un système de mapping par client.

Effectivement, un des besoin initiaux est d’héberger les données du client. Du moins, d’éliminer cet aspect de gestion pour le client. Ce qui est souhaité, c’est qu’il puisse utiliser l’outil d’analyse de son choix et simplement demander à accéder à ces données.

Dans cette perspective, je vais aller faire mes devoirs et je reviendrai vous faire part de la solution préconisée.

Merci encore