Archives de catégorie : Blogue

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 prises en charge sous MS SQL Server. Avec une telle relation récursive, tenter de supprimer un enregistrement duquel un autre enregistrement dépend 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 enregistrements. 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 enregistrements 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!

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 !

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!).

SharePoint 2010 sur Windows 7 x64 sous VirtualBox

Profitant de la fin d’un mandat chez un client exigeant Windows XP pour passer à Windows 7, je découvre que mon laptop est en fait un machine 64 bits ! Parfait, ça règle un problème pour le développement SharePoint 2010. Oui, SharePoint Server 2010 peut maintenant rouler sur une plateforme client (Windows 7, pas seulement Windows Server comme pour son prédécesseur 2007), mais il reste qu’une exigence de base est d’avoir un CPU 64 bits. Avant de réaliser que j’avais bel et bien un CPU x64, je comptais peut-être installer un “Type-1 Hypervisor” comme ESXi et rouler virtuellement une machine 64 bits sur un hôte 32 bits (oui, il paraît que ça se fait!). Mais bon, finalement, j’ai pu abandonner l’idée. C’est une bonne chose aussi, car, ESXi ne fournit pas de console sur la machine physique; ça prend un autre machine pour accéder à l’interface et démarrer les machines virtuelles. Intéressant pour un setup de serveurs, très peu pratique pour un laptop. Reste que l’idée de pouvoir tirer le maximum de performance d’une machine virtuelle avec un engin de virtualisation direct sur le métal m’attire, alors j’ai été tenté d’installer Server 2008 R2 Hyper-V, mais j’ai résisté à la tentation, cédant plutôt à Windows 7. Ensuite, installation de VirtualBox pour lancer la machine virtuelle 2010 Information Worker Demonstration and Evaluation Virtual Machine complète l’installation. Oups! Sur démarrage de la VM, j’ai un BSOD 0x0000007b qui est heureusement facile à résoudre(changer les paramètres du disque dur IDE virtuel à PIIX3).