Archive for avril, 2006
De l’art d’industrialiser les scripts de chargement ou un RKM Sunopsis pour PowerAmc
Une des problématiques classiques de chargement de données est la suivante :
Comment maintenir simplement mes scripts de chargement depuis plusieurs bases de données sources vers plusieurs bases de données cible lorsque les modèles de données de ces derniers évoluent régulièrement et de façon indépendante ?
Référentiel des communes et voies de France
Puisqu’il s’agit d’un problème apparemment récurrent, je vais vous expliquer la manière dont les
adresses postales sont gérées sur le site de Telemarket. Ca peut servir pour la culture générale et
pour une réuntilisation ultérieure.
A son inscription ou lorsqu’il modifie son adresse de livraison, le client ne peut pas saisir
n’importe quoi comme adresse. Il doit obligatoirement passer par la sélection d’une rue présente dans
le fichier Hexavia. Celui-ci est un référentiel utilisé par La Poste pour lister l’ensemble des rues de
chaque commune de France et de Navarre ( heu non pas de Navarre ).
Tout tient dans un fichier initial de 300 Mo contenant les 39900 communes et les 2 000 000 de voies,
ainsi que les voies synonymes.
Ensuite des mises à jours ( 5 Mo ) sont disponibles régulièrement.
Pour une localité les différents champs disponibles sont :
Code INSEE de la localité
Code INSEE de la localité globale
Libellé de la localité
Indicateur de pluridistribution
Indicateur lieu-dit
Indicateur de ville ROUDIS 2000
Code Postal
Code INSEE commune administrative
Indicateur localité fiabilisée
Libellé Acheminement
Pour les voies :
Code INSEE de la localité
Matricule voie
Dernier mot de la voie
Libellé de voie
Type de voie abrégé
Descripteur libellé de voie
Une plateforme ETL OpenSource
Voici encore un peu d’eau au moulin du décisionnel OpenSource. Clover est un outil ETL écrit en java permettant de poser les bases d’une solution d’extraction, de transformation et d’alimentation de données totalement libre. Cette solution est très élégamment accompagnée d’une interface graphique fonctionnant sous la forme d’un plugging sous Eclipse. Nous espérons pouvoir prochainement tester cette solution chez Ysance
Qui souhaite regarder cela de plus près ?
Le moteur ETL : http://cloveretl.berlios.de/index.php
L’interface graphique : http://www.clovergui.net/

