Wednesday, December 14, 2011

Case when null

Usamos CASE WHEN THEN para transformar dado un valor a otro, para personalizarlo. Por ejemplo, el típico F: Femenino y M: Masculino. Nuestro Case sería así:

SELECT blah, blah, blah, CASE sexo WHEN 'F' THEN 'FEMENINO' WHEN 'M' THEN 'MASCULINO' ELSE 'GAY?' END AS SEXO

Pero se podría dar el caso en que necesito mostrar al usuario dado un valor está en NULL entonces no se ejecutó alguna acción. Por ejemplo, tengo mi columna AprobadoPor, si está en NULL es porque no se ha aprobado el registro.

Para usar CASE WHEN THEN con valores nulos, es como sigue a continuación (checka que para estos casos, debes usar la palabra reservada Is Null, Is Not Null):

SELECT blah, blah, blah, CASE WHEN cs.AprobadoPor IS NULL THEN 'En espera' ELSE 'Sí' END AS APROBADO 

Tuesday, December 13, 2011

Validar hora como dato De entrada

Tenemos nuestra caja de texto que sólo debe dejar que el usuario ingrese una hora. Una solución es hacerlo con expresiones regulares.

Imports System.Text.RegularExpressions

Public Function esHoraValida() As Boolean
  Dim r As New Regex("([0-1][0-9]|2[0-3]):[0-5][0-9]")
  Dim sw As Boolean = True
  If Not (r.Match(Me.txtHora.Text)).Success Then
    sw = False
    'Si el dato de entrada no es hora, mostrar un mensaje al usuario ("Debe ingresar la hora con formato válido [08:30].")
  End If
  Return sw
End Function

Ah, y por cierto, para que la caja de texto sólo admita cuatro dígitos y ya esté incluido los dos puntos del medio, estoy usando el control MaskedTextBox (en winforms, en webforms también hay uno similar)


HaPPy CoDiNg =)

Monday, December 12, 2011

Resaltar el item actual seleccionado del menu

Nuestro sitio web tiene un menú, ya sea horizontal o vertical. El usuario navega a través de él. Es importante que cuando el usuario haga clic sobre un item de nuestro menú, hagamos que éste se resalte para que de esta manera nuestro usuario sepa dónde está posicionado o navegando.

Una solución es haciéndolo con JQuery.

Código HTML - menú


Código CSS - menú

#navegacion
{
 height: 41px;
 background-color: #07A8D6; 

}

#menu
{
 padding: 0;
 margin: 0;

}

#menu li
{
 display: inline; 
}

#menu li a:link, li a:visited
{
 text-decoration: none;
 float: left;
 color: #fff;
 background-color: #065081; 
 padding: 10px;
 border: 1px solid #fff;
}

#menu li.current a
{
 background-color: #07A8D6 ; 
}

#menu li a:hover
{
 background-color: #07A8D6; 
 margin-top:-2px;   padding-bottom:12px;  
}

Código JQuery



HaPPy CoDiNg =)

Tuesday, December 6, 2011

Padding o margin

Algo con lo que solía confundir eran el empleo de los atributos padding y margin. Una imagen vale más que mil palabras, así que la siguiente imagen muestra qué es cuál.


Como podés ver, los márgenes son el espacio que hay entre la capa y cualquier objeto adyacente. El (o padding) es el espacio entre el borde de la capa y el contenido. (El borde es la línea que delimita la capa)

MARGIN

Para establecer los márgenes mediante código CSS, exisiten distintas formas y es importante conocerlas todas para poder leer fácilmente el código css e interpretarlo. Por defecto, cada capa tiene 4 márgenes que vienen con un valor 0.

/*Aplicando los 4 márgenes de la forma natural*/
#capa    {
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
margin-left: 10px;
}
/*Aplicando los 4 márgenes de forma simplificada*/
#capa    {
margin: 10px;
}
/*Cuando el márgen de arriba es igual al márgen de abajo, y el márgen de la derecha es igual al márgen de la izquierda, se puede usar el siguiente formato, tomando en cuenta que el primer valor corresponde a los de arriba y abajo y el segundo valor a los de la derecha e izquierda*/
#capa   {
margin: 10px 5px;
}
/*Cuando los valores de la derecha e izquierda son los mismos y únicamente varían el de arriba con el de abajo, se procede con el siguiente formato, tomando en cuenta que el primer valor corresponde al márgen de arriba, el segundo a los de la derecha e izquierda y el tercero al de abajo*/
#capa    {
margin: 5px 15px 2px;
}
/*Cuando todos los márgenes son distintos uno del otro, entonces se procede a colocar cada valor, tomando en cuenta que el primer valor corresponde al de arriba, segundo: derecha, tercero: abajo y cuarto: izquierda (tal como las manecillas del reloj) */
#capa    {
margin: 3px 10px 6px 8px;
}

PADDING

Al igual que el MARGIN, se tiene 4 rellenos y por defecto vienen en valor 0. El código css se establece de la misma manera.

IMPORTANTE

El ancho real y el alto real de una capa se ve directamente afectado con los valores (de width y height) de sus márgenes, rellenos y bordes.

Ancho de una capa con todos sus atributos:

Ancho + margen izq. + margen der. + relleno izq. + relleno der. + borde izq. + borde der.

Esto es importante tomar en cuenta ya que afectará directamente al diseño de la página, habrá un desbordamiento.

HaPPy CoDiNg =)

Thursday, December 1, 2011

Actualizar una tabla mediante Un bucle

Frase del día: "El conocimiento hincha pero el amor edifica"

Sql Server. Cursor. While. Bucle. Update. Loop to update records in sql server. Using While Loop for SQL Server Update.

Si tu tabla está llena de datos y queres actualizar un campo con un dato algo genérico, podemos utilizar los beneficios de los bucles.

Si tu primary key es un correlativo y sabes que va en orden, lo más sencillo sería hacerlo así:

DECLARE @id BIGINT 
SET @id = 1
WHILE @id < 12
BEGIN
update test set descripcion='aquí el dato genérico' where id=@id
SET @id = @id + 1
END

En el caso de que no, entonces sería utilizando cursor. Checka:

DECLARE @id BIGINT
DECLARE myTable CURSOR FOR
SELECT id FROM test
OPEN myTable
FETCH NEXT FROM myTable
INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN
update test set descripcion='aquí el dato genérico' where id=@id
FETCH NEXT FROM myTable
INTO @id
END

Es que a mi me tocó hacer algo parecido. Pero no usé ninguno de las dos utilidades, mi caso era un caso especial jeje. Lo tuve que hacer por vb.net no más xD.

HaPPy CoDiNg.

Tuesday, November 29, 2011

Formatear una columna De Un gridview / datagridview

Frase del día: "No elegimos de quien enamorarnos y jamás pasa como debería."

Por ejemplo, si querés que el dato de x columna se muestre sólo la hora...



para el control DataGridView (Windows Form) el código va así:

Me.dgvServicio2.Columns(22).DefaultCellStyle.Format = "HH:mm"

para el control GridView (Web Form) el código va así:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
        If e.Row.RowType = DataControlRowType.DataRow Then
            e.Row.Cells(0).Text = CDate(e.Row.Cells(0).Text).ToString("HH:mm")
        End If
    End Sub

Más sencillo para windows form, no?

Pero en el caso de que tu GridView tenga deshabilitada la opción Autogeneración de Campos, en la parte donde le agregas las columnas podes formatearla:



HaPPy CoDiNg =)

Thursday, November 24, 2011

Gizmox - visual webgui

Visual WebGui es una herramienta creada por Gizmox. Gizmox funciona con el desarrollo .Net de Microsoft.

Visual WebGui es una aplicación que funciona sobre un sevidor de Internet usando software de virtualización y una capa de código que hace que su interfaz funcione en el moderno estándar para Web HTML5.

Practicamente es como desarrollar aplicaciones Windows y verlas como aplicaciones Web.

Windows con cara de Web o Web pero Windows.

Checka esto. Es una ventana dialog/popup. Lo desarrollé así:


Pero se lo ve así:


Y como funciona con Visual Studio, al agregar un nuevo proyecto (claro, después de instalar el gizmox) te aparecerá la siguiente venanta:


Más Info, su Web Oficial: http://www.visualwebgui.com/

