Showing posts with label Programación. Show all posts
Showing posts with label Programación. Show all posts

Thursday, February 23, 2017

Case When Else - If Else

Tengo la siguiente programación en Crystal Reports la cual necesité que traducirlo a SQL. Una solución fue como sigue a continuación (3 casos diferentes):

1.


case vIngresoDiario.IdcFormaPago 
 when 6 then
  case when (vIngresoDiario.IdcTipoCuota <> 27 and vIngresoDiario.IdcTipoCuota <> 230) then
   vIngresoDiario.MontoDetalle 
  else 
      ((vIngresoDiario.MontoDetalle) / (( 
     round((vIngresoDiario.PrimaTotal)*100/((vIngresoDiario.PrimaPura)+(vIngresoDiario.Adicionales)+(vIngresoDiario.Impuestos))-100,0) 
     * 0.01) +1)) end
  
 when 7 then
  case when vIngresoDiario.IdcTipoCuota =230 then
   (vIngresoDiario.MontoDetalle) / (vIngresoDiario.Interes * 0.01) +1 
  else
   case when vIngresoDiario.TipoTransp = 5 then
     (vIngresoDiario.MontoDetalle) / (vIngresoDiario.InteresPlanPago * 0.01) +1
   else
     ((vIngresoDiario.MontoDetalle) / (( 
     round((vIngresoDiario.PrimaTotal)*100/((vIngresoDiario.PrimaPura)+(vIngresoDiario.Adicionales)+(vIngresoDiario.Impuestos))-100,0) 
     * 0.01) +1)) end end
 end as  'PRIMA CONTADO'

2.

vIngresoDiario.AgenteBroker as 'AGENTE/BROKER', 
case 
 when vIngresoDiario.Numero  is not null 
 then convert(varchar(10),vIngresoDiario.Numero) + ' F'
 else
  convert(varchar(10), vIngresoDiario.NumeroRecibo) + ' R'
end as 'NRO FACTURA/RECIBO' ,

3.



case when 
 ABS(ROUND(vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100,2)-
 (vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100)) > 0.05
 then
  (vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100)
 else
   ROUND(vIngresoDiario.Comision/(vIngresoDiario.PrimaPura+vIngresoDiario.Adicionales-vIngresoDiario.GestionCobranzas)*100,2)
end as 'PorcComision',

Friday, April 27, 2012

Dada una fecha, obtener fecha inicio y fecha fin (VB.NET)

OoOoh, qué título más largo XD. No encontré otro que pueda resumir bien esta tarea.

Aquí la digo otra vez... (en Visual Basic .NET)

Dada una fecha, obtener o extraer la fecha inicial y la fecha final de esa fecha, valga la redundancia.

Ejemplo, fecha: 26/04/2012
La fecha inicial: 01/04/2012
La fecha final: 30/04/2012

La fecha inicial obvio es fácil, siempre será 01 y el mes y el año lo podes obtener a través de los métodos propios de VB.NET (.month, .year) Pero se puede evitar la fatiga haciendo eso... Cómo? Así:

Dim fecFin As New Date
Dim fecIni As New Date
fecFin = Me.txtFechaX.Value
fecIni = Me.txtFechaX.Value
fecIni = fecIni.AddDays(-fecIni.Day + 1)
fecFin = fecFin.AddDays(-fecFin.Day + 1).AddMonths(1).AddDays(-1)

A mi me sirvió de mucho, espero que sea lo que estés buscando. Saludos.

HaPPy CoDiNg! =)

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 =)

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 =)

Tuesday, August 17, 2010

Ajax: Accordion

Me gusta y aquí te va cómo utilizar el control de Accordion de Ajax.

Para ver cómo se ve (valga la redundancia),entra
aqui

Para empezar, si tenés el VS 2008, tenés que instalarte el ToolKit... si aún no lo has hecho, ingresa aquí para saber cómo.

Empezemos.

En el code html de Default.aspx de tu WebSite:

Primero te arrastras el ToolkitScriptManager, quedaria asi:



Luego,te arrastras el Accordion
Dentro de las etiquetras del Accordion, colocas entre etiquetas Panes y dentro de estas, metes todos los AccordionPane que desees... Dentro de estas, metes un Header y un Content. Y dentro del Content es justo el contenido.

Queria mas o menos asi, su estructura:



Ah, por cierto, en mi toolbar del blog no tengo la opción de escribir código pues no es un blog de programación... asi que si alguen tiene algun truco,bien, mientras, lo estoy metiendo dentro de un textarea... lo br se autocrean, uds. los eliminan...

