miércoles, mayo 25, 2005

Codigo ASP.Net - Asignar una columna de un DataReader a una varible en WebMatrix

Hace tiempo que quiero usar las funciones que se generan con el Wizard Code de Web Matrix, pero creando un DataReader en lugar de DataSet.
Por fin entendi, que no se puede tener acceso directo a los Items del DataReader. Lo cual no me agrada mucho, pero ya solucione el problema. Sobretodo en los casos de leer un registro de la tabla.
Lo que yo habia estado intentando durante todo este tiempo.
Aqui la funcion:

Function obtenLotexID(ByVal iDLote As Integer) As System.Data.IDataReader
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("MM_CONNECTION_STRING")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT [Lotes].* FROM [Lotes] WHERE ([Lotes].[IDLote] = @IDLote)"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

Dim dbParam_iDLote As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
dbParam_iDLote.ParameterName = "@IDLote"
dbParam_iDLote.Value = iDLote
dbParam_iDLote.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_iDLote)

dbConnection.Open
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

Return dataReader
End Function

Y aquí el llamado a la funcion

Sub Page_Load
Dim drLote as System.Data.OleDB.OleDBDataReader
intIDLote = Request.QueryString("lote")
textID.Text = obtenLotexID(intIDLote)
End Sub



Por supuesto, lo anterior manda un error de que no encuentra la columna correspondiente. Es asi que hoy vi un ejemplo y la forma de capturar los datos y ponerlas en una variable o como texto de un objeto de html es:


Sub Page_Load
Dim drLote as System.Data.OleDB.OleDBDataReader
intIDLote = Request.QueryString("lote")
intIDEmpresa = Request.QueryString("empresa")
drLote = obtenLotexID(intIDLote)
While drLote.Read()
txtID.Text = drLote("IDLote")
End While
End Sub



Como se puede observar en realidad se crea un nuevo DataReader el cual se llenara con los datos de la funcion (que por supuesto es un datareader por si misma).
Y ahora si, busco mediante un loop los valores que estoy requiriendo.

Listo!

viernes, mayo 20, 2005

Codigo ASP.Net - Agregar una grafica de datos.

Estuve buscando en Internet alguna solución para poner una pequeña grafica de barras o circular en una de las pantallas, de la aplicación de la empresa. Siempre había usado html para esto, una combinación de Css y las etiquetas de Table,Td y Tr. Pero en esta ocasion decidí que ya era tiempo de usar un verdadero gráfico. Además que si tenía toda la intención de usar un gráfico circular y en definitiva eso no se puede con html.

Existen varios controles comerciales entre ellos .netcharting, fxChart, etc. y de verdad baje la evaluación y me parecieron buenísimos, pero el precio no tanto.

Por ahi baje uno que tiene tiempo que es bastante famosillo y que se puede encontrar en www.carlosag.net llamado WebChart. Lo probe y no me gustó sinceramente no me gustó el tipo de graficos que genera. Es gratuito, muy sencillo y pero se ve muy burdo, asi que lo deseche.

Pero ayer como a eso de las 2:00 am, navegando en mi casa con la red inalámbrica de mi vecino (;)), encontré un maravilloso control. Solo permite dos tipos de gráficos Bar y Pie, pero lo importante es la buena calidad del gráfico que genera: http://www.codeproject.com/aspnet/webchart.asp
El autor del componente es un cuate que se autonombra BLONG.

Hoy me dí a la tarea de implementarlo en mi aplicación, no tiene mucha documentación, es mas, termine leyendo el codigo fuente del control para entender sobretodo las propiedades y los metodos. Pero la verdad es que en solo 20 min, mi aplicación ya tenía graficas (Y).

Creo que me tarde mas en escoger el formato final que en agregarlo. :D
Genera un archivo PNG, con lo cual permite mayor resolucion en el monitor.

Como siempre usé Web Matrix, es asi que el código lo pongo tal cual lo tengo en mi aplicación.

El codigo vb es:

Sub showChart (iD as Integer)
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("MM_CONNECTION_STRING")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT IDStatus....WHERE ID = @iD"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

Dim dbParam_iDSubasta As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
dbParam_iDSubasta.ParameterName = "@ID"
dbParam_iDSubasta.Value = iD
dbParam_iDSubasta.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_iDSubasta)

dbConnection.Open
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