Pero como todo, tiene sus ventajas y desventajas. Lo que me agrada es que te ahorra tiempo en el diseño de los formularios. Como que más te dedicás al código de programación y cero diseño. Oh vaya! Me acabo de dar cuenta. Con esto, ya no necesitaríamos contratar un Web Designer jajajajajajaj

Monday, November 21, 2011

Cómo cargar Un treeview windows form

Treeview. There is no treenode value property. VB.NET (System.Windows.Forms)

No es cierto que cuando poblamos un treeview de ASP.NET, utilizamos las propiedades Node.Text y Node.Value El text es lo que se muestra y el value es para trabajar por abajo, mas que todo para los queries es útil.

Pero resulta que el TreeView de los Controles Windows no tiene esa propiedad. Y si queremos hacer un insert a una x tabla a partir del treeview, estariamos en un conflicto.

Yo suelo utilizar la famosa property "tag". Esta propiedad recibe un objeto. Yo la trabajo así:

Public Sub proCargarArbol()
        Dim idServicio As Integer = Me.lsvServicios.SelectedItem.Text
        Dim objRutas As New clsTarifaServicio
        Dim dtServicio2 As DataTable = objRutas.getServicio2
        TreeView1.BeginUpdate()
        TreeView1.Nodes.Clear()
        Dim index As Integer = 0
        For Each dr As DataRow In dtServicio2.Rows
            Dim NewNode As New TreeNode
            NewNode.Text = dr(1).ToString
            NewNode.Tag = dr
            Me.TreeView1.Nodes.Add(NewNode)
            Dim dtRutas As DataTable = objRutas.getRutas(idServicio, dr(0))
            For Each row As DataRow In dtRutas.Rows
                Dim NewNodeSon As New TreeNode
                NewNodeSon.Text = row(2).ToString + " - " + row(4).ToString
                NewNodeSon.Tag = row
                Me.TreeView1.Nodes(index).Nodes.Add(NewNodeSon)
            Next
            index = index + 1
        Next
        TreeView1.EndUpdate()
    End Sub

Checkan? Al tag le estoy mandando una fila con los datos importantes de ese item que lo cargué en el árbol. Y bueno, cuando necesiten extraer esa info, solo le hacen un for each al árbol, se crean un datarow y se lo asigan el tag.

HaPPy Coding =)

Friday, November 18, 2011

Habilitar menú programador excel 2010

Para habilitar el menú programador en Excel 2010



Clic en Archivo que está situado en la parte izquierda superior de la ventana, luego clic en Opciones.


Se te abrirá la siguiente ventana.


Clic en Personalizar cinta de opciones, y en la parte derecha debajo de Fichas principales, tickea la opción Programador y clic en Aceptar. Listo!

Thursday, November 17, 2011

Cargar Un dropdownlist Con Un archivo XML

Si alguna vez quisieras cargar un combo como fuente de datos una hoja XML, hacerlo es sencillo.

Primero, te creas tu archivo XML. En un proyecto WEB, los archivos XML y otros de datos, se guardan en el directorio App_Data. Tal como se muestra en la siguiente imagen, te agregas un archivo XML.


Luego, empezas a editarlo, en este caso para el ejemplo voy a cargar un combo con una lista de países.


En el aspx de tu página, te jalas un control DropDownList y empezas a editarlo.



        


Checka que tiene un DataSourceID, para ello, te jalas un XmlDataSource y lo editas, que quede así:



El ID que le pongas al XmlDataSource se lo pasas al DropDownList a su atributo DataSourceID.

Luego ejecutas tu proyecto, y directamente verás tu combo cargado.

Si no querés que por defecto se cargue, entonces no uses el XmlDataSource. Hazlo por código. Así:


Public Sub prcCargarComboPaises()
        Dim ds As New DataSet
        ds.ReadXml(Server.MapPath("~/App_Data/Paises.xml"))
        Me.DropDownList2.DataSource = ds
        Me.DropDownList2.DataValueField = "abbrev"
        Me.DropDownList2.DataTextField = "name"
        Me.DropDownList2.DataBind()
    End Sub

Para bindear un GridView con un archivo XML es casi lo mismo! Checka:

Public Sub prcCargarGridViewPaises()
        Dim ds As New DataSet
        ds.ReadXml(Server.MapPath("~/App_Data/Paises.xml"))
        grvPaises.DataSource = ds
        grvPaises.DataBind()
    End Sub

HaPPy CoDiNg =)

Thursday, November 10, 2011

Iniciando con Log4net

En el software development, el escribir una bitácora de todo lo que pasa en el sistema es una buena práctica. ¿Por qué? Porque podrían ocurrir errores no controlados que son difíciles de rastrear. Por ello, atrapar el error y registrar lo que sucedió es una info muy preciada más todavía cuando ya se está en entorno de producción.

Log4net nos brinda esa solución.

Log4Net es un framework portado de la librería log4java, el cual te ofrece todas las herramientas posibles para poder hacer un logging, control de errores, monitorización de aplicaciones para todas tus aplicaciones posibles. Log4net es un producto gratuito ofrecido por Apache. http://logging.apache.org/log4net/index.html

LEVELS

Log4NET ofrece distintos niveles de monitorización predefinidos como son:

1. Debug: Se utiliza para líneas de debug.
2. Info: Se utiliza para dar información relativa de nuestra aplicación.
3. Warn: Son posibles puntos de ruptura de nuestro software: posibles alertas importantes.
4. Error: Se utiliza para detectar errores de nuestro software.
5. Fatal: Se utiliza para detectar posibles errores importantes de software, es decir, que impidan el funcionamiento del mismo por ejemplo.

APPENDERS

Es el modo en que los distintos niveles del log4net van a ser monitorizados/logeados, en log4net existen estos entre otros:

1. FileAppender: Logea el nivel definido en la configuración en fichero.
2. RollingFileAppender: Logea el nivel definido en la configuración en un fichero que va rotando dependiendo de su peso.
3. SmtpAppender: Logea el nivel definido en la configuracion y es enviado a un destinatario de correo.
4. ConsoleAppender: Usualmente es para testing pero funciona también en production. Escribe en el output window o en el command window si estás usando console application.
5. AdoNetAppender.

Para poner en marcha Log4net en tu aplicación necesitamos 3 elementos básicamente: la Configuración, el Setup y el Call.

Un Ejemplo Básico

Primero, debés bajarte la DLL de log4net. La podés bajar desde aqui
http://www.4shared.com/file/C37E3-aG/log4net.html

Contraseña: princesita

Luego lo agregas a tu proyecto.

Ahora, necesitamos configurar el web.config (app.config si tu aplicación es windows) Una configuración con lo suficiente sería la siguiente:



Como appender, estoy utilizando el RollingFileAppender. Creo que es el preferido.
En la etiqueta File debes colocar dónde se guardará el log.
conversionpattern es cómo se escribirá el texto del log, es decir, el formato.

En la clase donde utilizarás el logger, debes crearte un objeto de tipo ILog. Construirlo y empezar a llamarlo desde los lugares que desees. Checka el ejemplo, dentro de la función que me ejecuta un Select, voy a llamar al logger para registrar un ERROR. A propósito, le envío un SELECT con error para que se pueda registrar en el log.

Imports System.Data.SqlClient
Imports System.Text
Imports System.Configuration
Imports log4net

Public Class clsDataBase
Private strConn As String
Private log As ILog

Public Sub New()
strConn = ConfigurationManager.ConnectionStrings("CadenaDeConexion").ConnectionString
log = LogManager.GetLogger("lmendivil")
log4net.Config.XmlConfigurator.Configure()
End Sub

Public Function fncConsultar(ByVal strSQL As String) As DataTable
Dim objConn As New SqlConnection(strConn)
Dim objComm As New SqlCommand(strSQL, objConn)
Dim objAdap As New SqlDataAdapter(objComm)
Dim ds As New DataSet
Try
objConn.Open()
objAdap.Fill(ds)
Return ds.Tables(0)
Catch ex As Exception
log.Error(Me.getErrorSQL(strSQL), ex)
Throw New Exception(ex.Message)
Finally
objConn.Close()
End Try

End Function

Public Function getErrorSQL(ByVal sql As String) As String
Dim strErrorSQL As New stringbuilder
strErrorSQL.AppendFormat("SQL: {0}", sql)
strErrorSQL.AppendLine()
Return strErrorSQL.ToString
End Function
End Class


