gennaio 2006 Blog Posts

Pensando di fare piacere a tutti linko un sito molto minimal con un sacco di programm free e di utility.

http://www.photoshophow.com/freeware.htm

zerocode

I programmatori, ho sempre pensato, scrivendo codice, sono i migliori giudici dei programmi altui senon altro perchè hanno a mente le difficoltà magari legate al click su un bottone.

Segnalo quindi più che volentieri il post di una MPV

http://blogs.dotnethell.it/ester/Post_2228.aspx

che fa notare come le sottomarche molto spesso siano prodotte dalle aziende di alta qualità...

zerocode

Cercando novità sulla versione 2005 di SQL SERVER ho trovato questo articolo

Implementing Smart Reports with the Microsoft Business Intelligence Platform

mi sembra sia un'ottima introduzione

zerocode

Sono stati assegnati gli ACM fellows del 2006,  un ricercatore microsoft  Surajit Chaudhuri, ha vinto per le sue ricerche nel campo dell self-tunig dei database.

zerocode

Ultimamente sono stato parecchio impegnato quindi non ho avuto il tempo di mettermi ad imparare come postare gli articoli. Per cui per quanti avessero bisogno posto una funzione di sql  server (compatibile dalla versione 2000) che consente di ricavare la settimana a partire da una data:

CREATE function ISOweek(
 @date datetime
 )
 returns smallint
as

begin
 declare @ISOweek smallint
 select @ISOweek = datepart(week, @date) + 1 - datepart(week, convert(char(4), datepart(year, @date)) + '.01.04')
       

 -- caso particolare: 1-3 gennaio può appartenere all'anno precedente
 if (@ISOweek = 0)
  select @ISOweek = dbo.ISOweek(convert(char(4), datepart(year, @date) - 1) + '.12.' + convert(char(2), datepart(day, @date) + 24))
 
 -- caso particolare: 29-31 dicembre può appartenere all'anno successivo
 if ((datepart(month, @date) = 12) and ((datepart(day, @date) - datepart(weekday, @date)) >= 28))
  select @ISOweek = 1
 
 return(@ISOweek)
end

zerocode

Questo trick mi è piaciuto parecchio, tratta di come mettere un disclaimer nella finestra di logon di windows.

http://blogs.dotnethell.it/ester/Post_2063.aspx

zerocode

Poichè nel corso del suo lavoro, il programmatore oltre a scrivere "select * from ..." si trova a dover risolvere dei problemi. Ultimamente ho letto il seguente paper all'indirizzo

http://arxiv.org/abs/math.NT/0309224

il quale tratta di un problema matematico semplicissimo da formulare ma ancora irrisolto, ( dal punto di vista computazionale è facile verificarlo ma una dimostrazione non è ancora stata trovata). Il problema si formula così

  1. si consideri un numero intero x
  2. si assegni a  x un nuovo valore  nella seguente maniera: se x è pari allora si prende x e lo si divide per due  se x è dispari lo si moltiplica per tre gli si aggiunge 1 e lo si divide per due
  3. riprendi dal passo 1 con il nuovo valore di x.

La congettura è che l'algoritmo converga sempre a x=1 in un numero finito di passi.

zerocode

Segnalo che anche io come Simone  sono stato accettato come review da Eric Gunnerson  per il suo nuovo libro:   A Programmer's Introduction to C# 2.0. 

Prima di tutto ringrazio il neo mpv Lorenzo  che ci ha segnalato il post di  Gunnerson. Ho un'unica domanda che mi sorge spontanea: se per scegliere le persone Gunnerson ha utilizzato la funzione rand() di excel, da quanto posso vedere, ha beccato nell'ordine dei post

  • Io (pos 3)
  • Nanda (pos 9)
  • Simone (pos 13)
  • Andrew Burrows (pos 18)
  • Brian (pos 36).

Mi viene quindi il vago sospetto che la funzione rand di excell sia stata scritta da una persona di origine italo americana (due nomi su 5 sono italiani) e che tale funzione, abbia una insana passione per i numeri multipli di tre o quelli le cui cifre contengono questo numero.

zero