Dim sumaPagados as Integer
Dim sumaNoPagados as Integer
While dataReader.Read
Select dataReader("IDStatus")
Case 2, 3 ' se vendio
sumaNoPagados += 1 'vendido y pagado
Case 6 ' se reasigno
sumaNoPagados += 1 'reasignado y pagado
Case 4 'vendido y pagado
sumaPagados += 1 'vendido sin pago
Case 7 'reasignado y pagado
sumaPagados += 1 'reasignado sin pago
End Select
End While
If iD>0 Then
WebChart1.Visible=True
End If
WebChart1.WebChartItems.Add(New WebChartItem("NoPagados",sumaNoPagados,"False"))
WebChart1.WebChartItems.Add( New WebChartItem("Pagados", sumaPagados,"False"))

End Sub

Y en la parte de la pagina:

< blong:WebChart id="WebChart1" title="Gráfica Circular" runat="server" Type="Pie" Visible="False" ShowValues="True" Format="Png" Diameter="Small" >< /blong:WebChart >



Gracias BLONG
Listo!

miércoles, mayo 18, 2005

Codigo ASP.Net - Usando el objeto HashTable

La idea era usar un arreglo (array) dentro de una de las aplicaciones. Esto generalmente lo uso bastante, y aun cuando en Asp es muy sencillo de usar y dimensionar un arreglo o array. En Asp.Net me encontre con la novedad de que existe 3 tipos diferentes de collecciones para un arreglo.

  1. ArrayList
  2. HashTable
  3. y SortedList

Tome como base una funcion select de Web Matrix dentro de una pagina. Realice una modificacion a la consulta y al final de las modificaciones la funcion me regresa un HashTable en lugar de un dataset.
Aun cuando se puede utilizar directamente un join en la tabla directamente para que me dieran los resultados me gusta usar arreglos para designar los diferentes titulos a valores de una tabla que se usa como llave secundaria.
Codigo:

Function obtenBancos() As HashTable
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("CONNECTION_STRING")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT [Bancos].[IDBanco], [Bancos].[NombreBanco] FROM [Bancos] ORDER BY [Bancos].[NombreBanco] DESC"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

dbConnection.Open
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

Dim Bancos = New HashTable

While dataReader.Read()
Bancos.Add(dataReader(0),dataReader(1))
End While

Return Bancos
End Function


De esta manera cuando asi lo necesito hago llamar la funcion obtenBanco(2) y me resuelve con el banco correspondiente.
De la siguiente manera se puede llenar un DropDownList:

drpBancos.DataSource = obtenBancos()
drpBancos.DataValueField="Key"
drpBancos.DataTextField="Value"
drpBancos.DataBind()



Listo!

martes, mayo 10, 2005

FCKEditor en asp.net

Durante ayer y hoy he estado revisando el editor wysiwyg para paginas de FCKEditor.
Ya tenia tiempo que lo habia visto, en un par de ocasiones estuve a punto de usarlo, para ser mas especifico, implementarlo en PhpNuke, pero finalmente no lo habia usado.
Como estoy delegando algunas tareas y la persona que hará los cambios en el sitio web de la empresa no sabe de html, decidí que seria practico (en lugar de dar clases de html) agregar este editor.
Lo mejor del editor es el hecho que es muy estable, esta muy probado y tienen mucho tiempo desarrollandolo.

No hay mucha información para la instalación, por un minuto pense que con bajar el paquete .Net seria suficiente pero no. En realida el archivo .dll es simplemente es una extension del webcontrol para TextArea. Es asi que se requiere bajar el paquete completo, y ponerlo en una carpeta desde raiz.

Ahora bien se puede editar el codigo fuente del control para realizar las personalizaciones correspondientes, ahi para quien guste, me quedo con el compilado. A continuación un ejemplo:

Page Language="VB"
Register TagPrefix="uc0" TagName="encabezado" Src="/include/encabezado.ascx"
Register TagPrefix="FCKeditorV2" Namespace="FredCK.FCKeditorV2" Assembly="FredCK.FCKeditorV2, Version=2.1.1887.26124, Culture=neutral, PublicKeyToken=4f86767c9b519a06"
< html >
< head >
< / head >
< body text="#000000" bgcolor="#ffffff" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" >
< form runat="server" >
< FCKeditorV2:FCKeditor id="FCKeditor1" runat="server" toolbarset="Basic" width=400 >