Así es como se puede leer en el archivo bitacora.log


La línea roja que pinté está mostrando el FORMATO que previamente configuré en el web.config dentro de la etiqueta "conversionpattern", lo recuerdas? Checka que estoy mostrando:
LA FECHA, LA HORA, EL LEVEL, EL LOGGER, EL MÉTODO DESDE DONDE SE HACE EL LLAMADO, Y EL MENSAJSE

HaPPy LoGGinG =)

Tuesday, November 8, 2011

List Of a datatable

Cómo convertir una lista genérica de objetos a una datatable. vb.NET. ASP.NET

Lo cierto es que este tema me ha interesado, aquí te va un poco más de Reflection. Por si alguna vez precisas realizar una conversión de un List Of Tu Clase a un DataTable.

Nota.- La clase a utilizar en este ejemplo, es la clase Persona, la misma que se utilizó en el post anterior.

Primero, agrego mis objetos de tipo Persona a mi List Of. Luego que la lista está llenada, la traspaso a un datatable. Recorro las propiedades de mi clase para que los nombres de éstas sean los nombres de las columnas del datatable. Acto seguido, por cada ítem de la lista, recorro cada propiedad para agregar cada valor como fila del datatable. Bueno, lo demás ya es obvio.

Imports System.Collections.Generic
Imports System.Data
Imports System.Reflection
Imports ClassLibrary3

Partial Class _Default
    Inherits System.Web.UI.Page


    Private lstPersonas As New List(Of clsPersona)

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.prcCrearPersona()
        Dim dt As DataTable = ConvertToDataTable(lstPersonas)
    End Sub

    Private objPersona As clsPersona

    Public Sub prcCrearPersona()
        For i As Integer = 0 To 4
            objPersona = New clsPersona
            objPersona.pNombre = "Lizzy" & i
            objPersona.pApellido = "Mendivil" & i
            Me.lstPersonas.Add(objPersona)
        Next
    End Sub

    Public Shared Function ConvertToDataTable(Of T)(ByVal list As IList(Of T)) As DataTable
        Dim dt As New DataTable()
        Dim propiedades As PropertyInfo() = GetType(T).GetProperties
        For Each p As PropertyInfo In propiedades
            dt.Columns.Add(p.Name, p.PropertyType)
        Next
        For Each item As T In list
            Dim row As DataRow = dt.NewRow
            For Each p As PropertyInfo In propiedades
                row(p.Name) = p.GetValue(item, Nothing)
            Next
            dt.Rows.Add(row)
        Next
        Return dt
    End Function

End Class


Como resultado, tendrías que tener una vista similar a esta: (claro, según tu clase)


HaPPy Coding =)

Monday, November 7, 2011

System.reflection


Qué es Reflection? Para qué sirve? En qué me es útil? Cuándo usar? Bueno, si te has hecho estas preguntas vas bien, yo también me las hice, jejeje.

Empezemos por la definición:

Reflection proporciona objetos (de tipo Type) que encapsulan ensamblados, módulos y tipos. Se puede utilizar la reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo a partir de un objeto existente, e invocar sus métodos o tener acceso a sus campos y propiedades.

Reflection es una “tecnica” para poder extraer la metadata de nuestras estructuras de datos dentro de una assembly.

Reflection es la habilidad que tiene un código para revisar su propia estructura, es decir, podemos revisar la metadata que está en el assembly y manipularla a nuestro antojo.

Utilidades

Nos ayuda a consultar qué propiedades o métodos tiene un objeto en TIEMPO DE EJECUCIÓN.

Podemos diseñar un formulario dinámicamente.

Empezando a utilizar Reflection. HowTo

Hay dos formas: usando typeof() o GetType(). Ambas formas retornan un objeto tipo Type, ese es el que nos otorga a información que queremos.

Entre los principales métodos de Type están:

GetField() Obtiene el campo según el nombre.

GetMethod() Obtiene un método, y si éste tiene sobre cargas, al igual que el constructor, hay que pasarle el tipo correspondiente de la sobre carga.

GetProperty() Obtiene la propiedad según el nombre.

Nota: aparte de los métodos anteriores existen los mismos en plural, es decir que en vez de obtener un miembro, obtienes un arreglo con los resultados según los parámetros que le indiques. Ejm: GetProperty() tienes: GetProperties() el cual puedes llamar sin parámetros para obtener un PropertyInfo[] con todas las propiedades.

Let's do it. Ejemplo.

A continuación un ejemplo para fines académicos, dada una clase persona, usando reflection asignaré valores a sus propiedades. Primero lleno un diccionario cuya Key es el nombre de la propiedad de la clase y su Value obviamente el nombre que le quiero asignar a esa propiedad. Luego, recorro el diccionario para extraer sus propiedades y asignarles  un valor.

Imports System.Reflection
Imports System.Collections.Generic

Module Module1
    Sub Main()
        Dim atributosPersona As New Dictionary(Of String, String)
        atributosPersona.Add("pNombre", "Lizzy")
        atributosPersona.Add("pApellido", "Mendivil")

        Dim p As New clsPersona
        For Each atributo In atributosPersona
            Dim pf As PropertyInfo = p.GetType.GetProperty(atributo.Key)
            pf.SetValue(p, atributo.Value, Nothing)
        Next

        Console.WriteLine("Nombre: {0}", p.pNombre)
        Console.WriteLine("Apelllido: {0}", p.pApellido)
    End Sub

    Public Class clsPersona
        Private strNombre As String
        Private strApellido As String

        Public Property pNombre() As String
            Get
                Return strNombre
            End Get
            Set(ByVal value As String)
                strNombre = value
            End Set
        End Property

        Public Property pApellido() As String
            Get
                Return strApellido
            End Get
            Set(ByVal value As String)
                strApellido = value
            End Set
        End Property
    End Class
End Module

HaPPy Coding =)

Sunday, November 6, 2011

Web site vs web application

Si sos desarrollador .NET verás que tenés 2 opciones para crear proyectos web. Te has preguntado alguna vez cuál de los dos usarás? O... si hay 2 opciones, cuál es la mejor?

Veamos las diferencias que saltan a primera vista. Cheka la imagen siguiente:




Para empezar, el Web Site se agrega directamente con clic derecho sobre la solución. En cambio el Web Application hay que agregarlo desde la ventana dialog tal como se agrega un Class Library por ejemplo.

1.-

En Web Site, el código de diseño de la página se esconde completamente al desarrollador y se genera dinámicamente en tiempo de compilación.

En Web Application ese código está disponible y se llama igual que la página agregándose lo siguiente "designer.vb" (tal como lo podés ver en la imagen)

(A mi parecer esto está por demás ya que de nada sirve que lo tengás visible pues no vas a programar nada allí, es más, ni deberías tocarlo)

2.-

En los proyectos Web Site al precompilar la aplicación se genera una DLL por cada página o control de la aplicación, las cuales van dentro del directorio Bin.

En los proyectos de tipo Web Application se genera una única DLL que contiene el código completo de la aplicación, la cual se debe cargar en memoria sea necesario todo el código o no.

3.-

En Web Site podés editar el código de tus webforms en tiempo de ejecución.

Mientras que en los Web Applicacion esta opción no está habilitada. Tendrías que parar la ejecución, editar, y volver a ejecutar. o_O Esto realmente no me agrada (pero uno se acostumbra jejeje)

4.-

En Web Site no podés agregar una Class.vb en cualquier parte, sólo es posible dentro de la carpeta App_Data

En Web Application podés agregar una Class.vb en cualquier parte. Sin embargo esta opción no es de la gran importancia ya que quien es ordenado no agrega sus clases en "cualquier parte".

5.-

Cuando le das clic derecho sobre tu proyecto Sitio Web, no encontrás la opción "Properties" o "Propiedades"

Sin embargo, en los proyectos tipo Web Application sí tenemos esa opción. Esto llega a ser una gran ventaja ya que se tiene mayor control sobre su configuración.

En este link (en inglés) encontrás una ayuda de cuándo usar web site y cuándo web application.

En la Web encontrarás muchas más diferencias y más consejos a la hora de cuál de las dos opciones elegir.

Have a good choice! =)

Monday, October 17, 2011

Baterias. Notebooks. No cargar mientras se esta trabajando