Visto che esiste il movimento di liberazione dei nani da giardino  , che ne direste di creare un movimento di liberazione di quei tristissimi babbi Natale appesi, che quest'anno sono così numerosi ?

Problema: come implementare in un form e  in maniera corretta un grafico e visualizzarlo su un report creato con crystal report.

Soluzione: usiamo zedgraph.

Il problema con zedgraph http://zedgraph.sourceforge.net/ è che la documentazione non è moltissima e occorre usare un pò di fantasia per poter svolgere correttamente i compiti assegnati per casa. Metto quindi un pò di pseudo-codice che consente di creare un grafico e poi metterlo su crystal report: 

 

using System;

using System.Drawing;

using System.Collections;

using System.ComponentModel;

using System.Windows.Forms;

using System.Data;

using ZedGraph;

using CrystalDecisions.CrystalReports.Engine;

using CrystalDecisions.Shared;

 

 

namespace WindowsApplication2

{

      ///

      /// Summary description for Form1.

      ///

      public class Form1 : System.Windows.Forms.Form

      {

     

            private ZedGraph.ZedGraphControl zedGraphControl1;

            ///

            /// Required designer variable.

            ///

            private System.ComponentModel.Container components = null;

 

            public Form1()

            {

                  //

                  // Required for Windows Form Designer support

                  //

                  InitializeComponent();

            }

 

            ///

            /// Clean up any resources being used.

            ///

            protected override void Dispose( bool disposing )

            {

                  if( disposing )

                  {

                        if (components != null)

                        {

                             components.Dispose();

                        }

                  }

                  base.Dispose( disposing );

            }

 

            #region Windows Form Designer generated code

            ///

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            ///

            private void InitializeComponent()

            {

                  this.zedGraphControl1 = new ZedGraph.ZedGraphControl();

                  this.SuspendLayout();

                  //

                  // zedGraphControl1

                  //

                  this.zedGraphControl1.IsEnableHPan = true;

                  this.zedGraphControl1.IsEnableVPan = true;

                  this.zedGraphControl1.IsEnableZoom = true;

                  this.zedGraphControl1.IsScrollY2 = false;

                  this.zedGraphControl1.IsShowContextMenu = true;

                  this.zedGraphControl1.IsShowHScrollBar = false;

                  this.zedGraphControl1.IsShowPointValues = false;

                  this.zedGraphControl1.IsShowVScrollBar = false;

                  this.zedGraphControl1.IsZoomOnMouseCenter = false;

                  this.zedGraphControl1.Location = new System.Drawing.Point(0, 0);

                  this.zedGraphControl1.Name = "zedGraphControl1";

                  this.zedGraphControl1.PanButtons = System.Windows.Forms.MouseButtons.Left;

                  this.zedGraphControl1.PanButtons2 = System.Windows.Forms.MouseButtons.Middle;

                  this.zedGraphControl1.PanModifierKeys2 = System.Windows.Forms.Keys.None;

                  this.zedGraphControl1.PointDateFormat = "g";

                  this.zedGraphControl1.PointValueFormat = "G";

                  this.zedGraphControl1.ScrollMaxX = 0;

                  this.zedGraphControl1.ScrollMaxY = 0;

                  this.zedGraphControl1.ScrollMaxY2 = 0;

                  this.zedGraphControl1.ScrollMinX = 0;

                  this.zedGraphControl1.ScrollMinY = 0;

                  this.zedGraphControl1.ScrollMinY2 = 0;

                  this.zedGraphControl1.TabIndex = 0;

                  this.zedGraphControl1.ZoomButtons = System.Windows.Forms.MouseButtons.Left;

                  this.zedGraphControl1.ZoomButtons2 = System.Windows.Forms.MouseButtons.None;

                  this.zedGraphControl1.ZoomModifierKeys = System.Windows.Forms.Keys.None;

                  this.zedGraphControl1.ZoomModifierKeys2 = System.Windows.Forms.Keys.None;

                  this.zedGraphControl1.ZoomStepFraction = 0.1;

                  this.zedGraphControl1.Click += new System.EventHandler(this.zedGraphControl1_Click);

                  //

                  // Form1

                  //

                  this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);

                  this.ClientSize = new System.Drawing.Size(680, 414);

