ERP 360: Offre d'emploi Ingénieur d'Affaire

ERP 360: Offre d'emploi Ingénieur d'Affaire

ERP 360: Mise à jour d'ERP360 du 17 mars 2008

ERP 360: Mise à jour d'ERP360 du 17 mars 2008

Profits SNCF 2007

 

Juste pour rebondir sur cette annonce :

http://www.latribune.fr/info/Plus-de-1-milliard-d-euros-de-profits-pour-la-SNCF-en-2007-~-ID9C2AB30E71D62619C125741000400C50-$RSS=1

ça serait bien avec l'argent gagné de mettre des prises electriques dans toutes les wagons et pas qu'en première, personnelement, le wifi ne m'interesse pas dans un train.

Eric Besson et le "développement de l'économie numérique".

 

Ou comment boire du coca avec du bon fromage, Après avoir passé sous silence ce pan entier de l'economie lors des presidentielles, gauche ou droite. Après avoir oublié ce poste lors du gouvernement v1.0.

Voila qu'on nous mets un pantin, son seul fait d'arme etant d'avoir trahis en pleine campagne sa propre candidate, ce qui a été recompensé par son entrée dans un gouvernement qui pouvait vraiment se passer de ses "competences" et utiliser plutot celles de son propre camps, je pense a JF Copé, qui a montré la voie en informatisant les declarations d'impots et autres.

Franchement l'economie numérique vaut bien mieux que ça et doit etre traitée avec beaucoup plus de serieux et plus d'égards.

Un ministère dédié au meme titre que l'agriculture serait un minimum, je ne connais pas les chiffres mais je suis pret a parier qu'il y a plus d'informaticiens , web designers, chef de projet, ect.. qui travaillent dans l'economie numérique que dans l'agriculture a l'heure actuelle.

http://fr.wikipedia.org/wiki/%C3%89ric_Besson (absolument rien sur un la mise en place d'un projet lié a l'informatique)

Comment inclure logparser 2.2 dans un bootstrapper clickonce

 

Suite à une question que l'on vient de me poser par mail concernant visual logparser, voici la procedure a suivre pour ajouter logparser 2.2 comme prerequis dans un boostrapper d'application deployée via clickonce et d'une manière générale comment ajouter un composant.

1 - Telecharger bootstrapper manifest générator

http://www.codeplex.com/bmg

image

Ajouter un nouveau "Package Manifest"

image

indiquer le nom du package :

image

Ensuite il faut ajouter le fichier d'installation , bouton droit sur package, "Add Install File"

image

pour le msi, il faut le telecharger via l'adresse suivante :

http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en

image

on indique alors tous les parametres :

image

 

image

On compile le projet

image

Vous remarquerez le build ouput, le boot strapper generator a crée un nouveau repertoire contenant le msi de logparser dans le repository des packages clickonce.

Maintenant il suffit de regarder dans visualstudio et l'on voit apparaitre logparser 2.2 dans la liste des prerequis.

image

LinkPad ! un utilitaire pour faire des requetes linq avec des bases de données sql server

J'adore ce genre d'outil, très simple, efficace, pas d'installation, le top

http://www.linqpad.net/

Comment gerer la sortie de veille dans un service windows ?

 

Il est vrai que les services windows sont plutot dediés aux serveurs mais il arrive que certains service soient installés sur des postes clients, dans ce cas le client peut très bien mettre sa machine en veille ce qui arrete le service, la reprise n'est pas automatique, pour detectecter la sortie du mode veille il faut l'indiquer au service. Dans le constructeur par exemple on indique que l'on veut "Handler" les evenements concernant l'alimentation de la machine hote.

CanHandleEventPower = true;

ensuite pour "reveiller" ses process lors du redemarrage il faut overrider la methode OnPowerEvent et relancer un OnStart

protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
// Sortie du mode veille
if (powerStatus == PowerBroadcastStatus.ResumeSuspend)
{
OnStart(null);
}
return true;
}

UDPTraceListener et EntLib3.1 Logging application block

 

