Gestion du calendrier familial

Les calendriers scolaires collés sur le frigo avec du ruban adhésif (non, pas d’aimants; tout est  en inox maintenant!) et le calendrier maison fait à partir de nos photos de famille, c’est super pour ma blonde qui travaille de la maison, mais ce n’est pas terrible pour moi. Comprenez-moi, j’ai un petit côté Prof. Tournesol genre lunatique parfois, donc j’ai intérêt à m’entourer d’un peu de technologie pour m’aider à garder conscience du temps qui passe… et des meetings, rendez-vous, cours de musique/danse/patin des enfants et autres activités et d’être alerté par mon “téléphone intelligent” suffisamment d’avance pour que j’aie le temps de me rendre à destination sans trop de retard.

Voici la solution que j’ai mise en place. J’ai créé un calendrier familial partagé sur Live (oui, Google l’offre aussi, mais je m’assume!) et grâce à un connecteur installé avec Live Essentials, ce calendrier est maintenant disponible, avec synchro dans toutes les directions sur le Web et dans nos Outlook respectifs. Sous Outlook 2007 ou 2010, il est possible de voir plusieurs calendriers fusionnés en une seule vue intégrée. Génial! Mais pas tout à fait au point. Mon WP7 se synchronise avec un seul calendrier: mon agenda principal associé à mon compte Exchange. Si je veux être alerté, ça prend un p’tit bout de code macro VBA pour copier les items de mon calendrier familial dans mon calendrier principal. Voici une macro qui, sur ajout d’un item dans le calendrier familial, le copie dans le calendrier principal, en lui assignant un identifiant unique (l’identifiant EntryID n’est pas conservé). Sur modification ou retrait d’un item dans le calendrier partagé, la modification ou le retrait est répliqué dans le calendrier principal grâce à l’identifiant unique.

(Code...)

Avec ça, j’ai bon espoir de rater moins de rendez-vous !

Introduction à Windows Phone 7

Bon, il fallait bien que ce jour arrive. Mon super Nokia indestructible a fait un cycle complet dans la laveuse et après près de 5 ans de loyaux services, a finalement rendu l’âme, sans demander son reste, sans attendre non plus la réception d’un câble de transfert — commandé de Hong Kong avant les Fêtes mais toujours pas reçu ! — pour la copie de sauvegarde que j’avais prévu faire. J’ai donc dû faire un homme de moi et aller me chercher au plus vite un “téléphone intelligent” pour qu’il y ait rapidement à nouveau un abonné au numéro composé. Mais, la question se pose, quelle plateforme? Le sexy iPhone, le geeky Android ou le tout nouveau WP7? Malgré que je sois séduit par le clavier et la roulette du BlackBerry et ses applications axées sur les affaires, je l’élimine d’entrée de jeu. Cet appareil m’apparait, sans bonne raison, comme un appareil du passé. Le iPhone? Trop gadget, trop Mac, je ne saurais pas quoi en faire d’un point de vue développement. Car, je veux  profiter de l’occasion pour m’initier au développement sur les plateformes mobiles et l’idée de m’acheter un Mac et faire du Objective C me semble être une barrière à l’entrée plutôt élevée. Au pire, j’aurai toujours le iPhone 3GS de ma blonde pour faire des expériences… Android? Je suis séduit par l’ouverture de la plateforme et le fait que  Flash fonctionne sur cette plateform! Développement Java sur Eclipse? Oui, intéressant, j’ai  fait beaucoup de Java dans une autre vie. Mais, non, je persiste et signe, je m’assume, je pourrais bien le vouloir autrement, mais la réalité est que je suis entouré d’OS et d’outils Microsoft au quotidien, au travail comme à la maison, “I am a PC” et “Windows Phone 7 was my idea!”, j’ai même un XBox, malgré que je ne sois pas vraiment un “gamer” (mais les enfants trippent sur la Kinect!), alors, je m’assume et je décide de me lancer malgré l’immaturité relative de la nouvelle plateforme de Microsoft et le matériel pas tout à fait au niveau des iPhone 4, Galaxy S, Nexus S de ce monde pour enfin choisir un WP7 (LG Optimus Quantum chez Bell) comme appareil de tous les jours et comme appareil pour découvrir le merveilleux monde du développement pour appareils mobiles au-delà du simulateur. Je vous garderai au courant des mes expériences (et si je finis par craquer pour aller m’acheter aussi un Androïd débarré qui pourra aussi recevoir ma carte SIM de Bell!).

Suppression récursive sous MS SQL Server

Supposons que vous ayez une table définie comme ceci:

CREATE TABLE MyTable (

 

  OID INT, --clé primaire

 

  OID_Parent INT, --récursion, clé étrangère

 

  --... autre colonnes

 

)

 


 

 

 

 

 

 

 

 

