Thursday, December 30, 2010

XML

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 " & spLogNameEcuador & " "
            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






---------------------------
VB.NET

For Each dr As Janus.Windows.GridEX.GridEXRow In gridTrabajadores.GetCheckedRows()
            trabajador = dr.Cells("trabajador").Value
            trabajadoresXML += ""
        Next


        Try
            sql = "EXEC "
            sql += Constantes.pe_fpv5_sp_obten_Afp
            sql += " '" + cboCompania.Value + "', "
            sql += " '" + trabajadoresXML + "', "
            sql += cboAnio.Value.ToString() + ", "
            sql += cboPeriodo.Value.ToString()
            DsRepAFPExcel = Servicio.fillConsultaSQL(sql, ADAM.Framework.Windows.ConexionActual.conexionBD)



SQL

-- SELECT trabajador = T.item.value('@trabajador', 'char(10)')
-- FROM   @lsTrabajadorLista.nodes('/info') AS T(item) 






otras paginas
http://www.expert.tc/topic.php?id=128240
http://www.codeguru.com/csharp/csharp/cs_data/xml/article.php/c4227
http://www.codeguru.com/csharp/csharp/cs_data/xml/article.php/c4227
http://social.msdn.microsoft.com/Forums/en/sqlxml/thread/357feaac-892b-4aa9-92f6-9f07d388239f
http://msdn.microsoft.com/en-us/library/ms345110(v=sql.90).aspx

Tuesday, October 26, 2010

Obtener resultado en string separado por comas

DECLARE @var AS NVARCHAR(100)


SELECT @var = COALESCE(convert(nvarchar,@var) + ',' , '') + CONVERT(nvarchar,tabla.id_calendario) FROM
(SELECT distinct(id_calendario) FROM calendario_procesos WHERE anio = 2010 AND tipo_nomina = 'PJ') tabla


SELECT @var

Friday, October 15, 2010

sp_executesql