La pregunta del mishón, al menos para mi. La verdad que yo creía que no había problema alguno en conectar la portátil a la corriente mientras se la está usando. De hecho, casi siempre lo hago/lo hice. De agora en adelante sha no (hasta que mi hna. me dijo que su batería se había dañado por nada más y x eso decidí buscar más info en la web). Cheken por qué.

No conviene utilizar la notebook mientras la batería se está cargando. ¿Por qué? Las baterías de litio ion son enemigas del calor. Durante la carga se produce temperatura, la cual se incrementa además al estar utilizando el equipo. Entonces, mejor, cargarla y usarla, por separado.

Las fabricantes recomiendan quitar la batería si el usuario no va a utilizar el equipo durante un tiempo. En este caso, la carga de la pila conviene que esté cerca del 40% ya que las baterías de litio ion tampoco son amigas de quedarse en cero.

Aquí te van algunos buenos consejos para alargar el tiempo a la batería de tu notebook:

1- Apague las transmisiones inalámbricas: los infrarrojos (IrDA), Bluetooth y Wi-Fi son verdaderos vampiros de la electricidad, siendo equivalentes a mantener un celular en uso todo el tiempo. Apaga estas funciones cuando no sean necesarias.

2- Evite usar la unidad de CD o DVD: el gasto no sólo corre por cuenta del láser, sino también del motor que hace girar el disco. Y mejor ni hablar de las grabadoras.

3- Reduzca el brillo de la pantalla: algunos equipos lo hacen en forma automática ya que entre menos luz generen, menos energía demandarán.

4- Retire tarjetas de memoria o llaves USB: no deje que sus dimensiones reducidas lo engañen, pues energizarlas requiere un flujo adicional de electricidad. Esto es especialmente válido para dispositivos pequeños, como teléfonos o PDAs.

5- Evite usar aplicaciones de audio: aún con auriculares, la generación de sonido requiere un gasto constante de energía. Peor todavía si se alimentan parlantes externos.

Fuente: http://www.sobrenotebooks.com.ar

Saturday, October 15, 2011

Microsoft outlook 2010: poner firma

Cómo colocarle o poner firma a tu correo en Microsoft Outlook 2010.

Primero debes darle clic sobre la barra del menú principal en NUEVO MENSAJE DE CORREO ELECTRÓNICO.


Luego, en la ventana que se te abrió, dale clic sobre la barra del menú en FIRMA.


En seguida se te abrirá una ventanita que se llama FIRMAS Y PLANTILLA. Le das clic en NUEVA y te levantara un popup en el cual debes colocarle el nombre distintivo que se llamara tu firma (Recuerda que podes tener mas de una). En el recuadro EDITAR FIRMA, escribe tu firma y formateala. En la parte derecha superior hay tres combos en el cual debes elegir tu correo electrónico asociado a la firma, y que firma asociaras para los nuevos mensajes, para las respuestas y para los reenvios.


Cuando hayas terminado, le das clic en GUARDAR Y ACEPTAR. Pero si queres, en el tab siguiente que se llama DISENO DE FONDO PERSONAL, podes colocarle un tema o fuente. Mi tema favorito es el ECO y el HIELO.

Fácil, no?

Thursday, August 4, 2011

No visualizar Un subreporte / crystal reports

El ERP que estamos desarrollando actualmente en la empresa muestra sus reportes con la herramienta Crystal Reports (sin embargo, ya se tiene pensado empezar con Reporting Services 2008, mucho mejor, no?).

El punto es que el otro día yo necesitaba mostrar un subreporte pero qué pasaba si la consulta que me carga el subreporte tenía cero datos? En ese caso me mostraba el header pero en el body no había nada así que se veía muy feo. Por lo tanto, se tenía que validar para el caso que cuando no hayan datos, que ni se mande el subreporte.

A continuación les dejo en imágenes cómo hacerlo.

Primero, fíjense que mi subreporte (la parte marcada con un óvalo) esta en una sección, en la Section4.


En el código, es necesario saber la Section ya que con eso es que procedemos a ocultarlo. Lo demás la imagen lo explica sola.

Happy Coding! =)

Thursday, July 28, 2011

Loading generadores

A veces es necesario colocar en nuestras aplicaciones web un control en el que muestre a nuestro usuario de que una tarea se está procesando. Que el usuario sepa lo que está pasando.


A continuación te paso algunos links de aplicaciones que generan un gif:

Esta es la típica, creo que todos la conocen. No bonita para mi estilo: http://ajaxload.info/

Esta me gusta mucho: http://www.chimply.com
Mis favoritas son estas:




Bonitas pero cuando se las genera como que pierde el estilo inicial: http://www.loadinfo.net/

Otras: http://mentalized.net/activity-indicators/

Tuesday, July 26, 2011

Distinct en datatable

.NET VB.NET

Cuando le hacemos un select o un compute a un datatable, no tenemos la opción de hacerle un "distintc". Pero existe otra manera, utilizando Linq.

A continuación les dejo un ejemplo sencillo. Le hace un distinct a una columna y el resultado se lo inserta a un List Of.

Dim lstMonedas As New List(Of Integer)

 Dim monedas = From prod In ds.Tables(0) _
                       Select prod.Item("cfMoneNcod") _
                       Distinct


 For Each m In monedas
     lstMonedas.Add(m)
 Next

Monday, June 20, 2011

Truncate Vs delete

Anoche mientras estaba estudiando algo de programación y base de datos vi algo que no estoy acostumbrada a ver: "Truncate table my_table" y me dije... ¿truncate? ¿cuál es la diferencia entre esto y el Delete from my_table?

No me quedé con las dudas y ahora lo sé todo =) jejeje. Aquí les va algo que encontré en la web.

Truncate

Este comando remueve todas las filas de una tabla sin registrar las eliminaciones individuales en el log de transacciones. Prácticamente hace lo mismo que DELETE sin modificar o borrar la estructura de la tabla, sin embargo no se puede utilizar la clausula WHERE. TRUNCATE no permite filtrar por filas, elimina todos los registros de una tabla.

Delete

DELETE también remueve las filas de una tabla, pero registra las eliminaciones individuales en el log de transacciones. Podemos utilizar la clausula WHERE para filtrar las filas que necesitemos eliminar.

Diferencias y Semejanzas

1. TRUNCATE es un comando DDL (Lenguaje de definición de datos) mientras que DELETE es un DML (lenguajde de manipulación de datos)

2. Tanto TRUNCATE como DELETE eliminan los datos, no la estructura.

3. Solo DELETE permite la eliminación condicional de los registros.

4. TRUNCATE es mucho más rápdo que DELETE. (Esto es por el hecho de que TRUNCATE remueve los datos directamente sin hacer una copia dentro del Rollback Tablespace tal como lo hace el DELETE)

5. No se puede hacer un Rollback en TRUNCATE pero en Delete se puede.

6. TRUNCATE resetea el High Water Mark para la tabla y dealoca el espacio mientras que el DELETE no lo hace.

7. TRUNCATE no dispara Triggers asociados a la tabla.

8. DELETE es una operación registrada en el log de transacciones, basada en registrar cada eliminación individual.

9. Solo TRUNCATE reinicia el contador para una tabla que contenga una columna IDENTITY.

10. DELETE de tablas grandes genera una importante cantidad de UNDO y REDO.

11. TRUNCATE invalida cualquier cursor referenciado a la tabla.

Entre otras...

Mi sugerencia es que si tenés que eliminar todos los registros de una tabla for ever y no volver a saber never ever de ellos, deberías usar el TRUNCATE.

Thursday, June 9, 2011

Traductor A lenguaje hacker

Les comparto el programita que hice que traduce tu texto a lenguaje hacker /  L33T Leet 

51 3N713ND35 35745 P4|_48R45 Y4 54835 D3 |_0 QU3 3570Y H48|_4ND0 J3J3J3

El programa está en windows form/vb.net 2008

Tiene por el momento, tres estilos a formatear tu texto.

1. UnO. El QuE CoNvIeRtE A MiNúScUlAs Y MaYúScUlAs CoMo EsTe MiSmO TeXtO.

2. D05. QU3 35 4|_ |_3N6U4J3 H4C|<3R

A = "4"
B = "8"
E = "3"
G = "6"
H = "|-|"
I = "1"
K = "|<"
L = "|_"
M = "|\/|"
N = "|\|"
O = "0"
R = "|2"
S = "5"
T = "7"
U = "|_|"
V = "\/"
W = "\/\/"
Z = "2"

