• Martes 7 de Diciembre de 2021, 01:15

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Shiquilla

Páginas: [1] 2 3 ... 9
1
Visual Basic para principiantes / Re: GUARDAR DATOS DE UN CONTADOR
« en: Sábado 26 de Febrero de 2011, 13:36 »
Buenas, pues asi por lo pronto, si no quieres usar bases de datos, podrías utilizar:

1. Grabar el contador en un fichero ini
Al iniciar la aplicación leerías de ese fichero y pondrías los datos guardados, cada vez que se vaya a dando a algún contador irias actualizando dicho fichero.
La ventaja que tiene es que si te llevas la aplicación a otro PC junto con dicho fichero siempre tendrías la información.
Inconvenientes: Pues que cualquiera podría abrir ese fichero y manipularlo a su antojo.

2. Grabar el contador en el registro del sistema
Funciona igual que el anterior pero en vez de usar un fichero grabarias/leerias en el registro de windows.
La desventaja que tiene ese método es que esa información sólo estaría accesible en ese PC y no en otro.

Saludos,

2
Buenos días, ayer me instalé el SP1 de Windows 7. Cuál es mi sorpresa cuando compilo mi aplicación que utiliza las MDAC y da error "No coinciden los tipos". Testeando la aplicación, me daba error en:
Código: Visual Basic
  1. Dim cn As Adodb.Connection
  2. Set cn = new Adodb.Connection 'Aquí da ERROR NO COINCIDEN LOS TIPOS
  3.  

Mirando en Microsoft, puedes solucionar este problema haciendo:
Código: Visual Basic
  1. Dim cn As Object
  2. Set cn = CreateObject("Adodb.Connection")
  3.  

Si tienes una aplicación pequeña, recomiendo hacer esto, pero si tienes una aplicación muy grande, cambiar esto puede suponer un trabajo importante puesto que da error en cualquier objeto de las MDAC.

Microsoft ha sacado recientemente un hotfix para que los clientes que no tienen el SP1 de Windows 7, o Windows XP o cualquier otro Windows, puedan ejecutar aplicaciones que hayan sido compiladas bajo Windows 7 con SP1. Esto está muy bien, pero es que cuando el cliente tiene Windows 7 con SP1 de 32bits y tú lo has compilado en un Windows 7 de 64 bits, esa compilación tampoco funciona y, para mejorar la cosa, no puedes instalarle el Hotfix que soluciona el error (el hotfix sólo funciona para los Windows 7 que NO tienen en SP1 instalado).

Descarga del Hotfix de Microsoft: http://support.microsoft.com/hotfix/KBHotfix.aspx?kbnum=983246&kbln=es

Bueno, para solucionar el problema "momentáneamente", encontré una solución por internet. He realizado una copia de seguridad de las MDAC sin el SP1 puesto, me he puesto el SP1 y he vuelto a machacar las MDAC con las que tenía antes de realizar la actualización. De esta manera ya puedes compilar tus aplicaciones en Windows 7 con SP1 y que a todos tus clientes les funcione.

Los pasos a seguir son:
1. Abre el registro de sistema y ve a la siguiente clave:
   32 bits: HKEY_LOCAL_MACHINESOFTWAREClassesTypeLib{2A75196C-D9EB-4129-B803-931327F72D5C}
   64 bits: HKEY_LOCAL_MACHINESOFTWAREWow6432NodeClassesTypeLib{2A75196C-D9EB-4129-B803-931327F72D5C}

2. Pulsa botón derecho a la carpeta -> Permisos
3. Pulsa en Opciones avanzadas
4. Ve a Propietario, selecciona Administradores y marca la casilla "Reemplazar propietario en subcontenedores y objetos"
5. Pulsa aceptar, en la lista de usuarios, selecciona Administradores y dale permisos de Control Total.
6. Acepta

7. Ve a la siguiente carpeta:
   32 bits: C:Program FilesCommon FilesSystemado
   64 bits: C:Program Files (x86)Common FilesSystemado

8. Selecciona el fichero msado28.tlb, pulsa botón derecho -> propiedades
9. Ve a la solapa Seguridad, pulsa Opciones Avanzadas.
10. Ve a la solapa Propietario y pulsa en Editar
11. Selecciona Administradores y pulsa Aceptar, vuelve a pulsar en Aceptar
12. En la solapa Seguridad, pulsa el botón Editar, selecciona el grupo Administradores y dale permisos de Control Total
13. Acepta y vuelve a aceptar
14. Hacer lo mismo para el fichero msado27.tlb (desde el paso 8)