< / FCKeditorV2:FCKeditor >
< /form >
< / body >
< / html >



www.fkceditor.net

Listo!

jueves, mayo 05, 2005

Codigo ASP.Net - Contar registros distintos de una tabla

Use como siempre el wizard de Web Matrix para realizar un select. Modifique la cadena de consulta para contar los disitintos registros de la tabla y en lugar de generar un dataset o datareader la funcion genera un integer:


Function cuentaPC(ByVal iDSubasta As Integer) As Integer
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("Mi_CONNECTION_STRING")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT Count([Paletas].[IDPaleta]) as CuentaPaletas FROM (SELECT DISTINCT [Paletas].[IDPaleta] FROM [Paletas], [Lotes] WHERE (([Paletas].[IDPaleta] "& _
"= [Lotes].[IDPaleta]) AND ([Paletas].[IDSubasta] = @IDSubasta)))"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection


Dim dbParam_iDSubasta As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
dbParam_iDSubasta.ParameterName = "@IDSubasta"
dbParam_iDSubasta.Value = iDSubasta
dbParam_iDSubasta.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_iDSubasta)

dbConnection.Open
Dim intCuentaPaletas as Integer = dbCommand.ExecuteScalar()

Return intCuentaPaletas
End Function


Listo!

Databinding usando Iif

En muchas ocasiones requiero de colocar un valor boleano en alguna de las columnas de los datagrid. Y el codigo es sencillo:

< /asp :label text='
< % # IIf (Container.DataItem("Activacion"),"SI","NO") % >
' > < / asp:label >

Listo!

miércoles, mayo 04, 2005

SQL Tutorial

Siempre ando perdiendo esta pagina. Es un tutorial de w3schools.com. Es muy sencillo pero muy útil.

SQL Tutorial

¿No usar DataSets?

Acabo de leer el artículo en 4guysfromrolla. Me parecio interesante hacer la prueba, sobretodo porque se menciona que se puede aumentar hasta en 30 veces la velocidad de lectura de la base de datos. Y... sí efectivamente, es más rapido. Modifique el codigo para generar un DataReader en lugar de DataSet, y la diferencia fue asombrosa y de forma inmediata.


ASP.NET.4GuysFromRolla.com: Why I Don't Use DataSets in My ASP.NET Applications
Listo!

Ordenación (sort) con Web Matrix

Web Matrix contienen un control llamado MxDataGrid, que se supone es una version mejorada del control DataGrid. La verdad es que no lo encuentro tan amigable despues de todo. Razones:

  1. No contiene la opcion de "Formato Automatico" como el DataGrid normal,
  2. Existe poca información sobre su uso.
  3. El sort u ordenamiento, asi como la paginación no es tan inmediata, si se tiene que modificar el codigo.
Asi que con lo anterior, recomiendo usar el DataGrid normal.

Estuve posponiendo, por esto mismo, el agregar ordenacion en mis pantallas que contienen un data grid, pero por fin lo resolví y no estuvo tan complicado.
Algo que debo mencionar, es que pensé que el DataGrid haria el ordenamiento por mi, que no tendria que codificar algo para esto. Error!.
Pero no fue tan complicado, primero modifique la función "select" que se genera con los code wizards de Web Matrix.



Ejemplo:
Function obtenLotesxSubasta(ByVal iDSubasta As Integer) As System.Data.IDataReader
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("miconexion")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT .... FROM "
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

Dim dbParam_iDSubasta As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
dbParam_iDSubasta.ParameterName = "@IDSubasta"
dbParam_iDSubasta.Value = iDSubasta
dbParam_iDSubasta.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_iDSubasta)

dbConnection.Open
Dim dataReader As System.Data.IDataReader = dbCommand.ExecuteReader(System.Data.CommandBehavior.CloseConnection)

Return dataReader
End Function


Lo anterior se genera automaticamente, se hacen las siguientes modificaciones...


Function obtenLotesxSubasta(ByVal iDSubasta As Integer, ByVal orden As String) As System.Data.IDataReader

y ademas...

Dim queryString As String = "SELECT .... FROM ORDER BY " & orden

Pude haber usado un parametro en lugar de agregarlo directamente a la cadena de query ( tal vez lo haga mas adelante), pero funciona bien de esta forma usando menos lineas... ;).