3. Tres. Cifrado + 5. El 5 es parametrizable. Consiste en la palabra que quieres cifrar, cada letra le sumas 5 segun el abecedario. Por ejemplo, mira mi nombre con cifrado + 5. Lizzy = QNEED. El abeceadrio es de USA. No entra la "ch, ll, ñ"






El link directo para la descarga del instalador (msi) es este:

http://www.megaupload.com/?d=3KQYDVSI

Otras sugerencias, me las hacen conocer.

Tuesday, June 7, 2011

Diseñador web Vs desarrollador web

Web Designer vs Web Developer
¿Cuáles son las diferencias?

El diseñador web se ocupa del "front-end", es decir, del aspecto estético del sitio, lo visual. Mientras que el desarrollador (programador) web se encarga del "back-end", de la parte que no se ve, del código.

Un diseñador web entiende sobre los colores, fuentes, imágenes. Hará que el sitio sea llamativo para el público a quien va dirigido. Ese sitio se comprará tan solo mirandose. Provocará dejar buenos comentarios.
El diseñador web se vale de programas como Adobe Photoshop, Dreamweaver. Sabe de HTML, CSS y tal vez de JavaScript. Mucha imaginación y creatividad.

Por otro lado, el desarrollador web se preocupa de la codificación, de hacer que el sitio sea seguro. Las herramientas que utiliza son tales como PHP, ASP.NET, Java, Javascripts, MySQL, SQL Server

Analógicamente se puede decir que el "arquitecto" es el diseñador web y el "constructor" es el desarrollador web.

Está claro que una misma persona puede hacer los dos trabajos. Pero en la especialidad, está la perfección.

¿Qué área te gusta más?

Friday, June 3, 2011

Scripts insert De paises

No necesita más explicación/presentación.

Aquí les dejo el INSERT de todos los países.

A veces resulta muy últil.
CREATE TABLE pais(
 paisNcod INT NOT NULL PRIMARY KEY,
 paisNmbr VARCHAR(50) NOT NULL
)