15. Ejecuta el bat que hay en esta carpeta
   32 bits: registrar ado 32.bat
   64 bits: registrar ado 64.bat

   
Ya puedes compilar tus aplicaciones con el SP1 de Windows 7 sin que le salga al cliente "No coinciden los tipos"

Adjunto fichero donde se encuentran las copias de seguridad de los ficheros de las MDAC y los BAT correspondientes.

Un saludo.

3
SQL Server / Re: Pasar parámetro Tabla a una Función
« en: Jueves 3 de Junio de 2010, 17:45 »
Buenas tardes, la verdad que no lo he hecho nunca, pero en google me ha salido esto.
http://www.builderau.com.au/program/sqlserver/soa/Passing-table-valued-parameters-in-SQL-Server-2008/0,339028455,339282577,00.htm

 Espero que te sirva de ayuda,

Saludos,

4
SQL Server / Re: Sumar Campos con Condiciones
« en: Viernes 23 de Abril de 2010, 11:32 »
mmm, lo único que se me ocurre es que hagas esto:

He cambiado la agrupación para que: si DOCTYPE está entre de 5 ó 6 ponga un 1 y si es distinto ponga un 0, así sólo te devolverá dos filas por cada cliente, luego, sumarlo todo.

Código: SQL
  1. SELECT A.VENDORID, A.VENDNAME, SUM(A.FIELD_1) AS FIELD_1, SUM(A.FIELD_2) AS FIELD_2
  2. FROM (
  3. SELECT dbo.PM.VENDORID,
  4.      dbo.PM00.VENDNAME,
  5.      SALDO = SUM(CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN 0 ELSE PM.CURTRXAM END) AS FIELD_1,
  6.      SALDO1 = SUM(CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN dbo.PM.CURTRXAM * -1 ELSE 0 END) AS FIELD_2
  7. FROM dbo.PM INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID)
  8. GROUP BY dbo.PM.VENDORID, dbo.PM00.VENDNAME, CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN 1 ELSE 0 END
  9. ) A
  10. GROUP BY A.VENDORID, A.VENDNAME
  11.  

Saludos,

5
SQL Server / Re: modificar dos tablas relacionadas
« en: Jueves 22 de Abril de 2010, 12:58 »
Sentencia UPDATE

6
VB .NET / Re: Necesito arrelar este codigo
« en: Lunes 19 de Abril de 2010, 17:52 »
Lo único que se me ocurre es que en vez de mostrar el formulario con el método Show, hicieras lo siguiente en el formulario que muestras:

Código: vb.net
  1. Private msError as String
  2.  
  3. Public sub EditarPropiedades(Byref lsError as String)
  4.     msError=""
  5.     Me.Show
  6.     lsError = msError
  7.    
  8.     Me.Dispose
  9. End Sub
  10.  
  11. 'En algún evento del formulario, ya sea en el evento Load compruebes si la tabla está vacía, si es así, poner msError = "al Error" y llamar a Me.Close
  12.  

Y luego en el código, cambiar tu código por éste:
Código: vb.net
  1. If Not Me.TB_ID.Text = "" And e.KeyChar = Chr(13) Then
  2.     IdBindingSource.Filter = "ID = " & Me.TB_ID.Text
  3. Else
  4.     If Me.TB_ID.Text = "" And e.KeyChar = Chr(13) Then
  5.         Dim lsError as String
  6.         Tablas.EditarPropiedades(lsError)
  7.         If Trim(lsError) <> "" then msgbox(blablalbla)
  8.     End If
  9. End If
  10.  

Lo que no sé es si necesitas que se abra el formulario en modal ... (me da a mi que si)

Espero que te sirva de ayuda. Un saludo

7
Visual Basic 6.0 e inferiores / Re: 0.99 \ 1 = 1. WTF?
« en: Lunes 19 de Abril de 2010, 17:36 »
Buenas tardes, eso es porque al dividir en vb la barra "" redondea al alza, es decir, si el resultado de la división es superior > 0.5 lo redondea al inmediato superior, si es inferior, al inmediato inferior, al final sólo devuelve un entero. Te paso el código de estas funciones que están implementadas en SQL Server pero en VB6 no. Te paso el código de ambas para que pongas la que quieras.