SET @sql = 'SELECT @rpta = SUM(importe)
FROM   ' + @ls_tabla + '
WHERE  concepto = (SELECT valor FROM FPV5_EC_parametros_maestro WHERE id = 150)
       AND trabajador IN (SELECT DISTINCT(tra_cod)
                          FROM   #trabajadores)'


EXEC sp_executesql @sql,
     N'@rpta float output',
     @rpta = @hor_tra OUTPUT


SET @hor_tra = COALESCE(@hor_tra, 0)

Wednesday, October 13, 2010

Obtener diferentes valores de un mismo campo - Múltiples Joins

Obtener diferentes valores de un mismo campo - Múltiples Joins

SELECT ROW_NUMBER() OVER(ORDER BY t.trabajador) AS 'nro',
       t.trabajador,
       CASE 
            WHEN t.sexo = 1 THEN 'M'
            ELSE 'F'
       END AS sexo,
       SUM(a.importe) AS importe_1165,
       SUM(b.importe) AS importe_1006,
       SUM(c.importe) AS importe_601
       
FROM   trabajadores t
       INNER JOIN (
                SELECT trabajador,
                       concepto,
                       SUM(importe) AS importe
                FROM   transacciones_ns
                WHERE  compania = 'A'
                       AND clase_nomina = 'AD'
                       AND id_calendario = 209
                       AND concepto = 1165
                       AND trabajador = 90
                GROUP BY
                       trabajador,
                       concepto
            ) a
            ON  a.trabajador = t.trabajador
       INNER JOIN (
                SELECT trabajador,
                       concepto,
                       SUM(importe) AS importe
                FROM   transacciones_ns
                WHERE  compania = 'A'
                       AND clase_nomina = 'AD'
                       AND id_calendario = 209
                       AND concepto = 1006
                       AND trabajador = 90
                GROUP BY
                       trabajador,
                       concepto
            ) b
            ON  b.trabajador = t.trabajador
            INNER JOIN (
                SELECT trabajador,
                       concepto,
                       SUM(importe) AS importe
                FROM   transacciones_ns
                WHERE  compania = 'A'
                       AND clase_nomina = 'AD'
                       AND id_calendario = 209
                       AND concepto = 601
                       AND trabajador = 90
                GROUP BY
                       trabajador,
                       concepto
            ) c
            ON  c.trabajador = t.trabajador
GROUP BY 
t.trabajador,
sexo
                
También se puede revisar el artículo siguiente:
http://efreedom.com/Question/1-1172926/SQL-Issue-Calculating-Percentages-Using-Multiple-Joins-Table                
                

Thursday, September 9, 2010

sql beautifier

http://www.ubitsoft.com/products/t-sql-beautifier/

http://www.sqlinform.com/online.phtml

http://www.dpriver.com/pp/sqlformat.htm

sql assistant (best)

Wednesday, September 8, 2010

sql tables


IF OBJECT_ID('tempdb..#reporte') IS NULL
    BEGIN
        CREATE TABLE #reporte
        (
            tra_tot  INT,
            ing_tot  FLOAT,
            hor_tra  FLOAT,
            hor_ext  FLOAT
        )
    END
  
  
        DECLARE @lt_trabajadores TABLE (
                trabajador CHAR(10),
                registro_fiscal VARCHAR(20),
                nombre VARCHAR(100),
                clave_unica VARCHAR(25),
                fecha_baja VARCHAR(40),
                concepto SMALLINT,
                importe DECIMAL
        )



Otros archivos de interés:


Leer 1
Leer 2

Friday, September 3, 2010

T SQL - usar otra bd en tiempo de ejecucion

           --    FROM   PUNKUADAM.dbo.trabajadores t
           --           INNER JOIN punkuadam.dbo.vw_nombre_separado vns
           --                ON  vns.trabajador = t.trabajador
           --           INNER JOIN punkuadam.dbo.transacciones_ns tn
           --                ON  tn.trabajador = t.trabajador
           --           INNER JOIN punkuadam.dbo.transacciones_ns tn2
           --                ON  tn2.trabajador = t.trabajador
           --           INNER JOIN punkuadam.dbo.plazas p
           --                ON  p.trabajador = t.trabajador
           --           INNER JOIN punkuadam.dbo.puestos p2
           --                ON  p.puesto = p2.puesto

Wednesday, September 1, 2010

Obtener Numero lunes, Martes, miercoles en un rango de fechas

DECLARE @pd_inicio    AS SMALLDATETIME,
        @pd_fin       AS SMALLDATETIME,
        @pn_dia       AS SMALLINT

DECLARE @ln_total     AS SMALLINT
DECLARE @ln_datepart  AS SMALLINT
SET @ln_total = 0

SET @pd_inicio = '20100601'
SET @pd_fin = '20100630'
SET @pn_dia = 7 -- 1 lunes

PRINT @pn_dia
PRINT DATEPART(dw, @pd_inicio)

SET @ln_datepart = DATEPART(dw, @pd_inicio)


IF @pn_dia < DATEPART(dw, @pd_inicio)
    SET @pd_inicio = DATEADD(week, DATEDIFF(week, 0, @pd_inicio), 6 + @pn_dia)
ELSE
    IF @pn_dia > DATEPART(dw, @pd_inicio)
    SET @pd_fin = @pd_fin - (@pn_dia - DATEPART(dw, @pd_inicio))
--    SET @pd_inicio = DATEADD(
--            week,
--            DATEDIFF(week, 0, @pd_inicio),
--            @pn_dia - DATEPART(dw, @pd_inicio)
--    )

 IF @ln_datepart = 7 AND @pn_dia <> 7--funciona en agosto 2010
    SET @pd_inicio = DATEADD(d, -7, @pd_inicio)

    
WHILE @pd_inicio <= @pd_fin
BEGIN
    PRINT @pd_inicio
    SET @pd_inicio = DATEADD(d, 7, @pd_inicio)
    SET @ln_total = @ln_total + 1
END

SELECT @ln_total
      
       --fucnion origginal con 7 devuelve el sig lunes
       --select    dateadd(week, datediff(week, 0, getdate()),7)




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

OTRA FUNCION
IF OBJECT_ID('fn_hrv5_ec_get_numero_dias') IS NOT NULL
    DROP FUNCTION fn_hrv5_ec_get_numero_dias
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION fn_hrv5_ec_get_numero_dias
(
    @pd_inicio  AS SMALLDATETIME,
    @pd_fin     AS SMALLDATETIME,
    @pn_dia     AS SMALLINT --dia de la semana -- lunes = 1
)
RETURNS SMALLINT
AS
BEGIN
    DECLARE @offset  INT,
            @total_dias    AS SMALLINT
  
    SELECT @offset = CASE @pn_dia
                          WHEN 1 THEN 1
                          WHEN 2 THEN 2
                          WHEN 3 THEN 3
                          WHEN 4 THEN 4
                          WHEN 5 THEN 5
                          WHEN 6 THEN 6
                          WHEN 7 THEN 0
                     END
  
    SET @total_dias = DATEDIFF(
            WEEK,
            DATEADD(DAY, -@offset, @pd_inicio),
            DATEADD(DAY, -@offset, @pd_fin)
        )
  
    IF @pn_dia = DATEPART(dw, @pd_inicio)
        SET @total_dias = @total_dias + 1
  
    RETURN @total_dias
END
GO



DECLARE @ld_inicio  AS SMALLDATETIME
DECLARE @ld_fin     AS SMALLDATETIME

SET @ld_inicio = '20100601'
SET @ld_fin = '20100630'


SELECT dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 7),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 1),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 2),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 3),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 4),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 5),
       dbo.fn_hrv5_ec_get_numero_dias(@ld_inicio, @ld_fin, 6)



revisar
http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html

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

Thursday, July 22, 2010

merge excel cells in vb.net

   1:  Dim objRango As Excel.Range = objHojaExcel.Range("B1:B2")
   2:  objRango.MergeCells = True
   3:  objRango.HorizontalAlignment = Excel.Constants.xlCenter
   4:  objRango.VerticalAlignment = Excel.Constants.xlCenter
   5:   
   6:  objRango = objHojaExcel.Range("A7:D7")
   7:  objRango.Merge()
   8:  objRango.HorizontalAlignment = Excel.Constants.xlCenter
   9:  objRango.WrapText = True
  10:  objRango.ShrinkToFit = True

Dim objRango As Excel.Range = objHojaExcel.Range("B1:B2")
objRango.MergeCells = True
objRango.HorizontalAlignment = Excel.Constants.xlCenter
objRango.VerticalAlignment = Excel.XlVAlign.xlVAlignCenter

Thursday, July 15, 2010

dynamic variables


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