J'ai recemment mis en place un service NT et je voulais voir en temps réel ce qui se passait dans mes process, utilisant le logging application block , j'ai ecrit un TraceListener custom, qui ecrit la trace sur un port UDP. A l'aide d'un utilitaire en console, il est possible de voir passer en temps reel toute la trace, voici comment faire :

UdpTraceListener.cs

.
   1:  using System.Net;
   2:  using System.Net.Sockets;
   3:  using System.Text;
   4:   
   5:  using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
   6:  using Microsoft.Practices.EnterpriseLibrary.Logging;
   7:  using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
   8:  using Microsoft.Practices.EnterpriseLibrary.Logging.TraceListeners;
   9:   
  10:  namespace Serialcoder.Logging
  11:  {
  12:     [ConfigurationElementType(typeof(Configuration.UDPTraceListenerData))]
  13:     public class UDPTraceListener : FormattedTraceListenerBase
  14:     {
  15:        private Microsoft.Practices.EnterpriseLibrary.Logging.LogEntry m_entry;
  16:        UdpClient m_Sock;
  17:        IPEndPoint m_Iep;
  18:   
  19:        public UDPTraceListener() 
  20:           : base()
  21:        {
  22:        }
  23:   
  24:        public UDPTraceListener(ILogFormatter formatter) 
  25:           : base(formatter)
  26:        {
  27:        }
  28:   
  29:        public UDPTraceListener(int port, ILogFormatter formatter)
  30:           : base(formatter)
  31:        {
  32:           m_Sock = new UdpClient();
  33:           m_Iep = new IPEndPoint(IPAddress.Broadcast, port);
  34:        }
  35:   
  36:        public override void Write(string message)
  37:        {
  38:           byte[] data = Encoding.UTF8.GetBytes(message);
  39:           m_Sock.Send(data, data.Length, m_Iep);
  40:           InstrumentationProvider.FireTraceListenerEntryWrittenEvent();
  41:        }
  42:   
  43:        public override void WriteLine(string message)
  44:        {
  45:           Write(message);
  46:        }
  47:   
  48:        public override void TraceData(System.Diagnostics.TraceEventCache eventCache, string source, System.Diagnostics.TraceEventType eventType, int id, object data)
  49:        {
  50:           m_entry = (LogEntry)data;
  51:           string message = this.Formatter.Format(m_entry);
  52:           this.Write(message);
  53:        }
  54:   
  55:        public override bool IsThreadSafe
  56:        {
  57:           get
  58:           {
  59:              return true;
  60:           }
  61:        }
  62:   
  63:        protected override string[] GetSupportedAttributes()
  64:        {
  65:           return new string[2] { "formatter", "port" };
  66:        }
  67:   
  68:        protected override void Dispose(bool disposing)
  69:        {
  70:           base.Dispose(disposing);
  71:           m_Sock.Close();
  72:           m_Iep = null;
  73:           m_Sock = null;
  74:        }
  75:   
  76:     }
  77:  }

Le fichier de configuration :


