giovedì 17 febbraio 2011

Linq Select() Where()

Più per necssità che per altro mi sono messo a studiare linq più che altro per comprendere meglio le sue potenzialità. Ne sono venuti fuori questi tre esempietti semplici semplici che per ogni novizio potrebbero tornare utili.

Il framework è il 4.0
l'ambiente e Vs 2010.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LinqTest
{
class Program
{

public class OrderRow
{
public int amount { get; set; }
public string status { get; set; }
}

public class Order
{
public string name { get; set; }
public DateTime date { get; set; }
public int cost { get; set; }
public List<orderrow> Rows = new List<orderrow>();
}

static void Main(string[] args)
{


Order i1 = new Order();
i1.name = "001/1";
i1.date = DateTime.Now;
i1.cost = 100;

OrderRow i1_r1 = new OrderRow();
OrderRow i1_r2 = new OrderRow();
OrderRow i1_r3 = new OrderRow();
OrderRow i1_r4 = new OrderRow();

i1_r1.amount = 10; i1_r1.status = "s";
i1_r2.amount = 20; i1_r2.status = "s";
i1_r3.amount = 30; i1_r3.status = "s";
i1_r4.amount = 40; i1_r4.status = "s";

i1.Rows.Add(i1_r1);
i1.Rows.Add(i1_r2);
i1.Rows.Add(i1_r3);
i1.Rows.Add(i1_r4);

Order i2 = new Order();
i2.name = "001/2";
i2.date = DateTime.Now;
i2.cost = 10;

OrderRow i2_r1 = new OrderRow();
OrderRow i2_r2 = new OrderRow();

i2_r1.amount = 4; i2_r1.status = "n";
i2_r2.amount = 6; i2_r2.status = "n";

i2.Rows.Add(i2_r1);
i2.Rows.Add(i2_r2);


Order i3 = new Order();
i3.name = "001/3";
i3.date = DateTime.Now;
i3.cost = 1000;

OrderRow i3_r1 = new OrderRow();

i3_r1.amount = 990; i3_r1.status = "n";

i3.Rows.Add(i3_r1);

Order i4 = new Order();
i4.name = "001/4";
i4.date = DateTime.Now;
i4.cost = 1200;


Order[] Orders = new Order[] { i1, i2, i3, i4 };


var cResult = from t in Orders
where t.cost >= 100
select t;

foreach (var x in cResult)
{
Console.WriteLine(x.name + " " + x.cost.ToString());
}

cResult = from t in Orders
where (t.cost >= 100) && (t.Rows.Count > 2)
select t;

foreach (var x in cResult)
{
Console.WriteLine(x.name + " " + x.cost.ToString());
}

cResult = from t in Orders
where (t.cost == 100) && (t.Rows.Sum(c=> c.amount) == 100)
select t;

foreach (var x in cResult)
{
Console.WriteLine(x.name + " " + x.cost.ToString());
}

cResult = from t in Orders
where t.cost == (t.Rows.Sum(c => c.amount) )
select t;

foreach (var x in cResult)
{
Console.WriteLine(x.name + " " + x.cost.ToString() );
}

Console.ReadLine();
}
}
}

E dato che qualcuno al tempo disse " quando trovo un esempio su web difficilemente va ... " questo va !

giovedì 10 febbraio 2011

Campo Money sql server

Matematicamente parlando
y = (x/3)*3 che di norma dovrebbe dare y = x ma ne siamo davvero sicuri ? e soprattutto perchè è coinvolto il campo money ??

osservate attentamente questo brano di codice SQL..

declare @xM money
declare @xD decimal(9,2)

set @xM = 20.31
set @xD = 20.31

select (@xM/1000)*1000 X_Money ,(@xD/1000)*1000 X_Decimal

e Ottengo :
X_Money > 20,30
X_Decimal > 20.3100000

Qualcosa non torna ..o sbaglio.

Ponete quindi attenzione all'utilizzo di questo campo, soprattutto nei conti ...

lunedì 7 febbraio 2011

Passare il Nome di un DB come parametro in una Stored procedure

Ecco una cosa che tenicamente serve ma che difficilmente ci capita di realizzare.

Supponiamo di aver realizzato una porzione di logica all'interno di un DB (in sql server) supponiamo che questa logica sia "relativa" ad due particolari DB che per
esigenze hanno nomi differenti per ambienti differenti.

L'esigenza quindi è quella di poter modificare dinamicamente il nome dei DB passandoli come parametri.

CREATE PROCEDURE Test
@DBNAME_master sysname
AS
BEGIN
DECLARE @command varchar (300);
SET @command = 'SELECT * FROM ' + @DBNAME + 'dbo.Table_1';
exec (@command)
END
GO


In questo esempio non è difficile intuire che cosa avviene. Tuttavia questo implica uno sforzo decisamente elevato nella realizzazione di tutta la stored.

giovedì 3 febbraio 2011

Boxing And Unbox

Il concetto di boxing è molto diffuso, come per tutte le cose a volte è necessario
( scambio dati senza interface, metodi non generici ... ) a volte no.

Ho trovato un caso in cui il boxing è abbastanza comodo, e stranamente efficente.

Posto di avere una DetailsView ed essa connessa ad un objectDataSource nell'atto di
New (ItemCreated) dobbiamo popolare alcuni campi come default.

protected void dvCreateNewItem_ItemCreated(object sender, EventArgs e)
{
//
// campo Read Olny
//
dvCreateNewItem.Rows[0].Cells[1].Text ="campo scritto nella cella";
//
// boxing e unboxing in line...
//
((TextBox)(dvCreateNewItem.Rows[1].Cells[1].Controls[0])).Text ="Campo in text box";
//
// colonna template
//
TextBox txtDate = (TextBox)dvCreateNewItem.Rows[2].FindControl("txtDate");
txtDate.Text = DateTime.Now.ToShortDateString();
}

dvCreateNewItem.Rows[1].Cells[1].Controls[0] questa restituisce un oggetto
che so già essere una TextBox e che quindi posso già unboxare..

Sicuramente è molto meglio che eseguire una findControl che in questo caso non porterebbe a molto dato che il nome del campo "non c'e'" a differenza del TemplateField.

Efficente e necessario.

mercoledì 2 febbraio 2011

Template Columns BIND Format.

Generalmente mi dimentico come diavolo si formatta una template column, la cosa diventa "odiosa" quando per 1000 volte scrivi una porzione di codice e per 1000 volte la devi cercare perchè non ti entra in testa.

La cosa è semplice basta utilizzare la formattazione implicita delle stringhe all'interno della BIND.

Bind("fldDate","{0:dd/MM/yyyy}")

In questo modo :

< ItemTemplate >
< asp:Label ID="lblfldDate" Text='< %# Bind("fldDate","{0:dd/MM/yyyy}") % >' runat="server" / >
< /ItemTemplate >

e questo è il quanto.


Ed ecco fatto