lunes, 18 de octubre de 2010

Acceder a Métodos, Controles o propiedades de un formulario hijo a uno padre. [Windows Forms] C# VB.Net

El día de hoy comentare sobre un caso muy usual al trabajar con aplicaciones WindowsForms, por lo menos para mi en .Net 2003, 2005 y 2008.

En el caso que revisare mediante un ejemplo muy sencillo tenemos:

a) Un formulario principal, que alberga un GridControl, y un método de agregado de filas al DataTable que alimenta ese GrigControl.

b) Un formulario secundario que se crea como un objeto desde el formulario principal, y desde el cuál se invocara el método de agregado de filas del GridControl del formulario principal.

1. Como dije, tenemos un DataTable a nivel de clase:

Private dt As New DataTable()

2. Y en el Evento Load del Formulario principal, armamos la estructura de la tabla y agregamos unos registros de prueba :

Try
           dt.Columns.Add(New DataColumn("a"))
           dt.Columns.Add(New DataColumn("b"))
           dt.Columns.Add(New DataColumn("c"))

           dt.Rows.Add("1", "2", "3")
           dt.Rows.Add("4", "5", "6")
           dt.Rows.Add("7", "8", "9")
           dt.Rows.Add("10", "11", "12")

           gc1.DataSource = dt

       Catch ex As Exception
           MsgBox(ex.Message)
       End Try

3. Como dije anteriormente, tenemos un método para agregar nuevos registros al DataTable:

Public Sub addRow(ByVal val1 As String, ByVal val2 As String, ByVal val3 As String)
        Try
            dt.Rows.Add(val1, val2, val3)

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

4. Ahora bien, si este método es llamado desde el formulario principal pues todo va bien, pero si instanciamos un nuevo formulario:

Dim f As New Form4
        f.Owner = Me
        f.Show()

lo más seguro es que estando en el formulario secundario, estemos tentados a invocar al método, de la siguiente manera:

Form2.addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)

con lo cual, en tiempo de compilación no tendremos ningún problema, sin embargo cuando realicemos el compilado de la aplicación, al ejecutar la aplicación, el método no funciona correctamente. ¿Porqué?

Bueno, pues porque no podemos acceder a los formulario y sus propiedades hacia arriba de forma directa, por lo que es necesario realizar un <casting> obteniendo el nombre del formulario principal, de la propiedad “owner”:

CType(Me.Owner, Form2).addRow(TextBox3.Text, TextBox4.Text, TextBox5.Text)

con lo cual el problema queda resuelto.

Como siempre espero que en algún momento les sea de utilidad

Best regards And Happy coding.

KarlozArba

miércoles, 13 de octubre de 2010

Formateo de campos Fecha–Hora para Sql Server desde .Net

Este post pretendo que sea breve ya que solo es para comentar que en ocasiones nos encontramos el problema de insertar o actualizar datos Datetime desde aplicaciones hechas con Vb.Net o C# y estos marcan error si no son recibidos como parámetros Sql debido a que llevan el formato 01-10-2010 02:30 p.m. por lo que SQL Server no puede interpretar las cadenas (a.m. | p.m.).

Esta situación la podemos solvertar de la siguiente forma:

VarriableDateTime.ToString("yyyyMMdd hh:mm:ss")

en un Ejemplo sencillo:

string sql = "UPDATE zabp_tareas_ogerp ";
sql += string.Format(" SET TIEMPO_INICIO = '{0}', TIEMPO_FIN = '{1}',HORA_LIBERACION = {2}",P_Hora_Inicio.ToString("yyyyMMdd hh:mm:ss"), P_Hora_Fin.ToString("yyyyMMdd hh:mm:ss"), P_Duracion);
sql += string.Format(" WHERE FOLIO={0}",P_Folio);

Donde podemos observar como se formatea de la forma: 20101001 14:30:00 con lo que eliminamos el problema.

Como siempre espero que les sea de utilizada.

Best regards And Happy coding.

KarlozArba

viernes, 8 de octubre de 2010

Crear tabla en sql server desde una instruccion select

 

En esta ocasión quiero compartirles algo que suele ser muy necesario cuando queremos respaldar los datos de una tabla especifica, sin tener que hacer backup de la BD completa, o cuando necesitamos guardar solo ciertos datos pero no conocemos a priori la estructura que tendrán esos datos e incluso quizá este proceso deba hacerse de forma dinámica por lo que ni siquiera sabemos en que momento se generara.

Bueno la forma es muy sencilla y es la siguiente:

SELECT [*|| campo1, campo2, campo3… campo(n)]

INTO NombreTablaNuevaOTemporal

FROM TablaOrigen

La explicación más sencilla aún:

Realizamos un SELECT tal y como lo necesitemos pero después del listado del campos necesarios, usaremos la palabra reservada INTO que permite la creación de una tabla con el nombre que señalemos a continuación de dicha instrucción. Quizá la pregunta sea: ¿´Qué pasa cuando la tabla ya existe y contiene datos?, bueno pues, esa tabla y datos son respetados, agregando únicamente los nuevos registros.

Bien, para finalizar un ejemplo sencillo:

SELECT t.FOLIO, t.ASUNTO

INTO test_table FROM zabp_tareas_ogerp t

WHERE  t.PARA='Desarrollo-Carlos Armenta'

Debido a que todo se hace desde un SELECT, podemos hacerlo tan complejo como sea necesario.

Best regards And Happy coding.

KarlozArba