Référencer des scripts dans une MasterPage

by Nicolas Calvi 27. avril 2009 15:11

Il m'est arrivé récemment d'avoir un problème de référencement de me scripts JavaSript dans ma MasterPage. En effet ayant une arborescence compliquée (cf. ci-dessous), les chemins des fichiers se perdent un peu au moment du rendu.

> Site (Contient des pages qui implémente mes MasterPage)
    > Scripts (Contient mes fichiers js)
    > Master (Contient mes MasterPage)
    > CollectionPage1 (Contient des pages qui implémente mes MasterPage)
        > CollectionPage2 (Contient des pages qui implémente mes MasterPage)
    > CollectionPage3 (Contient des pages qui implémente mes MasterPage)

La question est donc : Comment référencer des scripts dans une MasterPage afin que le chemin soit toujours juste, et ce, peux importe ou se trouve ma page dans mon arborescence projet ? La réponse est de référencer les scripts dans l'événement Page_PreRender de la MasterPage (ou page) et faire un ResolveUrl sur le chemin du script, afin qu'a chaque rendu, la MasterPage puisse trouver le script sans problème, peut importe la page qui l'appelle.

protected void Page_PreRender(object sender, EventArgs e)
{
  this.Page.ClientScript.RegisterClientScriptInclude("MonScript1", this.ResolveUrl("~/Scripts/MonScript1.js"));
  this.Page.ClientScript.RegisterClientScriptInclude("MonScript2", this.ResolveUrl("~/Scripts/MonScript2.js"));
  this.Page.ClientScript.RegisterClientScriptInclude("MonScript3", this.ResolveUrl("~/Scripts/MonScript3.js"));
}

Définir une source de donnée WebService (SSRS)

by Nicolas Calvi 16. avril 2009 18:11

Je vais aborder ici comment faire pour définir une source de donnée de type WebService (XML) pour l'utiliser dans un rapport Reporting Services 2005. La chose se fait en deux phases.

Phase 1 : Définition de la source de donnée

Il est évident que dans ce cas, la source de donnée sera l'adresse de notre WebService, pour cela créez votre source de donnée et paramétrez là comme ceci : 

Il faut que le retour de votre WebService soit un XML ou un objet sérialisable dans ce sens. Une fois la source de donnée définie, il n'y a plus qu'à l'utiliser dans un DataSet.

Phase 2 : Définition d'un DataSet avec la source de donnée WebService

Le DataSet se défini comme normalement, on lui donne un nom, on lui donne comme source de donnée notre source de type XML. La seule chose a savoir est comment récupérer les données du WebService.

C'est dans la QueryString que l'on doit spécifier toutes ses informations, sous forme d'un XML propre à Reporting Services

Le XML (ci-bas) permet de définir la méthode su WebService à invoquer, ansi que les informations nécéssaire à la récupération des données.

<Query>
  <Method Namespace="http://tempuri.org/" Name="MaMethode"/>
  <SoapAction>http://tempuri.org/SuiviChantier</SoapAction>
  <ElementPath IgnoreNamespaces="true">
    *
  </ElementPath>
</Query>

 

Si le le WebService prend des paramètres, il suffit d'aller sur l'onglet Parameters et de les définirs. Il est alors possible de définir des paramètres en dur ou des paramètres passés au rapport.

Une fois terminé, vous n'avez plus qu'a utiliser le DataSet dans votre rapport. Mais il arrive parfois que Reporting Services ne remplisse pas automatiquement la liste des champs de binding, à ce moment vous devrez le faire à la main en ajoutant les champs un à un. Même si il ne les a pas trouvé en définissant le DataSet, cela ne l'empêchera pas de les récupérer par la suite.

Désactiver toutes les contraintes (Oracle)

by Nicolas Calvi 7. avril 2009 18:22

Je voudrais partager une procédure PL/SQL que j'ai écrite récemment et qui permet d'activer ou de désactiver toutes les contraintes d'un schéma utilisateur Oracle. Cela permet notamment de pouvoir faire des TRUNCATE qui sont parfois bloquées par les contraintes sur les tables. Voici la procédure :

/******************************************************************************
* Nom : DatabaseContrainte
* Description : Active ou désactive les contraintes de la base
*
* - Variables -
* (IN) pi_owner : Nom du owner du schéma
* (IN) pi_mode : 1 les actives, sinon désactive
******************************************************************************/

PROCEDURE DatabaseContrainte(pi_owner IN VARCHAR2, pi_mode IN NUMBER) IS

-- Curseurs

CURSOR c_contrainte(pi_owner VARCHAR2) IS 
        SELECT fk.OWNER, fk.CONSTRAINT_NAME , fk.TABLE_NAME, decode(fk.CONSTRAINT_TYPE,'P',1,'R',2, 3) as COLONNE
            FROM all_constraints fk
            WHERE fk.OWNER = pi_owner
            AND fk.CONSTRAINT_TYPE IN ('R', 'P' ,'C')
            ORDER BY COLONNE;

