Javascript : Restaurer le scroll au rechargement d’un écran

Ca remonte tout le temps ! Comment garder une page dans son état initial lors d’un « postback » ?
Article inspiré de cette page de forum.
Lors d’un postback d’une page, le scroll revient toujours à sa position initiale… Si on était situé en bas de page, il faut donc re-« moletter » jusqu’en bas. C’est très désagréable.
Voici donc un bout de javascript qui fonctionne de la façon suivant :

  • On enregistre (dans un champ caché, hidden) la position de l’écran sur certains « onchange » de contrôles.
  • La page se recharge
  • On récupère la valeur cachée, qu’on applique dès le window.onload

Du coup la page revient à sa position initiale !
Fonction à appeler à chaque fois qu’un contrôle gagne le focus, ou voit sa valeur changer, etc :

function SaveScroll()
{
    oHidden = document.getElementById("hdScrollPosition");
    if (oHidden)
    {
        var sScroll;
        // Test navigateur
        if (document.documentElement && document.documentElement.scrollTop)
            { sScroll = document.documentElement.scrollTop; }
        else if (document.body)
            { sScroll = document.body.scrollTop; }
        else
            { sScroll = 0; }
        oHidden.value = sScroll;
    }
}

Fonction à appeler sur le onload de la page :

function RestoreScroll()
{
    oHidden = document.getElementById("hdScrollPosition");
    if (oHidden)
    {
        var sScroll = oHidden.value;
        if (sScroll > 0)
        {
            if (document.documentElement && document.documentElement.scrollTop)
                { document.documentElement.scrollTop = sScroll;}
            else if (document.body)
            {
                if (window.navigator.appName == ’Netscape’)
                    { window.scroll(0, sScroll); }
                else
                    {
                        // Restauration du scroll
                        document.body.scrollTop = sScroll;
                        // Cas ASP.NET : si la page en question est incluse dans une masterpage :
                        // document.body.parentElement.scrollTop = sScroll;
                    }
            }
            else
            {
                window.scroll(0, sScroll);
            }
        }
        oHidden.value = 0;
    }
}

Maintenant, il suffit d’ajouter dans les pages :

  • Le contrôle caché qui sauve la position : <input id="Hidden1" type="hidden" />
  • La restauration du scroll au chargement de la page :
    <script type="text/javascript" language="javascript">
            window.onload = RestoreScroll();
    </script>

C# : Exécuter un batch et récupérer la sortie.


private int Run_Batch(string sBatchPath, string sBatchName, string sArgs)
{
	// Code retour du batch
    int iExitCode = 0;
    // Chemin complet du batch
    string sBatchFullPath = sBatchPath + "\" + sBatchName;
    // Configuration du batch (chemin, arguments, sorties...)
    ProcessStartInfo processInfo = new ProcessStartInfo(sBatchFullPath);
    processInfo.CreateNoWindow = true;
    processInfo.Arguments = sArgs;
    processInfo.RedirectStandardOutput = true;
    processInfo.RedirectStandardError = true;
    processInfo.UseShellExecute = false;
    // Process en soi
    Process pBatch = new Process();
    // Redirection de la sortie vers une fonction
    pBatch.OutputDataReceived += new DataReceivedEventHandler(pBatch_OutputDataReceived);
    pBatch.StartInfo = processInfo;
    pBatch.EnableRaisingEvents = true;
    // Démarrage du batch + lecture des sorties.
    pBatch.Start();
    pBatch.BeginOutputReadLine();
    pBatch.BeginErrorReadLine();
    // Synchronisation
    pBatch.WaitForExit();
    iExitCode = pBatch.ExitCode;
    // Fermeture
    pBatch.Close();
    return iExitCode;
}
protected void pBatch_OutputDataReceived(Object sender, DataReceivedEventArgs e)
{
    System.Console.Write(e.Data);
}

BATCH DOS: Récupérer le chemin absolu du batch

Pushez madame !
Le chemin du batch exécuté se retrouve de cette façon :
echo %~dp0
A noter que le chemin à partir duquel on appelle ce batch se retrouve ainsi :
echo %CD%
Source : Weblogs
Ainsi, pour éxécuter un batch qui fait appel à des ressources dans son propre répertoire, le mieux est de commencer ainsi :
@echo off
pushd %~dp0

SQL Server : Requêter à travers un firewall

Tout est décrit sur cette page : Lien vers MSDN
Ils précisent que ça se fait en 2 étapes :

  • Préciser à SQL Server d’utiliser le port 1433
  • Ouvrir le port sur le firewall.

Sinon :

As an alternative to configuring SQL Server to listen on a fixed port and opening the port, you can list the SQL Server executable (Sqlservr.exe) as an exception to the blocked programs.

C# : Créer rapidement un événement