De todos maneras, subí mi Default.aspx y el CSS que le dará estilo... ok?

Se puede bajar de aqui el codigo

Y de aqui la hoja de estilo

Happy Coding...

Thursday, October 23, 2008

Estilos De programación II

Continuando con las buenas prácticas de un programador :D les dejo lo siguiente:

1. Indentación
Sobre como indentar hay varios estilos tales como: Allman, K&R, BSD KN, Whitesmiths, etc.
El estilo Allman es el mejor, el cual dice que debemos usar los sangrados para indentar el código, nunca espacios. Poner las llaves de control en la línea subsiguiente.




2. Saltos de Línea
Añadir un salto de línea después del cierres de los paréntesis de los parámetros.
Añadir un salto de línea después un punto y coma, cuando termina la sentencia.




3. Espacios y líneas en blanco
Usar espacios en blanco para mejorar la legibilidad del código.
Usar espacios en blanco e ambos lados del operador de símbolos, después de comas y después de las declaraciones.
Usar líneas en blanco para separar trozos de código.
Usar líneas en blanco antes de cada método dentro de la clase.



4. Longitud de la línea
Evite las líneas de mas de 80 caracteres cuando supera se debe córtalo bajo los siguiente principios
Salto de línea después de la coma.
Salto de línea después de un operador.
Alinear la nueva línea con el principio de la expresión en el mismo nivel en la línea anterior.


Wednesday, October 22, 2008

Estilos De programación I

Entre las buenas prácticas de un programador, está el hacer uso de alguna convención de nombramiento ya sea de proyectos, archivos de código fuente e identificadores (campos, variables, métodos, propiedades, clases, interfases, etc. (depediendo del Leguaje de Programación))


¿Cuál es el objetivo de esta buena práctica? Implementar código fuente que sea legible, claro, consistente, fácil de comprender y mantener. 

A veces no será posible seguir en aquella empresa donde desarrollamos alguna aplicación y así que será otra la persona que se ocupe de su mantenimiento. Nuestro código debe tener la característica de que "otros" también puedan entenderlo sin máximo esfuerzo, costo y tiempo.

Las cosas podrían llegar a ser muy serias hasta el caso de que resultaría mejor volver a desarrollar ese sistema desde cero!

Bueno, pero como mencioné hace unas líneas arribas, una de las buenas prácticas es Convención de Nombres.

Entre los estilos, están los que siguen a continuación:

Camel Case: forma de escribir una palabra donde su primera letra está en minúsculas y la primera letra de las subsiguientes palabras en mayúsculas. Ejemplo: nombreCliente

Pascal Case: forma de escribir una palabra donde la primera letra está en mayúscula y la primera de las subsiguientes palabras igualmente en mayúscula. Ejemplo: NombreCliente

Estilo Mayúsculas: Todas las letras del identificador se encuentran en mayúsculas.

Estilo Minísculas: Todas las letras del identificador se encuentran en minúsculas.

Por defecto, algunos lenguajes de programación usan unos de estos estilos. Por ejemplo, 

Los que conocen JAVA, para nombrar las constantes, todo mayúscula. Para nombrar clases, usa PascalCase, para los métodos, usa camelCase.

CONVENCIÓN DE NOMBRES
La convención de nombres es un conjunto de normas y reglas para la escritura de nombres, código fuente, identificadores y comentarios dentro de la programación, que facilitan y hacen más comprensible su lectura.

1. Clases
Las clases representan “cosas” y no “acciones”, por tal motivo evitar verbos como nombre de clase.
El nombre de la clase debe estar en singular, salvo que la clase represente multiplicidad de cosas.
Las Nombres de las clases deberían ser Sustantivos: ejemplo carro, hombre, tienda, pais, empleado, proveedor
Cada clase debe tener un bloque de documentación según la norma del lenguaje.

2. Métodos
Los nombres de los métodos deberían ser un verbo, dado que describe una acción ; ejemplo remover(), enviar(), cargar()
Los Métodos dentro de las clases siempre debe declarar su visibilidad tales como privadas, protegidas, públicas, etc

3. Variables
Evitar variables que sean de un solo carácter, Los nombres comunes para las variables temporales son i, j, k, m, y n para los números enteros; c, d, y e para los caracteres.
Nombres de variables sólo pueden contener caracteres alfanuméricos
Nombres de variables deben ser camelCase


PARA LOS QUE TRABAJAN EN LA PLATAFORMA .NET