Código: Visual Basic
  1. 'Devuelve el entero más pequeño no menor que X.
  2. 'Ejemplo: Ceiling(1.23) = 2, Ceiling(-1.23) = -1
  3. Private Function Ceiling(ByVal X As Double) As Long
  4.    Ceiling = -Int(X * (-1))
  5. End Function
  6.  
  7. 'Devuelve el entero más grande no mayor que X.
  8. 'Ejemplo: Floor(1.23) = 1, Floor(-1.23) = -2
  9. Private Function Floor(ByVal X As Double) As Long
  10.    Floor = (-Int(X) * (-1))
  11. End Function
  12.  

Saludos,

8
La taberna del BIT / Invitación a Tuenti
« en: Lunes 19 de Abril de 2010, 17:20 »
Buenas tardes chicos/as, os escribo porque me interesaría entrar en Tuenti y veo que es necesario ser invitado por una persona que ya esté dentro. Si alguien tiene alguna invitación y tiene la gran amabilidad de hacerme de Tuenti se lo agradecería muchísimo.

PD: Si eso contactar conmigo por mensaje privado y le digo mi email... ojalá a alguien le sobre alguna.

Muchas gracias a todos.

9
SQL Server / Re: Sumar Campos con Condiciones
« en: Lunes 19 de Abril de 2010, 16:35 »
También, he visto en tu mensaje que dices que te presenta el mismo resultado más de una vez (repetidas), eso es por la agrupación que tienes.
Código: SQL
  1. dbo.PM.VENDORID, dbo.PM00.VENDNAME, dbo.PM.DOCTYPE
  2.  

Si la pones agrupada por cliente ya estaría (a no ser que DOCTYPE lo necesites para algo)
Código: SQL
  1. dbo.PM.VENDORID, dbo.PM00.VENDNAME
  2.  

Saludos,

10
SQL Server / Re: Sumar Campos con Condiciones
« en: Lunes 19 de Abril de 2010, 16:27 »
Perdón,me equivoqué en una línea, hay un error en la condición
Código: SQL
  1. SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
  2.  

Cambiar por:
Código: SQL
  1. SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
  2.  

Código: SQL
  1. SELECT DISTINCT
  2.     dbo.PM.VENDORID,
  3.     dbo.PM00.VENDNAME,
  4.     SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1,
  5.     SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
  6.   FROM
  7.     dbo.PM
  8.     INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID)
  9.   GROUP BY
  10.     dbo.PM.VENDORID,
  11.     dbo.PM00.VENDNAME,
  12.     dbo.PM.DOCTYPE
  13.  

Saludos,

11
SQL Server / Re: Llamada a una api de java desde sql server
« en: Lunes 19 de Abril de 2010, 11:03 »
Si usas SQL 2005 o superior podrias crear un ensamblado de .NET y que ésta llame a la API. Los ensamblados de SQL no son más que prodedimientos/funciones de SQL Server que ejecutan una DLL externa.

Mírate documentación sobre CLR de SQL Server: http://msdn.microsoft.com/es-es/library/ms254498%28VS.80%29.aspx

Si necesitas más ayuda te mando algún ejemplo.

Saludos,

12
SQL Server / Re: Consulta SQL sin Repeticiones
« en: Lunes 19 de Abril de 2010, 10:59 »
No entiendo la pregunta.

13
SQL Server / Re: Contador
« en: Lunes 19 de Abril de 2010, 10:57 »
Código: SQL
  1. DECLARE @lnI INT
  2.  
  3. SET @lnI = 0
  4. WHILE EXISTS(SELECT TOP 1 1 FROM TablaUsuarios WHERE Login = 'NombreUsu' + CASE WHEN @lnI = 0 THEN '' ELSE '_' + LTRIM(@lnI))
  5. BEGIN
  6. SET @lnI = @lnI + 1
  7. END
  8.  

Saludos,

14
SQL Server / Re: Sumar Campos con Condiciones
« en: Lunes 19 de Abril de 2010, 10:54 »
Hay que sacar el SUM fuera del CASE. Quedaría así:

Código: SQL
  1. SELECT DISTINCT
  2.    dbo.PM.VENDORID,
  3.    dbo.PM00.VENDNAME,
  4.    SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1,
  5.    SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
  6.  FROM
  7.    dbo.PM
  8.    INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID)
  9.  GROUP BY
  10.    dbo.PM.VENDORID,
  11.    dbo.PM00.VENDNAME,
  12.    dbo.PM.DOCTYPE
  13.  

Saludos,

