tag:blogger.com,1999:blog-47922900852524990622024-03-13T11:37:23.274-05:00Róbinson MoscosoEstaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo... sirve como extensión de memoria.Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.comBlogger23125tag:blogger.com,1999:blog-4792290085252499062.post-48752079075124379402020-05-21T05:48:00.000-05:002020-05-21T05:48:03.468-05:00Certificación alcanzada <div data-iframe-width="150" data-iframe-height="270" data-share-badge-id="d066c8c5-9b48-4612-83a5-c22844f221ca" data-share-badge-host="https://www.youracclaim.com"></div><script type="text/javascript" async src="//cdn.youracclaim.com/assets/utilities/embed.js"></script>Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-21061795756651803022014-04-21T09:24:00.000-05:002014-10-20T09:10:47.841-05:00Script para generar el diccionario de datos<h2>
</h2>
<div>
/*****************/<br />
Actualización 21 de octubre de 2014<br />
*Adjunto el archivo SQL para facilitar su utilizacion<br />
<br />
<a href="https://drive.google.com/file/d/0B6TVhW0UkW4nYm1vdEVqbGJVYTQ/view?usp=sharing">Diccionario.sql</a><br />
<br />
<br />
/*****************/<br />
<br />
<br />
Hola, una de las cosas por las que uno como freelancer tiene que pasar es por entregar una documentación adecuada de sus proyectos, y una parte de esta documentación es el diccionario de datos, y la mejor forma de hacerlo (En SQL Server 2005 o superior) , es:</div>
<div>
<br /></div>
<div>
1. Al crear la tablas, campos, y vistas utilizar el la propiedades la descripción de dicho objeto:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwAzFm-5Cme4cEYri0b8wqyHLwi1aL8gi7__JfHSe5GR16u9oNxsjDFFfxJMX82OeXth_V6zrjiyysFg9RJ0dp-K1_xMdwD__5OtIarJl5NaO3NE9GTpigy2-hMOS_ddcuMPrLuaxwpynj/s1600/DisenoTabla.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwAzFm-5Cme4cEYri0b8wqyHLwi1aL8gi7__JfHSe5GR16u9oNxsjDFFfxJMX82OeXth_V6zrjiyysFg9RJ0dp-K1_xMdwD__5OtIarJl5NaO3NE9GTpigy2-hMOS_ddcuMPrLuaxwpynj/s1600/DisenoTabla.png" height="341" width="400" /></a></div>
<div>
Una ventaja de esta opción, es que si se hace un backup, o si se genera un script del objeto o de la base de datos, la descripción de este siempre estará incluida, otra ventaja, es que es fácilmente actualizable el diccionario pues solo es necesario actualizar esta propiedad cuando sea conveniente. </div>
<div>
<br /></div>
<div>
<br /></div>
<div>
2. Una vez diseñada la base de datos se debe abrir el siguiente script </div>
<br />
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br />--Cut and paste the results to note pad and name with a *.html format when saving.<br /><br /><br />--//SQL Database documentation script<br />--//Author: Nitin Patel, Email: nitinpatel31@gmail.com<br />--//Modificado por :Robinson Moscoso, Email: robinmp@gmail.com<br />--//Date:26-Jun-2013<br />--//Description: T-SQL script to generate the database document for SQL server 2005 <br />Declare @i Int, @maxi Int<br />Declare @j Int, @maxj Int<br />Declare @sr int<br />Declare @Output varchar(4000)<br />Declare @SqlVersion varchar(5)<br />Declare @last varchar(155), @current varchar(255), @typ varchar(255), @description varchar(4000)<br />Declare @NombreTabla nvarchar(100)<br /><br /><br />--crear la tabla donde se van a guardar los tamaños<br />declare @tamanio as table (objname varchar(255),rows varchar (100),reserved varchar(100),data varchar(100),index_size varchar(100),unused varchar(100))<br /><br /><br />create Table #Tables (id int identity(1, 1), Object_id int, Name varchar(155), Type varchar(20), [description] varchar(4000))<br />create Table #Columns (id int identity(1,1), Name varchar(155), Type Varchar(155), Nullable varchar(2), [description] varchar(4000),[valor] varchar(4000))<br />create Table #Fk(id int identity(1,1), Name varchar(155), col Varchar(155), refObj varchar(155), refCol varchar(155))<br />create Table #Constraint(id int identity(1,1), Name varchar(155), col Varchar(155), definition varchar(1000))<br />create Table #Indexes(id int identity(1,1), Name varchar(155), Type Varchar(25), cols varchar(1000))<br />create Table #Procedure(id int identity(1,1), Shema varchar(50), [Procedure] Varchar(100), CreadoEl varchar(100), UltimaModificacion varchar(100))<br /><br /><br /> If (substring(@@VERSION, 1, 25 ) = 'Microsoft SQL Server 2005')<br /> set @SqlVersion = '2005'<br />else if (substring(@@VERSION, 1, 26 ) = 'Microsoft SQL Server 2000')<br /> set @SqlVersion = '2000'<br />else<br /> set @SqlVersion = '2005'<br />Print '<head>'<br />Print '<title>::' + DB_name()+'::</title>'<br />Print '<style>'<br> <br>Print ' body {'<br>Print ' font-family:verdana;'<br>Print ' font-size:9pt;'<br>Print ' }'<br> <br>Print ' td {'<br>Print ' font-family:verdana;'<br>Print ' font-size:9pt;'<br>Print ' }'<br> <br>Print ' th {'<br>Print ' font-family:verdana;'<br>Print ' font-size:9pt;'<br>Print ' background:#A9D5A7;'<br>Print ' }'<br>Print ' table'<br>Print ' {'<br>Print ' background:#238C1D;'<br>--Print ' background:#d3d3d3;'<br>Print ' }'<br>Print ' tr'<br>Print ' {'<br>Print ' background:#ffffff;'<br>Print ' }'<br>Print ' </style>'<br />Print '</head>'<br />Print '<body>'<br /><br /><br />set nocount on<br />if @SqlVersion = '2000'<br /> begin<br /> insert into #Tables (Object_id, Name, Type, [description])<br /> --FOR 2000<br /> select object_id(table_name), '[' + table_schema + '].[' + table_name + ']', <br /> case when table_type = 'BASE TABLE' then 'Table' else 'View' end,<br /> cast(p.value as varchar(4000))<br /> from information_schema.tables t<br /> left outer join sysproperties p on p.id = object_id(t.table_name) and smallid = 0 and p.name = 'MS_Description'<br /> order by table_type, table_schema, table_name<br /> end<br /> else <br /> if @SqlVersion = '2005'<br /> begin<br /> insert into #Tables (Object_id, Name, Type, [description])<br /> --FOR 2005<br /> Select o.object_id, '[' + s.name + '].[' + o.name + ']',<br /> case when type = 'V' then 'View' when type = 'U' then 'Table' end, <br /> cast(p.value as varchar(4000))<br /> from sys.objects o<br /> left outer join sys.schemas s on s.schema_id = o.schema_id<br /> left outer join sys.extended_properties p on p.major_id = o.object_id and minor_id = 0 and p.name = 'MS_Description'<br /> where type in ('U', 'V')<br /> order by type, s.name, o.name;<br /> end<br />Set @maxi = @@rowcount<br />set @i = 1<br />print '<table align="center" border="0" cellpadding="0" cellspacing="0" style="width: 550pxpx;">
<tr><td colspan="3" style="font-size: 14pt; height: 50; text-align: center;"><a href="https://www.blogger.com/null" name="index"></a><b>Index</b></td></tr>
</table>
'<br />print '<table align="center" border="0" cellpadding="0" cellspacing="1" style="width: 550pxpx;">
<tr><th>Sr</th><th>Object</th><th>Type</th></tr>
'<br /><br /><br />While(@i <= @maxi)<br /> begin<br /> select @Output = '
<tr><td align="center">' + Cast((@i) as varchar) + '</td><td><a href="https://www.blogger.com/blogger.g?blogID=4792290085252499062#' + Type + ':' + name + '">' + name + '</a></td><td>' + Type + '</td></tr>
'<br /> from #Tables where id = @i<br /> <br /> print @Output<br /> set @i = @i + 1<br /> end<br />print '</table>
<br />'<br /><br /><br />set @i = 1<br />While(@i <= @maxi)<br /> begin<br /> --table header<br /> select @NombreTabla = name from #Tables where id = @i<br /> delete from @tamanio<br /> insert into @tamanio<br /> exec sp_spaceused @NombreTabla<br /><br /><br /> select @Output = '
<tr><th align="left"><a href="https://www.blogger.com/null" name="' + Type + ':' + name + '"></a><b>' + Type + ':' + name + '</b></th></tr>
', @description = [description]<br /> from #Tables where id = @i<br /> print '<br /><br /><br /><table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td align="right"><a href="https://www.blogger.com/blogger.g?blogID=4792290085252499062#index">Index</a></td></tr>
'<br /> print @Output<br /> print '</table>
<br />'<br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><th align="left">Nro Filas</th><th align="left">Reservado</th><th align="left">Tamaño de los Datos</th><th align="left">Tamaño de los Indices</th><th align="left">No Usado</th></tr>
'<br /> select @Output = '
<tr><td align="left">'+ rows +'</td><td align="left">'+ reserved +'</td><td align="left">' + data + '</td><td align="left">' + index_size + '</td><td align="left">' + unused+ '</td></tr>
' <br /> from @tamanio<br /> print @Output<br /> print '</table>
<br />'<br /> <br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Description</b></td></tr>
<tr><td>' + isnull(@description,'') + '</td></tr>
</table>
<br />'<br /><br /><br /> --table columns<br />truncate table #Columns<br />if @SqlVersion = '2000'<br /> begin<br /> insert into #Columns (Name, Type, Nullable, [description], valor)<br /> --FOR 2000<br /> Select c.name,<br /> type_name(xtype) + (<br /> case when (type_name(xtype) = 'varchar' or type_name(xtype) = 'nvarchar' or type_name(xtype) ='char' or type_name(xtype) ='nchar')<br /> then '(' + cast(length as varchar) + ')'<br /> when type_name(xtype) = 'decimal' <br /> then '(' + cast(prec as varchar) + ',' + cast(scale as varchar) + ')'<br /> else ''<br /> end <br /> ),<br /> case when isnullable = 1 then 'Y' else 'N' end,<br /> cast(p.value as varchar(8000)),<br /> ''<br /> from syscolumns c<br /> inner join #Tables t on t.object_id = c.id<br /> left outer join sysproperties p on p.id = c.id and p.smallid = c.colid and p.name = 'MS_Description'<br /> where t.id = @i<br /> order by c.colorder<br /> end<br /> else <br /> if @SqlVersion = '2005'<br /> begin<br /> insert into #Columns (Name, Type, Nullable, [description],valor)<br /> --FOR 2005 <br /> Select c.name,<br /> type_name(user_type_id) + (<br /> case when (type_name(user_type_id) = 'varchar' or type_name(user_type_id) = 'nvarchar' or type_name(user_type_id) ='char' or type_name(user_type_id) ='nchar')<br /> then '(' + cast(max_length as varchar) + ')'<br /> when type_name(user_type_id) = 'decimal' <br /> then '(' + cast([precision] as varchar) + ',' + cast(scale as varchar) + ')'<br /> else ''<br /> end <br /> ),<br /> case when is_nullable = 1 then 'Y' else 'N' end,<br /> cast(p.value as varchar(4000)),<br /> cast(p1.value as varchar(4000))<br /> from sys.columns c<br /> inner join #Tables t on t.object_id = c.object_id<br /> left outer join sys.extended_properties p on p.major_id = c.object_id and p.minor_id = c.column_id and p.name = 'MS_Description'<br /> left outer join sys.extended_properties p1 on p1.major_id = c.object_id and p1.minor_id = c.column_id and p1.name = 'Valor'<br /> where t.id = @i<br /> order by c.column_id<br /> end<br /> Set @maxj = @@rowcount<br /> set @j = 1<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Table Columns</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" colorbackground="#249732" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Datatype</th><th>Nullable</th><th>Description</th><th>Value</th></tr>
'<br /> <br /> While(@j <= @maxj)<br /> begin<br /> select @Output = '
<tr><td align="center" width="30px">' + Cast((@j) as varchar) + '</td><td width="200px">' + isnull(name,'') + '</td><td width="200px">' + upper(isnull(Type,'')) + '</td><td align="center" width="50px">' + isnull(Nullable,'N') + '</td><td width="650px">' + isnull([description],'') + '</td><td width="650px">' + isnull(valor,'') + '</td></tr>
'<br /> from #Columns where id = @j<br /> <br /> print @Output <br /> Set @j = @j + 1;<br /> end<br /><br /><br /> print '</table>
<br />'<br /><br /><br /> --reference key<br /> truncate table #FK<br /> if @SqlVersion = '2000'<br /> begin<br /> insert into #FK (Name, col, refObj, refCol)<br /> -- FOR 2000<br /> select object_name(constid), s.name, object_name(rkeyid) , s1.name <br /> from sysforeignkeys f<br /> inner join sysobjects o on o.id = f.constid<br /> inner join syscolumns s on s.id = f.fkeyid and s.colorder = f.fkey<br /> inner join syscolumns s1 on s1.id = f.rkeyid and s1.colorder = f.rkey<br /> inner join #Tables t on t.object_id = f.fkeyid<br /> where t.id = @i<br /> order by 1<br /> end <br /> else if @SqlVersion = '2005'<br /> begin<br /> insert into #FK (Name, col, refObj, refCol)<br />-- FOR 2005<br /> select f.name, COL_NAME (fc.parent_object_id, fc.parent_column_id) , object_name(fc.referenced_object_id) , COL_NAME (fc.referenced_object_id, fc.referenced_column_id) <br /> from sys.foreign_keys f<br /> inner join sys.foreign_key_columns fc on f.object_id = fc.constraint_object_id <br /> inner join #Tables t on t.object_id = f.parent_object_id<br /> where t.id = @i<br /> order by f.name<br /> end<br /> <br /> Set @maxj = @@rowcount<br /> set @j = 1<br /> if (@maxj >0)<br /> begin<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Refrence Keys</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Column</th><th>Reference To</th></tr>
'<br /><br /><br /> While(@j <= @maxj)<br /> begin<br /><br /><br /> select @Output = '
<tr><td align="center" width="25px">' + Cast((@j) as varchar) + '</td><td width="300px">' + isnull(name,'') + '</td><td width="300px">' + isnull(col,'') + '</td><td>[' + isnull(refObj,'N') + '].[' + isnull(refCol,'N') + ']</td></tr>
'<br /> from #FK where id = @j<br /><br /><br /> print @Output<br /> Set @j = @j + 1;<br /> end<br /><br /><br /> print '</table>
<br />'<br /> end<br /><br /><br /> --Default Constraints<br /> truncate table #Constraint<br /> if @SqlVersion = '2000'<br /> begin<br /> insert into #Constraint (Name, col, definition)<br /> select object_name(c.constid), col_name(c.id, c.colid), s.text<br /> from sysconstraints c<br /> inner join #Tables t on t.object_id = c.id<br /> left outer join syscomments s on s.id = c.constid<br /> where t.id = @i<br /> and<br /> convert(varchar,+ (c.status & 1)/1)<br /> + convert(varchar,(c.status & 2)/2)<br /> + convert(varchar,(c.status & 4)/4)<br /> + convert(varchar,(c.status & 8)/8)<br /> + convert(varchar,(c.status & 16)/16)<br /> + convert(varchar,(c.status & 32)/32)<br /> + convert(varchar,(c.status & 64)/64)<br /> + convert(varchar,(c.status & 128)/128) = '10101000'<br /> end<br /> else if @SqlVersion = '2005'<br /> begin<br /> insert into #Constraint (Name, col, definition)<br /> select c.name, col_name(parent_object_id, parent_column_id), c.definition<br /> from sys.default_constraints c<br /> inner join #Tables t on t.object_id = c.parent_object_id<br /> where t.id = @i<br /> order by c.name<br /> end<br /> Set @maxj = @@rowcount<br /> set @j = 1<br /> if (@maxj >0)<br /> begin<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Default Constraints</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Column</th><th>Value</th></tr>
'<br /><br /><br /> While(@j <= @maxj)<br /> begin<br /><br /><br /> select @Output = '
<tr><td align="center" width="25px">' + Cast((@j) as varchar) + '</td><td width="300px">' + isnull(name,'') + '</td><td width="300px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>
'<br /> from #Constraint where id = @j<br /><br /><br /> print @Output<br /> Set @j = @j + 1;<br /> end<br /><br /><br /> print '</table>
<br />'<br /> end<br /><br /><br /> --Check Constraints<br /> truncate table #Constraint<br /> if @SqlVersion = '2000'<br /> begin<br /> insert into #Constraint (Name, col, definition)<br /> select object_name(c.constid), col_name(c.id, c.colid), s.text<br /> from sysconstraints c<br /> inner join #Tables t on t.object_id = c.id<br /> left outer join syscomments s on s.id = c.constid<br /> where t.id = @i<br /> and ( convert(varchar,+ (c.status & 1)/1)<br /> + convert(varchar,(c.status & 2)/2)<br /> + convert(varchar,(c.status & 4)/4)<br /> + convert(varchar,(c.status & 8)/8)<br /> + convert(varchar,(c.status & 16)/16)<br /> + convert(varchar,(c.status & 32)/32)<br /> + convert(varchar,(c.status & 64)/64)<br /> + convert(varchar,(c.status & 128)/128) = '00101000'<br /> or convert(varchar,+ (c.status & 1)/1)<br /> + convert(varchar,(c.status & 2)/2)<br /> + convert(varchar,(c.status & 4)/4)<br /> + convert(varchar,(c.status & 8)/8)<br /> + convert(varchar,(c.status & 16)/16)<br /> + convert(varchar,(c.status & 32)/32)<br /> + convert(varchar,(c.status & 64)/64)<br /> + convert(varchar,(c.status & 128)/128) = '00100100')<br /><br /><br /> end<br /> else if @SqlVersion = '2005'<br /> begin<br /> insert into #Constraint (Name, col, definition)<br /> select c.name, col_name(parent_object_id, parent_column_id), definition<br /> from sys.check_constraints c<br /> inner join #Tables t on t.object_id = c.parent_object_id<br /> where t.id = @i<br /> order by c.name<br /> end<br /> Set @maxj = @@rowcount<br /> <br /> set @j = 1<br /> if (@maxj >0)<br /> begin<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Check Constraints</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Column</th><th>Definition</th></tr>
'<br /><br /><br /> While(@j <= @maxj)<br /> begin<br /><br /><br /> select @Output = '
<tr><td align="center" width="25px">' + Cast((@j) as varchar) + '</td><td width="300px">' + isnull(name,'') + '</td><td width="300px">' + isnull(col,'') + '</td><td>' + isnull(definition,'') + '</td></tr>
'<br /> from #Constraint where id = @j<br /> print @Output<br /> Set @j = @j + 1;<br /> end<br /><br /><br /> print '</table>
<br />'<br /> end<br /><br /><br /><br /><br /> --Triggers<br /> truncate table #Constraint<br /> if @SqlVersion = '2000'<br /> begin<br /> insert into #Constraint (Name)<br /> select tr.name<br /> FROM sysobjects tr<br /> inner join #Tables t on t.object_id = tr.parent_obj<br /> where t.id = @i and tr.type = 'TR'<br /> order by tr.name<br /> end<br /> else if @SqlVersion = '2005'<br /> begin<br /> insert into #Constraint (Name)<br /> SELECT tr.name<br /> FROM sys.triggers tr<br /> inner join #Tables t on t.object_id = tr.parent_id<br /> where t.id = @i<br /> order by tr.name<br /> end<br /> Set @maxj = @@rowcount<br /> <br /> set @j = 1<br /> if (@maxj >0)<br /> begin<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Triggers</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Description</th></tr>
'<br /><br /><br /> While(@j <= @maxj)<br /> begin<br /> select @Output = '
<tr><td align="center" width="25px">' + Cast((@j) as varchar) + '</td><td width="300px">' + isnull(name,'') + '</td><td></td></tr>
'<br /> from #Constraint where id = @j<br /> print @Output<br /> Set @j = @j + 1;<br /> end<br /><br /><br /> print '</table>
<br />'<br /> end<br /><br /><br /> --Indexes<br /> truncate table #Indexes<br /> if @SqlVersion = '2000'<br /> begin<br /> insert into #Indexes (Name, type, cols)<br /> select i.name, case when i.indid = 0 then 'Heap' when i.indid = 1 then 'Clustered' else 'Nonclustered' end , c.name<br /> from sysindexes i<br /> inner join sysindexkeys k on k.indid = i.indid and k.id = i.id<br /> inner join syscolumns c on c.id = k.id and c.colorder = k.colid<br /> inner join #Tables t on t.object_id = i.id<br /> where t.id = @i and i.name not like '_WA%'<br /> order by i.name, i.keycnt<br /> end<br /> else if @SqlVersion = '2005'<br /> begin<br /> insert into #Indexes (Name, type, cols)<br /> select i.name, case when i.type = 0 then 'Heap' when i.type = 1 then 'Clustered' else 'Nonclustered' end, col_name(i.object_id, c.column_id)<br /> from sys.indexes i<br /> inner join sys.index_columns c on i.index_id = c.index_id and c.object_id = i.object_id<br /> inner join #Tables t on t.object_id = i.object_id<br /> where t.id = @i<br /> order by i.name, c.column_id<br /> end<br /><br /><br /> Set @maxj = @@rowcount<br /> <br /> set @j = 1<br /> set @sr = 1<br /> if (@maxj >0)<br /> begin<br /><br /><br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Indexes</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Name</th><th>Type</th><th>Columns</th></tr>
'<br /> set @Output = ''<br /> set @last = ''<br /> set @current = ''<br /> While(@j <= @maxj)<br /> begin<br /> select @current = isnull(name,'') from #Indexes where id = @j<br /> <br /> if @last <> @current and @last <> ''<br /> begin <br /> print '
<tr><td align="center" width="25px">' + Cast((@sr) as varchar) + '</td><td width="300px">' + @last + '</td><td width="300px">' + @typ + '</td><td>' + @Output + '</td></tr>
'<br /> set @Output = ''<br /> set @sr = @sr + 1<br /> end<br /> <br /> <br /> select @Output = @Output + cols + '<br />' , @typ = type<br /> from #Indexes where id = @j<br /> <br /> set @last = @current <br /> Set @j = @j + 1;<br /> end<br /> if @Output <> ''<br /> begin <br /> print '
<tr><td align="center" width="25px">' + Cast((@sr) as varchar) + '</td><td width="300px">' + @last + '</td><td width="300px">' + @typ + '</td><td>' + @Output + '</td></tr>
'<br /> end<br /><br /><br /> print '</table>
<br />'<br /> end<br />--------------------------------------------------------------------------------------------<br /> Set @i = @i + 1;<br /> --Print @Output<br /> Print 'Autor: ROBINSON MOSCOSO - SIPSE'<br />end<br />-------------------------------------------------------------------------------------------------------------------------------------------------------------<br /> -- procedures<br /> truncate table #Procedure<br /> if @SqlVersion = '2005'<br /> begin<br /> ---create Table #Procedure(id int identity(1,1), Shema varchar(25), [Procedure] Varchar(60), CreadoEl varchar(50), UltimaModificacion varchar(50))<br /> insert into #Procedure (Shema, [Procedure], CreadoEl, UltimaModificacion)<br /> SELECT SPECIFIC_SCHEMA AS Shema,ROUTINE_NAME As [Procedure],CREATED AS CreadoEl,LAST_ALTERED AS UltimaModificacion<br /> FROM INFORMATION_SCHEMA.ROUTINES<br /> WHERE ROUTINE_TYPE = 'PROCEDURE' -- AND LEFT(ROUTINE_NAME,4) ='usp_'<br /> ORDER BY ROUTINE_NAME <br /> end<br /><br /><br /> Set @maxj = @@rowcount<br /> set @j = 1<br /><br /><br /> <br /> print ''<br /> print '<br />'<br /> print ''<br /> print '<table border="0" cellpadding="0" cellspacing="0" style="width: 1250pxpx;">
<tr><td><b>Procedure Name</b></td></tr>
</table>
'<br /> print '<table border="0" cellpadding="0" cellspacing="1" style="width: 1250pxpx;">
<tr><th>Sr.</th><th>Schema</th><th>Procedure Name</th><th>Creado El</th><th>UltimaModificacion</th></tr>
'<br /><br /><br /> While(@j <= @maxj)<br /> begin<br /> select @Output = '
<tr><td align="center" width="30px">' + Cast((@j) as varchar) + '</td><td width="70px">' + isnull(Shema,'') + '</td><td width="240px">' + isnull([Procedure],'') + '</td><td align="Left" width="280px">' + isnull(CreadoEl,'') + '</td><td width="280px">' + isnull(UltimaModificacion,'') + '</td></tr>
'<br /> from #Procedure where id = @j<br /> <br /> print @Output <br /> Set @j = @j + 1;<br /> end<br /><br /><br />print '</table>
<br />'<br />Print 'Autor: ROBINSON MOSCOSO - SIPSE'<br />Print '</body>'<br />Print '</span>'<br />
<br />
<br />
drop table #Tables<br />
drop table #Columns<br />
drop table #FK<br />
drop table #Constraint<br />
drop table #Indexes<br />
drop table #Procedure<br />
<br />
set nocount off<br />
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">-- Fin del script</span><br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
3. Seleccionar que genere el resultado en un archivo </div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBs2YVIk1fizB23AgFUjEIr2WnHxNVoA-5IyPumeJ9qNJyez685MSD1dLnBirHuheHmeYg4fOxEmSg23ryhKXurDrVEdtlU5-s5PDipTIoURPPkNOKriufJdybE17I1MRZScOx3Sa3iNmz/s1600/DisenoTabla2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBs2YVIk1fizB23AgFUjEIr2WnHxNVoA-5IyPumeJ9qNJyez685MSD1dLnBirHuheHmeYg4fOxEmSg23ryhKXurDrVEdtlU5-s5PDipTIoURPPkNOKriufJdybE17I1MRZScOx3Sa3iNmz/s1600/DisenoTabla2.png" height="384" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
3. Al ejecutar el script se abre una ventana para guardar el archivo generado, se especifica el nombre, teniendo en cuenta de agregar el tipo htm al final del nombre (por ejemplo: diccionario<b>.htm</b>) y en tipo de archivo se debe seleccionar "Todos los archivos(*.*)" y se hace clic en guardar.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCE8nCftHHfIDBJa_a6lQjVm8OFFnFJXfkYnwkmagePOfINikn-63l3SKY68VvCZ5Y_i5XlGIbBT1uh6-a4mTMQJyLVNI3FF8HAXjv6BrEJU895F-Pw3n1vD8NMKw3KUDxmHcSTT6O6u-c/s1600/DisenoTabla3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCE8nCftHHfIDBJa_a6lQjVm8OFFnFJXfkYnwkmagePOfINikn-63l3SKY68VvCZ5Y_i5XlGIbBT1uh6-a4mTMQJyLVNI3FF8HAXjv6BrEJU895F-Pw3n1vD8NMKw3KUDxmHcSTT6O6u-c/s1600/DisenoTabla3.png" height="384" width="640" /></a></div>
<div>
<br /></div>
<div>
4. Finalmente abrimos el archivo en cualquier navegador y se podrá observar el diccionario de nuestra base de datos.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTS8Qea-CqZx2p41_TsIqfaAGQfZpWshk2zl40hER3zrh1KemNFZXAQxbNaVaTHQaQ9_43zUL42WZavVD3UZy9V9VUg31t67yGGiVQU3dlhCiY_nZL4i_nSXWqypZoFFhIVfkHZ1aJOZ4C/s1600/DisenoTabla4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTS8Qea-CqZx2p41_TsIqfaAGQfZpWshk2zl40hER3zrh1KemNFZXAQxbNaVaTHQaQ9_43zUL42WZavVD3UZy9V9VUg31t67yGGiVQU3dlhCiY_nZL4i_nSXWqypZoFFhIVfkHZ1aJOZ4C/s1600/DisenoTabla4.png" height="270" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOtjeQWDLs04aMUMTZH1YvNaMVIrphOeO3swKrsiysKRRA9hjOtqu7zY1fxgWztj3BgY_ddxi8jA_eWIj7oIpXgKItIlYmnFSDmQ7s8o7dzq0IfGXlvdWQQDM_4y9p9t9LonbjR7Agl6DA/s1600/DisenoTabla5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOtjeQWDLs04aMUMTZH1YvNaMVIrphOeO3swKrsiysKRRA9hjOtqu7zY1fxgWztj3BgY_ddxi8jA_eWIj7oIpXgKItIlYmnFSDmQ7s8o7dzq0IfGXlvdWQQDM_4y9p9t9LonbjR7Agl6DA/s1600/DisenoTabla5.png" height="177" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Este script, lo encontré hace un tiempo por ahí navegando pero no recuerdo el sitio para hacer referencia a este, sin embargo, quien lo hizo aparece en el Script, por lo tanto agradezco a <a href="mailto:nitinpatel31@gmail.com">Nitin Patel</a> por tan buen trabajo.</div>
<div>
<br />
<br />
<br /></div>
</div>
<div>
Saludos</div>
<div>
<br /></div>
<div>
Róbinson</div>
Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com2tag:blogger.com,1999:blog-4792290085252499062.post-33265294895999475682014-04-16T09:49:00.000-05:002014-04-16T09:49:34.152-05:00Lista de tablas con el tamaño ocupado por cada unaEn algunos casos, por cuestión de administración uno necesita verificar el tamaño ocupado por las tablas en una base de datos, afortunadamente existe el procedimiento del sistema sp_spaceused, con el cual, enviando como parámetro el nombre de la tabla obtengo la información necesaria.<br />
<br />
Sin embargo, necesité virifcar el tamaño de todas las tablas al mismo tiempo, con el fin de comparar la cantidad utilizada en diferentes tablas, y pues buscando encontré en la siguiente dirección <a href="http://infoinnova.net/2012/01/tablas-de-una-base-de-datos-con-sus-respectivos-tamanos/">http://infoinnova.net/2012/01/tablas-de-una-base-de-datos-con-sus-respectivos-tamanos/ </a> el script que me permitió generar dicha consulta:<br />
<br />
<pre class="csharpcode">SELECT
X.[name],
REPLACE(CONVERT(varchar, CONVERT(money, X.[rows]), 1), '.00', '')
AS [rows],
REPLACE(CONVERT(varchar, CONVERT(money, X.[reserved]), 1), '.00', '')
AS [reserved],
REPLACE(CONVERT(varchar, CONVERT(money, X.[data]), 1), '.00', '')
AS [data],
REPLACE(CONVERT(varchar, CONVERT(money, X.[index_size]), 1), '.00', '')
AS [index_size],
REPLACE(CONVERT(varchar, CONVERT(money, X.[unused]), 1), '.00', '')
AS [unused]
FROM
(SELECT
CAST(object_name(id) AS varchar(50))
AS [name],
SUM(CASE WHEN indid < 2 THEN CONVERT(bigint, [rows]) END)
AS [rows],
SUM(CONVERT(bigint, reserved)) * 8
AS reserved,
SUM(CONVERT(bigint, dpages)) * 8
AS data,
SUM(CONVERT(bigint, used) - CONVERT(bigint, dpages)) * 8
AS index_size,
SUM(CONVERT(bigint, reserved) - CONVERT(bigint, used)) * 8
AS unused
FROM sysindexes WITH (NOLOCK)
WHERE sysindexes.indid IN (0, 1, 255)
AND sysindexes.id > 100
AND object_name(sysindexes.id) <> 'dtproperties'
GROUP BY sysindexes.id WITH ROLLUP
) AS X
WHERE X.[name] is not null
ORDER BY X.[rows] DESC</pre>
<pre class="csharpcode"><span style="font-size: xx-small;">
</span></pre>
<pre class="csharpcode"></pre>
<pre class="csharpcode">Espero sea de utilidad.</pre>
<pre class="csharpcode"></pre>
<pre class="csharpcode">Saludos</pre>
Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-50080968582006233302013-02-03T20:39:00.001-05:002013-02-03T21:22:19.245-05:00Azure–Desarrollando aplicaciones Multi-Cliente para la nube<p> </p> <p>Como ahora ando buscando temas de arquitectura para mis próximos productos para Azure, encontré este libro de “Patterns & Practices“ en el cual describen como debería ser una aplicación para diferentes clientes o suscriptores.</p> <p>En el vínculo se encuentra el libro completo en PDF (versión 3.0 de diciembre de 2012) , además incluye el código de ejemplo y hands on labs para apoyar el aprendizaje, definitivamente super recomendado.</p> <p>El link al contenido: <a title="http://msdn.microsoft.com/en-us/library/ff966499.aspx" href="http://msdn.microsoft.com/en-us/library/ff966499.aspx">http://msdn.microsoft.com/en-us/library/ff966499.aspx</a></p> <p><a href="http://msdn.microsoft.com/en-us/library/ff966499.aspx"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-LmT7V0z4v6U/UQ8RN-ecuhI/AAAAAAAABd4/bzoyM2TYOoc/image%25255B3%25255D.png?imgmax=800" width="196" height="244"></a></p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-74992995791246212672012-10-16T22:05:00.001-05:002012-10-18T15:32:42.910-05:00Charm de settings con la política de privacidad<p>Hola, Uno de los motivos por los cuales las app no son aceptadas en el windows store es por que no tienen definida una política de privacidad.</p> <p>En el siguiente ejemplo voy a mostrar como crear en el charm de settings una política de privacidad.</p> <p>1. Crear un xaml que contenga la información de “acerca de”</p> <blockquote> <p>a. En nuestra app adicionar un nuevo control de usuario, en mi caso lo llamaré AcercaDe.xaml:</p> <p><a href="http://lh6.ggpht.com/-jCY0n4A1Nyg/UH4gQDD_E3I/AAAAAAAABao/CQWwxbLd0Dc/s1600-h/image3.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-qqTcb3kdhuQ/UH4gQyueVcI/AAAAAAAABaw/fkOu2OYcs3E/image_thumb1.png?imgmax=800" width="443" height="253"></a></p> <p>b. Escribir en este xaml la información de contacto y la información de la política de privacidad, para ello he creado en este xaml un stackpanel dentro del cual utilicé varios textblok para especificar la información:</p><pre class="csharpcode"><span class="kwrd"><</span><span class="html">UserControl</span><br /> <span class="attr">x:Class</span><span class="kwrd">="MiTaskList.AcercaDe"</span><br /> <span class="attr">xmlns</span><span class="kwrd">="http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span><br /> <span class="attr">xmlns:x</span><span class="kwrd">="http://schemas.microsoft.com/winfx/2006/xaml"</span><br /> <span class="attr">xmlns:local</span><span class="kwrd">="using:MiTaskList"</span><br /> <span class="attr">xmlns:d</span><span class="kwrd">="http://schemas.microsoft.com/expression/blend/2008"</span><br /> <span class="attr">xmlns:mc</span><span class="kwrd">="http://schemas.openxmlformats.org/markup-compatibility/2006"</span><br /> <span class="attr">mc:Ignorable</span><span class="kwrd">="d"</span><br /> <span class="attr">d:DesignHeight</span><span class="kwrd">="300"</span><br /> <span class="attr">d:DesignWidth</span><span class="kwrd">="400"</span><span class="kwrd">></span><br /> <br /> <span class="kwrd"><</span><span class="html">Grid</span> <span class="attr">Background</span><span class="kwrd">="Black"</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">StackPanel</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>Acerca de:<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>Aplicacion desarrollada por:<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>Robinson Moscoso<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>rmoscosp@hotmail.com<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>Tel: 57-3002141652<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>robinmp.wix.com<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span><span class="kwrd">></span>Política de privacidad<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <span class="kwrd"><</span><span class="html">TextBlock</span> <span class="attr">TextWrapping</span><span class="kwrd">="Wrap"</span><span class="kwrd">></span>Esta aplicación hace uso de la conexión a internet, única y exclusivamente, para descargar información relativa de la misma desde nuestros servidores. Ninguna información de la máquina o del usuario es enviada de vuelta a ellos ni a ningún otro servidor a través de internet ni de ningún otro medio por parte de esta aplicación.<span class="kwrd"></</span><span class="html">TextBlock</span><span class="kwrd">></span><br /> <br /> <span class="kwrd"></</span><span class="html">StackPanel</span><span class="kwrd">></span><br /><br /> <span class="kwrd"></</span><span class="html">Grid</span><span class="kwrd">></span><br /><span class="kwrd"></</span><span class="html">UserControl</span><span class="kwrd">></span></pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /></blockquote><br /><p>2. Definir una variable en el app.xaml.cs que permita controlar que ya se registró el evento que publica el vinculo en el charm de settings.</p><br /><blockquote><br /><p><a href="http://lh4.ggpht.com/-g93TOLdQxm4/UH4gRqyzxjI/AAAAAAAABa4/Zlg_zsp035k/s1600-h/image%25255B4%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-MewIFe3J5AA/UH4gSd_YpAI/AAAAAAAABbA/insORVq6PuU/image_thumb%25255B1%25255D.png?imgmax=800" width="395" height="323"></a></p></blockquote><br /><p>3. Definir en la primera pagina que se ejecuta en mi app el evento que adiciona a settings el vinculo al xaml que he creado en el punto 1:</p><br /><blockquote><br /><p>a. adicionar variables de control:</p><br /><p><a href="http://lh5.ggpht.com/-5-mXJwRVqIc/UH4gTIiOi_I/AAAAAAAABbI/8S6gwNalU18/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-HIpKAG65w_c/UH4gTo54S1I/AAAAAAAABbQ/oY5avB9zozw/image_thumb%25255B3%25255D.png?imgmax=800" width="439" height="222"></a></p><br /><p>b. Adicionar en el constructor el registro del evento:</p><br /><p><a href="http://lh4.ggpht.com/-8VvLC0jOHzM/UH4gULWxPDI/AAAAAAAABbY/cHdIi38gtxM/s1600-h/image%25255B12%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-lqxkJpdxvGs/UH4gU3rdDFI/AAAAAAAABbg/vP6KmoEtOsk/image_thumb%25255B5%25255D.png?imgmax=800" width="552" height="292"></a></p><br /><p>c. Adicionar el método OnCommandRequest:</p><br /><p><a href="http://lh5.ggpht.com/--hfiqar6Nhk/UH4gVZ1p2RI/AAAAAAAABbo/-l9RLJrnCXo/s1600-h/image%25255B16%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-RsmfEw5q_uQ/UH4gWAbCaYI/AAAAAAAABbw/p2e3JI16EhM/image_thumb%25255B7%25255D.png?imgmax=800" width="521" height="153"></a></p><br /><p>d. Adicionar el método onSettingsCommand: (en este método relaciono el xaml de AcercaDe.xaml creado en el numeral 1 de este post)</p><br /><p><a href="http://lh6.ggpht.com/-uPYOGNkQXZY/UH4gWsSFkTI/AAAAAAAABb4/DbdV5J6vNVg/s1600-h/image%25255B24%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-Mj0egtdQN0w/UH4gXmXPE-I/AAAAAAAABcA/R7-Ub179oP8/image_thumb%25255B11%25255D.png?imgmax=800" width="488" height="432"></a></p><br /><p>e. agrego los métodos de OnWindowSizeChanged, OnWindowActivated y OnPopupClosed</p><br /><p><a href="http://lh4.ggpht.com/-A0EE92wdBZo/UH4gYf-U_aI/AAAAAAAABcI/nHnGLnrXoYk/s1600-h/image%25255B28%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-OdQoUJLaXd0/UH4gZDQAklI/AAAAAAAABcQ/e3MwCItBnS4/image_thumb%25255B13%25255D.png?imgmax=800" width="523" height="279"></a></p><br /><p>f. todo el código debería verse asi:</p><pre class="csharpcode"><span class="kwrd">using</span> MiTaskList.DataModel;<br /><span class="kwrd">using</span> System;<br /><span class="kwrd">using</span> System.Collections.Generic;<br /><span class="kwrd">using</span> System.IO;<br /><span class="kwrd">using</span> System.Linq;<br /><span class="kwrd">using</span> Windows.Foundation;<br /><span class="kwrd">using</span> Windows.Foundation.Collections;<br /><span class="kwrd">using</span> Windows.UI.ApplicationSettings;<br /><span class="kwrd">using</span> Windows.UI.Popups;<br /><span class="kwrd">using</span> Windows.UI.Xaml;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Controls;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Controls.Primitives;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Data;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Input;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Media;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Media.Animation;<br /><span class="kwrd">using</span> Windows.UI.Xaml.Navigation;<br /><br /><span class="rem">// The Basic Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234237</span><br /><br /><span class="kwrd">namespace</span> MiTaskList<br />{<br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// A basic page that provides characteristics common to most applications.</span><br /> <span class="rem">/// </summary></span><br /> <span class="kwrd">public</span> <span class="kwrd">sealed</span> <span class="kwrd">partial</span> <span class="kwrd">class</span> Inicio : MiTaskList.Common.LayoutAwarePage<br /> {<br /><br /> <span class="rem">// Used to determine the correct height to ensure our custom UI fills the screen.</span><br /> <span class="kwrd">private</span> Rect windowBounds;<br /><br /> <span class="rem">// Desired width for the settings UI. UI guidelines specify this should be 346 or 646 depending on your needs.</span><br /> <span class="kwrd">private</span> <span class="kwrd">double</span> settingsWidth = 646;<br /><br /> <span class="rem">// This is the container that will hold our custom content.</span><br /> <span class="kwrd">private</span> Popup settingsPopup;<br /><br /> <br /> <span class="kwrd">public</span> Inicio()<br /> {<br /> <span class="kwrd">this</span>.InitializeComponent();<br /><br /> windowBounds = Window.Current.Bounds;<br /><br /> <span class="rem">// Added to listen for events when the window size is updated.</span><br /> Window.Current.SizeChanged += OnWindowSizeChanged;<br /><br /> <span class="rem">//Evento de lanzamiento de settings</span><br /> <span class="rem">//rootPage.NotifyUser("Defaults command added", NotifyType.StatusMessage);</span><br /> <span class="kwrd">if</span> (!App.isEventRegistered)<br /> {<br /> <span class="rem">// Listening for this event lets the app initialize the settings commands and pause its UI until the user closes the pane.</span><br /> <span class="rem">// To ensure your settings are available at all times in your app, place your CommandsRequested handler in the overridden</span><br /> <span class="rem">// OnWindowCreated of App.xaml.cs</span><br /> SettingsPane.GetForCurrentView().CommandsRequested += onCommandsRequested;<br /> App.isEventRegistered = <span class="kwrd">true</span>;<br /> }<br /><br /><br /> }<br /><br /> <span class="kwrd">private</span> <span class="kwrd">void</span> onCommandsRequested(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs eventArgs)<br /> {<br /> UICommandInvokedHandler handler = <span class="kwrd">new</span> UICommandInvokedHandler(onSettingsCommand);<br /><br /> SettingsCommand generalCommand = <span class="kwrd">new</span> SettingsCommand(<span class="str">"DefaultsId"</span>, <span class="str">"Acerca de"</span>, handler);<br /> eventArgs.Request.ApplicationCommands.Add(generalCommand);<br /> }<br /><br /> <span class="kwrd">private</span> <span class="kwrd">void</span> onSettingsCommand(IUICommand command)<br /> {<br /> <span class="rem">//rootPage.NotifyUser("Defaults command invoked", NotifyType.StatusMessage);</span><br /><br /> <span class="rem">// Create a Popup window which will contain our flyout.</span><br /> settingsPopup = <span class="kwrd">new</span> Popup();<br /> settingsPopup.Closed += OnPopupClosed;<br /> Window.Current.Activated += OnWindowActivated;<br /> settingsPopup.IsLightDismissEnabled = <span class="kwrd">true</span>;<br /> settingsPopup.Width = settingsWidth;<br /> settingsPopup.Height = windowBounds.Height;<br /><br /> <span class="rem">// Add the proper animation for the panel.</span><br /> settingsPopup.ChildTransitions = <span class="kwrd">new</span> TransitionCollection();<br /> settingsPopup.ChildTransitions.Add(<span class="kwrd">new</span> PaneThemeTransition()<br /> {<br /> Edge = (SettingsPane.Edge == SettingsEdgeLocation.Right) ?<br /> EdgeTransitionLocation.Right :<br /> EdgeTransitionLocation.Left<br /> });<br /><br /> <span class="rem">// Create a SettingsFlyout the same dimenssions as the Popup.</span><br /> AcercaDe mypane = <span class="kwrd">new</span> AcercaDe();<br /> mypane.Width = settingsWidth;<br /> mypane.Height = windowBounds.Height;<br /><br /> <span class="rem">// Place the SettingsFlyout inside our Popup window.</span><br /> settingsPopup.Child = mypane;<br /><br /> <span class="rem">// Let's define the location of our Popup.</span><br /> settingsPopup.SetValue(Canvas.LeftProperty, SettingsPane.Edge == SettingsEdgeLocation.Right ? (windowBounds.Width - settingsWidth) : 0);<br /> settingsPopup.SetValue(Canvas.TopProperty, 0);<br /> settingsPopup.IsOpen = <span class="kwrd">true</span>;<br /> }<br /><br /> <span class="kwrd">void</span> OnWindowSizeChanged(<span class="kwrd">object</span> sender, Windows.UI.Core.WindowSizeChangedEventArgs e)<br /> {<br /> windowBounds = Window.Current.Bounds;<br /> }<br /><br /> <span class="kwrd">private</span> <span class="kwrd">void</span> OnWindowActivated(<span class="kwrd">object</span> sender, Windows.UI.Core.WindowActivatedEventArgs e)<br /> {<br /> <span class="kwrd">if</span> (e.WindowActivationState == Windows.UI.Core.CoreWindowActivationState.Deactivated)<br /> {<br /> settingsPopup.IsOpen = <span class="kwrd">false</span>;<br /> }<br /> }<br /><br /> <span class="kwrd">void</span> OnPopupClosed(<span class="kwrd">object</span> sender, <span class="kwrd">object</span> e)<br /> {<br /> Window.Current.Activated -= OnWindowActivated;<br /> }<br /><br /><br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// Populates the page with content passed during navigation. Any saved state is also</span><br /> <span class="rem">/// provided when recreating a page from a prior session.</span><br /> <span class="rem">/// </summary></span><br /> <span class="rem">/// <param name="navigationParameter">The parameter value passed to</span><br /> <span class="rem">/// <see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested.</span><br /> <span class="rem">/// </param></span><br /> <span class="rem">/// <param name="pageState">A dictionary of state preserved by this page during an earlier</span><br /> <span class="rem">/// session. This will be null the first time a page is visited.</param></span><br /> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> LoadState(Object navigationParameter, Dictionary<String, Object> pageState)<br /> {<br /> }<br /><br /> <span class="rem">/// <summary></span><br /> <span class="rem">/// Preserves state associated with this page in case the application is suspended or the</span><br /> <span class="rem">/// page is discarded from the navigation cache. Values must conform to the serialization</span><br /> <span class="rem">/// requirements of <see cref="SuspensionManager.SessionState"/>.</span><br /> <span class="rem">/// </summary></span><br /> <span class="rem">/// <param name="pageState">An empty dictionary to be populated with serializable state.</param></span><br /> <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> SaveState(Dictionary<String, Object> pageState)<br /> {<br /> }<br /><br /> }<br />}</pre><br /><p> </p></blockquote><br /><p>luego se ejecutar y al hacer clic en settings se ve de esta forma:</p><br /><p><a href="http://lh3.ggpht.com/-K4wKj3o9KXM/UH4gaTtv1qI/AAAAAAAABcY/p0GNWftdDkk/s1600-h/image%25255B33%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-ZV0jgS16CAk/UH4gbVgv9yI/AAAAAAAABcg/N281ONASxz0/image_thumb%25255B16%25255D.png?imgmax=800" width="340" height="377"></a></p><br /><p>y al hacer clic en acerca de, se abre el AcercaDe.xaml:</p><br /><p><a href="http://lh3.ggpht.com/-rzp1KeRmDX4/UH4gciTKHlI/AAAAAAAABco/lmSA9Bz1TUk/s1600-h/image%25255B37%25255D.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://lh5.ggpht.com/-_oKzHJE0ugc/UH4gdj3oq2I/AAAAAAAABcw/o8UOIJ8HfwY/image_thumb%25255B18%25255D.png?imgmax=800" width="337" height="361"></a></p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com1tag:blogger.com,1999:blog-4792290085252499062.post-40581855163464386822012-09-09T08:36:00.001-05:002012-09-09T08:41:23.874-05:00Iconos para mi WinRT AppCuando vemos el diseño que traen las app para windows 8 los iconos llaman bastante la atención.<br />
<a href="http://lh6.ggpht.com/-vo3luVDzj70/UEybOob79II/AAAAAAAABZY/p7tgs4KjkJ0/s1600-h/image%25255B2%25255D.png"><img alt="image" border="0" height="46" src="http://lh5.ggpht.com/-meGyX7LuURg/UEybPHBYpyI/AAAAAAAABZg/XlWi0jdRcoU/image_thumb.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
Y cuando desarrollamos nuestras apps y queremos tener dicho iconos en ellas, para muchos la opción es buscar el png en algún buscador de imagenes, o incluso abrir paint y manos a la obra.<br />
Lo que muchos no saben, es que estos íconos son una fuente que viene en windows, y que la podemos utilizar en nuestra app y solo utilizar el simbolo que correspone al icono respectivo dentro de un textblock por ejemplo.<br />
El tipo de letra a utilizar es <strong>“Segoe UI Symbol” </strong>y con el mapa de caracteres podemos identificar el simbolo que queremos utilizar en nuestra app.<br />
<a href="http://lh5.ggpht.com/-7KP3TXVA8cA/UEybPimGShI/AAAAAAAABZo/8kqXY13Gjnc/s1600-h/image%25255B10%25255D.png"><img alt="image" border="0" height="289" src="http://lh5.ggpht.com/-3o0wcBVh5Ek/UEybQCVEjOI/AAAAAAAABZw/hlcia4zQmvg/image_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="336" /></a><br />
Luego lo seleccionamos, lo copiamos y lo pegamos dentro de un Textblock que tenga en el atributo FontFamily el tipo de letra <strong>“Segoe UI Symbol”.</strong><br />
<a href="http://lh6.ggpht.com/-zgtfffxoV3Q/UEybQ-_a5yI/AAAAAAAABZ4/bJwq8MHZvzs/s1600-h/image%25255B9%25255D.png"><img alt="image" border="0" height="29" src="http://lh6.ggpht.com/-AxWX1A_mfaI/UEybRcKgcBI/AAAAAAAABaA/_2_vbt8tgVQ/image_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="550" /></a><br />
Y pues al ser una fuente tenemos la ventaja de poder cambiar el tamaño fácilmente, el color de nuestros iconos, y lo mejor de todo, nuestra app queda mucho mas liviana al no tener que incluir este tipo de imágenes. <br />
El resultado:<br />
<a href="http://lh4.ggpht.com/-g41u4SMjuUo/UEybSD3jDCI/AAAAAAAABaI/1viozHSibFI/s1600-h/image%25255B14%25255D.png"><img alt="image" border="0" height="46" src="http://lh6.ggpht.com/-GnfkmAnP_5I/UEybSYlIYLI/AAAAAAAABaQ/ixm3fWfIGEc/image_thumb%25255B5%25255D.png?imgmax=800" style="background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a>Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com1tag:blogger.com,1999:blog-4792290085252499062.post-42019734400695363612012-09-06T07:46:00.001-05:002012-09-06T07:54:41.659-05:00A desarrollar Windows 8 apps con BDotNet, Microsoft y apps.co<p> </p> <p>Hola, teniendo en cuenta la iniciativa del Ministerio TIC , apps co en la cual se apoya el desarrollo de aplicaciones en nuevas tecnologías (<a href="http://www.vivedigital.gov.co/appsco/">Click aquí para más información</a>) y el apoyo de Microsoft para que estas apps sean en Windows 8 y Windows Phone, BDotNet se une a esta iniciativa capacitando a los desarrolladores que quieran hacer parte de esta iniciativa.</p> <p>¿Cómo se van a realizar dichas capacitaciones?</p> <p>Esta capacitaciones se harán por medio de web cast, en los cuales guiaremos el proceso del desarrollo de las apps que nuestros miembros quieran sacar adelante.</p> <p>Inicialmente las capacitaciones estarán basadas en Windows 8, para lo cual es importante que se inscriban en la pagina oficial del apps co, seleccionando que la tecnología a aprendes de desarrollo Nativo y dentro de esta Windows 8</p> <p><a href="http://lh4.ggpht.com/-2WOZunQ_P5Q/UEibDmwldDI/AAAAAAAABYo/47mNELrm6Mg/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-95Q5-N1-dSQ/UEibEj0dGsI/AAAAAAAABYw/wrBpjSIoTq4/image_thumb.png?imgmax=800" width="244" height="189"></a></p> <p><a href="http://lh4.ggpht.com/-7MXbmEqxZEE/UEibFJm3ZkI/AAAAAAAABY4/U-gK41gVPaA/s1600-h/image%25255B5%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh4.ggpht.com/-i8QQSaQV63w/UEibFnH5mnI/AAAAAAAABZA/47m1_mg4Ru4/image_thumb%25255B1%25255D.png?imgmax=800" width="192" height="244"></a></p> <p>Es muy importante tener en cuenta que solo se pueden capacitar en una tecnología a la vez, y si el usuario se inscribe más de una vez, solo se tendrá en cuenta el ultimo registro que haya realizado.</p> <p>Ahora, los invitamos a que sigan la comunidad, a través de nuestra página <a href="http://www.bogotadotnet.org">www.bogotadotnet.org</a>, en nuestra página de facebook <a title="https://www.facebook.com/ComunidadBogotaDotNet" href="https://www.facebook.com/ComunidadBogotaDotNet">https://www.facebook.com/ComunidadBogotaDotNet</a> y en twitter a través del hashtag <a href="https://twitter.com/#!/search/?q=%23BDotNet&src=hash">#BDotNet</a> para informarlos de los pasos a seguir.</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com1tag:blogger.com,1999:blog-4792290085252499062.post-31294741753949074472012-08-27T09:54:00.001-05:002012-08-27T09:55:32.733-05:00PPTs y talleres de la clase sistemas de información<p> </p> <p>Para mis estudiantes del curso de Sistemas de Información de la UN.</p> <p>Por favor diligencien este formulario para enviarles el material de las clases.</p> <p><iframe style="height: 452px; width: 499px" height="685" marginheight="0" src="https://docs.google.com/spreadsheet/embeddedform?formkey=dDgybkZIbWRLSEQ2WkgzVFl0dFZleEE6MQ" frameborder="0" width="760" marginwidth="0">Loading...</iframe></p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-37954349780917507792012-08-27T08:41:00.001-05:002012-08-27T09:02:49.655-05:00Como subir un App WinRT a Windows app storeDentro de las oportunidades que se vienen con Windows 8 es la de poder ofrecer nuestras aplicaciones a través del Windows app store. En este artículo veremos los pasos para subir nuestras apps:<br />
<h2>
1. Registro:</h2>
Lo primero es ir al Windows Dev Center (<a href="http://msdn.microsoft.com/en-us/windows/apps" title="http://msdn.microsoft.com/en-us/windows/apps">http://msdn.microsoft.com/en-us/windows/apps</a>) e iniciar sesión con el live id.<br />
Seguido vamos a la opción de Dashboard, en la cual iniciamos el proceso de registro, seleccionando el país en el que nos encontramos, para nuestro caso “Colombia” <br />
<a href="http://lh3.ggpht.com/-yjGDB-WuXEA/UDt4n-fc7oI/AAAAAAAABTQ/wT8_N2nF5To/s1600-h/image%25255B2%25255D.png"><img alt="image" border="0" height="172" src="http://lh3.ggpht.com/-Ebesr-Ht33E/UDt4oTWO15I/AAAAAAAABTY/LP7z9GUY3yc/image_thumb.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
Una vez en la ventana de registro llenamos la información correspondiente. Para tener en cuenta, el código postal lo podemos encontrar en la página de 4-72 (aplica para Colombia: <a href="http://190.26.208.149/CodigosPostales/Index.html#app=76ee&4817-selectedIndex=1" title="http://190.26.208.149/CodigosPostales/Index.html#app=76ee&4817-selectedIndex=1">http://190.26.208.149/CodigosPostales/Index.html#app=76ee&4817-selectedIndex=1</a>)<br />
<a href="http://lh4.ggpht.com/-vn_L65jzmt8/UDt4pLUk3XI/AAAAAAAABTg/RAlLvKckZJQ/s1600-h/image%25255B5%25255D.png"><img alt="image" border="0" height="244" src="http://lh4.ggpht.com/-Yrf_krKw4Vc/UDt4pgI6a9I/AAAAAAAABTk/iEoeo3Oy8ko/image_thumb%25255B1%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="181" /></a><br />
<br />
Una vez hacemos clic en siguiente debemos leer y aceptar el contrato (Application Development Agreement)<br />
<a href="http://lh5.ggpht.com/-Zvw_EPzq_wk/UDt4qHApQ1I/AAAAAAAABTo/u3fe-gCGRqI/s1600-h/image%25255B8%25255D.png"><img alt="image" border="0" height="209" src="http://lh4.ggpht.com/-rH2d81hD8I4/UDt4qmiaSYI/AAAAAAAABTs/2zwUhsyEJL4/image_thumb%25255B2%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
<br />
<h2>
2. PRECIO y pago</h2>
En la página se nos especifica el precio a pagar por el registro, si se tiene un código se puede incluir en esta parte.<br />
<a href="http://lh6.ggpht.com/-KHTnGsS6G_Q/UDt4rYZJYeI/AAAAAAAABTw/2xmNsnaxCsM/s1600-h/image%25255B11%25255D.png"><img alt="image" border="0" height="175" src="http://lh3.ggpht.com/-1Ey842Qsv98/UDt4sH3LDBI/AAAAAAAABT8/_ZOF2RKGPuI/image_thumb%25255B3%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
Una vez se hace clic en siguiente se activa la ventana de pago, en la cual registramos la información de una Tarjeta de Crédito por medio de la cual se hará el pago.<br />
<a href="http://lh3.ggpht.com/-grRwaR_5bEI/UDt4sqmxDMI/AAAAAAAABUM/3oI_bP8D7go/s1600-h/image%25255B14%25255D.png"><img alt="image" border="0" height="244" src="http://lh4.ggpht.com/-U_4yhUwMv2U/UDt4tuDClMI/AAAAAAAABUU/f94IX4eN6AM/image_thumb%25255B4%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="95" /></a><br />
Una vez registrados los datos del medio de pago se debe hacer la confirmación de la compra:<br />
<a href="http://lh6.ggpht.com/-NuFWpC10kk8/UDt4t_YHGXI/AAAAAAAABUg/iZZcfU21Qh8/s1600-h/image%25255B17%25255D.png"><img alt="image" border="0" height="244" src="http://lh6.ggpht.com/-6efa2-4SSnM/UDt4vOdCUkI/AAAAAAAABUo/N1fQtUhvjvs/image_thumb%25255B5%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="212" /></a><br />
Una vez realizados estos pasos nos llega un correo de conformación de la creación de la cuenta y del pago realizado. Ahora ya podemos iniciar nuestro trabajo en el dashboard<br />
<a href="http://lh4.ggpht.com/-yxc8PWzHRMM/UDt4vjOmd0I/AAAAAAAABUw/vNFPMOHhT28/s1600-h/image%25255B20%25255D.png"><img alt="image" border="0" height="170" src="http://lh5.ggpht.com/-geHamR1bc-I/UDt4v6bqecI/AAAAAAAABU4/awY20poluyk/image_thumb%25255B6%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
<h2>
3. SUBIR UNA APP</h2>
Una vez ingresamos al Dash Board podemos iniciar con el proceso de carga de nuestra aplicación, para ello utilizamos el link Submit an app:<br />
<a href="http://lh4.ggpht.com/-JDXRlDDE_MI/UDt4wlNOGXI/AAAAAAAABVA/_-v6lCqJ5BE/s1600-h/image%25255B23%25255D.png"><img alt="image" border="0" height="168" src="http://lh3.ggpht.com/-O_egd5R0P5w/UDt4w0Ig_EI/AAAAAAAABVI/GlUtzVB7T68/image_thumb%25255B7%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
Para subir la app nos pide los siguientes pasos:<br />
<a href="http://lh6.ggpht.com/-Ma_HdkcIUSg/UDt4xrykl1I/AAAAAAAABVQ/GYEfp5iX1NI/s1600-h/image%25255B26%25255D.png"><img alt="image" border="0" height="244" src="http://lh4.ggpht.com/-39hpdLg7lcI/UDt4yYoL8yI/AAAAAAAABVY/dbISLGCjz9M/image_thumb%25255B8%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="192" /></a><br />
<ul>
<li>App Name</li>
</ul>
<blockquote>
Se debe reservar el nombre que tendrá la app.<br />
<a href="http://lh4.ggpht.com/-XC0Jo7bowig/UDt4yzrB1tI/AAAAAAAABVg/5TYAwai7TAc/s1600-h/image%25255B35%25255D.png"><img alt="image" border="0" height="187" src="http://lh3.ggpht.com/-qC4AVRpvHTU/UDt4zmfR2HI/AAAAAAAABVo/I9qr4dqTAwQ/image_thumb%25255B11%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
<a href="http://lh5.ggpht.com/-Y8E5N-QAHVg/UDt40O85KwI/AAAAAAAABVw/XUMjkSvs_Q4/s1600-h/image%25255B38%25255D.png"><img alt="image" border="0" height="122" src="http://lh4.ggpht.com/-Z_0Olsa4r5E/UDt40VR3VTI/AAAAAAAABV4/0dKC_QoqFHo/image_thumb%25255B12%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<ul>
<li>Selling details (Opciones para la venta)</li>
</ul>
<blockquote>
En esta opción se determina el precio, y si aplica en periodo de prueba de la app, para nuestro caso nuestra app será gratis (Free).<br />
Además en esta opción se debe seleccionar en que mercados quedará disponible, teniendo en cuenta las opciones y palabras que tiene nuestra app, pues una palabra común en el dialecto colombiano, puede ser mal vista en otra región, lo cual puede causas que la app no sea subida al app store.<br />
<a href="http://lh3.ggpht.com/-xBlJBX_1h_s/UDt41LCvnvI/AAAAAAAABWA/QhUKttpWvEE/s1600-h/image%25255B41%25255D.png"><img alt="image" border="0" height="198" src="http://lh6.ggpht.com/-XqOhUiaOL9s/UDt41jk0I-I/AAAAAAAABWI/gr1ghHHn5jE/image_thumb%25255B13%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
También se debe seleccionar la fecha en que será lanzada nuestra app, la primera opción es publicarla una vez pase el proceso certificación.<br />
También se debe seleccionar la categoría sobre la cual se alojará la app, en mi caso “Business”<br />
Se debe también seleccionar si la app requiere para funcionar algunas especificaciones de hardware, particularmente si el dispositivo debe tener alguna versión de DirectX o si requiere dispositivos con más de 2GB de RAM.<br />
Se debe seleccionar si la app cumple con las directrices de accesibilidad, importante tener en cuenta que si la app no cumple con alguna de las opciones de accesibilidad descritas en la guía y es seleccionada esta opción, la app no será certificada.<br />
<a href="http://lh6.ggpht.com/-SF6Qf9BXRkI/UDt42rqo_LI/AAAAAAAABWQ/R2ViVClwu-k/s1600-h/image%25255B44%25255D.png"><img alt="image" border="0" height="241" src="http://lh6.ggpht.com/-sBmz4QGHG7k/UDt43OsCxuI/AAAAAAAABWY/wyAxqSF4oGE/image_thumb%25255B14%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<ul>
<li>Características avanzadas</li>
</ul>
<blockquote>
<a href="http://lh6.ggpht.com/-iM12mYRC1RI/UDt43gKoIZI/AAAAAAAABWg/SN4EXLzzDUg/s1600-h/image%25255B47%25255D.png"><img alt="image" border="0" height="213" src="http://lh5.ggpht.com/-sgskHxJdTeQ/UDt44fsUWMI/AAAAAAAABWo/_X0neFDYe5o/image_thumb%25255B15%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a><br />
En este apartado configuramos 1. si la app y cuenta con “Push notifications and Live Connect services” los cuales deben ser configurados antes de subir la app para la certificacion. 2. “In-app offers” si se quiere configurar ofertas dentro de la aplicación.</blockquote>
<ul>
<li>Audiencia a quien va dirigida la app (Age rating and rating certificates)</li>
</ul>
<blockquote>
Se debe seleccionar para que público puede estar disponible la app, hay que tener en cuenta que Windows Store no permite subir aplicaciones explicitas para adultos únicamente (por ejemplo apps de contenido sexual)</blockquote>
<blockquote>
<a href="http://lh3.ggpht.com/-Pbds7TZpKUU/UDt46KeDtqI/AAAAAAAABW0/bIzhIjcPx-M/s1600-h/image%25255B50%25255D.png"><img alt="image" border="0" height="213" src="http://lh4.ggpht.com/-3R84Ki7LEPQ/UDt4684pASI/AAAAAAAABW8/6_G_qmiPnMA/image_thumb%25255B16%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<ul>
<li>Criptografía (Cryptography)</li>
</ul>
<blockquote>
Permite especificar si la app usa encriptación.<br />
<a href="http://lh6.ggpht.com/-ReY28YJEDsk/UDt47WHF2OI/AAAAAAAABXE/B8BGumdq_ro/s1600-h/image%25255B53%25255D.png"><img alt="image" border="0" height="213" src="http://lh3.ggpht.com/-nrikF7RL72c/UDt474IoYKI/AAAAAAAABXM/OVqlficAvFU/image_thumb%25255B17%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<ul>
<li>Paquetes</li>
</ul>
<blockquote>
Es necesario subir el paquete de nuestra app, este paquete se puede crear a través de Visual Studio (proximante publicaré un post al respecto)<br />
<a href="http://lh5.ggpht.com/-rmQnfYIpJeI/UDt48U40J1I/AAAAAAAABXU/L4ujdX7bIGs/s1600-h/image%25255B56%25255D.png"><img alt="image" border="0" height="213" src="http://lh3.ggpht.com/-yJN176SZk7Y/UDt49LhPowI/AAAAAAAABXc/PBUvbiubMTI/image_thumb%25255B18%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<ul>
<li>Descripción</li>
</ul>
<blockquote>
Una ves tenemos los paquetes subidos, precedemos a dar una descripción de nuestra app, en la cual se pide:<br />
<ol>
<li>Descripción de la app, que será el texto que leerán nuestros usuarios antes de descargar la app
<li>App Features (Características)
<li>Keywords (Palabras clave)
<li>Description of update (descripción de la actualización)
<li>Copyright and trademark (Derechos de autor)
<li>Additional license terms (Términos adicionales de la licencia)
<li>Screenshots (pantallazos)
<li>Promotional images (imágenes promocionales)
<li>Recommended hardware (Hardware recomendado)
<li>Website
<li>Support contact info (Información de contacto para soporte)
<li>Privacy policy ( Política de privacidad)</li>
</li>
</li>
</li>
</li>
</li>
</li>
</li>
</li>
</li>
</li>
</li>
</ol>
<a href="http://lh6.ggpht.com/-4L4STriDKsU/UDt491rjTcI/AAAAAAAABXk/qJ62S1-1wqg/s1600-h/image%25255B66%25255D.png"><img alt="image" border="0" height="519" src="http://lh4.ggpht.com/-jrdAAYgotrQ/UDt4-EYkZjI/AAAAAAAABXs/VB1uhpRxZkQ/image_thumb%25255B22%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="162" /></a></blockquote>
<ul>
<li>Notas a los probadores (Notes to testers)</li>
</ul>
<blockquote>
Permite escribir información que ayuda a los probadores a entender y a utilizar la aplicación. La información ingresada en esta parte no será vista por los usuarios de la app.</blockquote>
<blockquote>
<a href="http://lh6.ggpht.com/-pKg1GwdsC9I/UDt4-4iLhuI/AAAAAAAABX0/wYCZLnblhng/s1600-h/image%25255B62%25255D.png"><img alt="image" border="0" height="183" src="http://lh4.ggpht.com/-nnc3oyolOcY/UDt4_U47YRI/AAAAAAAABX8/awxv68Tyfq4/image_thumb%25255B20%25255D.png?imgmax=800" style="background-image: none; border-width: 0px; display: inline; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="244" /></a></blockquote>
<h2>
4. Enviar la app para certificación</h2>
Una vez se han completado todos los pasos se habilita la opción de enviar la app para la respectiva certificación.<br />
<a href="http://lh4.ggpht.com/-H2ktp4AGGRc/UDt4_z7xp-I/AAAAAAAABYE/Rbzh62Ckq5M/s1600-h/image%25255B70%25255D.png"><img alt="image" border="0" height="358" src="http://lh4.ggpht.com/-JMfk3K67B9M/UDt5AusmkKI/AAAAAAAABYM/xqjnsnLePpo/image_thumb%25255B24%25255D.png?imgmax=800" style="background-image: none; border: 0px currentColor; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;" title="image" width="202" /></a><br />
<br />
Bueno, espero sea de utilidad este pequeño tutorial sobre el proceso de carga de nuestras apps.Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com3tag:blogger.com,1999:blog-4792290085252499062.post-85095371265169658902012-08-03T09:02:00.001-05:002012-08-03T09:02:41.439-05:00Capacitación gratuita!<p>Hola, </p> <p>Para los interesados en adquirir nuevos conocimiento y ampliar sus horizontes les recomiendo le den un vistazo a esta página, en la cual encontrarán cursos online gratis ofrecidos por la universidad de Harvard y el MIT.</p> <p><a title="https://www.edx.org/courses" href="https://www.edx.org/courses">https://www.edx.org/courses</a></p> <p><a href="http://lh5.ggpht.com/-q9F78l3SVFQ/UBvZ7BcxLyI/AAAAAAAABSA/AuWrLUS9Uk8/s1600-h/image%25255B2%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-2d7grNkF-CU/UBvZ7xgzSEI/AAAAAAAABSI/YyOdKRONuBo/image_thumb.png?imgmax=800" width="244" height="135"></a></p> <p><a href="http://lh4.ggpht.com/-ozPBfKyMZdg/UBvZ8jHaD0I/AAAAAAAABSQ/rVeXxxSSTkI/s1600-h/image%25255B5%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh3.ggpht.com/-EzaMgNb5Rvo/UBvZ9IIXMeI/AAAAAAAABSY/KlMc2--jpNk/image_thumb%25255B1%25255D.png?imgmax=800" width="244" height="135"></a></p> <p><a href="http://lh5.ggpht.com/-dveFqTfpQI0/UBvZ936q3EI/AAAAAAAABSg/P8E8bQzYwRU/s1600-h/image%25255B8%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-4pqYYx6NWZA/UBvZ-QlJ5_I/AAAAAAAABSo/vcb94nh1Tp4/image_thumb%25255B2%25255D.png?imgmax=800" width="244" height="134"></a></p> <p><a href="http://lh3.ggpht.com/-RtT40KUnaqk/UBvZ_fEeI7I/AAAAAAAABSw/XTf8AHm2Ylo/s1600-h/image%25255B11%25255D.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://lh6.ggpht.com/-QmAJT2ziw1Q/UBvaALlyGZI/AAAAAAAABS4/_D50JPyG4m4/image_thumb%25255B3%25255D.png?imgmax=800" width="244" height="134"></a></p> <p>Espero sea de su total interés</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-19180045482693188822012-07-31T16:06:00.002-05:002012-07-31T16:07:34.820-05:00Calcular la edad en SQL con una FuncionA veces en proyectos de orden social nos encontramos en que debemos calcular la edad de una persona a partir de su fecha de nacimiento, y pues los primero que a uno se le ocurre es restar las dos fechas con la función datediff:<br />
<br />
<span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">select</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">DATEDIFF</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">year</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">())</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">from</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">personas</span></span></span></span></span></span><br />
Sin embargo esta respuesta no es tan exacta por que no tiene en cuenta si ya cumplió o no años, para solucionar eso, hay que evaluar si la fecha de cumpleaños ya paso y si es así sumar un año.<br />
<br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">select</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">DATEDIFF</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">year</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">()</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)+</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">case</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">when </span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">())</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">Or</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">())</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">And</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Day</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">())</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">day</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)))</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">Then</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">-</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">1 </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">else</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> 0 </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">end</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">as</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">edad</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">from</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">personas</span></span></span><br />
<br />
Ahora esto lo podemos poner en una función para calcular la edad cada vez que lo necesite, asi:<br />
<br />
<br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">CREATE</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">FUNCTION</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">[dbo]</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">[fnEdad]</span></span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Add the parameters for the function here</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fNacimiento</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">datetime</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">
</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fdiligenciamiento</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">datetime</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">RETURNS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">int</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS<br />
BEGIN</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Declare the return variable here</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">DECLARE</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@ResultVar</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">int</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">
</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">set</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@ResultVar</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">DATEDIFF</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">year</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fdiligenciamiento</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)+</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">case</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">when </span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fdiligenciamiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">Or</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> </span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fdiligenciamiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Month</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">And</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">Day</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fdiligenciamiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">day</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@fNacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">)))</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">Then</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">-</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">1 </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">else</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> 0 </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">end</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">
</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">RETURN</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">@ResultVar</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">END</span></span></span></span></span><br />
Ahora podemos utilizar la función fnEdad para calcular la edad de una persona, incluso si queremos saber la edad en una fecha especifica se envia como segundo parametro la edad en la que se desea calcular dicha fecha:<br />
<br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">select</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">dbo</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">FnEdad</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">fechanacimiento</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;"><span style="color: magenta; font-family: Consolas; font-size: x-small;">getdate</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">())</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">as</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">edad</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">from</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;"><span style="color: teal; font-family: Consolas; font-size: x-small;">personas</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><br />
<br />
Espero les sea de utilidad!<br />
Saludos!Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com7tag:blogger.com,1999:blog-4792290085252499062.post-3082103762655944242012-03-07T19:40:00.001-05:002012-03-07T19:40:20.802-05:00Probando VS 11–PowerPoint Storyboarding<p>Instalé el Visual Studio 11 y estoy probando y mirando cositas y me encontré con una herramienta bastante interesate.</p> <p>Resulta que el con la instalación del VS 11 se incluye algo llamado “Powerpoint Storyboarding” que no es otra cosa que una plantilla para Powerpoint con las cosas que uno necesita para hacer facilmente historias de usuario.</p> <p>Alguna vez ha utilizado Powerpoint para hacer prototipos de aplicaciones y mostrarle a cliente como van a quedar?</p> <p>Pues con esta herramienta ese proceso se hace mucho mas sencillo.</p> <p><strong>Algunas pantallas:</strong></p> <p>Figuras para utilzar en el StoryBoard</p> <p><a href="http://lh4.ggpht.com/-P7K3BirUEaM/T1f_4LXQoUI/AAAAAAAABQY/SmdrxWzsFGg/s1600-h/image%25255B2%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/-PZ3YPKurd1Q/T1f_4_En0kI/AAAAAAAABQg/EcueYqbwXQw/image_thumb.png?imgmax=800" width="161" height="244" /></a> <a href="http://lh6.ggpht.com/-ucohZ9nDiHs/T1f_5V1VHdI/AAAAAAAABQo/Qup3sQc3QEM/s1600-h/image%25255B5%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-VSIOFbMj5S0/T1f_6EDUKuI/AAAAAAAABQw/72NwMnG8Mis/image_thumb%25255B1%25255D.png?imgmax=800" width="149" height="244" /></a></p> <p>Incluye dentro de sus figuaras iconos y figuas de Metro Style y de WP 7</p> <p>Además tambien permite conectar la presentación Team Foundation:</p> <p><a href="http://lh6.ggpht.com/-VVX5qVQOEb4/T1f_67AXRyI/AAAAAAAABQ4/TClHkr55NPs/s1600-h/image%25255B8%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/-jdwoAnlCWzQ/T1f_7d4QaJI/AAAAAAAABRA/wH63oz4M1Yg/image_thumb%25255B2%25255D.png?imgmax=800" width="244" height="186" /></a> </p> <p>Y para terminar: una pantalla de reportes para mi cliente montado sobre una tablet:</p> <p><a href="http://lh3.ggpht.com/-I6TlNZGxMuI/T1f_8FIn6rI/AAAAAAAABRI/x5tFjfz2F3Q/s1600-h/image%25255B12%25255D.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-BlJl8oLnX28/T1f_8xgM8oI/AAAAAAAABRQ/y18zOpsmtRM/image_thumb%25255B4%25255D.png?imgmax=800" width="293" height="168" /></a></p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-5020089306608374902011-10-03T08:46:00.000-05:002011-10-03T09:48:26.333-05:00Repetir encabezado de una tabla en Report viewer (ASP.NET y VB.NET)<p>Hola, </p> <p>En un curso que esoty dictando de ASP.NET con VB, me hicieron una pregunta interesante, “¿Como repetir el encabezado de una tabla en cada una de las hojas del reporte?”  </p> <p>Al agregar una tabla a nuestro reporte, se activa en la parte inferior de este una zona de agrupación de filas y columnas, en esta zona, en la parte superior derecha se encuentra una flecha con un menú contextual.</p> <p><a href="http://lh3.ggpht.com/-qWd1AQ-4F9o/TonLJpr7cgI/AAAAAAAABN8/0866gf6nKKA/s1600-h/image%25255B4%25255D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-rufV02vyT04/TonLKUH53NI/AAAAAAAABOA/P2puaIy7wiI/image_thumb%25255B2%25255D.png?imgmax=800" width="387" height="264" /></a> </p> <p>En esa opción se selecciona “Modo avanzado” (“Avanced mode”), al hacerlo se habilitan unas opciones ocultas que hacen referencia al encabezado de la tabla, tanto en filas como en columnas:</p> <p><a href="http://lh5.ggpht.com/-1PnTgm8XDqk/TonLKqlV-OI/AAAAAAAABOE/KREFNfwuwjU/s1600-h/image%25255B9%25255D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-NeapYCOKfGM/TonLLCOpNPI/AAAAAAAABOI/ByvZmY_bDSg/image_thumb%25255B5%25255D.png?imgmax=800" width="386" height="148" /></a></p> <p> </p> <p>Cuando se hace clic sobre el grupo (Static) de las filas la venta de propiedades se activa la pripiedad “RepeatOnNewPage”. Cambiamos la propiedad a “True” y listo.</p> <p> </p> <p><a href="http://lh4.ggpht.com/-07lABeC3EIw/TonLLrQUIqI/AAAAAAAABOM/36uBQJpYTEM/s1600-h/image%25255B16%25255D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-B0P2Pn9H-OE/TonLL8ovZZI/AAAAAAAABOQ/3ON9qP9KFFE/image_thumb%25255B8%25255D.png?imgmax=800" width="401" height="234" /></a></p> <h2>El resultado:</h2> <p>Página 1:</p> <p><a href="http://lh4.ggpht.com/-fOiNXHa0uTo/TonLMpvgF4I/AAAAAAAABOU/uexHtki7s6w/s1600-h/image%25255B27%25255D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/-pQb18LXTYHg/TonLNMC5mvI/AAAAAAAABOY/QdHct0TUEwc/image_thumb%25255B15%25255D.png?imgmax=800" width="391" height="116" /></a></p> <p>Página 2 y siguientes:</p> <p><a href="http://lh4.ggpht.com/-uvTh-PlE4NY/TonLN3ObYrI/AAAAAAAABOc/9ZhsNk6PYoc/s1600-h/image%25255B26%25255D.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/-N9kYhT26Hl0/TonLOc19X6I/AAAAAAAABOg/8uIODqn9umM/image_thumb%25255B14%25255D.png?imgmax=800" width="396" height="100" /></a></p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com6tag:blogger.com,1999:blog-4792290085252499062.post-60580124899271657302011-08-18T10:25:00.001-05:002011-08-18T10:25:28.290-05:00Quien es el dueño de lo que yo desarrollo.<p>Como desarrolladores de software nos encontramos siempre con este caso: quien es el dueño de lo que hacemos?</p> <p>Lo que siempre hay que tener en cuenta es bajo que norma se rigen las relaciones entre los individuos, estas normas están reglamentadas en leyes, códigos, decretos y una serie de cosas más que los abogados saben con más detalle. </p> <p>En el desarrollo de software lo que se crea es una relación entre dos individuos (personas naturales o jurídicas) el desarrollador y el cliente, teniendo en cuenta este aspecto, esta relación se puede dar entre otras teniendo en cuenta los siguientes casos:</p> <p>1. Caso 1: Al desarrollador lo contrataron como empleado por nómina con todas la prestaciones del caso o como freelance pagado por horas para desarrollar algo específico para la empresa por medio de una orden de prestación de servicos, para desarrollar algo con recursos de la empresa, en las instalaciones de la empresa. En este caso todas las líneas del código desarrollado, las librerías creadas, y el producto, serán propiedad del cliente. En este caso la relación está amparada bajo el código sustantivo del trabajo (contrato laboral) y el código de comercio (contrato de prestación de servicios) algo al respecto en este vínculo: http://www.gerencie.com/contrato-de-servicios.html. </p> <p>En este caso el desarrollador ganó experiencia, reconocimiento.</p> <p>2. Caso 2: Una empresa contrata a un desarrollador para que le haga un producto a la medida. El producto fue desarrollado por el desarrollador, en las instalaciones del desarrollador, con herramientas del desarrollador. </p> <p>En este caso la relación cliente-desarrollador es regido por el código de comercio y por tanto se debe realizar un contrato entre las dos partes donde se especifique claramente quien es dueño de que, en este contrato debe de regir una cláusula de confidencialidad, para que el cliente proteja su negocio, que es lo importante para el cliente. </p> <p>En este contrato también se debe especificar los derechos patrimoniales, es decir quién puede lucrarse de la comercialización de dicho producto. Sin embargo el derecho de autor o derechos morales son del desarrollador y no se pueden negociar ni ceder, al igual que pasa con las obras de arte. </p> <p>En el contrato también se puede especificar quien es el dueño del código desarrollado, lo que yo hago, es que en mis contratos especifico que el producto es del cliente. Pero el código es de mi propiedad, es decir, el cliente puede coger su producto, modificarlo, ampliarlo, venderlo a su gusto, pero yo, puedo usar el código utilizado para crear dicho producto en otras aplicaciones, eso sí, sin infringir la cláusula de confidencialidad. Lo que quiere decir, que si yo hice durante el desarrollo del sistema para la empresa A, una librería que optimiza el acceso la base de datos, dicho código lo puedo utilizar en mis posteriores aplicaciones. Lo que no podría hacer, es venderle el producto que le hice parea la empresa A a la empresa B (si así se encuentra especificado en el contrato). </p> <p>Hay una práctica que yo hago, y así lo específico en mis contratos, es que yo entrego el producto con el código fuente al cliente, sin embargo, aclaro que cualquier modificación que hagan al código anula la garantía. Y créanme que siempre el cliente me ha contratado de nuevo para que le haga yo mismo las mejoras al producto, y si eventualmente el cliente modifica el código y daña la aplicación, adivinen a quien llama y adivinen cuanto cobro yo por arreglar el daño…</p> <p>3. Caso 3: Yo hice un producto y el cliente me quiere comprar dicho producto, en ese caso, el producto fue desarrollado por mí, en mis instalaciones y con mis recursos. En este caso el cliente adquiere el producto que yo le estoy ofreciendo, y también está regido por el código de comercio en una operación de compra-venta en la cual también hay que hacer un contrato y en este se especifica que la propiedad es mía y que, el cliente puede utilizar dicho producto para su beneficio. Como en el caso por ejemplo de un sistema de nómina, ahí no hay procesos del cliente a proteger ni confidencialidad sobre procedimientos ni nada, pues es una tarea común a muchos clientes, el producto se puede vender sin ninguna restricción de confidencialidad. </p> <p>4. Caso 4: Ahora aprovechando las nuevas tecnologías, como Windows azure, surge una nueva posibilidad, el software como servicio, en este caso, el cliente compra el acceso al sistema por un tiempo especificado, por una cantidad de transacciones especificadas, etc, etc, etc, más o menos como un alquiler, en este caso también se debe realizar un contrato y es regido por el código de comercio, pero es más parecido a un contrato de arrendamiento, en el cual el cliente hace uso del producto bajo unas condiciones especificadas. Es contrato es lo que normalmente uno chequea como “Acepto” en algunos sitios sin ni siquiera leer lo que allí dice.</p> <p>En conclusión hay que tener muy claro lo que se especifica en el contrato, pues en caso de un pleito jurídico es el primer documento que se tiene en cuenta para el desempate (es decir definir quién tiene la razón, si el cliente o el desarrollador), y por consiguiente sugiero que se valgan de un abogado para que les ayude a crear una buena minuta contractual que se encargará de regir la relación con sus clientes.</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com3tag:blogger.com,1999:blog-4792290085252499062.post-54949464001703641682011-02-13T00:31:00.001-05:002011-02-13T13:44:17.024-05:00Mi primera experiencia con Windows Azure<p>Bueno, pues acabo de enterarme que me gané un XBOX 360 con Kinect  por participar en el primer concurso de Cloud XBOX realizado por Microsoft.</p> <p>Antes que nada, agradezco a Microsoft Colombia por brindarme la oportunidad de participar en el concurso, lo que me ha permitido además de de ganarme el premio, indagar sobre una tecnología que estoy seguro me va a abrir nuevas posibilidades de negocios.</p> <p>Bueno, el concurso consistía en realizar un prototipo de una aplicación para Windows Azure, publicarla (para esto utilicé una cuenta de prueba), realizar un video explicando el prototipo y participar de la carrera de Windows Azure en el <a href="http://www.mslatam.com/latam/technet/mva2/Home.aspx">programa MVA</a> . Este fue el video con el cual participé:</p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:8994fd7c-1968-4240-8f52-6524912f0a04" class="wlWriterEditableSmartContent"><div id="c3a1bc8f-4d66-492d-be74-dcb94e769900" style="margin: 0px; padding: 0px; display: inline;"><div><a href="http://www.youtube.com/watch?v=JzW61TPQe7Y" target="_new"><img src="http://lh3.ggpht.com/_jvoaUtqm6xQ/TVgmfyHjcuI/AAAAAAAABM0/M3v_6SOvdqI/video29b52a7cf9c5%5B56%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('c3a1bc8f-4d66-492d-be74-dcb94e769900'); downlevelDiv.innerHTML = "<div><object width=\"370\" height=\"208\"><param name=\"movie\" value=\"http://www.youtube.com/v/JzW61TPQe7Y?hl=en&hd=1\"><\/param><embed src=\"http://www.youtube.com/v/JzW61TPQe7Y?hl=en&hd=1\" type=\"application/x-shockwave-flash\" width=\"370\" height=\"208\"><\/embed><\/object><\/div>";" alt=""></a></div></div></div> <h2> </h2> <h2>Acerca de Celuturno</h2> <p>El sistema fue una idea pensada para mejorar el servicio que prestan los restaurantes, al tomar el celular del cliente al tomar el pedido para enviarle un mensaje de texto avisando que su pedido se encuentra listo. </p> <p>Con esta aplicación se pretende eliminar la espera que tiene que hacer el cliente frente a un tablero o esperando ser llamado desde la zona de entrega de pedidos, o en el mejor de los casos cargar un dispositivo grande e incómodo que avisará al cliente cuando el pedido se encuentre listo.</p> <h2>Mi primera experiencia con Windows Azure</h2> <p>Este prototipo fue mi primer acercamiento al desarrollo para Windows Azure. Y en esta experiencia he notado que no no difiere mucho de lo que ya venia haciendo como desarrollador de aplicaciones ASP .NET, lo cual me facilitó la creación del prototipo.</p> <p>Sin embargo para implementar la aplicación es necesario tener un conocimiento adicional sobre el almacenamiento de información, el manejo de sesiones y otras cosas mas que pude dominar gracias a:</p> <p>1. Curso de capacitación realizado por la comunidad <a href="http://www.bogotadotnet.org">BogotaDotNet</a></p> <p>2. El <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&displaylang=en">Windows Azure Plataform Training Kit</a></p> <p>3. La carrera de <a href="http://www.mslatam.com/latam/technet/mva2/Studies/EducationDetails.aspx?id=877">Cloud Computing de MVA</a>  </p> <p>4. El blog de <a href="http://blogs.msdn.com/b/warnov/">Walter Novoa</a>, en el cual encontré detalles claves para que mi aplicación funcionara correctamente.</p> <p>un punto adicional: La aplicación es perfecta para ser montada en Windows Azure, teniendo en cuenta que el procesamiento de esta es mayor a ciertas horas (hora de almuerzo) y en otras horas la aplicación puede estar detenida (horas de la noche), lo que disminuye el costo de la aplicación en un ambiente de alta disponibilidad.</p> <h2>Detalle de la aplicación</h2> <p>La aplicación es una aplicación web forms de ASP.NET, la cual la implemeté sobre un web role.</p> <p>Consta de un formulario ASPX que tiene la interfaz de digitación de celulares y el envío de mensajes a los clientes y otro formulario que permite la iniciación a cero del contador de turnos.</p> <p>Teniendo en cuenta que la aplicación no necesita un complejo modelo de base de datos el almacenamiento se hizo utilizando el Azure Storage, alimentando los datos mediante <a href="http://blogs.msdn.com/b/jnak/archive/2010/01/06/walkthrough-windows-azure-table-storage-nov-2009-and-later.aspx">tables</a> </p> <p>El manejo de tables me permite almacenar los telefonos con los turnos y una manipulación simple de estos datos a través de linq.</p> <p>Por ultimo, la aplicación tiene una clase que permite enviar el mensaje de texto a el celular del cliente, utilizando las api que los proveedores de telefonía celular tienen para tal fin.</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com2tag:blogger.com,1999:blog-4792290085252499062.post-80991500423228736422011-01-04T14:30:00.001-05:002011-01-04T14:30:28.471-05:00OBTENIENDO EL LOG DE LINQ to SQL UTILIZANDO EL DATACONTEXT<p> </p> <p>Hola…</p> <p>Me he encontrado en una situación en la que requiero registrar el log de todas las operaciones realizadas en una aplicación </p> <p>Para dar solución a dicho requerimiento lo que hice fue registrar todas las operaciones SQL realizadas sobre la base de datos.</p> <p>Teniendo en cuenta que la aplicación se encuentra en ASP.NET y la capa de datos la estoy trabajando con LINQ to SQL opté por obetener las transacciones realizadas a través del DataContext.</p> <p>A continuación explico como realicé dicho proceso:</p> <p>1. Requerimiento:</p> <blockquote> <p>Registrar el log de todas las transacciones realizadas en la aplicación</p></blockquote> <p>2. Escenario:</p> <blockquote> <p>Aplicación en ASP.NET utilizando LINQ to SQL como capa de datos.</p> <p>A través del editor del LinqToSQL cree el diagrama y lo llamé bdRemisiones.dbml</p> <p><a href="http://lh6.ggpht.com/_jvoaUtqm6xQ/TSN1URCp3-I/AAAAAAAABMk/YL5PuwZQc-E/s1600-h/image%5B3%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_jvoaUtqm6xQ/TSN1U8mUpsI/AAAAAAAABMo/lEFnexVSekg/image_thumb%5B1%5D.png?imgmax=800" width="312" height="248"></a> </p></blockquote> <p>3. Solución:</p> <p>Teniento en cuenta que a través del diseñador se crean automáticamente las clases que me permiten abstraer el modelo de la base de datos y entre ellas una llamada bdRemisionesDataContext que se encarga de conectar a la base de datos realizar las respectivas actualizaciones (para ver como se hace recomiendo: <a href="http://thinkingindotnet.wordpress.com/tutorial-de-linq-to-sql/">tutorial-de-linq-to-sql</a>) </p> <p>La clase creada por el diseñador es una clase parcial, lo que me permite adicionar métodos y propiedades desde otro archivo (OJO: es importante que sea en otro archivo, por que si se hace una modificación al modelo, los cambios se pueden perder) </p> <p>Ahora, simplemente lo que hice fue crear en un archivo nuevo de clase, crear la clase parcial que me permite obtener el log de las transacciones SQL realizadas por el bdRemisionesDataContext asi:</p><pre class="csharpcode">Partial <span class="kwrd">Public</span> <span class="kwrd">Class</span> bdRemisionesDataContext<br /> <span class="kwrd">Inherits</span> System.Data.Linq.DataContext<br /> <br /><span class="kwrd">End</span> Class</pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Luego definí un strinWriter para almacenar el contenido del log:</p><pre class="csharpcode"><span class="kwrd">Dim</span> writer <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.StringWriter()<br /></pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p> </p><br /><p>despues, con el fin de que al crear un nuevo bdRemisionesdatacontext automaticamente se incie el registro del log creé el método onCreated() en el cual asigno el log del datacontext (ver <a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k(SYSTEM.DATA.LINQ.DATACONTEXT.LOG);k(TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22);k(DevLang-VB)&rd=true">Datacontex.Log</a>)</p><br /><p> </p><pre class="csharpcode"> <span class="kwrd">Private</span> <span class="kwrd">Sub</span> OnCreated()<br /> <span class="kwrd">MyBase</span>.Log = writer<br /> <span class="kwrd">End</span> Sub</pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>Luego creo un método que me retorna un string con el log de las opreaciones realizadas por dicho datacontext:</p><br /><p> </p><pre class="csharpcode"> <span class="kwrd">Public</span> <span class="kwrd">Function</span> GetLogStr() <span class="kwrd">As</span> <span class="kwrd">String</span><br /> <span class="kwrd">Dim</span> lg <span class="kwrd">As</span> <span class="kwrd">String</span><br /> <span class="kwrd">MyBase</span>.Log = writer<br /> lg = writer.ToString()<br /> <span class="kwrd">Return</span> lg<br /> <span class="kwrd">End</span> <span class="kwrd">Function</span><br /></pre><br /><p>el código completo se ve asi:</p><pre class="csharpcode">Partial <span class="kwrd">Public</span> <span class="kwrd">Class</span> bdRemisionesDataContext<br /> <span class="kwrd">Inherits</span> System.Data.Linq.DataContext<br /><br /> <span class="kwrd">Dim</span> writer <span class="kwrd">As</span> <span class="kwrd">New</span> System.IO.StringWriter()<br /> <br /> <span class="kwrd">Private</span> <span class="kwrd">Sub</span> OnCreated()<br /> <span class="kwrd">MyBase</span>.Log = writer<br /> <span class="kwrd">End</span> <span class="kwrd">Sub</span><br /><br /> <span class="kwrd">Public</span> <span class="kwrd">Function</span> GetLogStr() <span class="kwrd">As</span> <span class="kwrd">String</span><br /> <span class="kwrd">Dim</span> lg <span class="kwrd">As</span> <span class="kwrd">String</span><br /> <span class="kwrd">MyBase</span>.Log = writer<br /> lg = writer.ToString()<br /> <span class="kwrd">Return</span> lg<br /> <span class="kwrd">End</span> <span class="kwrd">Function</span><br /><br /><span class="kwrd">End</span> Class</pre><br /><p>Ahora para utilizar el log creado simplemente creo un objeto el bdRemisionesdatacontext, realizo las operaciones necesarias y por ultimo utilizo el log generado por ejemplo para incluirlo en una tabla de auditoria. Ej:</p><pre class="csharpcode"> <span class="rem">'instanciar el objeto bd utilizando la clase bdRemisionesDataContext</span><br /> Using bd <span class="kwrd">As</span> <span class="kwrd">New</span> bdRemisionesDataContext()<br /> <span class="kwrd">Dim</span> fecha <span class="kwrd">As</span> <span class="kwrd">Date</span> = <span class="kwrd">CDate</span>(sender.text)<br /><br /> <span class="rem">'Utilizar linq para obtener un objeto con los datos de mi base de datos</span><br /> <span class="kwrd">Dim</span> r = From x <span class="kwrd">In</span> bd.Web_Remisiones<br /> <span class="kwrd">Select</span> x<br /> Where x.IdRemision = idremision<br /><br /> <span class="kwrd">Dim</span> remision <span class="kwrd">As</span> <span class="kwrd">New</span> Web_Remisione()<br /> remision = r.First<br /> <span class="rem">'Modificar el valor de una propiedad de mi objeto remisiones</span><br /><br /> remision.FechaEntrega = fecha<br /><br /> <span class="rem">'Al utilizar submitchanges el datacontext genera la sentencia update y actuliza el registro en la base de datos</span><br /> bd.SubmitChanges()<br /><br /> <span class="rem">'Utilizo mi claye de ayuda Helper para registrar el log de la transaccion</span><br /> <span class="rem">'Notese que con el obejeto bd puedo utilizar el método creado GetLogStr para</span><br /> <span class="rem">'obtener la cadena con el log de la transacción.</span><br /><br /> Using h <span class="kwrd">As</span> <span class="kwrd">New</span> Helper<br /> h.InsertarAuditoria(bd.GetLogStr)<br /> <span class="kwrd">End</span> Using<br /><br /> <span class="kwrd">End</span> Using</pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><br /><p>La cadena retornada por el método en este caso sería algo asi: </p><pre class="csharpcode"><span class="kwrd">SELECT</span> <span class="kwrd">TOP</span> (1) [t0].[IdRemision], [t0].[Consecutivo], [t0].[FechaRemision], [t0].[HoraRemision], [t0].[Id_Cliente], [t0].[Contacto], [t0].[RemitirA], [t0].[UltimaModificacion], [t0].[IdUsuario], [t0].[FechaCreacion], [t0].[Observaciones], [t0].[FechaEntrega]<br /><span class="kwrd">FROM</span> [dbo].[Web_Remisiones] <span class="kwrd">AS</span> [t0]<br /><span class="kwrd">WHERE</span> [t0].[IdRemision] = @p0<br /><span class="rem">-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [2]</span><br /><span class="rem">-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1</span><br /><br /><span class="kwrd">UPDATE</span> [dbo].[Web_Remisiones]<br /><span class="kwrd">SET</span> [FechaEntrega] = @p10<br /><span class="kwrd">WHERE</span> ([IdRemision] = @p0) <span class="kwrd">AND</span> ([Consecutivo] = @p1) <span class="kwrd">AND</span> ([FechaRemision] = @p2) <span class="kwrd">AND</span> ([HoraRemision] = @p3) <span class="kwrd">AND</span> ([Id_Cliente] = @p4) <span class="kwrd">AND</span> ([Contacto] = @p5) <span class="kwrd">AND</span> ([RemitirA] = @p6) <span class="kwrd">AND</span> ([UltimaModificacion] = @p7) <span class="kwrd">AND</span> ([IdUsuario] = @p8) <span class="kwrd">AND</span> ([FechaCreacion] = @p9) <span class="kwrd">AND</span> ([Observaciones] <span class="kwrd">IS</span> <span class="kwrd">NULL</span>) <span class="kwrd">AND</span> ([FechaEntrega] <span class="kwrd">IS</span> <span class="kwrd">NULL</span>)<br /><span class="rem">-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [2]</span><br /><span class="rem">-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [2]</span><br /><span class="rem">-- @p2: Input SmallDateTime (Size = -1; Prec = 0; Scale = 0) [20/12/2010 12:00:00 a.m.]</span><br /><span class="rem">-- @p3: Input VarChar (Size = 8000; Prec = 0; Scale = 0) [ ]</span><br /><span class="rem">-- @p4: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [M27]</span><br /><span class="rem">-- @p5: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [ANGELA RODRIGUEZ]</span><br /><span class="rem">-- @p6: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [ANGELA RODRIGUEZ CRA 5 CON CLL 25]</span><br /><span class="rem">-- @p7: Input SmallDateTime (Size = -1; Prec = 0; Scale = 0) [20/12/2010 12:00:00 a.m.]</span><br /><span class="rem">-- @p8: Input Int (Size = -1; Prec = 0; Scale = 0) [1]</span><br /><span class="rem">-- @p9: Input SmallDateTime (Size = -1; Prec = 0; Scale = 0) [20/12/2010 09:56:00 p.m.]</span><br /><span class="rem">-- @p10: Input SmallDateTime (Size = -1; Prec = 0; Scale = 0) [31/12/2010 12:00:00 a.m.]</span><br />-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 4.0.30319.1</pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style><br /><pre class="csharpcode">Espero les sirva de algo este post y si tienen comentarios y sugerencias, bienvenidos sean.</pre><pre class="csharpcode">Róbinson Moscoso<br>Bogotá - Colombia<br></pre><pre class="csharpcode"> </pre><pre class="csharpcode"> </pre><pre class="csharpcode"> </pre><br /><style type="text/css">.csharpcode, .csharpcode pre<br />{<br /> font-size: small;<br /> color: black;<br /> font-family: consolas, "Courier New", courier, monospace;<br /> background-color: #ffffff;<br /> /*white-space: pre;*/<br />}<br />.csharpcode pre { margin: 0em; }<br />.csharpcode .rem { color: #008000; }<br />.csharpcode .kwrd { color: #0000ff; }<br />.csharpcode .str { color: #006080; }<br />.csharpcode .op { color: #0000c0; }<br />.csharpcode .preproc { color: #cc6633; }<br />.csharpcode .asp { background-color: #ffff00; }<br />.csharpcode .html { color: #800000; }<br />.csharpcode .attr { color: #ff0000; }<br />.csharpcode .alt <br />{<br /> background-color: #f4f4f4;<br /> width: 100%;<br /> margin: 0em;<br />}<br />.csharpcode .lnum { color: #606060; }<br /></style> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-7852098779454286722010-04-10T19:12:00.001-05:002010-04-10T19:12:06.304-05:00Grupo de estudio Silverlight<p>Dentro de las actividades de la comunidad <a title="Comunidad de desarrolladores BogotaDotNet" href="http://www.BogotaDotNet.org" target="_blank">BogotaDotNet</a> realizamos grupos de estudio y hoy arrancamos con el grupo de estudio de Silverlight…</p> <p>Lo primero es que quiero agradecer a <a href="http://blogs.msdn.com/warnov/default.aspx" target="_blank">Walter Novoa</a> por facilitarme material para el grupo de estudio, y pues de una comparto con ustedes un post que me pasó con diferentes recursos:</p> <p><a href="http://blogs.msdn.com/warnov/archive/2010/02/25/recursos-para-ponerse-al-d-a-con-la-ola-microsoft-2010-para-desarrolladores.aspx" target="_blank">Recursos Para Ponerse al Día con la ola Microsoft 2010 para desarrolladores</a></p> <p>También pongo otros links que estoy utilizando para preparar el grupo de estudio:</p> <p><a title="http://www.frameworkla.net/Silverlight.aspx" href="http://www.frameworkla.net/Silverlight.aspx">http://www.frameworkla.net/Silverlight.aspx</a></p> <p><a title="http://blogs.ligasilverlight.com/?p=692" href="http://blogs.ligasilverlight.com/?p=692">http://blogs.ligasilverlight.com/?p=692</a></p> <p><a title="http://rdiazconcha.com/" href="http://rdiazconcha.com/">http://rdiazconcha.com/</a></p> <p><a title="http://www.silverlight-training-guide.com/index.html" href="http://www.silverlight-training-guide.com/index.html">http://www.silverlight-training-guide.com/index.html</a></p> <p> </p> <p>Bueno, trataré de escribir  un resumen de lo que se haga en cada sesión.</p> <p>Saludos</p> <p>Yo</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com1tag:blogger.com,1999:blog-4792290085252499062.post-38700938000316149152010-03-24T13:51:00.001-05:002010-03-24T13:51:23.892-05:00Web Cast de Seguridad<p>En el día de mañana, mi amigo <a href="http://www.hodracirk.com/" target="_blank">Ricardo Polo</a> dará un web cast para Microsoft Technet a las 8pm hora España y 2pm hora Bogotá, Lima, Quito. El web cast se hará para la comunidad española <a href="http://www.secondnug.com/" target="_blank">SecondNug</a> </p> <p>Acá les dejo el link al evento y espero verlos por ahí.</p> <p><a href="https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032447804&Culture=es-ES" target="_blank"><img border="0" alt="" align="center" src="http://www.secondnug.com/img/eventos/carteles/foro_uac1.jpg" /></a></p> <p>Buena suerte <a href="http://www.hodracirk.com/" target="_blank">Ricardo Polo</a> y nos vemos en la red.</p> <p>Saludos</p> <p>Róbinson Moscoso</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-91499611739767541792010-03-24T11:18:00.001-05:002010-03-24T11:18:53.383-05:00Arquitectura en español<p> </p> <p>Acabo de encontrar en la página de campusMVP <a title="http://www.facebook.com/campusMVP?ref=nf" href="http://www.facebook.com/campusMVP?ref=nf">http://www.facebook.com/campusMVP?ref=nf</a> que publican un libro gratuito sobre arquitectura N-Capas, obviamente ya lo descargué y le di una revisada y esta super, por un lado bien explicadito con buenas definiciones y con ejemplos y todo, y pues para los que les patina un poco el coco con el ingles, el libro esta en español.</p> <p>Entonces para los que les interesa el cuento de la arquitectura, y mas aún si están interesados en desarrollar aplicaciones empresariales no duden en descargarlo</p> <p> </p> <p><a title="http://msdn.microsoft.com/es-es/architecture/default.aspx" href="http://msdn.microsoft.com/es-es/architecture/default.aspx">http://msdn.microsoft.com/es-es/architecture/default.aspx</a></p> <p> </p> <p>Saludos</p> <p> </p> <p>Róbinson Moscoso</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-18984068889716015682010-03-13T23:51:00.001-05:002010-03-13T23:51:08.405-05:00Covarianza y Contravarianza<p>Hola como están, en el evento sobre novedades del net framework 4.0  (realizado el 9 de marzo de 2010 en Bogotá) quedaron algunas preguntas sin responder, por lo tanto se convirtieron en tareas pendientes, así pues acá inicio respondiendo el primer punto de la tarea.</p> <p>En este link hay una super buena explicación de la covarianza y la contravarianza, ademas, tambien explica como fue aplicada la novedad al framework 4.0.</p> <p><a href="http://unmapaporfavor.blogspot.com/2009/04/invarianza-covarianza-contravarianza.html" target="_blank">Haz lo que digo, no lo que hago ...</a></p> <p>Tambien en este video presentado por nuestro MVP JuanK se explica este concepto:</p> <p><a href="http://vimeo.com/channels/juank#9635181" target="_blank">Ideas de un Conejo - Visual Studio 2010 C# y la TPL</a></p> <p>Espero que con esta información puedan encontrar un poco mas de claridad sobre estos dos conceptos.</p> <p>Saludos</p> <p>Robinson Moscoso <br />Consultor en Sistemas de Información <br />57-3002141652 <br />Bogotá - Colombia</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-89599164339283246052010-02-24T15:03:00.001-05:002010-02-24T15:03:49.400-05:00Grupos de estudio 2010 - I<p> </p> <p>Hola… </p> <p>En la comunidad BogotaDotNet, estamos por arrancar los grupos de estudio 2010 – I, pero es necesario conocer el interés de nuestros participantes sobre lo que les gustaría que estudiáramos juntos, por eso los invito a votar en la encuesta a través de nuestra página:</p> <p><a title="http://www.bogotadotnet.org/" href="http://www.bogotadotnet.org/">http://www.bogotadotnet.org/</a></p> <p>Es importante aclarar que deben estar pendientes por que pronto se abrirán las inscripciones.</p> <p> </p> <p>Suerte y pulso</p> <p>ROBINSON MOSCOSO PEREZ</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com0tag:blogger.com,1999:blog-4792290085252499062.post-1922667760018159742010-02-15T20:49:00.001-05:002010-02-15T20:49:30.420-05:00Update masivo desde ASP.NET a SQL sever con LINQ to object.<p>Hola, alguna vez me encontré con este problema y he visto que no he sido el único en encontrarme en esta situación:</p> <p><strong>Gridview en ASP.NET con múltiples registros que se deben actualizar cuando hago clic un botón.</strong></p> <p>Se puede hacer fácilmente realizando un recorrido por todas las filas (gridviewrow) del gridview y creando una sentencia SQL por cada fila.</p> <p> <br />Aunque esta es una solución, no presenta el mejor rendimiento, teniendo en cuenta que si son 20 filas se realizarían 20 conexiones a la base de datos, y si hay 20 usuarios conectados al sistema, serías 400 conexiones (:S) y así sucesivamente…</p> <p>A continuacón mediante un ejemplo lo mas ilustrado posible voy a proponer una solución a esto de la siguiente manera:</p> <ol> <li>Con Linq to object creo un XML con la información de todo el gridview. </li> <li>Creo un procedimiento almacenado en SQL server 2005 (aplica para 2008 y espero que para subsiguientes)  que: <ol> <li>Reciba como parámetro el XML </li> <li>actualice los registros existentes </li> <li>agregue los registros nuevos </li> </ol> </li> </ol> <p>Para ello voy a realizar la el ejercicio con pequeño inventario de lo que hay en mi cocina.</p> <h2>Creación de la base de datos</h2> <p>una base de datos que llamaré inventario con una tabla de productos en la cual tengo tres campos: idproducto, producto, cantidad.</p> <p> </p> <p><a href="http://lh6.ggpht.com/_jvoaUtqm6xQ/S3n5ApVuWmI/AAAAAAAABLE/sW8GOEWm4kI/s1600-h/image%5B3%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_jvoaUtqm6xQ/S3n5MLVSwrI/AAAAAAAABLQ/yaZOZOhZLqE/image_thumb%5B1%5D.png?imgmax=800" width="385" height="239" /></a> </p> <p>El código para crear la bd y la tabla:</p> <blockquote> <p><font size="1">USE [inventario] <br />GO <br />/****** Object:  Table [dbo].[Productos]    Script Date: 02/15/2010 16:00:11 ******/ <br />SET ANSI_NULLS ON <br />GO <br />SET QUOTED_IDENTIFIER ON <br />GO <br />SET ANSI_PADDING ON <br />GO <br />CREATE TABLE [dbo].[Productos]( <br />    [idProducto] [int] IDENTITY(1,1) NOT NULL, <br />    [Producto] [varchar](20) NOT NULL, <br />    [Cantidad] [float] NOT NULL CONSTRAINT [DF_Productos_Cantidad]  DEFAULT ((0)), <br />CONSTRAINT [PK_Productos] PRIMARY KEY CLUSTERED <br />( <br />    [idProducto] ASC <br />)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY] <br />) ON [PRIMARY] </font></p> <p><font size="1">GO <br />SET ANSI_PADDING OFF</font></p> </blockquote> <p>Ahora, voy a agregar a manera de ejemplo 10 productos con su respectiva cantidad (aprovecho que hice mercado el fin de semana :D ):</p> <p> </p> <p><a href="http://lh4.ggpht.com/_jvoaUtqm6xQ/S3n5MupA6NI/AAAAAAAABLU/d4zuqkZYj-0/s1600-h/image%5B8%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_jvoaUtqm6xQ/S3n5NoN7npI/AAAAAAAABLY/FjNa-jYR3w0/image_thumb%5B4%5D.png?imgmax=800" width="358" height="401" /></a></p> <p></p> <p></p> <h2>Creación del sitio web</h2> <p>ahora, voy a crear un nuevo sitio web con VS 2008 en el cual voy a leer la información de mi inventario:</p> <p>1. Creo un gridview con los tres campos (Nótese que el campo cantidad es un TemplateField en el cual tengo en el ItemTemplate un textbox donde voy mantener la cantidad) :</p> <blockquote> <p><asp:GridView runat="server" ID="GrdInventario" AutoGenerateColumns="False"> <br />    <Columns> <br />        <asp:BoundField DataField="IdProducto" HeaderText="IdProducto" /> <br />        <asp:BoundField DataField="Producto" HeaderText="Producto" /> <br />        <asp:TemplateField HeaderText="Cantidad"> <br />            <ItemTemplate> <br />                <asp:TextBox ID="txtCantidad" runat="server" Text='<%# Bind("Cantidad") %>'></asp:TextBox> <br />            </ItemTemplate> <br />        </asp:TemplateField> <br />    </Columns> <br /></asp:GridView></p> </blockquote> <p>2. Agrego un botón para actualizar:</p> <blockquote> <p><br /> <br /><asp:Button ID="BtnActualizar" runat="server" Text="Actualizar" /> </p> </blockquote> <p>3.En el pageload mediante un datareader lleno el gridview:</p> <blockquote> <p>Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load <br />        If Page.IsPostBack = False Then <br />            'Utilizar el connectionString del webconfig: <br />            Dim cnnStr As String = ConfigurationManager.ConnectionStrings("InventarioConn").ConnectionString <br />            'usar una conexion a la base de datos <br />            Using cnn As New SqlConnection(cnnStr) <br />                cnn.Open() <br />                Try <br />                    Using cmd As SqlCommand = New SqlCommand("select idproducto, producto, cantidad from productos", cnn) <br />                        cmd.CommandType = CommandType.Text <br />                        Using dr As SqlDataReader = cmd.ExecuteReader() <br />                            GrdInventario.DataSource = dr <br />                            GrdInventario.DataBind() <br />                        End Using <br />                    End Using <br />                Catch ex As Exception <br />                    Throw ex <br />                Finally <br />                    cnn.Close() <br />                End Try <br />            End Using <br />        End If <br />    End Sub</p> </blockquote> <p>4. No olvidar utilizar los namespace de System.Data y System.Data.SqlClient</p> <blockquote> <p>Imports System.Data.SqlClient <br />Imports System.Data</p> </blockquote> <p>Ahora, después de aplicar autoformato al gridview y un título,  al ejecutarse deberia verse algo asi:</p> <p><a href="http://lh3.ggpht.com/_jvoaUtqm6xQ/S3n5OXf4XfI/AAAAAAAABLc/YvqPHc_K-lg/s1600-h/image%5B13%5D.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_jvoaUtqm6xQ/S3n5PLo8RyI/AAAAAAAABLg/pC-9Wgs8A9U/image_thumb%5B7%5D.png?imgmax=800" width="272" height="464" /></a> </p> <p><strong>Nótese</strong>:</p> <ul> <li>El botón actualizar todavía no hace nada. </li> <li>La columna cantidad muestra las celdas como textbox </li> </ul> <h2>Procedimiento almacenado que actualiza la tabla</h2> <p>Hasta aquí todo normal, ahora voy a crear un procedimiento almacenado que reciba como parámetro de tipo xml.</p> <p>El XML que debe recibir el procedimiento almacenado es así:</p> <p><productos> <br />    <producto id="12" cantidad="5"></producto> <br />    <producto id="13" cantidad="12"></producto> <br />    <producto id="14" cantidad="15"></producto> <br /></productos></p> <p>El procedimiento será asi:</p> <blockquote> <p>CREATE PROC [usp_ActualizarInventario] <br />    @Variables xml <br />AS <br />--actualizar los que esten en la tabla </p> <p>UPDATE [Productos] <br />    SET  <br />        [Cantidad] = T.Item.value('@cantidad',  'float') <br />    FROM <br />        [productos] p <br />        join    @Variables.nodes('productos/producto') AS T(Item) on ( <br />                p.idProducto=T.Item.value('@idproducto',  'int') <br />                ) <br />                    ; </p> </blockquote> <p><strong>Nótese:</strong></p> <ul> <li>Se realiza un update con un join donde la tabla productos se actualiza con la información del XML para cada registro donde el idproducto de la tabla corresponda al idproducto del XML </li> <li>En el mismo procedimiento almacenado se puede crear una sentencia Insert para los registros nuevos (por el momento solo lo realizaré con el update) </li> </ul> <h2>Crear el XML en la página ASP.NET utilizando Linq to object</h2> <p>Ahora de regreso a nuestro proyecto vamos a invocar el procedimiento almacenado creado para actualizar la tabla con lo que modifiquemos en la página, pero primero vamos a crear el contenido que se debe ir en el parámetro @Variables del procedimiento almacenado:</p> <p>1. En el evento clic del botón Actualizar vamos a crear una variable que nos almacene el xml (<strong>no olvide utilizar el namespace System.Linq</strong>)</p> <p>Dim xmlVariables As XElement <br />xmlVariables = <productos> <br />                   <%= From fila As GridViewRow In GrdInventario.Rows _ <br />                       Select <producto id=<%= fila.Cells(0).Text %> <br />                                  cantidad=<%= CType(fila.FindControl("txtCantidad"), TextBox).Text %>> <br />                              </producto> %> <br />               </productos></p> <p><strong>Nótese:</strong></p> <ul> <li>Mi lenguaje de programación es <strong>Visual Basic </strong></li> <li>Aprovechando lo anterior se puede crear la estructura xml directamente digitando esta como se desea.</li> <li>Con linq to object extraje el id del producto y la cantidad respectiva de cada producto</li> <li>Utilizando el Debuger del Visual Studio, podemos observar el contenido de la variable (con la estructura que debe recibir el parámetro del SQL Server):</li> </ul> <p><a href="http://lh4.ggpht.com/_jvoaUtqm6xQ/S3n5REF2bzI/AAAAAAAABLk/yCQpLkkV3Os/s1600-h/image%5B18%5D.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_jvoaUtqm6xQ/S3n5SPXwITI/AAAAAAAABLo/4DRWSxve0gI/image_thumb%5B10%5D.png?imgmax=800" width="415" height="276" /></a> </p> <p> </p> <p>2. ahora que ya tenemos en una variable el xml que vamos a enviar al procedimiento almacenado simplemente lo ejecutamos: </p> <blockquote> <p>Dim CadenaConexion As String = ConfigurationManager.ConnectionStrings("InventarioConn").ConnectionString <br />Using cnn As New SqlConnection(CadenaConexion) <br />    cnn.Open() <br />    Try <br />        Using cmd As New SqlCommand("usp_ActualizarInventario", cnn) <br />            cmd.CommandType = CommandType.StoredProcedure <br />            cmd.Parameters.AddWithValue("@Variables", xmlVariables.ToString()) <br />            Dim result As Integer = cmd.ExecuteNonQuery() <br />            Response.Write("Registros Actualizados: " & result) <br />        End Using <br />    Catch ex As Exception <br />        Throw ex <br />    Finally <br />        cnn.Close() <br />    End Try <br />End Using </p> </blockquote> <p>3. Ejecutamos y listo: Viajes a la base de datos 1, registros actualizados 15.</p> <p>Saludos</p> <p> </p> <p>ROBINSON MOSCOSO PEREZ</p> Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com4tag:blogger.com,1999:blog-4792290085252499062.post-3295131020580790832010-01-07T10:56:00.000-05:002010-01-07T11:07:58.191-05:00Estrenando BlogHola, mmm como una de las metas que tengo para este 2010 es crear mi blog y tenerlo actualizado, la idea es tratar los dos temas que mas me apasionan, el desarrollo de software y mis andanzas en moto. vamos a ver como me va y esperemos que este año sea el año!!Robinson Moscosohttp://www.blogger.com/profile/08357572942192743719noreply@blogger.com2