INSERT INTO pais VALUES (1, 'Afganistán');
INSERT INTO pais VALUES (2, 'Islas Gland');
INSERT INTO pais VALUES (3, 'Albania');
INSERT INTO pais VALUES (4, 'Alemania');
INSERT INTO pais VALUES (5, 'Andorra');
INSERT INTO pais VALUES (6, 'Angola');
INSERT INTO pais VALUES (7, 'Anguilla');
INSERT INTO pais VALUES (8, 'Antártida');
INSERT INTO pais VALUES (9, 'Antigua y Barbuda');
INSERT INTO pais VALUES (10, 'Antillas Holandesas');
INSERT INTO pais VALUES (11, 'Arabia Saudí');
INSERT INTO pais VALUES (12, 'Argelia');
INSERT INTO pais VALUES (13, 'Argentina');
INSERT INTO pais VALUES (14, 'Armenia');
INSERT INTO pais VALUES (15, 'Aruba');
INSERT INTO pais VALUES (16, 'Australia');
INSERT INTO pais VALUES (17, 'Austria');
INSERT INTO pais VALUES (18, 'Azerbaiyán');
INSERT INTO pais VALUES (19, 'Bahamas');
INSERT INTO pais VALUES (20, 'Bahréin');
INSERT INTO pais VALUES (21, 'Bangladesh');
INSERT INTO pais VALUES (22, 'Barbados');
INSERT INTO pais VALUES (23, 'Bielorrusia');
INSERT INTO pais VALUES (24, 'Bélgica');
INSERT INTO pais VALUES (25, 'Belice');
INSERT INTO pais VALUES (26, 'Benin');
INSERT INTO pais VALUES (27, 'Bermudas');
INSERT INTO pais VALUES (28, 'Bhután');
INSERT INTO pais VALUES (29, 'Bolivia');
INSERT INTO pais VALUES (30, 'Bosnia y Herzegovina');
INSERT INTO pais VALUES (31, 'Botsuana');
INSERT INTO pais VALUES (32, 'Isla Bouvet');
INSERT INTO pais VALUES (33, 'Brasil');
INSERT INTO pais VALUES (34, 'Brunéi');
INSERT INTO pais VALUES (35, 'Bulgaria');
INSERT INTO pais VALUES (36, 'Burkina Faso');
INSERT INTO pais VALUES (37, 'Burundi');
INSERT INTO pais VALUES (38, 'Cabo Verde');
INSERT INTO pais VALUES (39, 'Islas Caimán');
INSERT INTO pais VALUES (40, 'Camboya');
INSERT INTO pais VALUES (41, 'Camerún');
INSERT INTO pais VALUES (42, 'Canadá');
INSERT INTO pais VALUES (43, 'República Centroafricana');
INSERT INTO pais VALUES (44, 'Chad');
INSERT INTO pais VALUES (45, 'República Checa');
INSERT INTO pais VALUES (46, 'Chile');
INSERT INTO pais VALUES (47, 'China');
INSERT INTO pais VALUES (48, 'Chipre');
INSERT INTO pais VALUES (49, 'Isla de Navidad');
INSERT INTO pais VALUES (50, 'Ciudad del Vaticano');
INSERT INTO pais VALUES (51, 'Islas Cocos');
INSERT INTO pais VALUES (52, 'Colombia');
INSERT INTO pais VALUES (53, 'Comoras');
INSERT INTO pais VALUES (54, 'República Democrática del Congo');
INSERT INTO pais VALUES (55, 'Congo');
INSERT INTO pais VALUES (56, 'Islas Cook');
INSERT INTO pais VALUES (57, 'Corea del Norte');
INSERT INTO pais VALUES (58, 'Corea del Sur');
INSERT INTO pais VALUES (59, 'Costa de Marfil');
INSERT INTO pais VALUES (60, 'Costa Rica');
INSERT INTO pais VALUES (61, 'Croacia');
INSERT INTO pais VALUES (62, 'Cuba');
INSERT INTO pais VALUES (63, 'Dinamarca');
INSERT INTO pais VALUES (64, 'Dominica');
INSERT INTO pais VALUES (65, 'República Dominicana');
INSERT INTO pais VALUES (66, 'Ecuador');
INSERT INTO pais VALUES (67, 'Egipto');
INSERT INTO pais VALUES (68, 'El Salvador');
INSERT INTO pais VALUES (69, 'Emiratos Árabes Unidos');
INSERT INTO pais VALUES (70, 'Eritrea');
INSERT INTO pais VALUES (71, 'Eslovaquia');
INSERT INTO pais VALUES (72, 'Eslovenia');
INSERT INTO pais VALUES (73, 'España');
INSERT INTO pais VALUES (74, 'Islas ultramarinas de Estados Unidos');
INSERT INTO pais VALUES (75, 'Estados Unidos');
INSERT INTO pais VALUES (76, 'Estonia');
INSERT INTO pais VALUES (77, 'Etiopía');
INSERT INTO pais VALUES (78, 'Islas Feroe');
INSERT INTO pais VALUES (79, 'Filipinas');
INSERT INTO pais VALUES (80, 'Finlandia');
INSERT INTO pais VALUES (81, 'Fiyi');
INSERT INTO pais VALUES (82, 'Francia');
INSERT INTO pais VALUES (83, 'Gabón');
INSERT INTO pais VALUES (84, 'Gambia');
INSERT INTO pais VALUES (85, 'Georgia');
INSERT INTO pais VALUES (86, 'Islas Georgias del Sur y Sandwich del Sur');
INSERT INTO pais VALUES (87, 'Ghana');
INSERT INTO pais VALUES (88, 'Gibraltar');
INSERT INTO pais VALUES (89, 'Granada');
INSERT INTO pais VALUES (90, 'Grecia');
INSERT INTO pais VALUES (91, 'Groenlandia');
INSERT INTO pais VALUES (92, 'Guadalupe');
INSERT INTO pais VALUES (93, 'Guam');
INSERT INTO pais VALUES (94, 'Guatemala');
INSERT INTO pais VALUES (95, 'Guayana Francesa');
INSERT INTO pais VALUES (96, 'Guinea');
INSERT INTO pais VALUES (97, 'Guinea Ecuatorial');
INSERT INTO pais VALUES (98, 'Guinea-Bissau');
INSERT INTO pais VALUES (99, 'Guyana');
INSERT INTO pais VALUES (100, 'Haití');
INSERT INTO pais VALUES (101, 'Islas Heard y McDonald');
INSERT INTO pais VALUES (102, 'Honduras');
INSERT INTO pais VALUES (103, 'Hong Kong');
INSERT INTO pais VALUES (104, 'Hungría');
INSERT INTO pais VALUES (105, 'India');
INSERT INTO pais VALUES (106, 'Indonesia');
INSERT INTO pais VALUES (107, 'Irán');
INSERT INTO pais VALUES (108, 'Iraq');
INSERT INTO pais VALUES (109, 'Irlanda');
INSERT INTO pais VALUES (110, 'Islandia');
INSERT INTO pais VALUES (111, 'Israel');
INSERT INTO pais VALUES (112, 'Italia');
INSERT INTO pais VALUES (113, 'Jamaica');
INSERT INTO pais VALUES (114, 'Japón');
INSERT INTO pais VALUES (115, 'Jordania');
INSERT INTO pais VALUES (116, 'Kazajstán');
INSERT INTO pais VALUES (117, 'Kenia');
INSERT INTO pais VALUES (118, 'Kirguistán');
INSERT INTO pais VALUES (119, 'Kiribati');
INSERT INTO pais VALUES (120, 'Kuwait');
INSERT INTO pais VALUES (121, 'Laos');
INSERT INTO pais VALUES (122, 'Lesotho');
INSERT INTO pais VALUES (123, 'Letonia');
INSERT INTO pais VALUES (124, 'Líbano');
INSERT INTO pais VALUES (125, 'Liberia');
INSERT INTO pais VALUES (126, 'Libia');
INSERT INTO pais VALUES (127, 'Liechtenstein');
INSERT INTO pais VALUES (128, 'Lituania');
INSERT INTO pais VALUES (129, 'Luxemburgo');
INSERT INTO pais VALUES (130, 'Macao');
INSERT INTO pais VALUES (131, 'ARY Macedonia');
INSERT INTO pais VALUES (132, 'Madagascar');
INSERT INTO pais VALUES (133, 'Malasia');
INSERT INTO pais VALUES (134, 'Malawi');
INSERT INTO pais VALUES (135, 'Maldivas');
INSERT INTO pais VALUES (136, 'Malí');
INSERT INTO pais VALUES (137, 'Malta');
INSERT INTO pais VALUES (138, 'Islas Malvinas');
INSERT INTO pais VALUES (139, 'Islas Marianas del Norte');
INSERT INTO pais VALUES (140, 'Marruecos');
INSERT INTO pais VALUES (141, 'Islas Marshall');
INSERT INTO pais VALUES (142, 'Martinica');
INSERT INTO pais VALUES (143, 'Mauricio');
INSERT INTO pais VALUES (144, 'Mauritania');
INSERT INTO pais VALUES (145, 'Mayotte');
INSERT INTO pais VALUES (146, 'México');
INSERT INTO pais VALUES (147, 'Micronesia');
INSERT INTO pais VALUES (148, 'Moldavia');
INSERT INTO pais VALUES (149, 'Mónaco');
INSERT INTO pais VALUES (150, 'Mongolia');
INSERT INTO pais VALUES (151, 'Montserrat');
INSERT INTO pais VALUES (152, 'Mozambique');
INSERT INTO pais VALUES (153, 'Myanmar');
INSERT INTO pais VALUES (154, 'Namibia');
INSERT INTO pais VALUES (155, 'Nauru');
INSERT INTO pais VALUES (156, 'Nepal');
INSERT INTO pais VALUES (157, 'Nicaragua');
INSERT INTO pais VALUES (158, 'Níger');
INSERT INTO pais VALUES (159, 'Nigeria');
INSERT INTO pais VALUES (160, 'Niue');
INSERT INTO pais VALUES (161, 'Isla Norfolk');
INSERT INTO pais VALUES (162, 'Noruega');
INSERT INTO pais VALUES (163, 'Nueva Caledonia');
INSERT INTO pais VALUES (164, 'Nueva Zelanda');
INSERT INTO pais VALUES (165, 'Omán');
INSERT INTO pais VALUES (166, 'Países Bajos');
INSERT INTO pais VALUES (167, 'Pakistán');
INSERT INTO pais VALUES (168, 'Palau');
INSERT INTO pais VALUES (169, 'Palestina');
INSERT INTO pais VALUES (170, 'Panamá');
INSERT INTO pais VALUES (171, 'Papúa Nueva Guinea');
INSERT INTO pais VALUES (172, 'Paraguay');
INSERT INTO pais VALUES (173, 'Perú');
INSERT INTO pais VALUES (174, 'Islas Pitcairn');
INSERT INTO pais VALUES (175, 'Polinesia Francesa');
INSERT INTO pais VALUES (176, 'Polonia');
INSERT INTO pais VALUES (177, 'Portugal');
INSERT INTO pais VALUES (178, 'Puerto Rico');
INSERT INTO pais VALUES (179, 'Qatar');
INSERT INTO pais VALUES (180, 'Reino Unido');
INSERT INTO pais VALUES (181, 'Reunión');
INSERT INTO pais VALUES (182, 'Ruanda');
INSERT INTO pais VALUES (183, 'Rumania');
INSERT INTO pais VALUES (184, 'Rusia');
INSERT INTO pais VALUES (185, 'Sahara Occidental');
INSERT INTO pais VALUES (186, 'Islas Salomón');
INSERT INTO pais VALUES (187, 'Samoa');
INSERT INTO pais VALUES (188, 'Samoa Americana');
INSERT INTO pais VALUES (189, 'San Cristóbal y Nevis');
INSERT INTO pais VALUES (190, 'San Marino');
INSERT INTO pais VALUES (191, 'San Pedro y Miquelón');
INSERT INTO pais VALUES (192, 'San Vicente y las Granadinas');
INSERT INTO pais VALUES (193, 'Santa Helena');
INSERT INTO pais VALUES (194, 'Santa Lucía');
INSERT INTO pais VALUES (195, 'Santo Tomé y Príncipe');
INSERT INTO pais VALUES (196, 'Senegal');
INSERT INTO pais VALUES (197, 'Serbia y Montenegro');
INSERT INTO pais VALUES (198, 'Seychelles');
INSERT INTO pais VALUES (199, 'Sierra Leona');
INSERT INTO pais VALUES (200, 'Singapur');
INSERT INTO pais VALUES (201, 'Siria');
INSERT INTO pais VALUES (202, 'Somalia');
INSERT INTO pais VALUES (203, 'Sri Lanka');
INSERT INTO pais VALUES (204, 'Suazilandia');
INSERT INTO pais VALUES (205, 'Sudáfrica');
INSERT INTO pais VALUES (206, 'Sudán');
INSERT INTO pais VALUES (207, 'Suecia');
INSERT INTO pais VALUES (208, 'Suiza');
INSERT INTO pais VALUES (209, 'Surinam');
INSERT INTO pais VALUES (210, 'Svalbard y Jan Mayen');
INSERT INTO pais VALUES (211, 'Tailandia');
INSERT INTO pais VALUES (212, 'Taiwán');
INSERT INTO pais VALUES (213, 'Tanzania');
INSERT INTO pais VALUES (214, 'Tayikistán');
INSERT INTO pais VALUES (215, 'Territorio Británico del Océano Índico');
INSERT INTO pais VALUES (216, 'Territorios Australes Franceses');
INSERT INTO pais VALUES (217, 'Timor Oriental');
INSERT INTO pais VALUES (218, 'Togo');
INSERT INTO pais VALUES (219, 'Tokelau');
INSERT INTO pais VALUES (220, 'Tonga');
INSERT INTO pais VALUES (221, 'Trinidad y Tobago');
INSERT INTO pais VALUES (222, 'Túnez');
INSERT INTO pais VALUES (223, 'Islas Turcas y Caicos');
INSERT INTO pais VALUES (224, 'Turkmenistán');
INSERT INTO pais VALUES (225, 'Turquía');
INSERT INTO pais VALUES (226, 'Tuvalu');
INSERT INTO pais VALUES (227, 'Ucrania');
INSERT INTO pais VALUES (228, 'Uganda');
INSERT INTO pais VALUES (229, 'Uruguay');
INSERT INTO pais VALUES (230, 'Uzbekistán');
INSERT INTO pais VALUES (231, 'Vanuatu');
INSERT INTO pais VALUES (232, 'Venezuela');
INSERT INTO pais VALUES (233, 'Vietnam');
INSERT INTO pais VALUES (234, 'Islas Vírgenes Británicas');
INSERT INTO pais VALUES (235, 'Islas Vírgenes de los Estados Unidos');
INSERT INTO pais VALUES (236, 'Wallis y Futuna');
INSERT INTO pais VALUES (237, 'Yemen');
INSERT INTO pais VALUES (238, 'Yibuti');
INSERT INTO pais VALUES (239, 'Zambia');
INSERT INTO pais VALUES (240, 'Zimbabue');