Se tiene que agregar el atributo OnSortCommand="midatagrid_SortCommand" al DataGrid y por supuesto escoger las columnas que se podrán ordenar agregando SortExpression="ID" segun corresponda. Y finalmente el eventhandler:

Sub midatagrid_SortCommand(sender As Object, e As DataGridSortCommandEventArgs)
orden = e.SortExpression
intIDSubasta = request.querystring("suabsta")
dgrLotes.DataSource = obtenLotesxSubasta(intIDSubasta, orden)
dgrLotes.DataBind()
End Sub


Listo!

PDFCreator 0.8

Creo que olvide mencionar en mi lista de software, estoy haciendo la modificacion en el post anterior. Pero creo que puedo platicar un poco mas de él, en esta ocasión.
Lo que me parece grandioso de PDFCreator es que se instala como una impresora dentro del ambiente de windows, es asi que se puede generar cualquier cosa en formato PDF. Porque gastar en Adobe Acrobat, cuando esta herramienta hace un excelente trabajo.
Es cierto que no genera todas las opciones de Acrobat, pero sinceramente quien las necesita.
Cuando se envia o se usa un archivo PDF, es simplemente por seguridad para que no esten modificando el archivo, de otra manera mejor enviar el archivo .doc o .xls o lo que sea.
Se instala el PDFCreator y tiene un archivo de inicio en español que habra que obtener de forma independiente. http://sector7g.wurzel6.de/pdfcreator/index_en.htm o en http://sourceforge.net/projects/pdfcreator/
Listo!

Anim FX banners en Flash

Instale Anim-FX en su version de prueba y simplemente no me gusto. Despues de varios intentos con Swish y pensando en crear el banner de la empresa en Gif Animado. Simplemente me decidi por unos templates gratuitos que andaban por ahi, y lo tuve que hacer en Flash MX.
Creo que perdí mas tiempo en estar buscando como hacerlo que en realidad hacerlo.
Espero que se acepte.
Listo!

martes, mayo 03, 2005

Dar formato de moneda a un string.

4GuysFromRolla.com - ASPFAQS.com : ASP.NET : How can I format numbers and date/times using ASP.NET? For example, I want to format a number as a currency.

Codigo ASP.Net - Leer un registro de una tabla.

A continuación un snippet, que siempre ando olvidando a la hora de leer un registro de una table:

intIDLote = Request.QueryString("lote")
Dim drLote As System.Data.DataRow
drLote = obtenLotexID(intIDLote).Tables(0).Rows(0)
Titulo.Text = drLote.Item("Titulo")

La siguiente funcion se genera en Web Matrix. Recuerda que tiene que ser un DATASET, y no un DataReader.

Function obtenLotexID(ByVal iDLote As Integer) As System.Data.DataSet
Dim connectionString As String = System.Configuration.ConfigurationSettings.AppSettings("MM_CONNECTION_STRING_connGabasys")
Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

Dim queryString As String = "SELECT ...... ([Lotes].[IDLote] = @IDLote))"
Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
dbCommand.CommandText = queryString
dbCommand.Connection = dbConnection

Dim dbParam_iDLote As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
dbParam_iDLote.ParameterName = "@lote"
dbParam_iDLote.Value = iDLote
dbParam_iDLote.DbType = System.Data.DbType.Int32
dbCommand.Parameters.Add(dbParam_iDLote)

Dim dataAdapter As System.Data.IDbDataAdapter = New System.Data.OleDb.OleDbDataAdapter
dataAdapter.SelectCommand = dbCommand
Dim dataSet As System.Data.DataSet = New System.Data.DataSet
dataAdapter.Fill(dataSet)

Return dataSet
End Function

lunes, mayo 02, 2005

Lista de Software que uso

