mercoledì 18 novembre 2009

Query che passione...

Capita che qualcuno vi chieda di risolvere difficili situazioni... a volte queste portano a scrivere query davvero scriteriate.
C'e' da dire che una stored procedure possa a volte salvarci ma a volte questo non è possibile... soprattutto se il db è Mysql.

Vi porto questo esempio

SELECT
Event_Date,
id_a as l_ida,
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_A') as ValueA
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_B') as ValueB,
Entity_value,
if(
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_C'
AND entity_value_b = Entity_value) IS NULL, 'Id_b',
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_C'
AND entity_value_b = Entity_value)) as ValueC
FROM
dwh_entities_logs
WHERE
direction = 'O'
AND
status = 0
AND
event_date IN (
SELECT Max(event_date) FROM dwh_entities_logs WHERE direction = 'O' AND status = 0 GROUP BY id_a)

Bhe sembra un vera e propria pazzia.. per altro difficilemente leggibile e per una qualche ragione ho pure modificato i nomi
dei campi... ma non di molto

L'attenzione è su questa porzione.. che sembra difficile da comprendere perchè annidare un if con 2 select potrebbe sembrare
sia lenta che caotica ( che critica.. ) ma che ci crediate o no .. è un missile..

if(
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_C'
AND entity_value_b = Entity_value) IS NULL, 'Id_b',
(SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_C'
AND entity_value_b = Entity_value)) as ValueC

Mysql consente una notazione molto semplice ed efficace, l'associazione diretta di una query annidata ad una variabile.

questo ci consente di modificare un filo una scrittura complessa come la precedente... in

@xData := (SELECT entity_value_a FROM dwh_entities WHERE id_a = l_ida AND entity_type = 'value_C'
AND entity_value_b = Entity_value),
if(
(@xData) IS NULL, 'Id_b',
(@xData)
) as ValueC

Il vantaggio e che si esegue la query una volta sola.. velocizzando l'estrazione..

Chiaramente .. salvare il mondo da Godzilla con una calamita... rimane sempre complesso ma non impossibile.

mercoledì 4 novembre 2009

Messagio d'errore del tutto particolare...


sto cercando di convertire questo numero... 000044110004554330000006 da chiamiamolo string a int64...

bhe credo qualche cosa possa aver creato qualche intoppo, mi aspettavo un errore, quanto meno intelligente,
eppure ottengo un qualcosa di davvero forviante.

Giusto per la chiamata è questa..
Int64 idNewSeed = Convert.ToInt64(lblSeed.Text.Replace("H",""));

lblSeed.Text contiene "H000044110004554330000006"

Ancora una volta qualche ho dubbio su come ragiona sto chiodo !!

lunedì 2 novembre 2009

Eventi, delegati e intefaccie...

E' stato realizzato un nuovo post più accurato con approfondimenti sull'argomento:
How To: Use Event and Delegate C#

Può succedere, per carità lo comprendo bene che prima o poi vi venga in mente di dichiarare un evento in un interfaccia...
certo la qual cosa può far anche arricciare il naso, ma non è una situazione imbroba.

E quasi palese che per prima cosa scirverte..

public interface IMyInterface
{
event MyEvent;
}
e vi suonerà il solito campanello da allarme... vi evito vari altri tentativi .. inutili e dispendiosi.

public interface IMyInterface
{
event EventHandler MyEvent;
}

ma questo tecnicamente vi costringe ad usare un Event Handler "SUO" e non vostro ...
e quando tornerete alla vostra bella classe scoprirete che quanto avrete scritto a poco vi serve.

Supponiamo che quanto vi è necessario sia un Messaggio d'errore ..

public delegate void IOnError(string Error);

public interface IMyInterface
{
event IOnError OnError();
}

public class MyClass:IMyInterface
{
public event IOnError OnError;
}

ed in questo modo ottieniamo un evento comodo comodo da ridelegare ad altri ... non male ??