.


   1:  using System.Configuration;
   2:  using System.Diagnostics;
   3:   
   4:  using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
   5:  using Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder;
   6:  using Microsoft.Practices.EnterpriseLibrary.Logging.Formatters;
   7:  using Microsoft.Practices.EnterpriseLibrary.Logging.Configuration;
   8:  using Microsoft.Practices.ObjectBuilder;
   9:   
  10:  namespace Serialcoder.Logging.Configuration
  11:  {
  12:     [Assembler(typeof(UDPTraceListenerAssembler))]
  13:     public class UDPTraceListenerData : TraceListenerData
  14:     {
  15:        private const string PORT = "port";
  16:        private const string FORMATTERNAMEPROPERTY = "formatter";
  17:   
  18:        public UDPTraceListenerData() 
  19:        {
  20:        }
  21:   
  22:        public UDPTraceListenerData(int port, string formatterName)
  23:           : this("unnamed", port, formatterName)
  24:        {
  25:        }
  26:   
  27:        public UDPTraceListenerData(string name, int port, string formatterName)
  28:           : this(name, port, formatterName, TraceOptions.None)
  29:        {
  30:        }
  31:   
  32:        public UDPTraceListenerData(string name, int port, string formatterName, TraceOptions traceOptions)
  33:           : base(name, typeof(UDPTraceListener), traceOptions)
  34:        {
  35:           this.Port = port;
  36:           this.Formatter = formatterName;
  37:        }
  38:   
  39:        [ConfigurationProperty(PORT,IsRequired=true)]
  40:        public int Port
  41:        {
  42:           get { return (int)base[PORT]; }
  43:           set { base[PORT] = value; }
  44:        }
  45:   
  46:        [ConfigurationProperty(FORMATTERNAMEPROPERTY, IsRequired = false)]
  47:        public string Formatter
  48:        {
  49:           get { return (string)base[FORMATTERNAMEPROPERTY]; }
  50:           set { base[FORMATTERNAMEPROPERTY] = value; }
  51:        }
  52:   
  53:     }
  54:   
  55:     public class UDPTraceListenerAssembler : TraceListenerAsssembler
  56:     {
  57:        public override TraceListener Assemble(IBuilderContext context, Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.TraceListenerData objectConfiguration, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
  58:        {
  59:           UDPTraceListenerData castedObjectConfiguration
  60:              = (UDPTraceListenerData)objectConfiguration;
  61:   
  62:           ILogFormatter formatter = GetFormatter(context, castedObjectConfiguration.Formatter, configurationSource, reflectionCache);
  63:   
  64:           TraceListener createObject = new UDPTraceListener(castedObjectConfiguration.Port, formatter);
  65:           return createObject;
  66:        }
  67:     }
  68:   
  69:  }

la partie interessante de ce code est l'ecriture sur un port udp réaliser par :



ensuite il faut ajouter ce listener dans la sections des listeners du ficher de configuration

 




         <add port="20202" listenerDataType="Serialcoder.Logging.Configuration.UDPTraceListenerData, Serialcoder.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null"
traceOutputOptions="None" type="Serialcoder.Logging.UDPTraceListner, Serialcoder.Logging, Version=3.1.0.0, Culture=neutral, PublicKeyToken=null"
name="UDP Trace Listener" formatter="Condensed Informations" />

on indique alors via l'attribut "port", le port sur lequel on veut envoyer la trace.

 

pour ecouter il suffit de faire une petite application console :

 

.


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:   
   5:  namespace ServiceTraceListnerConsole
   6:  {
   7:     class Program
   8:     {
   9:        static void Main(string[] args)
  10:        {
  11:           if (args == null || args.Length != 2)
  12:           {
  13:              Console.WriteLine("Using :");
  14:              Console.WriteLine();
  15:              Console.WriteLine("ServiceTraceListnerConsole <IPEndpoint> <Port>");
  16:              Console.WriteLine();
  17:              Console.WriteLine("Example :");
  18:              Console.WriteLine("ServiceTraceListnerConsole 192.168.1.1 20202");
  19:              return;
  20:           }
  21:   
  22:           new ServiceListner(args[0], Convert.ToInt32(args[1]));
  23:        }
  24:     }
  25:  }

et son fichier d'ecoute du port UDP :


.


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using System.Threading;
   5:  using System.Net;
   6:   
   7:  namespace ServiceTraceListnerConsole
   8:  {
   9:     public class ServiceListner
  10:     {
  11:        private string m_IPEndPoint;
  12:        private int m_Port;
  13:        private System.Threading.Thread m_Thread;
  14:        private System.Threading.ManualResetEvent m_EventStop;
  15:        private System.Net.Sockets.UdpClient m_Sock;
  16:   
  17:        public ServiceListner(string ipEndPoint , int port)
  18:        {
  19:           m_IPEndPoint = ipEndPoint;
  20:           m_Port = port;
  21:           m_EventStop = new System.Threading.ManualResetEvent(false);
  22:           m_Thread = new System.Threading.Thread(Listen);
  23:           m_Thread.Start();
  24:        }
  25:   
  26:        private void Listen()
  27:        {
  28:           // IPEndPoint iep = new IPEndPoint(IPAddress.Parse(m_IPEndPoint), m_Port);
  29:           m_Sock = new System.Net.Sockets.UdpClient(m_Port);
  30:           while (true)
  31:           {
  32:              IAsyncResult result = m_Sock.BeginReceive(new AsyncCallback(ReceiveMessage), null);
  33:              WaitHandle[] handles = new WaitHandle[] { m_EventStop, result.AsyncWaitHandle };
  34:              int index = WaitHandle.WaitAny(handles);
  35:              if (index == 0)
  36:              {
  37:                 m_Sock.Close();
  38:                 break;
  39:              }
  40:           }
  41:        }
  42:   
  43:        private void ReceiveMessage(IAsyncResult ar)
  44:        {
  45:           IPEndPoint iep = new IPEndPoint(IPAddress.Any, 0);
  46:           byte[] data = m_Sock.EndReceive(ar, ref iep);
  47:           string message = Encoding.UTF8.GetString(data);
  48:           Console.WriteLine(message);
  49:        }
  50:     }
  51:  }

Sur les applications existantes utilisant le LAB il s'uffit d'utiliser ce listener pour voir apparaitre la trace dans une console, ceci peut etre interessant pendant la phase d'installation d'un nouveau service ou dans une application web.

ERP Studio - Mise à jour du 5 mars 2008

Cette mise à jour est l'occasion pour mettre en place les nouvelles fonctionnalités suivantes :

  • Nouvelle page de deploiement de l'application

Comme nous l'avions annoncé, nous avons changé de Framework pour suivre le plus possible les innovations apportées par Microsoft et avons migré toute l'application sur le .Net Framework 3.5, à la clé, un gain de productivité pour les developpeur et donc la mise en place plus rapide de vos demandes.

  • Modification de la boite de login/password

Il n'y a plus qu'une seule boite qui regroupe le splash screen et la procedure de login, le demarrage du logiciel à été acceleré.

image

Il est possible de charger la configuration du serveur via un fichier que l'on peut mettre sur une clé usb par exemple.

  • Extension du principe de colorisation des listes

maintenant il est possible de coloriser avec un theme que l'on peut appliquer en temps réél et qui est sauvé dans les paramètres utilisateurs.

image

Ce principe est appliqué sur toutes les listes, un nouveau mode aussi est present sur le attributs de chaque entité et permet lui aussi une colorisation en fonction des de certains critères.

  • Liste des produits et délai moyen de livraison

Une nouvelle colonne fait son apparition dans la liste des produits, le délai moyen de livraison pour les clients, il est calculé statistiquemnet sur 2 ans glissant et permet d'annoncer a son client le délai moyen constaté pour le livrer quand le produit n'est pas en stock, a ajouté au delai moyen de reception deja pris en compte.

  • Nouvelle propriété pour le produit, disponibilité à la vente

Il est possible de spécifier pour un produit s'il est disponible a la vente, pour l'instant cet etat est binaire, il est prevu de pouvoir spécifier des périodes.

image

  • Ajout d'une colonne commentaire sur le tarif produit fournisseur

il est possible d'ajouter un commentaire par tarif par produit fournisseur, celui-ci est reporté systematiquement dans la commande fournisseur

  • Commande mono fournisseur centrale d'achat

il est possible de passer massivement en commande fournisseur tous les produits mono fournisseurs en rupture a partir du moment ou il sont réservés par un ou plusieurs clients, il suffit d'indiquer la date limite de temps pour la reservation, généralement nous avons constaté que cette fonctionnalité peut faire gagner 15 minutes de productivité par jour

  • Reorganisation des rubans

Trois nouveaux bontons font leur apparition, les actions massives, la galerie de courbe statistique , et la coloration

image

  • Nouvelles statistiques

Affichage des commandes fournisseurs, par fournisseur.

Affichage du panier moyen annuel d'achat et de vente.

Repartition des produits par categorie.

  • Generation des relevés de facture

Possibilité de selectionner la date et possiblité d'annuler une opération en cours

image

  • Gestion des listes

Replacement massif d'une valeur par une autre

Correction des bugs suivants :

fermeture du programme après enregistrement du réglement de 2 factures

Crash sur la liste des factures qd une catégorie de client est crée sur un autre poste

l'affichage d'une catégorie, comportant des sous-catégories, ne fonctionne pas.