Thursday, April 7, 2011

Programador como diseñador

Vaya! Ya me lo decia mi hermano... 'Querida Lizzy te aconsejo a que estudies Diseño Gráfico, Diseño Web todo lo que tenga que ver con Diseño. Desarrollador + Diseñador es una buena combinación. Hace falta.'

Digamos que todos sabemos que 'el que mucho aprieta, poco abarca'. Pero a mi me parece un consejo que hay que tomarlo como: 'Es necesario saber defenderse. Tener la noción.'

Casi siempre se ha dicho sobre el desarrollador como diseñador... ni hablar! No me resultó tan gracioso hasta que leí algo al respecto. Uhm y hasta pena me dio porque luego dicen que los usuarios son los tontos. o_O

Pero debo decir que yo, como mujer, no me sumo al 100% de ese cúmulo de programadores que asustan a los usuarios. Lo he vivido porque he trabajado con sistemas de que sí. Y yo al ponerme como usuario, los entiendo más!

Si bien, como diseñadora gráfica... (manejar Photoshop, FireWorks, Flash) estoy en pañales, en diseño de mis interfaces son detallista y cuidadosa. Vigilo mi ortografía, puntuación, redacción en los mensajes de usuario.

La siguiente es una imágen poco exagerada para ponerle humor al tema. (Espero que no haya quienes se den aludidos al caso, jajaja)


En este link, 7 SEÑALES QUE UNA INTERFAZ DE USUARIO FUE CREADA POR UN PROGRAMADOR (The 7 signs your UI was created by a programmer), muestra precisamente esas señales para hacernos entender que podemos mejorar con nuestro trabajo.

Si bien esto no está fuertemente conectado con el tema de diseño gráfico sino mas bien de cuidado e iniciativa propia, estudiar diseño nos puede ayudar a darnos pautas para que nuestro producto se "vea más bonito". Es cierto, la belleza es subjetiva pero al menos hay algo que se llama sentido común y órden.

Wednesday, April 6, 2011

Cómo validar una entrada De datos numérica

KeyWords: ASP.NET, VB.NET, Validar, Entrada de Datos

Cuando se manejan formularios, al momento de insertar los datos a una base de datos éstos deben coincidir con el tipo (cadena, entero, fecha, etc.) que estamos utilizando.

Como controles AJAX, hay un extender que se llama FilteredTextBoxExtender al cual podemos decirle qué tipo de entrada quiere para una caja de texto, incluso podemos customizarlo a nuestro agrado. Pero en el caso que se necesite sólo números (para este ejemplos nos centraremos en validar a INTEGER), el código .aspx sería así:







Cuando ejecutemos el proyecto, veremos que no nos permitirá typear letras ni otros caracteres a parte de números. Pero sí podremos typear lo siguiente: "111111111111111111111111111111111111111111111111"

Definitivamente eso nos daría una excepción. Para controlarla, yo utilizo el "TryParse" como en el siguiente código, en el CodeBehind:


Protected Sub btnValidar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnValidar.Click
If Me.txtEntrada.Text.Length > 0 Then
Dim i As Integer = 0
If Not Integer.TryParse(Me.txtEntrada.Text, i) Then
Me.lblMensaje.Text = "La entrada debe ser un valor numérico."
Else
Me.lblMensaje.Text = "Good!"
End If
End If
End Sub


=) HaPPy CoDiNg!

Tuesday, April 5, 2011

Cómo cargar Un combo / dropdownlist dentro De Un gridview

KeyWords: TemplateField, DropDownList en GridView

Para poder agregar un combo o dropdownlist dentro de un gridview, es necesario utilizar una columna templeteada (TempleateField).

El siguiente código en el archivo .aspx



 
    Prueba de Combo 
                                                            
     
                                                                
  
 
 


Dentro del evento del GridView llamado RowDataBound, el siguiente código


Protected Sub grvPrueba_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grvPrueba.RowDataBound
 Try
 If e.Row.RowType = DataControlRowType.DataRow Then
  Dim combo As DropDownList = DirectCast(e.Row.FindControl("cboComboPrueba"), DropDownList)
   combo.ClearSelection()
   If combo IsNot DBNull.Value Then
      Me.prcCargarComboGridView(combo)
   End If
  End If
 Catch ex As Exception
  Throw ex
 End Try
End Sub


El siguiente código es la función que hace cargar los datos al dropDonwList. Insertalo en cualquier lugar de tu CodeBehind:


Public Sub prcCargarComboGridView(ByVal cboCombo As DropDownList)
Dim objNegocio As New clsClaseNegocios
Dim dtDatosParaCargarElCombo As DataTable = objNegocio.fncGetDatos()
  cboCombo.DataSource = dtDatosParaCargarElCombo 
            cboCombo.DataTextField = "nombre"
            cboCombo.DataValueField = "codigo"
            cboCombo.DataBind()
    End Sub


Quedaría como se muestra en la siguiente imágen:




=) HaPPy CoDiNg!

Monday, April 4, 2011

Cómo cambiar el valor De una columna De Un gridview En tiempo De ejecución

KeyWords: ASP.NET, VB.NET, GRIDVIEW

Resulta que la consulta SQL que le bindeas a tu GridView tiene un campo byte que cada número significa algo. Por ejemplo. 0: Iniciado. 1: Vigente. 2:Cancelado. 3:Terminado, etc. Y lo cierto es que no quieres mostrar este dato como número sino como texto.

Te doy tres alternativas para una solución.

Solución 1

Utilizando una columna normal (BoundField), en el evento del GridView llamado "RowDataBound", y suponiendo que la columna a la que se quiere modificar sea la 0, insertas el siguiente código:

Protected Sub grvPrueba_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grvPrueba.RowDataBound
        Try
            
            If e.Row.RowType = DataControlRowType.DataRow Then 

                   Select Case e.Row.Cells(0).Text
                    Case 0
                        e.Row.Cells(0).Text = "Iniciado"
                    Case 1
                        e.Row.Cells(0).Text = "Vigente"
                    Case 2
                        e.Row.Cells(0).Text = "Cancelado"
                    Case 3
                        e.Row.Cells(0).Text = "Terminado"
                End Select


            End If
        Catch ex As Exception
            Throw ex
        Finally

        End Try
    End Sub

Solución 2

Utilizando una columna templeteada (TemplateField), le pones un label y llamas a una función en la cual le das el número y te devolverá el valor correspondiente.

El siguiente código, en el .aspx



fncGetEstado es la función
estado es el campo de base de datos, ese campo numérico en el se registran los estados en forma de número.

El siguiente código en el codeBihind

Public Function fncGetEstado(ByVal estado As Byte) As String

        Select Case estado
            Case 0
                Return "Iniciado"
            Case 1
                Return "Vigente"
            Case 2
                Return "Cancelado"
            Case 3
                Return "Terminado"

        End Select

    End Function

Solución 3

Otra posible solución sería que directamente hagas la modificación en tu consulta SQL y así cuando la bindees a tu GridView ya no tendrás que hacer nada. La consulta SQL sería así.

SELECT columna1, columna2, CASE columna3 WHEN 0 THEN 'Iniciado' WHEN 1 THEN 'Vigente' WHEN 2 THEN 'Cancelado' WHEN 3 THEN 'Terminado' AS estado
FROM tabla1

Ojo que ahora la columna ya no será "columna1", sino que en tu GridView debes enlanzarlo con "estado" la cual es la columna ya procesada.

=) HaPPy CoDiNg!

Wednesday, March 30, 2011

Cómo pasar Los datos De un gridview a Un datatable

ASP.NET, VB.NET

Se podría dar el caso de que las celdas de un GridView sean generadas o ingresadas por el usuario en tiempo de ejecución. Es decir, lo que se muestra en el GridView no son datos bindeados.

