Présentation d'un ERP facile à utiliser
Installation
L'installation est très simple, il suffit de décompacter l'archive. Il faut au préalable avoir installé un JDK 1.5. Le package de lancement inclu le moteur catalina.
Mise en route
Il suffit de lancer http://localhost:8080/catalog. Le login est "admin" et le mot de passe "ofbiz".
Cet ERP possède un module de gestion de stock et achats, gestion des commandes, gestion marketing, un module de comptable, gestion de la fabrication,...
dimanche 28 janvier 2007
L'ERP Neogia
Pentaho
Une plate-forme incluant des outils de reporting, d’analyse (OLAP), de tableau de bord, de data mining et d’ETL. Disponible sous forme de suite ou de services Web. Ce produit s'appui sur le serveur J2EE Jboss et sur Jboss Portal.
Installation
L'installation de la version de démo ne pose pas de problème particulier sur windows. Il suffit de décompresser l'archive pentaho_demo-1.2.0.534-GA.zip. Il faut bien entendu au préalable avoir installé sur la machine un jdk.
Démarrage
Il suffit de lancer start-pentaho.bat. Puis de lancer un navigateur sur localhost:8080
Outil de conception
L'installation de cet outil se base sur le même principe que le serveur. Il suffit de décompresser l'archive (pentaho-design-studio_1.2.0.341-GA.zip). Par contre il s'agit d'un programme client lourd basé sur eclipse. Le programme de lancement est PentahoDesignStudio.exe.
Licence
Ce produit est distribué sous licence MPL
vendredi 19 janvier 2007
PHP sur serveur JAVA
Il existe un serveur J2EE qui est capable de voir les applications PHP comme des servlets. Voici comment il s'utilise.
Resin-Caucho est un serveur certifié J2EE, proposé sous une double licence GPL et commerciale. Sous ces deux licences vous pourrez trouver la servlet Quercus qui est capable de faire tourner des programmes PHP5. L'installation d'une application php sur ce serveur est très simple. Il suffit de copier dans la répertoire webapps de copier l'application. il faudra lui rajouter un répertoire WEB_INF contenant un fichier de paramétrage resin-web.inf.
Ce qui est interressant aussi, c'est qu'il existe une version autonome de Quercus, l'interpreteur/compilateur PHP, embarqué dans Resin. Je précise interpreteur/compilateur, parce que, en mode compilateur quercus convertie le code PHP en code JAVA, comme Jasper peut le faire avec du code JSP.
La licence de ce produit est la GPL.
Ceci en fait un produit praticulièrement interressant.
jeudi 18 janvier 2007
Comment fonctionne les dfm ?
Les dfm sont les fichiers descriptifs des fiches, datamodule et frame. Le but de cet article est de décrire comment fonctionne la construction des fiches dans un programme Delphi.
La sérialisation des composants dans Delphi passe par la classe TStream. Cette classe est abstraite et ne propose pas d'implémentation des méthodes d'accès au support de stockage. De cette manière on a dans la VCL une implémentation de cette classe pour des fichiers disques (TFileStream), pour la RAM (TMemoryStream), pour un blob binaire dans une base de données (TBlobStream), sur un réseau (TSocketStream) ou dans les ressources d'un fichier au format PE, type .exe ou dll (TResourceStream). C'est cette dernière classe qui va nous intérresser ici.
En fait les points communs entre TDatamodule, TForm et TFrame est que tout d'abord ce sont des composants et donc qu'ils peuvent être agrégés et sérialisés. De plus les constructeurs de ces trois classes sont conçus pour aller chercher un fichier dfm et le déssérialiser.
Dans l'éditeur de Delphi, ces classes se dérivent toujours. A chaque fois que l'on souhaite créer une nouvelle fiche, Delphi va construire une nouvelle classe de fiche dérivée de TForm. De plus le source de cette classe possède une directive particulière qui lui permet de convertir le fichier dfm associé en ressource du fichier compilé ({$R *.dfm}). Dans les sources des constructeurs de ces classes on peut constater que l'on fait appel à un traitement particulier si l'on n'est pas dans l'IDE et si la classe courante n'est pas la classe de base.
Ce traitement particulier se trouve dans la procédure InitInheritedComponent. Cette procédure va faire appel à la fonction InternalReadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent) qui va reconstruire la fiche à partir de la ressource ResName, dans le module HInst et sur le composant Instance. Le nom de la ressource est celui de la classe finale.
Voilà.
Comment appeler une méthode par son nom ?
L'objectif est de pouvoir appeler une méthode sur un objet, descendant de TObject, dont la classe est inconnu. Cette méthode sera simple et sans paramètre. La difficulté ici est que l'on ne peut pas passer par le transtypage.
Donc il va falloir ruser pour pouvoir faire l'appel à une méthode de cette classe.
Conditions préalables :
1 - La classe doit être compilé avec la directive $M+ (par exemple TPersistent).
2 - La méthode que l'on souhaite appeler doit être publiée.
Pour récupérer la méthode save d'un objet inconnu il faut passer par la fonction de classe MethodAddress introduite dans TObject. Tant qu'une classe descendante de TObject n'est pas compilée avec la directive $M+, les instances n'auront pas de RTTI, on donc pas de possibilité de retrouver l'adresse d'une méthode.
Pour plus de détails à ce sujet vous pouvez voir le code de MethodAddress dans System.pas.
Le code de cet appel est le suivant :
var
zmSave: procedure of object; // la méthode save
zpSave: pointer; // pointeur vers le code de la méthode save
begin
// si il existe un éditeur courant et que le panneau de cet éditeur existe et que le panneau a une méthode
// save publié alors....
if assigned(CurrentEditor) and assigned(CurrentEditor.ctrl) and (CurrentEditor.ctrl.MethodAddress('Save') <> nil) then
begin
// on récupère le pointeur sur le code de la méthode save
zpSave := CurrentEditor.ctrl.MethodAddress('Save');
// puis on initialise la variable zmSave avec le code et les données associés
TMethod(zmSave).data := CurrentEditor.ctrl;
TMethod(zmSave).code := zpSave;
// et on fait l'appel
zmSave;
mercredi 17 janvier 2007
Le transport d'électricité
La France étant un pays de faible densité de population, les lieux de production sont souvent éloignés des consommateurs. Les réseaux de transport et de distribution ont pour but de faire circuler le courant électrique des centrales aux clients. La desserte de ces derniers a rendu nécessaire la construction de plus d'un million de kilomètres de lignes.
Les lignes haute et très haute tension qui constituent le réseau de transport, acheminent d'importantes quantités d'électricité. Organisées en réseaux interconnectés, elles permettent les échanges entre régions ou pays. En cas de besoin, elles peuvent faire transiter l'électricité d'un bout à l'autre du territoire. Elles alimentent aussi de grandes entreprises industrielles.
Les lignes moyennes et basse tension forment le réseau de distribution. Elles répondent aux besoins locaux. Alimentées depuis les lignes à haute et très haute tension, elles diffusent l'électricité vers les autres clients (particuliers, P.M.E.-P.M.I.).
Les centres de production et de répartition du courant électrique vers les lieux de consommation sont régis par un système complexe. Au coeur de ce système, les 'dispatchings' constituent les centres d'aiguillage de l'électricité. Le rôle de ces centres est d’ajuster en permanence la production à la demande. Les 'dispatchings' sont aidés par de puissants calculateurs qui traitent les informations et signalent le franchissement de seuils dangereux pour la qualité ou la sécurité d'alimentation en électricité. Il permet également d'éviter tout gaspillage.
Physiquement ce réseau est constitué de lignes, de postes de répartition et de transformation, de générateurs et de points de piquage
Les tensions de fonctionnement, en France, vont de 63000 à 400000 volts.
Le poste de répartition
Un poste de répartition a pour but de distribuer l’énergie électrique sur le territoire. En général un poste de répartition 63 kV contient des transformateurs pour abaisser la tension de 63 kV vers 20 kV pour fournir le service distribution qui achemine alors l’énergie vers des PME-PMI ou des transformateurs 20KV-380V .
Le poste est le point de connexion de toutes les lignes électriques hautes tensions. Un poste est constitué d’un ou deux jeux de 3 barres qui répartissent l’énergie sur plusieurs lignes triphasées (d’une façon imagé c’est une multiprise ). Chaque ligne est connectée aux barres par l’intermédiaire d’un disjoncteur et de 2 sectionneurs de ligne montés en série.
Ces barres peuvent être divisées en plusieurs sections ( jusqu'à 3 ) connectées entre elle par des sectionneurs de sectionnement. Lorsque le poste a 2 jeux de barres on a présence d’un ou deux disjoncteurs de couplage pour connecter les 2 jeux entre eux. Sauf exceptions tous les disjoncteurs et sectionneurs sont télécommandables. Les opérateurs contrôle ainsi l’ouverture et la fermeture des disjoncteurs de plusieurs postes sur une zone géographique bien délimité. Ils commandent les disjoncteurs et les sectionneurs en fonction de la consommation électrique, des travaux sur le réseau etc....
Les disjoncteurs des postes ont aussi pour fonction de protéger le réseau contre les surintensités. ( à cause de la foudre ou à des branches d’arbre) Ces défauts électriques sont dans la plupart des cas furtif, c’est pourquoi il est inutile et problématique ( coupure électrique ) de laisser un disjoncteur ouvert après un problème. Un automate va donc essayer de réenclencher le disjoncteur au bout de quelques secondes. L’évolution conduit à réduire le temps de coupure en installant des automates de réenclenchement rapide.
Les points de piquage
Il s’agit simplement du branchement de l’extrémité d’une ligne au milieu d’une autre.
Les générateurs
Il s’agit simplement des centrales de production d’électricité.
mardi 16 janvier 2007
Truc pour dotclear
Que faire si vos tags aboutissent à une page inconnu dans apache (erreur 404) ?
La solution est très simple une fois que l'on a trouvé, mais ce n'est pas évident à première vue. En fait il suffit d'aller dans
Tableau de Bord / paramétres du blog et ensuite de demander Méthode de lecture de l'URL=QUERY_STRING
Voilà.
lundi 15 janvier 2007
Structuration d’un produit assurance IARD
Ce document est un exemple de modélisation de données pour l’enregistrement de contrats d’assurances. Il ne s’agit pas d’une règle absolue.
Grandes lignes de l’assurance et de la structuration d’un contrat
Le principe de l’assurance consiste pour la compagnie d’assurance à prendre à son compte un risque de perte financière résultant d’un évènement à caractère accidentel et/ou imprévisible subit par l’assuré. L’assuré en échange de ce service devra payer une prime à l’assureur. Les sinistres peuvent être de natures variés sur le plan financier (montants très variables) et par rapport à leur fréquence (évènement rares ou fréquents).
Ainsi le contrat d’assurance décrit un accord entre l’assureur et l’assuré concernant le type de risque couvert et les montants en jeux.
L’évolution du secteur fait qu’un contrat peut-être dit multirisques.. Les niveaux de garantie souscrit pour ces risques sont eux aussi variables en fonction du type de protection souhaité par l’assuré. Ainsi, par exemple, pour une assurance automobile on peut avoir simplement la responsabilité civile (tiers) ou un ensemble de garantie (RC+juridique+bris de glace, etc….). Ce type de contrat peut porter sur un ou plusieurs « objets » assurés (exemple : l’automobile seule, ou l’automobile+le conducteur).
L’ensemble des garanties qui composent un produit d’assurance décrit le découpage de ce produit en différentes garanties. Ces garanties sont elles-mêmes regroupées en options suivant des règles de marketing et/ou juridique. Ce sont ces options qui vont être commercialisées. Chacune des garanties d’une option est tarifé, la prime d’une option est la somme des montants de primes de chaque garanties qui la compose, augmentées des taxes diverses applicables en fonction de la garantie. En outre des taxes peuvent avoir un rôle a jouer dans la réassurance, lorsqu'un risque est considéré comme trop gros pour être supporté par une seule compagnie (Catastrophe naturelle et attentat)
(Remarque : le présent document ne traite pas de la tarification, mais uniquement du découpage des contrats). Chaque option commerciale est rattachée ensuite à un (ou plusieurs) objets qui sont définis comme étant nécessaire à la vente d’un contrat. Par exemple on ne peut pas vendre de contrat d’assurance automobile, s’il n’existe ni automobile, ni conducteur. Ces deux « objets » doivent être décrit dans le contrat et doivent exister. Ceci afin de se mettre en conformité avec le droit, car pour qu’un contrat d’assurance puisse exister, il est nécessaire que les objets assurés existent et de plus les risques assurés doivent aussi exister. (exemple : il n’est légalement pas possible d’assurer un poisson contre le risque de noyade)
Les caractéristiques des objets assurés permettent de déterminer les montants de primes. Ainsi un conducteur pourra avoir comme caractéristique l’age de son permis (jeune conducteur) et son bonus/malus. Ces caractéristiques influencent les montants de prime de la responsabilité civile automobile.
Exemple de découpage
Produit assurance automobile
Objet assuré : véhicules
Options commerciale : Au tiers
* Défense-recours
* Responsabité civile
Options commerciale : Bris de glace de base
* Pare-Brise avant
Options commerciale : Bris de glace « plus »
* Pare-Brise avant
* Vitre latérales et arrières
* Optiques
Objet assuré : conducteur
Options commerciale Accident corporels
* Arret de travail, indemnités journalières
* Frais médicaux.
Options commerciale : Décès
* Frais d’obsèques
* Préjudices économiques des ayants droits
Les divisions du produit d’assurance correspond à la notion de condition générale. Le choix des options commerciales dans un produit va définir les conditions particulières d’un assurés. Certaines options commerciales peuvent être obligatoires (au tiers) et d’autres peuvent être incompatibles (on ne peut pas vendre pour un même contrat une option Bris de glace de base et Bris de glace « plus »).
Principes d’informatisation de ces concepts
* Les informations de références – Les conditions générales
Les informations concernant les conditions générales doivent être enregistrés dans un domaine de la base particulier. On devra y retrouver le découpage complet d’un produit d’assurance, ainsi que la tarification associé à chaque garantie.
* L’enregistrement des contrats
Au moment de l’enregistrement d’un contrat on devra au préalable saisir les données du souscripteur du contrat. Ensuite on enregistrera le type de contrat (automobile, habitation etc…) avec les informations propres au contrat (par exemple date de souscription, mode de paiement, ….). Puis on saisira les informations concernant les objets assurés. Chaque type d’objet ayant des propriétés qui lui sont propres (une automobile aura une immatriculation, une date de mise en circulation, une marque, etc…. un conducteur aura un numéro de permis, une date de permis, un bonus/malus, etc….)
Les règles de compatibilités d’options commerciales doivent être gérée par le logiciel de gestion. Ce logiciels devra pouvoir enregistrer ensuite la ou les options commerciales associés au couple contrat/objet. Puis il reste à faire le total des primes des garanties et à rapporter le montant au niveau du contrat.
Persistance simple d’objet VCL en base SQL avec blob
Présentation d'une technique minimaliste de persistance d'objet en base SQL avec Delphi.
Pour cette technique on utilise la méthode d’un objet de classe TStream
function ReadComponent(Instance: TComponent): TComponent;
qui retourne un composant correspondant à l’instance décrite dans le flux TStream et la méthode
procedure WriteComponent(Instance: TComponent);
qui écrit un composant dans le flux.
Il existe dans Delphi une classe TblobStream qui permet l’enregistrement du flux dans un champ de type blob d’une base. Il suffit alors d’utiliser une instance de ce genre de flux pour enregistrer des objets en base.
La structure d’un enregistrement peut avoir la forme suivante :
Un identifiant (ID) (chaine de caractères ou entier en fonction des besoins) et un champ blob.