                  this.Controls.Add(this.zedGraphControl1);

                  this.Name = "Form1";

                  this.Text = "Form1";

                  this.Load += new System.EventHandler(this.Form1_Load);

                  this.ResumeLayout(false);

 

            }

            #endregion

 

            ///

            /// The main entry point for the application.

            ///

            [STAThread]

            static void Main()

            {

                  Application.Run( new Form1() );

            }

 

            private void Form1_Load( object sender, System.EventArgs e )

            {

                  CreaGrafico();

            }

 

            private void zedGraphControl1_Click(object sender, System.EventArgs e)

            {

                  AnteprimaGrafico();

            }

 

            protected void AnteprimaGrafico(){

                  if (System.IO.File.Exists("c:\\grafico.Png"))

 

                        System.IO.File.Delete("c:\\grafico.Png");

 

                  zedGraphControlMain.GraphPane.Image.Save (

 

                        "c:\\grafico.Png");

 

                  System.IO.FileStream fs = System.IO.File.OpenRead("c:\\grafico.Png");

 

                  byte[] data = new byte[fs.Length];

 

                  fs.Read(data, 0, data.Length);

 

                  fs.Close();

 

 

                  System.Data.DataTable dt = new System.Data.DataTable("immagine_grafico");

 

                  dt.Columns.Add("immagine_grafico", data.GetType());

 

                  ds.Tables.Add(dt);

 

                  System.Data.DataRow dr = ds.Tables[0].NewRow();

 

                  dr[0] = data;

 

                  ds.Tables[0].Rows.InsertAt(dr,0);

 

                  ds.WriteXmlSchema("..\\..\\xsd\\rptGrafico.xsd");

 

 

 

                  rpt = new ReportDocument();

 

                  rpt.Load("..\\..\\Report\\rptGrafico.rpt", CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy);

 

 

                  rpt.SetDataSource(this.ds);

 

                  rpt.Refresh();

 

 

                  FormReportViewer frmrpt = new FormReportViewer(rpt);

 

                  frmrpt.MdiParent = this.MdiParent;

 

                  frmrpt.Show();

 

 

            }

 

            protected void CreaGrafico()

            {

                 

                  zedGraphControl1.IsShowPointValues = true;

                  zedGraphControl1.GraphPane.Title = "Test Case for C#";

                  double[] x = new double[100];

                  double[] y = new double[100];

double[] z = new double[100];

                  int   i;

                  for ( i=0; i<100; i++ )

                  {

                        x[i] = (double) i / 100.0 * Math.PI * 2.0;

                        y[i] = Math.Sin( x[i] );

                        z[i] = Math.Cos( x[i] );

                  }

                  zedGraphControl1.GraphPane.AddCurve( "Sine Wave", x, y, Color.Red, SymbolType.Square );

                  zedGraphControl1.GraphPane.AddCurve( "Sine Wave", x, z, Color.Blue, SymbolType.Star );

                  zedGraphControl1.AxisChange();

                  zedGraphControl1.Invalidate();

           

                 

            }

 

     }

 

OK OK non sono stato chiarissimo causa fretta nel copia incolla necessita qualche spiegazione. 

 

Nel metodo creagrafico occorre chiamare prima di tutto il metodo

zedGraphControl1.GraphPane.CurveList.Clear();

altrimenti se viene richiamato, il metodo, duplica le colonne perchè aggiunge due volte i valori (cosa questa che mi ha fatto perdere parecchio tempo). Inoltre il metodo di salvare il file su disco e poi caricarlo su un dataset non è molto efficiente, occorrerebbe (e dio sia lodato per sourceforge per il codice sorgente) aggiungere/implementare qualche metodo dentro la classe ZedGraphControl. Tuttavia funziona (e se funziona non è poi così stupido) ed è anche molto veloce. Inoltre si possono scegliere fra vari tipi di grafico e nel sito è possibile vedere altri sorgenti.

In effetti il bello è che il costo è praticamente zero anche se uno deve sbattersi a cercare le soluzioni. Giudizio finale positivo per cui spero che sarà utile a qualcuno.

Resto in attesa di Vs. commenti e/o suggerimenti.

zero

 

 

Il mio primo post su UGIDOTNET.