Création de liaison entre plusieurs objets sous SugarCRM 4.2
La création d’une liaison au travers d’une nouvelle table de liaisons au sein de SugarCRM nécessite quelques modifications au cœur du code source, cette opération ne pouvant être faite directement au travers de l’interface.
L’exemple suivant permet de créer une liaison entre une affaire (opportunity) et une autre affaire (opportunity).
1/ Création du fichier de MetaData
Un fichier de MetaData « opportunities_opportunitiesMetaData.php » doit être créé dans le répertoire /metadata/ afin de déclarer la table de liaison.
La déclaration se fait sous forme de tableau associatif contenant l’ensemble de la description de la liaision : son nom, ses champs (avec le type) et ses index.
Cette déclaration permet aussi de définir la façon dont la liaison fonctionne.
Ci-dessous la déclaration de la liaison « opportunities_opportunities » :
$dictionary[’opportunities_opportunities’] = array ( ‘table’ => ‘opportunities_opportunities’
, ‘fields’ => array (
array(’name’ =>’id’, ‘type’ =>’varchar’, ‘len’=>’36′)
, array(’name’ =>’opportunities_id’, ‘type’ =>’varchar’, ‘len’=>’36′, )
, array(’name’ =>’opportunities1_id’, ‘type’ =>’varchar’, ‘len’=>’36′,)
, array (’name’ => ‘date_modified’,'type’ => ‘datetime’)
, array(’name’ =>’deleted’, ‘type’ =>’bool’, ‘len’=>’1′, ‘default’=>’0′, ‘required’=>true)
) , ‘indices’ => array (
array(’name’ =>’opportunities_opportunitiespk’, ‘type’ =>’primary’, ‘fields’=>array(’id’))
, array(’name’ =>’opportunities1_idx’, ‘type’ =>’index’, ‘fields’=>array(’opportunities_id’))
, array(’name’ =>’opportunities2_idx’, ‘type’ =>’index’, ‘fields’=>array(’opportunities1_id’))
, array(’name’ => ‘opp1_opp2′, ‘type’=>’alternate_key’, ‘fields’=>array(’opportunities1_id’,'opportunities_id’))
)
, ‘relationships’ => array (’opportunities_opportunities’ => array(’lhs_module’=> ‘Opportunities’, ‘lhs_table’=> ‘opportunities’, ‘lhs_key’ => ‘id’,
‘rhs_module’=> ‘Opportunities’, ‘rhs_table’=> ‘opportunities’, ‘rhs_key’ => ‘id’,
‘relationship_type’=>’many-to-many’,
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’,
))
)
Si les deux cotés de la relation doivent être stockés en base de données, il suffit de remplacer dans le code ci-dessus :
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’,
par
‘join_table’=> ‘opportunities_opportunities’, ‘join_key_lhs’=>’opportunities_id’, ‘join_key_rhs’=>’opportunities1_id’, ‘reverse’=>’1′,
La structure « relationship » permet de spécifier d’où viennent les informations de liaisons :
Lhs_module : nom du module pour la partie gauche de la liaison
Lhs_table : nom de la table pour la partie gauche de la liaison
Lhs_key : nom de la clé pour la partie gauche de la liaison
Rhs_module : nom du module pour la partie droite de la liaison
Rhs_table : nom de la table pour la partie droite de la liaison
Rhs_key : nom de la clé pour la partie droite de la liaison
Relationship_type : type de relation, les valeurs possibles sont many-to-many, one-to-many…
Join_table : nom de la table de jointure, partie gauche et droite la clé de jointure
2/ Création de la table de jointure en base de données
La table de jointure doit être créée en base de données grâce à un script SQL de la forme :
DROP TABLE IF EXISTS `sugar42`.`opportunities_opportunities`;
CREATE TABLE `sugar42`.`opportunities_opportunities` (
`id` varchar(36) NOT NULL,
`opportunities_id` varchar(36) NOT NULL,
`opportunities1_id` varchar(36) NOT NULL,
`date_modified` datetime NOT NULL,
`deleted` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `opportunities1_idx` (`opportunities_id`),
KEY `opportunities2_idx` (`opportunities1_id`),
KEY `opp1_opp2` (`opportunities1_id`,`opportunities_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
3/ Déclaration dans le dictionnaire de table
Afin que le fichier que nous venons de créer soit pris en compte, celui-ci doit être ajouter au fichier modules/TableDictionary.php sous la forme de l’instruction suivante :
include_once(”metadata/opportunities_opportunitiesMetaData.php”);
4/ Déclaration de la liaison possible dans vardefs.php du module concerné
Une nouvelle entrée dans le tableau associatif de description de dictionnaire du module concerné doit être ajoutée afin de rendre possible la liaison défini au préalable.
Cette modification s’effectue dans le fichier vardefs.php du module concerné (modules/Opportunities/vardefs.php pour notre exemple).
La modification est de la forme :
‘opportunities’ =>
array (
‘name’ => ‘opportunities_opportunities’,
‘type’ => ‘link’,
‘relationship’ => ‘opportunities_opportunities’,
’source’=>’non-db’,
‘module’=>’Opportunities’,
‘bean_name’=>’Opportunity’,
‘vname’=>’LBL_OPPORTUNITY’,
),
5/ Affichage du SubPanel dans le module souhaité
Afin de rendre possible la liaison, il est nécessaire d’afficher un nouveau SubPanel dans l’écran de List du module concerné.
Cet ajout s’effectue au travers d’un complément au tableau associatif $layout_defs[« Opportunities »] dans le fichier layout_defs.php du module.
Il est de la forme :
‘opportunities’ => array(
‘order’ => 50,
‘module’ => ‘Opportunities’,
’subpanel_name’ => ‘default’,
‘get_subpanel_data’ => ‘opportunities’,
‘add_subpanel_data’ => ‘opportunity_id’,
‘title_key’ => ‘LBL_OPPORTUNITIES_SUBPANEL_TITLE’,
‘top_buttons’ => array(
array(’widget_class’ => ‘SubPanelTopCreateButton’),
array(’widget_class’ => ‘SubPanelTopSelectButton’, ‘mode’=>’MultiSelect’)
),
‘refresh_page’=>1,
),
Le paramètre ‘refresh_page’ autorise le rafraichissement de la page appelante.
Il est également nécessaire de définir le titre du SubPanel dans le fichier de langue du module.
‘LBL_OPPORTUNITIES_SUBPANEL_TITLE’ => ‘Affaires’
Dans le fichier /modules/Opportunities/language/fr_FR.lang.php
6/ Avant d’exécuter les scripts de SugarCRM
Afin d’éviter tout plantage du au système de cache, il est nécessaire de reconstruire l’ensemble des relations.
Pour cela, sous SugarCRM, dans la partie Admin, cliquer sur le menu « réparations » et choisir « Reconstruire les relations ».
Qui croît au décisionnel en Open Source
Le monde du décisionnel est en plein effervescence. Pour ceux qui souhaitent enrichir leurs connaissances dans le domaine du Décicionnel Open Source, voici un lien à voir:
http://blogs.zdnet.fr/index.php/2006/03/05/decisionnel-et-open-source/
@+
Peter ZOLA
No comments