Fiche mémo pour créer rapidement un événement lancé d’une classe, et abonnement à cet event.
Etapes de création d’un événement customisé complet (C#):

  • 1- DANS LA CLASSE SOULEVANT L’EVENEMENT
  • Delegate :
    public delegate void MonHandler(object sender, MonEventArgs e);
  • L’événement lui-même:
    public event MonHandler On_QuelqueChoseSePassed;
  • Classe « MonEventArgs » :
    public class MonEventArgs : EventArgs
        {
            private int _iInformation1;
            private string _sInformation2;
            internal MFluxEventArgs(int iInfo1, string sInfo2)
            {
                _iInformation1 = iInfo1;
                _sInformation2 = sInfo2;
            }
            public int Information1
            {
                get { return _iInformation1; }
            }
            public string Information2
            {
                get { return _sInformation2; }
            }
        }
  • Fonction qui lance l’événement :
        private void FireQuelqueChoseSePassed(MonEventArgs e)
        {
            if (On_QuelqueChoseSePassed != ')
            {
                On_QuelqueChoseSePassed(this, e);
            }
        }

 

  • Maintenant, dans mon code, je vais avertir quand quelque chose se passe :

    ...
    FireQuelqueChoseSePassed(new MFluxEventArgs(15, "On est ici"));
    ...
  • 2- AILLEURS, on souhaite s’abonner à l’événement :
  • On abonne une fonction de la même signature que le delegate :

    MaClasse.On_QuelqueChoseSePassed +=new MaClasse.MonHandler(LaFonctionQuiVaRecevoirLEvent);
  • La fonction abonnée :

    protected void LaFonctionQuiVaRecevoirLEvent(object sender, MonEventArgs e)
    {
    // Ici, on peut utiliser "sender" (objet MaClasse instancié), ou "e" (qui contient un entier et un string...)
    }

SQL SERVER : Désactiver les contraintes sur une table.

La commande est celle-ci :
ALTER TABLE ma_table NOCHECK CONSTRAINT ALL
Pour désactiver TOUTES les contraintes de TOUTES les tables :
exec sp_MSforeachtable ’ALTER TABLE ? NOCHECK CONSTRAINT ALL’
Pour tout remettre d’équerre :
exec sp_MSforeachtable ’ALTER TABLE ? CHECK CONSTRAINT ALL’
A noter que ça marche aussi pour désactiver les triggers : ALTER TABLE ma_table DISABLE TRIGGER ALL, puis faire ENABLE pour les réactiver.
Source sur SQLServer Magazine.

Tips pour SSIS (SQL Server Integration Services)

L’héritier des lots DTS donne du fil à retordre…

    • Erreurs lors de la lecture d’un fichier plat : « LocaleID xx n’est pas installé… ».
      –> Solution : Eviter les fichiers plats de type CSV. Renommer les CSV en TXT, et ca va marcher.
    • Erreur 0xC02020A1 : « Erreur de conversion » lorsqu’on essaie d’intégrer les données d’un fichier plat vers une autre source de données.
      –> Solution : Il faut bien vérifier la taille des colonne importées. Sinon faire un clic-droit sur le composant de flux de données, puis « Afficher l’éditeur avancé > Propriétés d’entrée de de sortie > Sortie de source de fichier plat > Colonnes de sortie ». Choisir les colonnes qui plantent, et changer le paramètre TruncationRowDisposition à « RD_IgnoreFailure ».
      –> Risque : les données tronquées seront simplement notifiée.
    • Le composant de flux de données pour filtrer des données est le « Fractionnement conditionnel ».

To be continued...

.NET : Le bon encodage

Bien définir la balise « Globalization » du web.config.
Diantre, votre page web s’affiche, mais les caractères spéciaux sont de vraies hiéroglyphes. En .NET, la solution se cache souvent dans un web.config mal… configuré :
<globalization requestEncoding="ISO-8859-15" responseEncoding="ISO-8859-15" fileEncoding="ISO-8859-15" culture="fr-FR" uiCulture="fr-FR" />

MOSS 2007 : Activer les statistiques d’un site

Comment accéder à de magnifiques rapports d’utilisation du site ? (camemberts, diagrammes…)
Voici les 3 manipulations à effectuer pour activer les statistiques sur un site MOSS :

  • Activer le journal de traitement de l’analyse
  •  » Admin centrale Sharepoint > Opération > Traitement de l’analyse de l’utilisation « 
  • Cocher  » Activer le journal « 
  • Emplacement : Donner (pourquoi pas) le même répertoire que les logs wss.
  • Nombre de fichiers : Nb de serveurs de BDD * 3 (préconisation MS).
  • Cocher  » Activer le traitement « .
  • Donner un intervalle de temps d’au moins 1/2 heure, le midi ou le soir.
  •  » OK « 

Dans les services partagés du site :

  • Cliquer sur « Rapports d’utilisation » dans la section « Rapports d’utilisation d’Office SharePoint ».
  • Cocher les deux cases, et faire « OK »

L’URL de la page qui va contenir les stats du site est :
http://mon_site/_layouts/SPUsageWeb.aspx