15
SQL Server / Re: instalar sql server 2005 en windows 7
« en: Jueves 26 de Noviembre de 2009, 19:17 »
- Ejecuté el instalador en modo administrador
- En la consola de los servicios, le cambié el inicio del servicio SQL Server para que lo iniciase con el usuario Administrador del PC
- Habilité los puertos TCPIP en la consola de caracteristicas

¿El servicio se te inicia? Si no se te inicia prueba a ver cambiando el usuario con el que se inicia el servicio.
Si el servicio se inicia normalmente y el analizador te dice que no puede conectar con conexiones remotas o algo asi, prueba a conectar con el analizador de esta manera: .[INSTANCIA] (Sustituye el nombre del pc por un punto).

Si de esta manera te conecta entonces tienes que habilitar lo del TCPIP.

Saludos,

16
SQL Server / Re: instalar sql server 2005 en windows 7
« en: Viernes 13 de Noviembre de 2009, 09:00 »
Sí, tengo instaladas SQL Server 2000, 2005 y 2008 en Windows 7 64bits.

Saludos,

17
SQL Server / Re: Servidor
« en: Viernes 13 de Noviembre de 2009, 08:55 »
Siempre y cuando tengas el puerto de SQL Server que vayas a utilizar (por defecto 1433) abierto en el router y redirigido al ordenador en cuestión, conociendo la IP pública de tu empresa (o DNS, lo que useis) si podrías conectar.

Saludos,

18
SQL Server / Re: sql server compatible
« en: Viernes 13 de Noviembre de 2009, 08:49 »
En efecto la versión Developer es compatible. Si no la consigues, siempre podrías instalar el MSDE y después las herramientas administrativas.

Saludos,

19
SQL Server / Re: Servidor
« en: Jueves 29 de Octubre de 2009, 09:12 »
Buenas, si el nombre del server está correcto, has intentado conectar con canalización con nombre y/o TCPIP y eso estás seguro de que está OK, es problema de la seguridad de SQL Server.

Si quieres probar si es de conexión o de seguridad, podrías crear un usuario específico de SQL Server y probar. Si entras con dicho usuario entonces es problema de seguridad.

Si vas a autentificarte como usuario de Windows, ese usuario debe estar especificado en el servidor SQL, en la carpeta SEGURIDAD del Administrador corporativo con el nombre completo del usuario. Es decir, [nombrepc/Dominio]Usuario.

Saludos,

20
SQL Server / Re: Consulta con COUNT
« en: Lunes 28 de Septiembre de 2009, 10:19 »
Código: SQL
  1. SELECT A.id, A.Descripcion, nHijos = (SELECT COUNT(1) FROM Tabla B WHERE A.id = B.Padre) FROM Tabla A
  2.  

Saludos,

21
SQL Server / Re: SQL server en RED...
« en: Jueves 10 de Septiembre de 2009, 17:43 »
Si lo que quieres que ambos servidores SQL Server estén comunicados, podrías mirar en google los Servidores Vinculados.
http://www.guillesql.es/Articulos/SQLServerFAQ_Servidor_Vinculado_OPENQUERY_Notacion_4_Partes.aspx

Saludos,

22
SQL Server / Re: Consulta Recursiva
« en: Jueves 10 de Septiembre de 2009, 17:37 »
Lo podrías lograr partiendo con una tabla de apoyo donde vayas insertando y marcando los datos que tienes.

Supongamos que dicha tabla tiene el ID del registro y un campo bTrabajo de tipo BIT (Cuando = 1 entonces ya se han insertado sus hijos)
 
Por ejemplo (Suponiendo que la tabla real se llama TABLADATOS):

Código: SQL
  1. DECLARE @Apoyo TABLE (idRegistro INT NOT NULL PRIMARY KEY, bTratado NOT NULL DEFAULT 0, bNuevo  NOT NULL DEFAULT 1)
  2. INSERT INTO @Apoyo (idRegistro) VALUES (1) -- Aquí habría que hacer la primera INSERT (el/los padres de todos los demás)
  3. WHILE EXISTS (SELECT TOP 1 1 FROM @Apoyo WHERE bTratado = 0 AND bNuevo = 1)
  4. BEGIN
  5.     UPDATE @Apoyo SET bNuevo = 0 WHERE bTratado = 0
  6.     INSERT INTO @Apoyo (idRegistro) SELECT idRegistro FROM TablaDatos A INNER JOIN @Apoyo B ON A.idSiguienteComponente = B.idRegistro WHERE B.bTratado = 0 AND B.bNuevo = 0
  7.     UPDATE @Apoyo SET bTratado = 1 WHERE bNuevo  = 0
  8. END
  9.  