Bien qu’il soit possible de définir une clé étrangère avec l’attribut DELETE CASCADE, à la différence d’autres SGBD, les suppressions en cascade récursives sur la même table ne sont pas pris en charge sous MS SQL Server. Avec une telle relation récursive, tenter de supprimer un enregistrement duquel un autre enregistrement dépen n’est pas permis. Si pour contourner le problème vous tentez de créer un déclencheur INSTEAD OF DELETE, celui-ci ne se déclenche uniquement pour le premier DELETE. Il ne se déclenche pas récursivement pour supprimer tous les enregistrement. Ce comportement est attendu et documenté sur MSDN : “Si un déclencheur INSTEAD OF défini sur une table exécute une instruction portant sur cette table et qui est susceptible de l’activer de nouveau, il n’est pas appelé de façon récurrente.” La solution est donc de créer un déclencheur de suppression récursif comme celui-ci:

CREATE TRIGGER del_MyTable

 

  ON MyTable

 

  INSTEAD OF DELETE

 

AS

 

  CREATE TABLE #Table(

 

    OID INT

 

  )

 

  INSERT INTO #Table (OID) SELECT OID FROM deleted

 

  DECLARE @c INT

 

  SET @c = 0

 

  WHILE @c <> @@ROWCOUNT

 

  BEGIN

 

    SELECT @c = @@ROWCOUNT

 

    INSERT INTO #Table (OID)

 

    SELECT MyTable.OID FROM MyTable

 

    LEFT OUTER JOIN #Table ON MyTable.OID = #Table.OID

 

    WHERE MyTable.OID_Parent IN (SELECT OID FROM #Table)

 

    AND #Table.OID IS NULL

 

  END

 

  DELETE MyTable FROM MyTable INNER JOIN #Table ON MyTable.OID = #Table.OID

 

END

 


 

 

 

Ce déclencheur insère tous les enregistrements de la pseudo table deleted dans une table temporaire #Table. Ensuite, il rassemble tous les enregistrements qui ne sont pas déjà dans la table temporaire (LEFT OUTER JOIN … WHERE IS NULL). La boucle s’arrête si aucun nouvel enregistrement n’est trouvé. Finalement, tous les documents recueillis sont supprimés.

(Adapté de devioblog)

Suppression récursive sous MS SQL Server

Supposons que vous ayez une table définie comme ceci:

CREATE TABLE MyTable (

 

  OID INT, --clé primaire

 

  OID_Parent INT, --récursion, clé étrangère

 

  --... autre colonnes

 

)

 


 

 

 

 

 

 

 

 

Bien qu’il soit possible de définir une clé étrangère avec l’attribut DELETE CASCADE, à la différence d’autres SGBD, les suppressions en cascade récursives sur la même table ne sont pas pris en charge sous MS SQL Server. Avec une telle relation récursive, tenter de supprimer un enregistrement duquel un autre enregistrement dépen n’est pas permis. Si pour contourner le problème vous tentez de créer un déclencheur INSTEAD OF DELETE, celui-ci ne se déclenche uniquement pour le premier DELETE. Il ne se déclenche pas récursivement pour supprimer tous les enregistrement. Ce comportement est attendu et documenté sur MSDN : “Si un déclencheur INSTEAD OF défini sur une table exécute une instruction portant sur cette table et qui est susceptible de l’activer de nouveau, il n’est pas appelé de façon récurrente.” La solution est donc de créer un déclencheur de suppression récursif comme celui-ci:

CREATE TRIGGER del_MyTable

 

  ON MyTable

 

  INSTEAD OF DELETE

 

AS

 

  CREATE TABLE #Table(

 

    OID INT

 

  )

 

  INSERT INTO #Table (OID) SELECT OID FROM deleted

 

  DECLARE @c INT

 

  SET @c = 0

 

  WHILE @c <> @@ROWCOUNT

 

  BEGIN

 

    SELECT @c = @@ROWCOUNT

 

    INSERT INTO #Table (OID)

 

    SELECT MyTable.OID FROM MyTable

 

    LEFT OUTER JOIN #Table ON MyTable.OID = #Table.OID

 

    WHERE MyTable.OID_Parent IN (SELECT OID FROM #Table)

 

    AND #Table.OID IS NULL

 

  END

 

  DELETE MyTable FROM MyTable INNER JOIN #Table ON MyTable.OID = #Table.OID

 

END

 


 

 

 

Ce déclencheur insère tous les enregistrements de la pseudo table deleted dans une table temporaire #Table. Ensuite, il rassemble tous les enregistrements qui ne sont pas déjà dans la table temporaire (LEFT OUTER JOIN … WHERE IS NULL). La boucle s’arrête si aucun nouvel enregistrement n’est trouvé. Finalement, tous les documents recueillis sont supprimés.

(Adapté de devioblog)

Boucler sur tous les enregistrements d’une table

Voici une façon simple et élégante (mais pas très rapide!) de boucler en SQL sur tous les enregistrements d’une table qui comporte une clé primaire unique:

-- changer type, id et table selon le type et le nom de la clé primaire et la table à manipuler
declare @id type
select @id = min(id) from table
while @id is not null
begin
-- modifier cette ligne selon l'opération à faire sur chaque enregistrement
select * from table where id = @id
select @id = min(id) from table where id > @id
end

Pour boucler sur tous les enregistrements d’une table qui ne comporte pas de clé primaire, la méthode est plus complexe et moins élégante; elle implique l’utilisation d’une table temporaire. Voirhttp://support.microsoft.com/kb/111401 pour plus de détails.

WikiPlus de KWizCom

C’est connu, les fonctionalités de base de SharePoint côté Wiki sont faibles comparativement à d’autres offres sur le marché. La référence dans ce segment est sans contredit MediaWiki, l’engin derrière Wikipedia. Tout autre technologie sera nécessairement comparée à MediaWiki. Et, dans une telle comparaison, SharePoint ne fait généralement pas très bonne figure. En fait, c’était surtout vrai avant SharePoint Server 2010 qui offre maintenant des fonctionalités Enterprise Wiki qui commandent plus de respect! Par contre, si vous êtes toujours sur MOSS ou WSS 2007 ou si votre plateforme de prédilection gratuite reste SharePoint Foundation 2010, le produit WikiPlus de KWizCom, une compagnie canadienne (Markham, Ontario) soit dit en passant, pourrait sans doute vous intéresser!

WikiPlus de KWizCom

C’est connu, les fonctionalités de base de SharePoint côté Wiki sont faibles comparativement à d’autres offres sur le marché. La référence dans ce segment est sans contredit MediaWiki, l’engin derrière Wikipedia. Tout autre technologie sera nécessairement comparée à MediaWiki. Et, dans une telle comparaison, SharePoint ne fait généralement pas très bonne figure. En fait, c’était surtout vrai avant SharePoint Server 2010 qui offre maintenant des fonctionalités Enterprise Wiki qui commandent plus de respect! Par contre, si vous êtes toujours sur MOSS ou WSS 2007 ou si votre plateforme de prédilection gratuite reste SharePoint Foundation 2010, le produit WikiPlus de KWizCom, une compagnie canadienne (Markham, Ontario) soit dit en passant, pourrait sans doute vous intéresser!

Connexion SP2010 BCS à BD MySQL WikiMedia

SharePoint 2010 propose une technologie nommée BCS (Business Connectivity Services) permettant d’intégrer des données provenant de sources de données externes à SharePoint. Comme premier essai avec cette technologie, je tente de créer un lien vers une base de données MySQL WikiMedia. Pour se faire, j’utilise ma machine virtuelle de développement Information Worker sur VirtualBox (voir billet précédent) pour créer un projet BCS sous Visual Studio 2010.

Connexion SP2010 BCS à BD MySQL WikiMedia

SharePoint 2010 propose une technologie nommée BCS (Business Connectivity Services) permettant d’intégrer des données provenant de sources de données externes à SharePoint. Comme premier essai avec cette technologie, je tente de créer un lien vers une base de données MySQL WikiMedia. Pour se faire, j’utilise ma machine virtuelle de développement Information Worker sur VirtualBox (voir billet précédent) pour créer un projet BCS sous Visual Studio 2010.

Gestion du calendrier familial

Les calendriers scolaires collés sur le frigo avec du ruban adhésif (non, pas d’aimants; tout est  en inox maintenant!) et le calendrier maison fait à partir de nos photos de famille, c’est super pour ma blonde qui travaille de la maison, mais ce n’est pas terrible pour moi. Comprenez-moi, j’ai un petit côté Prof. Tournesol genre lunatique parfois, donc j’ai intérêt à m’entourer d’un peu de technologie pour m’aider à garder conscience du temps qui passe… et des meetings, rendez-vous, cours de musique/danse/patin des enfants et autres activités et d’être alerté par mon “téléphone intelligent” suffisamment d’avance pour que j’aie le temps de me rendre à destination sans trop de retard.

Voici la solution que j’ai mise en place. J’ai créé un calendrier familial partagé sur Live (oui, Google l’offre aussi, mais je m’assume!) et grâce à un connecteur installé avec Live Essentials, ce calendrier est maintenant disponible, avec synchro dans toutes les directions sur le Web et dans nos Outlook respectifs. Sous Outlook 2007 ou 2010, il est possible de voir plusieurs calendriers fusionnés en une seule vue intégrée. Génial! Mais pas tout à fait au point. Mon WP7 se synchronise avec un seul calendrier: mon agenda principal associé à mon compte Exchange. Si je veux être alerté, ça prend un p’tit bout de code macro VBA pour copier les items de mon calendrier familial dans mon calendrier principal. Voici une macro qui, sur ajout d’un item dans le calendrier familial, le copie dans le calendrier principal, en lui assignant un identifiant unique (l’identifiant EntryID n’est pas conservé). Sur modification ou retrait d’un item dans le calendrier partagé, la modification ou le retrait est répliqué dans le calendrier principal grâce à l’identifiant unique.

(Code...)

Avec ça, j’ai bon espoir de rater moins de rendez-vous !