Para poder recuperar estos datos, no existe un método como tal. Por tanto, hay que programarlo.

Es sencillo, primero hay que crear la estructura del DataTable. Por ejemplo:

Public Sub prcCrearEstructuraDatatable()
        Dim dt As New DataTable
        dt.Columns.Add("inProdNcod")
        dt.Columns.Add("inProdCodg")
        dt.Columns.Add("vtLisDPrec")
        dt.Columns.Add("vtLisDDsct")
        dt.Columns.Add("vtLisDMoni")
        dt.Columns.Add("vtLisDMarg")
        dt.Columns.Add("vtLisMNcod")
        dt.Columns.Add("vtLisDNcod")
        Me.ViewState("dtDetalle") = dt
    End Sub


(Meto el DataTable dentro de un ViewState para luego poder manipular la tabla en cualquier momento)

Luego de haber cargado los datos al Gridview, los cuales se desea guardarlos, le hacemos un For Each y metemos en cada fila del DataTable lo que hay en cada celda del GridView, las celdas que deseemos. Para ello, recuperamos la estructura del DataTable la cual está en el ViewState. Y al final, hacemos el caso inverso, asignamos lo que hay en el DataTable ahora al ViewState (esto es para la manipulación posterior de los datos)

Public Function fncCargarDataTable(ByRef strMensaje As String) As Boolean
    Me.prcCrearEstructuraDatatable()
    Dim dt As DataTable = Me.ViewState("dtDetalle")
    If Me.grvListaDePrecios.Rows.Count > 0 Then
        For Each fila As GridViewRow In Me.grvListaDePrecios.Rows
            Dim f As DataRow = dt.NewRow()
            Dim txtDescuento As TextBox = DirectCast(fila.Cells(6).Controls(1), TextBox)

            f("inProdNcod") = DirectCast(fila.Cells(8).Controls(1), Label).Text
            f("inProdCodg") = fila.Cells(1).Text
            f("vtLisDPrec") = DirectCast(fila.Cells(4).Controls(1), TextBox).Text
            f("vtLisDDsct") = IIf(txtDescuento.Text = "", "0", txtDescuento.Text)
            If txtDescuento.Text = "" Then
                txtDescuento.Text = "0"
            End If
            f("vtLisDMoni") = DirectCast(fila.Cells(4).Controls(7), DropDownList).SelectedValue
            f("vtLisDMarg") = DirectCast(fila.Cells(5).Controls(1), Label).Text
            f("vtLisMNcod") = Me.ViewState("EstadoID")
            f("vtLisDNcod") = DirectCast(fila.Cells(9).Controls(1), Label).Text

            dt.Rows.Add(f)
        Next
        Me.ViewState("dtDetalle") = dt
    Else
        strMensaje = "Debe generar la lista de precios antes de guardarla."
        Return False
    End If
    Return True
End Function

=) HaPPy CoDiNg!

Monday, March 28, 2011

Como quitar Los ceros que genera el AVG de SQL

Me topé con el lio de que cuando ejecuto la siguiente consulta sql, en el resultado del AVERAGE o promedio, me agrega hasta 6 dígito después del punto. Si el resultado no tuviera decimales, le agrega en total 6 molestosos ceros.

SELECT p.inProdCodg, p.inProdDesc, AVG(a.inPxalCuni) AS COSTO
FROM dbo.inProd p INNER JOIN dbo.inPxAl a ON a.inProdNcod=p.inProdNcod
GROUP BY p.inProdCodg, p.inProdDesc

Una solución? Hacerle un CAST
El tipo de dato de la columna de la cual saco el promedio es DECIMAL(14,2)

Por tanto, la consulta sql quedaría así:

SELECT p.inProdCodg, p.inProdDesc, CAST(AVG(a.inPxalCuni) AS DECIMAL(14,2)) AS COSTO
FROM dbo.inProd p INNER JOIN dbo.inPxAl a ON a.inProdNcod=p.inProdNcod
GROUP BY p.inProdCodg, p.inProdDesc


=) Happy Coding!

Monday, March 21, 2011

Cómo obtener los textpath De Los nodos padres


TreeView, ASP.NET, VB.NET Selected Node Text Path

Un TreeNode tiene como propiedad el ValuePath, con esa propiedad se puede obtener la ruta de los valores dado un nodo hasta llegar al nodo raíz. Por ejemplo: ---> 0/1/2/3/4

Si, ahora, estás buscando cómo obtener la ruta del text... buscando un TextPath? No hay, qué raro. Si hay un ValuePath, por qué no hicieron un TextPath. En fin, como no hay, hay que hacerlo :P A mi me tocó hacerlo pues lo necesitaba para obtener algo asi como en la siguiente imágen:



Dado un nodo seleccionado, se obtiene la ruta de los text a partir de ahí hasta el nodo raíz. Tiene el formato: Parent - Child1 - Child11 - Child111 ... Si no le colocas el "-" Usará el separador que por defecto pone el lenguaje "/"

El código:


Protected Sub trvListaDePrecios_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles trvListaDePrecios.SelectedNodeChanged
        Dim nodo As TreeNode = Me.trvListaDePrecios.SelectedNode
        Dim strTextPath As String = nodo.Text
        Dim strSeparador As String = "-"
        Me.trvListaDePrecios.PathSeparator = CChar(strSeparador)
        While Not nodo.Parent Is Nothing
            strTextPath = nodo.Parent.Text & " " & Me.trvListaDePrecios.PathSeparator & " " & strTextPath
            nodo = nodo.Parent
        End While
        Dim strValuePath As String = Me.trvListaDePrecios.SelectedNode.ValuePath
        Me.prcCargarDatosPopUp(strValuePath, strTextPath.ToUpper())
    End Sub

HaPPy CoDiNg =)

Tuesday, March 15, 2011

Convert.ToInt32 vs CInt

Ambas sentencias devuelven el mismo valor:




Dim d1 As Double = 5.5
Dim i1 As Integer = Convert.ToInt32(d1)

Dim d2 As Double = 5.5
Dim i2 As Integer = CInt(d2)




Si estás usando Visual Basic .NET tal vez te has preguntado cuál es la diferencia de usar Convert.ToInt32 o CInt, o si es indiferente o cuándo usar lo uno y cuándo lo otro.

Microsoft recomienda usar CInt a utilizar el método de Convert.ToInt32 de .NET Framework ¿Por qué? Porque esta función se compila en línea, es decir, el código de conversión forma parte del código que evalúa la expresión. A veces no se produce una llamada a un procedimiento para realizar la conversión, lo que mejora el rendimiento.

Good Coding! =)

Monday, March 14, 2011

Como insertar registros De Una tabla a otra tabla

SQL SERVER

El caso más sencillo es cuando ambas tablas se encuentran dentro de la misma base de datos que pertenece a un mismo servidor.

INSERT INTO tabla_destino SELECT * FROM tabla_origen

La cantidad y tipo de datos de columnas deben coincidir tanto para la tabla origen como en la de destino (asímismo para los otros dos casos)

Ej:

INSERT INTO dbo.cfPrfl (cfEmprNcod,cfPrflNmbr) SELECT cfEmprNcod, dcPrsnNmbr FROM dcPrsn

Este es el caso medio, cuando se quiere insertar datos de una tabla a otra pero estas pertecenen a diferentes base de datos en un mismo servidor. En este caso, el usuario debe tener acceso a las dos base de datos.

INSERT INTO base_de_datos.dbo.tabla_destino SELECT * FROM base_de_datos.dbo.tabla_origen

Ej:


INSERT INTO UponERP.dbo.cfPais SELECT cfPaisNmbr FROM UponErpTestLizzy.dbo.cfPais

Y por último, este es el caso final. Cuando se desea insertar datos de una tabla a otra pero que ambas tablas están en diferentes base de datos y las cuales a su vez pertenecen a distintos servidor.

Para este caso, es necesario que el usuario tenga acceso a los dos servidores y a las dos base de datos

INSERT INTO servidor.base_de_datos.esquema.tabla_destino SELECT * FROM servidor.base_de_datos.esquema.tabla_origen

Ej:


INSERT INTO [DESARROLLO02\SQL2005].UponErpTestLizzy.dbo.cfBsAu SELECT * FROM [SRV-DB\SQL2005].UponErpTest.dbo.cfBsAu

Good Coding =)