Ya he hecho cosas de este estilo y este método va muy bien ya que puedes tener niveles infinitos, espero haberme explicado bien.

Saludos,

23
SQL Server / Re: Usuarios multiples con la misma cuenta de acceso (login)
« en: Martes 21 de Julio de 2009, 19:28 »
Puedes usar siempre el mismo login y pass sin problema ya que cada conexión a base de datos crea un SPID en SQL Server diferente aun usando el mismo usuario de acceso. Ten en cuenta que el usuario y contraseña de SQL Server es sólo una seguridad de acceso a los datos.

Si quieres ver lo que hace SQL Server por dentro, ejecuta dos veces la aplicación en la misma máquina, abre el analizador de consultas y ejecuta el siguiente procedimiento:
Código: SQL
  1. sp_who
  2.  

Verás como tendrás 3 SPID distintos: 2 con los accesos de la aplicación y uno el que estás usando al realizar esta consulta.

Sobre lo de modificar un registro al mismo tiempo entra en juego el tema de bloqueos que los maneja la base de datos sola siempre y cuando no abras un registro en modo pesimista (BLOQUEA SIEMPRE). Al abrir un recordset, una de las opciones es el bloqueo, que por defecto es optimista (sólo bloquea al hacer una UPDATE / DELETE).

Saludos,

24
SQL Server / Re: buscador de productos
« en: Lunes 13 de Julio de 2009, 13:07 »
Para hacer que un campo empieze por, contenga, termine, etc debe hacer:

Empieza por:
Código: SQL
  1. WHERE Campo LIKE 'Cadena%'
  2.  
Contiene:
Código: SQL
  1. WHERE Campo LIKE '%Cadena%'
  2.  
Termina por:
Código: SQL
  1. WHERE Campo LIKE '%Cadena'
  2.  

Cuidado con el carácter _ porque en la sentencia LIKE significa cualquier caracter, antes de hacer esto deberías reemplazar en el filtro el carácter _ por [_] para que encuentre ese carácter en concreto.

Saludos,

25
SQL Server / Re: Sugerencia Procedure Cantidad de Stock por Mes
« en: Lunes 13 de Julio de 2009, 12:52 »
Si tienes SQL Server 2005 o superior podrías mirar la sentencia PIVOT que hace lo que quieres.

Si tienes SQL Server 2000 podrías crearte una tabla temporal que contenga lo que quieres devolver y hacer una UPDATE sobre la tabla, por ejemplo:

