Friday, August 27, 2010

nombre de variables dinamicos

        Dim i As Integer
        Dim field As System.Reflection.FieldInfo
        Dim lblruc As Label
        For i = 1 To psComReg.Length()
            field = Me.GetType().GetField("lbl_5_" + i.ToString(), _
                System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance)
            lblruc = DirectCast(field.GetValue(Me), Label)
            lblruc.Text = psComReg(i - 1)
        Next

Wednesday, August 25, 2010

Grabar log en SQL SERVER con campo XML

    Private Sub GrabarLogReportes()
        Dim htDescripcion As New Hashtable
        htDescripcion.Add("compania", cboCompania.SelectedValue)
        htDescripcion.Add("anio", cboAnio.SelectedValue)
        htDescripcion.Add("periodo", cboPeriodo.SelectedValue)
        Generico.EscribeLog(servicio, "INEC", txtRuta.Text, htDescripcion)      
    End Sub

----------------------------


Public Shared Sub EscribeLog(ByRef servicio As ServiciosADAM, ByVal reporte As String, ByVal ruta As String, ByVal htDescripcion As Hashtable)
        Dim sql As String
        Dim diccionario As IDictionaryEnumerator
        Dim strBuilder As New System.Text.StringBuilder
        Dim writerSettings As New System.Xml.XmlWriterSettings()
        ' Crear diccionario para poder ser recorrido en la generación de la cadena XML
        diccionario = htDescripcion.GetEnumerator
        ' Crear cadena XML
        With writerSettings
            .Indent = True
            .IndentChars = New String(" "c, 4)
        End With
        Dim writer As System.Xml.XmlWriter = System.Xml.XmlWriter.Create(strBuilder, writerSettings)
        With writer
            .WriteStartElement("Descripcion")
            ' Agregar los componentes del diccionario
            While diccionario.MoveNext
                .WriteElementString(diccionario.Key, diccionario.Value)
            End While
            .WriteEndElement()
        End With
        writer.Flush()
        writer.Close()
        ' Eliminar la primera linea de la cadena XML
        Dim cadenaSaltoLinea As String() = Split(strBuilder.ToString(), vbNewLine)
        Dim descripcion As String
        descripcion = String.Join(vbNewLine, cadenaSaltoLinea, 1, cadenaSaltoLinea.Length - 1)
        ' Llamar al procedimiento almacenado
        Try
            sql = "exec sp_hrv5_ec_log_reportes "
            sql += "'" & reporte & "', "
            sql += "'" & ADAM.Framework.Windows.ConexionActual.Usuario & "', "
            sql += "'" & ruta & "', "
            sql += "'" & descripcion & "'"
            If (servicio.ejecutaConsulta(sql, ConexionActual.conexionBD) <> 1) Then
                Throw New Exception("La generación del reporte no pudo ser registrada en el log de la base de datos.")
            End If
        Catch ex As Exception
            MuestraErrorAdam(ex)
        End Try
    End Sub


BD
--------------------------------------------------

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO

CREATE TABLE hrec_log_reportes(
    [tipo_reporte] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [fecha_emision] [datetime] NULL,   
    [usuario] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [ruta_emision] [varchar](200) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [descripcion] XML NULL
    --[descripcion] [varchar](500) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

--DROP TABLE  [dbo].hrec_log_reportes




------------------------------------------------------------


IF OBJECT_ID('sp_hrv5_ec_log_reportes') IS NOT NULL
    DROP PROCEDURE sp_hrv5_ec_log_reportes
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_hrv5_ec_log_reportes]
(
    @tipo_reporte  VARCHAR(10),
    @usuario       VARCHAR(20),
    @ruta_emision  VARCHAR(200),
    @descripcion   XML
)
AS
    INSERT INTO hrec_log_reportes
      (
        tipo_reporte,
        fecha_emision,
        usuario,
        ruta_emision,
        descripcion
      )
    VALUES
      (
        @tipo_reporte,
        GETDATE(),
        @usuario,
        @ruta_emision,   
        @descripcion
      )
GO







Tuesday, August 17, 2010

T-SQL Escoger el mayor valor de un determinado campo



DECLARE @TestTable TABLE (id INT, home INT, date DATETIME,
  player VARCHAR(20), resource INT)

INSERT INTO @TestTable
SELECT 1, 10, '20090304', 'john', 399 UNION
SELECT 2, 11, '20090304', 'juliet', 244 UNION
SELECT 5, 12, '20090304', 'borat', 555 UNION
SELECT 3, 10, '20090303', 'john', 300 UNION
SELECT 4, 11, '20090303', 'juliet', 200 UNION
SELECT 6, 12, '20090303', 'borat', 500 UNION
SELECT 7, 13, '20081224', 'borat', 600 UNION
SELECT 8, 13, '20090101', 'borat', 700

-- Answer
SELECT id, home, date, player, resource
FROM (SELECT id, home, date, player, resource,
    RANK() OVER (PARTITION BY home ORDER BY date DESC) N
    FROM @TestTable
)M WHERE N = 1

-- and if you really want only home with max date
SELECT T.id, T.home, T.date, T.player, T.resource
    FROM @TestTable T
INNER JOIN
(   SELECT TI.id, TI.home, TI.date,
        RANK() OVER (PARTITION BY TI.home ORDER BY TI.date) N
    FROM @TestTable TI
    WHERE TI.date IN (SELECT MAX(TM.date) FROM @TestTable TM)
)TJ ON TJ.N = 1 AND T.id = TJ.id