Query: Aquí es pot escollir el mètode per generar la SP QUERY, segons els diferents criteris de volum de dades, número de paràmetres de filtrat...
Sincronitza: aquest botó actualitza la informació que hi ha en el Generador respecte el que hi ha a la BBDD. Es a dir funciona BBDD -> Generador. Un cop sincronitzat la BBDD i el Generador tenen la mateixa definició de dades. És típic afegir un camp a la BBDD, aleshores es fa sincronitza, genera storeds i genera classe, per aquest ordre.
Genera storeds: amb la informació del Generador es generen totes les storeds amb les condicions indicades.
Crea taula: amb la informació del Generador crea la taula a la BBDD. Això és útil quan es crea la taula en un entorn i es vol passar a un altra. Seria funcionar Generador -> BBDD.
Crea indexs: es crean els indexos que tingui informats el Generador, també útil per migrar entre entorns.
Genera classe: amb la informació del Generador i obtenint informació de les Storeds Procedures (SP) es genera la classe derivada corresponent. Si s'actualitzen les SP cal primer generar-les i després regenerar la classe, amb aquest ordre.
Generar pantalla: crea una pantalla bàsica, amb taules HTML, etc...
Editar pantalla: si ja hi ha una pantalla generada on s'ha estat treballant afegint controls a la pantalla.
Un dels passos que fa el Generador de classes és obtenir les taules d'una BBDD. És una tasca molt senzilla. S'executa una SQL contra la taula "sysobjects" i llestos. Després es carreguen en un combo els resultats. Com sempre el codi:
btnCarregaTaules.Enabled = false;
string SQL;
DataTable TBL;
try
{
SqlConnection CONN = newSqlConnection();
CONN.ConnectionString = GestorTaules.ConnString;
CONN.Open();
SQL = "SELECT name FROM sysobjects WHERE xtype='u' ORDER BY name";
TBL = Utils.ExecuteSQL(SQL, CONN);
foreach (DataRow DR in TBL.Rows)
{
cboTaules.Items.Add(DR["name"].ToString());
}
CONN.Close();
}
catch (Exception E)
{
MessageBox.Show("Error: " + E.Message);
}
btnCarregaTaules.Enabled = true;
#14/04/2014 16:12 Programació C# SQLServer Autor: Alex Canalda
Aquest llibre segueix la història en just el punt on ho deixa l'anterior.
I també encaixa amb la història que s'explica en la serie The Lost Fleet Beyond Frontier, concretament en el Guardian.
En aquest llibre s'explica com la gent de Midway va cada cop tornant a valors més democràtics, poc a poc la gent va més motivada i menys amenaçada. I llavors descobreixen que així es funciona millor. Poc a poc la Iceni i el General Drakon van confiant més l'un amb l'altra i els intents, complots etc... cada cop ho tenen més difícil per trencar la "revolució". En el llibre hi ha dues campanyes, una on el General Drakon va a Taroa a ajudar a aquest sistema estel·lar a independitzar-se dels Sindics, i una altra campanya on van a recuperar presoners a la banda de l'Alliança, a Varandal. El llibre acaba bruscament deixant peu pel següent que ves a saber quan es publicarà.
Noctua ha presentat el nou NH-D15, aplicant allò de "més gran, millor". El D14 fa 140mm d'ample, el de D15 fa 150mm. Penso que per plaques base amb el primer PCI-Express de 16x just al costat del processador això és massa gran. Per plaques que al costat del processador tinguin un 1x que no es fa servir i el 16x és el segon no hi haurà problemes d'espai. També comenten que els mòduls de RAM poden ser de 64mm d'alçada si es deixa un sol ventilador, si no màxim 38mm, i la gràcia és que vagi amb dos ventiladors. Penso que potser es pot posar un de 120mm com el D14. El sistema d'ancoratge és el mateix, el SecurFirm2.
Aquest fi de setmana hem vist aquesta pel·lícula que ja està disponible en 1080p. El cert és que m'ha agradat molt, té trossos infantils i altres que penso que els costarà més d'entendre que està passant. Gràficament el tema de neu i el gel està molt ben aconseguit. Es va veient l'evolució dels dibuixos CGI (Computer-generated imagery). A Monstruos SA van introduir els pèls, a Nemo els líquids, faltava la neu. La peli combina acció, cançons i moments infantils molt bé. Els nens es queden hipnotitzats. La banda sonora té una cançó recomanable, "Let it go" i en hispanistaní "Libre soy".
[Spoilers] Una cosa curiosa de l'argument és que no hi ha un dolent, molt dolent, simplement que a vegades les coses dolentes passen sense voler. La Elsa no controla els seus poders congeladors i quan se li escapen fan mal. Per això marxa a viure sola. La seva germana la va buscar per dir-li que no s'amoïni que no passa res. En el viatge coneix al ninot de neu i al Cristof que l'ajuden i descobreix que amb amor el gel es pot controlar.
El C# té un munt de paraules reservades i cada dia que passa m'adono de quantes en desconec. Fins ara feia servir const per definir constants, però clar, constants no hi ha tantes, ja que només es poden definir quan es declaren, algo com:
publicconststring foo = "foo";
Llavors quan s'intenta fer qualsevol modificació del valor salta un error. Algo com això:
Doncs a vegades volem que una variable sigui tingui un valor que un cop assignat no es pugui modificar, en aquest cas el const no ens pot ajudar, perque el valor s'assigna en temps de compilació. Per això està el readonly, que permet assignar un valor en temps d'execució.
publicclass MyClass
{
publicreadonlystring foo = "foo";
public MyClass(string abc)
{
foo = abc; //Aquí NO hi ha error.
}
}
En canvi l'assignació fora del constructor no està permesa i sí dóna error. Si afegim aquest mètode a la classe anterior no funciona.
Les propietats readonly només es poden assignar en la declaració (com les constants) i en el constructor. Però si un objecte deriva del que conté les propietats readonly aleshores si s'intenta accedir a aquestes, encara que sigui en el constructor de l'objecte derivat, no ens deixa. Això és així per que quan s'executa el constructor de l'objecte derivat el contructor de l'objecte base ja s'ha executat. Aleshores cal una forma que quan s'invoca al constructor de l'objecte derivat es pugui invocar al base. Es fa així:
publicclass MyClass
{
publicreadonlystring foo = "foo";
public MyClass(string abc)
{
foo = abc;
}
}
publicclass MyExtClass : MyClass
{
public MyExtClass(string abc1, string abc2) : base(abc1) //Correcte!!!
{
foo = abc2; //Error el constructor base ja s'ha executat
}
}
#07/04/2014 17:36 Programació C# Autor: Alex Canalda
Un dels punts més polèmics del Windows 8.1 és l'eliminació del menú Inici. Després de que Microsoft hagi sentit les critiques dels usuaris (i veure la velocitat patètica d'adopció del 8.1) ha donat el seu braç a tòrcer i ha tornat a posar el menú Inici d'una forma descafeinada. Ara és un mix entre Metro i el clàssic.
Normalment faig servir el fitxer de configuració de .NET de torn, el web.config o el que toqui. Però cada cop més em trobo amb que no puc posar allí, d'una forma fàcil i entenedora els valors que vull fer servir en una aplicació. I sempre amb por de si trencaré algun punt vital, o si ho posaré correctament...
Per aquests motius he fet la classe clsConfig. Aquí puc guardar els ajustos ("settings") de l'aplicació. Es tracta de posar un fitxer XML "config.xml" amb els valors dins de la següent forma:
Després cal una classe per llegir aquest fitxer. La clsConfig també permet grabar-hi valors, per exemple en una aplicació d'escriptori que fa servir carpetes és habitual guardar la carpeta que fa servir l'usuari (el valor de l'últim cop que l'ha fet servir). A continuació el codi corresponent:
publicclass clsConfig
{
privateDictionary<string, string> Config = newDictionary<string, string>();
publicreadonlystring FitxerConfiguracio = "config.xml";
publicbool Error { get; set; }
publicstring txtError { get; set; }
public clsConfig(string pFitxerConfiguracio)
{
if(!string.IsNullOrEmpty(pFitxerConfiguracio)) FitxerConfiguracio = pFitxerConfiguracio;
}
publicstring Ver()
{
return"1.3 - 20/05/2013";
}
publicstring GetVal(string Name)
{
string Valor = "";
if (Config.ContainsKey(Name))
{
Valor = Config[Name];
Error = false;
txtError = "";
}
else
{
Valor = "";
Error = true;
txtError = "'" + Name + "' no encontrado en la configuración";
}
return Valor;
}
publicvoid SetVal(string Name, string Value)
{
if (Config.ContainsKey(Name))
{
Config[Name] = Value;
Error = false;
txtError = "";
}
else
{
Error = true;
txtError = "'" + Name + "' no encontrado en la configuración";
}
}
publicvoid CreateVal(string Name, string Value)
{
if (Config.ContainsKey(Name))
{
Error = true;
txtError = "'" + Name + "' ya creado en la configuración";
}
else
{
Config.Add(Name, Value);
}
}
publicvoid Save()
{
string path = Application.ExecutablePath;
XmlDocument Doc = newXmlDocument();
XmlNode Root;
XmlNode Element;
XmlNode Nom;
XmlNode Valor;
Doc.LoadXml("<?xml version=\"1.0\" standalone=\"yes\"?><root></root>");
Root = Doc.SelectSingleNode("descendant::root");
foreach (KeyValuePair<String, String> Param in Config)
{
Element = Doc.CreateNode(XmlNodeType.Element, "element", "");
Nom = Doc.CreateNode(XmlNodeType.Element, "name", "");
Valor = Doc.CreateNode(XmlNodeType.Element, "value", "");
Nom.InnerText = Param.Key;
Valor.InnerText = Param.Value;
Element.AppendChild(Nom);
Element.AppendChild(Valor);
Root.AppendChild(Element);
}
path = Path.GetDirectoryName(path);
path += "\\" + FitxerConfiguracio;
Doc.Save(path);
}
public void Initialize()
{
string path = Application.ExecutablePath;
XmlDocument XMLDoc = newXmlDocument();
XmlNodeList Nodes;
XmlNode Node;
string Nom = "", Valor = "";
try
{
Error = false;
txtError = "";
path = Path.GetDirectoryName(path);
path += "\\" + FitxerConfiguracio;
XMLDoc.Load(path);
Nodes = XMLDoc.SelectNodes("descendant::element");
if (Nodes != null)
{
foreach (XmlNode N in Nodes)
{
Node = N.SelectSingleNode("descendant::name");
if (Node != null) Nom = Node.InnerText;
else Nom = "";
Node = N.SelectSingleNode("descendant::value");
if (Node != null) Valor = Node.InnerText;
else Valor = "";
Config.Add(Nom, Valor);
}
}
}
catch (Exception E)
{
txtError = E.Message;
Error = true;
}
}
}
Després es fa servir així:
clsConfig Conf = newclsConfig();
Conf.Initialize(); //Important inicialitzar per carregar els valors de la configuració
CadConn = Conf.GetVal("CadConn");
#03/04/2014 10:33 Programació C# Autor: Alex Canalda
Com ja m'he acabat els llibres disponibles de "The Lost Fleet Beyond Frontier" i fins al maig no surt el següent, he agafat aquesta altra serie "Lost Stars". L'acció es situa en el mateix univers fictici on es desenvolupa "The Lost Fleet Beyond Frontier", i en el temps està entre el 2on i el 3er llibre de l'altra serie, es a dir entre Invicible i Guardian. Manté la coherència entre les dues línies argumentals i si ja has llegit els altres ja saps com acaben certes coses.
Spoilers: El llibre tracta del sistema Midway controlat pels Sindics s'allibera liquidant a tots els agents de la controladora ISS (els snakes que ho espien tot) i els CEOs Drakon i Iceni es fan amb el control. Poc a poc es van humanitzant i fent-se menys cruels, però tot el llibre estan amb tira i afluixa de que si un liquida a l'altra o no. El Drakon controla les tropes i la Iceni controla les naus. El sistema Midway és la porta d'accés a la zona controlada pels alienígenes Enigma i per on passa la flota de la Aliança per investigar-los en els altres llibres. En el llibre s'explica com la Iceni aconsegueix un battleship del sistema estelar del costat i com el Drakon aconsegueix unes drassanes a un altra sistema. El llibre acaba amb l'arribada de forces dels Sindicats i dels extraterrestres Enigma. I amb aquest "hangover" ho deixa pel següent (encara que com encaixa amb The Lost Fleet això ja es sap com acaba).
Aquest llibre m'ha agradat encara que a vegades es fa una mica cansino amb el tema de "te mato, bueno no te mato" entre els dos CEOs, i el tema de "no se puede confiar en nadie porque te traicionan y te liquidan". Obviant això nauetes i pew-pew! Fantàstic!.