Código: SQL
  1. DECLARE @nAño INTEGER; SET @nAño = 2005
  2. DECLARE @lnI INTEGER
  3. DECLARE @nTotal INTEGER
  4. DECLARE @sSQL VARCHAR(8000)
  5. DECLARE @dFechaINI DATETIME; SET @dFechaINI = CONVERT(DATETIME, '01/01/' + LTRIM(@nAño), 103)
  6. DECLARE @dFechaFIN DATETIME; SET @dFechaFIN = CONVERT(DATETIME, '31/12/' + LTRIM(@nAño), 103)
  7.  
  8. -- ---------------------------------------------------------------------------------------------
  9. -- Tabla de meses y años y su orden
  10. -- Es necesaria para poder realizar las updates masivas en el orden específico
  11. -- ---------------------------------------------------------------------------------------------
  12. CREATE TABLE #Dias_Meses
  13. (
  14.     nOrden NUMERIC(18,0) IDENTITY(1,1) NOT NULL,
  15.     dFecha DATETIME NOT NULL DEFAULT 0,
  16.     nMes INTEGER NOT NULL DEFAULT 0,
  17.     nAño INTEGER NOT NULL DEFAULT 0
  18.  
  19.     PRIMARY KEY (nOrden)
  20. )
  21.  
  22. -- En este caso, crea un TOP 12
  23. SET @sSQL = 'INSERT INTO #Dias_Meses (nAño) SELECT TOP ' + LTRIM(DATEDIFF(MONTH, @dFechaINI, @dFechaFIN) + 1) + ' 0 FROM SYSOBJECTS A CROSS JOIN SYSCOLUMNS B'
  24. EXEC(@sSQL)
  25.  
  26. UPDATE #Dias_Meses SET dFecha = DATEADD(MONTH, nOrden -1, '01/' + RIGHT('0' + LTRIM(MONTH(@dFechaINI)),2) + '/' + LTRIM(YEAR(@dFechaINI)))
  27. UPDATE #Dias_Meses SET nMes = MONTH(dFecha), nAño = YEAR(dFecha)
  28.  
  29. UPDATE #Dias_Meses SET dFecha = @dFechaINI WHERE nOrden = 1
  30. -- ---------------------------------------------------------------------------------------------
  31.  
  32. -- Creas la tabla con los datos fijos que vas a devolver
  33. CREATE TABLE #Datos
  34. (
  35.     sCodArticulo VARCHAR(250) NOT NULL PRIMARY KEY
  36. )
  37.  
  38. -- Añadimos las columnas necesarias a la tabla #Datos
  39. -- ---------------------------------------------------------------------------------------------
  40. SET @sSQL = ''
  41. SELECT @sSQL = @sSQL + CASE WHEN LEN(@sSQL) > 0 THEN ', ' ELSE '' END + 'nCant_' + LTRIM(nOrden) + ' NUMERIC(18,2) NOT NULL DEFAULT 0' FROM #Dias_Meses ORDER BY nOrden
  42. SET @sSQL = 'ALTER TABLE #Datos ADD ' + @sSQL
  43. PRINT @sSQL
  44. EXEC(@sSQL)
  45. -- ---------------------------------------------------------------------------------------------
  46.  
  47. -- Hace la INSERT en la tabla #Datos poniendo todos los artículos que entran en el filtro
  48. -- ---------------------------------------------------------------------------------------------
  49. INSERT INTO #Datos (sCodArticulo)
  50. SELECT dbo.ARTICULO.COD_ARTICULO
  51. FROM dbo.ARTICULO INNER JOIN dbo.DETALLE_BOLETA ON dbo.ARTICULO.COD_ARTICULO = dbo.DETALLE_BOLETA.COD_ARTICULO
  52. WHERE DETALLE_BOLETA.FECHA_EGRESO BETWEEN @dFechaINI AND @dFechaFIN
  53. GROUP BY dbo.ARTICULO.COD_ARTICULO
  54. -- ---------------------------------------------------------------------------------------------
  55.  
  56. -- Ahora, hacemos la UPDATE apoyandonos sobre la tabla #Dias_Meses
  57. -- ---------------------------------------------------------------------------------------------
  58. SET @nTotal = DATEDIFF(MONTH, @dFechaINI, @dFechaFIN) + 1
  59. SET @lnI = 1
  60. WHILE @lnI <= @nTotal
  61. BEGIN
  62.     SET @sSQL = 'UPDATE A SET A.nCant_' + LTRIM(@lnI) + ' = ISNULL(B.nTotal,0)'
  63.     SET @sSQL = @sSQL + ' FROM #Datos A'
  64.     SET @sSQL = @sSQL + ' INNER JOIN (
  65.                                         SELECT dbo.ARTICULO.COD_ARTICULO, SUM(dbo.DETALLE_BOLETA.CANTIDAD) AS nTotal
  66.                                         FROM dbo.ARTICULO INNER JOIN dbo.DETALLE_BOLETA ON dbo.ARTICULO.COD_ARTICULO = dbo.DETALLE_BOLETA.COD_ARTICULO'
  67.     SET @sSQL = @sSQL + ' INNER JOIN #Dias_Meses DM ON MONTH(DETALLE_BOLETA.FECHA_EGRESO) = DM.nMes AND YEAR(DETALLE_BOLETA.FECHA_EGRESO) = DM.nAño'
  68.     SET @sSQL = @sSQL + ' WHERE DETALLE_BOLETA.FECHA_EGRESO BETWEEN ''' + LTRIM(@dFechaINI) + ''' AND ''' + LTRIM(@dFechaFIN) + ''''
  69.     SET @sSQL = @sSQL + ' AND DM.nOrden = ' + LTRIM(@lnI)
  70.     SET @sSQL = @sSQL + ' GROUP BY dbo.ARTICULO.COD_ARTICULO) B ON A.sCodArticulo = B.COD_ARTICULO'
  71.     EXEC(@sSQL)
  72.  
  73.     SET @lnI = @lnI + 1
  74. END
  75. -- ---------------------------------------------------------------------------------------------
  76.  
  77. SELECT * FROM #Datos ORDER BY sCodArticulo
  78.  
  79. DROP TABLE #Datos
  80. DROP TABLE #Dias_Meses
  81.  

Sería hacer algo parecido, en este caso es dinámico y da igual el filtro que se haga.

Espero que te sirva, saludos.

Nota: No lo he probado

Páginas: [1] 2 3 ... 9