Mucha gente cree que uso software pirata, pero no es asi. Lo que intentó usar la mayor parte del tiempo es software Open Source; es asi que a continuacion mi lista de open source:
  1. Filezilla - Programa para realizar ftp, es muy bueno y vino a sustituir al buen ws_ftp que utilice por mucho tiempo. http://filezilla.sourceforge.net
  2. 7Zip - Programa de compresion, que aun cuando XP permite abrir y crear archivos .zip, la verdad es que me encuentro en internet con otros tipos de archivos entre ellos .rar, .gz, .ace, etc. Este programa es un poco rudimentario, no es tan amigable. Pero funciona, y me evito tener WinZip. http://www.7zip.org
  3. RealVNC - ¡Que haria sin VNC! Ha venido a solucionarme muchos problemas de acceso remoto a las computadoras, el único problema es que ahora camino menos, y los kilitos se quedan... http://www.realvnc.com
  4. NVU - Por fin deje de utilizar frontpage. Es una herramienta basada en el framework de Mozilla, funciona de maravilla. Todavia tiene bugs, pero espero que para la version final se eliminen. http://www.nvu.com
  5. Crimson Editor - He usado por mucho tiempo esta herramienta freeware, me gusta, es rápida y me he acomodado muy bien. http://www.crimsoneditor.com. Existe por ahi otra que es opensource, que se llama SciTE http://www.scintilla.org/SciTE.html
  6. ASP .Net Web Matrix - Mi programa para desarrollar paginas asp.net. Es practico y gratuito. Tiene algunas desventajas, como seria la falta de intellisense. Pero bueno no me costo diez mil pesos. Asi, que no me quejo. http://www.asp.net
  7. Gimp - Para el desarrollo de graficos. Esto es de bitmap. Chafisimo para el vectorial. Y por otra parte odio que no tenga, algo asi como macros. Per bueno, eso lo hago con otra cosa. http://www.gimp.org
  8. IrfanView - Es una utileria para ver graficos, y permite editar de manera muy sencilla los graficos. Lo uso para modificar el tamaño de alguna foto. http://www.irfanviewer.com
  9. Sodipodi - Herramienta para graficos vectoriales. El detalle es que general archivos de svg, y no he encontrado algo que lo convierta a illustrator o freehand, pero funciona muy bien. http://www.sodipodi.com
  10. Open Office 2 - Olvidense de Office, es muy caro, asi de plano. Es muy caro. Y lo peor es que cuesta mas en México que en EEUU... http://www.openoffice.org
  11. Thunderbird - Openoffice no cuenta con un lector de email, tipo outlook. Y aqui es donde entra Thunderbird, el cliente de email de Mozilla. http://www.mozilla.org
  12. PDFCreator - Herramienta que viene a sustituir Adobe Acrobat para generar archivos PDF. http://sourceforge.net/projects/pdfcreator/

Por ahora eso es todo. Recomiendo usar www.sf.net y www.tucows.com

Listo!

Paint .Net 2.1

Paint .Net es un programa sencillo para el diseño, pero me ha sorprendido que permite manejo de capas. Se promociona como el sustituto de Paint que viene incluido en Windows XP. Esta apoyado en parte por Microsoft, pero el desarrollo es open source y esta siendo desarrollado en la universidad de washington: http://www.eecs.wsu.edu/paint.net/
Muy, pero muy recomendable. Esta en version release 2.1.
Si continuan con el desarrollo, es posible que se convierta en una aplicacion tipo Gimp (www.gimp.org).
Listo!

Visual Studio Web Express Edition

He estado trabajando con ASP .net 1.1 queria esperar a que saliera la versión 2.0 pero la verdad es que ya tenia que migrar toda la intranet en la oficina, asi que con todo y mi pesar empece con la version 1.1. Pero, pero recomiendo obtener la version 2.0 beta 2. Se puede bajar de www.asp.net es un enlace directo a Microsoft.
El costo de esta aplicación a diferencia de Web Matrix que es totalmente gratuito, será de 50 dolarucos. No me parece mal y en cuanto este la versión final lo comprare.
¿Para cuando estara la version 2.0? pues no existe fecha o por lo menos yo no la tengo. Espero sea pronto para empezar a utilizarla.
El primer proyecto con .Net2 sera MedSid.
Listo!

Inicio del Blog

Empiezo el mes con un blog. Veremos como va el asunto.

Pequeña introducción de mi persona, mi nombre es Víctor García. Tengo trabajando en el area de sistemas entre 9 y 10 años.

El fin del blog, es llevar una bitacora de aquellas cosas que voy resolviendo en el trabajo.
Que pueden incluir codigo, anotacion, soluciones, tips, etc.

Si a alguien le sirven, perfecto.

Tal vez cooperen con dar click a los Google - Adsense.

Bueno por ahora es todo.

Listo!