-- Variables

v_table all_constraints.TABLE_NAME%type;
v_owner all_constraints.OWNER%type;
v_contrainte all_constraints.CONSTRAINT_NAME%type;
v_colonne NUMBER(1);

BEGIN
       
    -- On liste les contraintes
        
    OPEN c_contrainte(pi_owner);
    LOOP
        FETCH c_contrainte INTO v_owner, v_contrainte, v_table, v_colonne;
        EXIT WHEN c_contrainte%NOTFOUND;
    
        IF ( pi_mode = 1 ) THEN
    
            EXECUTE IMMEDIATE 'ALTER TABLE ' || v_owner || '.' || v_table || ' ENABLE CONSTRAINT ' || v_contrainte;
            
        ELSE
                
            EXECUTE IMMEDIATE 'ALTER TABLE ' || v_owner || '.' || v_table || ' DISABLE CONSTRAINT ' || v_contrainte || ' CASCADE';
            
        END IF;
        
    END LOOP;
    CLOSE c_contrainte;

END DatabaseContrainte;

Je voudrais juste préciser un point, le fait que l'on active / désactive les contraintes dans un ordre précis.  En effet j'ai ajouté un ORDER BY du nom de COLONNE qui traite d'abord les clés primaires, ensuite les clés étrangères pour enfin traiter les contraintes. Cela permet d'éviter certain plantage lors de la réactivation de certaines clés étrangères.

Appliquer un Shader sur le rendu final

by Nicolas Calvi 17. mars 2009 15:57

Article pour un rendu en 2D avec XNA 3.0 

Quand on développe des jeux avec XNA, on voudrais parfois appliquer un Shader sur le rendu final de la scène, à savoir l'image qui est produite après le rendu de chaque objet de notre jeu. Appliquer un Shader sur un objet est chose facile, mais sur le rendu final de la scène en est une autre.

La première question que l'on se pose : Comment récupérer le rendu final sous forme de texture 2D. Pour cela il faut savoir qu'il est possible de détourner le rendu effectué par le SpriteBatch vers une autre source de rendu que le buffer d'affichage. Pour ce la il suffit d'utiliser la fonction SetRenderTarget() sur l'objet GraphicDevice. Cette fonction permet de changer l'endroit ou le rendu est fait.

Une fois cette fonction invoquée, vous pouvez dessiner avec le SpriteBatch et pour récupérer le résultat il suffit d'appeller ResolveBackBuffer() sur l'objet GraphicDevice. Vous allez alors récupérer une Texture2D sur laquelle vous pourrez appliquer le Shader final. Il faudra par contre ne pas oublier de changer le buffer de rendu pour revenir vers le buffer d'affichage.

RenderTarget2D renderTarget;
SpriteBatch spriteBatch;

// Création du SpriteBatch

spriteBatch = new SpriteBatch(this.GraphicsDevice);

// On change le buffer d'écriture pour rendre
// la scéne dans une Texture2D de type RenderTarget2D

this.GraphicsDevice.SetRenderTarget(0, renderTarget);
this.GraphicsDevice.Clear(Color.TransparentWhite);

// On dessine notre scène

spriteBatch.Begin();

// ...

spriteBatch.End();

// On remet le buffer d'écriture sur l'écran

this.GraphicsDevice.SetRenderTarget(0, null);

// On charge notre Shader

Effect effect = this.Content.Load<Effect>("MonShader");

// Démarage de l'affichage, on commence par le BEGIN du spriteBatch
// puis par celui du Shader pour préparer le Device au rendu

spriteBatch.Begin();
effect.Begin();

// On effectue les passes du Shader (en prenant la texture du render target)

foreach ( EffectPass oPass in effect.CurrentTechnique.Passes )
{
    oPass.Begin();
    spriteBatch.Draw(renderTarget.GetTexture(), new Vector2(0.0f, 0.0f), Color.White);
    oPass.End();
}

// Fin du rendu du Shader

effect.End();
spriteBatch.End();

Execution fichier script SqlServer

by Nicolas Calvi 4. mars 2009 13:32

Récemment j'ai été confronté à une problématique étrange, l'impossibilité d'exécuter des fichiers sql dans d'autre fichier sql avec SqlServer. En effet venant du monde Oracle, je pensais bêtement qu'il y avait un équivalent au '@' pour l'exécution de fichier.

Après de nombreuses investigations, je me suis aperçu que la seule façon de faire était de passer en mode SqlCommand (SqlCmd). Car une fois passé dans ce mode on peut lancer un série de fichier script avec le mot clé ":r".

:r C:\Scripts\MonScript_01.sql

:r C:\Scripts\MonScript_02.sql

De plus on peut activer l'erreur sur la première erreur via l'instruction ":On Error exit", ce qui permet un comportement similaire à Oracle avec arrêt en cas de problème.