|
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
1
« 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
« en: Viernes 25 de Febrero de 2011, 12:44 »
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: Dim cn As Adodb.Connection Set cn = new Adodb.Connection 'Aquí da ERROR NO COINCIDEN LOS TIPOS
Mirando en Microsoft, puedes solucionar este problema haciendo: Dim cn As Object Set cn = CreateObject("Adodb.Connection")
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=esBueno, 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
« en: Jueves 3 de Junio de 2010, 17:45 »
4
« 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. SELECT A.VENDORID, A.VENDNAME, SUM(A.FIELD_1) AS FIELD_1, SUM(A.FIELD_2) AS FIELD_2 FROM ( SELECT dbo.PM.VENDORID, dbo.PM00.VENDNAME, SALDO = SUM(CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN 0 ELSE PM.CURTRXAM END) AS FIELD_1, SALDO1 = SUM(CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN dbo.PM.CURTRXAM * -1 ELSE 0 END) AS FIELD_2 FROM dbo.PM INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID) GROUP BY dbo.PM.VENDORID, dbo.PM00.VENDNAME, CASE WHEN dbo.PM.DOCTYPE BETWEEN 5 AND 6 THEN 1 ELSE 0 END ) A GROUP BY A.VENDORID, A.VENDNAME
Saludos,
5
« en: Jueves 22 de Abril de 2010, 12:58 »
Sentencia UPDATE
6
« 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: Private msError as String Public sub EditarPropiedades(Byref lsError as String) msError="" Me.Show lsError = msError Me.Dispose End Sub '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
Y luego en el código, cambiar tu código por éste: If Not Me.TB_ID.Text = "" And e.KeyChar = Chr(13) Then IdBindingSource.Filter = "ID = " & Me.TB_ID.Text Else If Me.TB_ID.Text = "" And e.KeyChar = Chr(13) Then Dim lsError as String Tablas.EditarPropiedades(lsError) If Trim(lsError) <> "" then msgbox(blablalbla) End If End If
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
« 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. 'Devuelve el entero más pequeño no menor que X. 'Ejemplo: Ceiling(1.23) = 2, Ceiling(-1.23) = -1 Private Function Ceiling(ByVal X As Double) As Long Ceiling = -Int(X * (-1)) End Function 'Devuelve el entero más grande no mayor que X. 'Ejemplo: Floor(1.23) = 1, Floor(-1.23) = -2 Private Function Floor(ByVal X As Double) As Long Floor = (-Int(X) * (-1)) End Function
Saludos,
8
« 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
« 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. dbo.PM.VENDORID, dbo.PM00.VENDNAME, dbo.PM.DOCTYPE
Si la pones agrupada por cliente ya estaría (a no ser que DOCTYPE lo necesites para algo) dbo.PM.VENDORID, dbo.PM00.VENDNAME
Saludos,
10
« en: Lunes 19 de Abril de 2010, 16:27 »
Perdón,me equivoqué en una línea, hay un error en la condición SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
Cambiar por: SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2
SELECT DISTINCT dbo.PM.VENDORID, dbo.PM00.VENDNAME, SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1, SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 OR dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2 FROM dbo.PM INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID) GROUP BY dbo.PM.VENDORID, dbo.PM00.VENDNAME, dbo.PM.DOCTYPE
Saludos,
11
« 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.aspxSi necesitas más ayuda te mando algún ejemplo. Saludos,
12
« en: Lunes 19 de Abril de 2010, 10:59 »
No entiendo la pregunta.
13
« en: Lunes 19 de Abril de 2010, 10:57 »
DECLARE @lnI INT SET @lnI = 0 WHILE EXISTS(SELECT TOP 1 1 FROM TablaUsuarios WHERE Login = 'NombreUsu' + CASE WHEN @lnI = 0 THEN '' ELSE '_' + LTRIM(@lnI)) BEGIN SET @lnI = @lnI + 1 END
Saludos,
14
« en: Lunes 19 de Abril de 2010, 10:54 »
Hay que sacar el SUM fuera del CASE. Quedaría así: SELECT DISTINCT dbo.PM.VENDORID, dbo.PM00.VENDNAME, SALDO = SUM(CASE WHEN(dbo.PM.DOCTYPE <> 6 AND dbo.PM.DOCTYPE <> 5) THEN PM.CURTRXAM ELSE 0 END) AS FIELD_1, SALDO1 = SUM(CASE WHEN(dbo.PM.DOCTYPE = 6 AND dbo.PM.DOCTYPE = 5) THEN 0 ELSE dbo.PM.CURTRXAM * -1 END) AS FIELD_2 FROM dbo.PM INNER JOIN dbo.PM00 ON (dbo.PM.VENDORID = dbo.PM00.VENDORID) GROUP BY dbo.PM.VENDORID, dbo.PM00.VENDNAME, dbo.PM.DOCTYPE
Saludos,
15
« 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
« en: Viernes 13 de Noviembre de 2009, 09:00 »
Sí, tengo instaladas SQL Server 2000, 2005 y 2008 en Windows 7 64bits.
Saludos,
17
« 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
« 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
« 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
« en: Lunes 28 de Septiembre de 2009, 10:19 »
SELECT A.id, A.Descripcion, nHijos = (SELECT COUNT(1) FROM Tabla B WHERE A.id = B.Padre) FROM Tabla A
Saludos,
22
« 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): DECLARE @Apoyo TABLE (idRegistro INT NOT NULL PRIMARY KEY, bTratado NOT NULL DEFAULT 0, bNuevo NOT NULL DEFAULT 1) INSERT INTO @Apoyo (idRegistro) VALUES (1) -- Aquí habría que hacer la primera INSERT (el/los padres de todos los demás) WHILE EXISTS (SELECT TOP 1 1 FROM @Apoyo WHERE bTratado = 0 AND bNuevo = 1) BEGIN UPDATE @Apoyo SET bNuevo = 0 WHERE bTratado = 0 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 UPDATE @Apoyo SET bTratado = 1 WHERE bNuevo = 0 END
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
« 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: 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
« en: Lunes 13 de Julio de 2009, 13:07 »
Para hacer que un campo empieze por, contenga, termine, etc debe hacer: Empieza por: WHERE Campo LIKE 'Cadena%'
Contiene: WHERE Campo LIKE '%Cadena%'
Termina por: WHERE Campo LIKE '%Cadena'
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
« 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: DECLARE @nAño INTEGER; SET @nAño = 2005 DECLARE @lnI INTEGER DECLARE @nTotal INTEGER DECLARE @sSQL VARCHAR(8000) DECLARE @dFechaINI DATETIME; SET @dFechaINI = CONVERT(DATETIME, '01/01/' + LTRIM(@nAño), 103) DECLARE @dFechaFIN DATETIME; SET @dFechaFIN = CONVERT(DATETIME, '31/12/' + LTRIM(@nAño), 103) -- --------------------------------------------------------------------------------------------- -- Tabla de meses y años y su orden -- Es necesaria para poder realizar las updates masivas en el orden específico -- --------------------------------------------------------------------------------------------- CREATE TABLE #Dias_Meses ( nOrden NUMERIC(18,0) IDENTITY(1,1) NOT NULL, dFecha DATETIME NOT NULL DEFAULT 0, nMes INTEGER NOT NULL DEFAULT 0, nAño INTEGER NOT NULL DEFAULT 0 PRIMARY KEY (nOrden) ) -- En este caso, crea un TOP 12 SET @sSQL = 'INSERT INTO #Dias_Meses (nAño) SELECT TOP ' + LTRIM(DATEDIFF(MONTH, @dFechaINI, @dFechaFIN) + 1) + ' 0 FROM SYSOBJECTS A CROSS JOIN SYSCOLUMNS B' EXEC(@sSQL) UPDATE #Dias_Meses SET dFecha = DATEADD(MONTH, nOrden -1, '01/' + RIGHT('0' + LTRIM(MONTH(@dFechaINI)),2) + '/' + LTRIM(YEAR(@dFechaINI))) UPDATE #Dias_Meses SET nMes = MONTH(dFecha), nAño = YEAR(dFecha) UPDATE #Dias_Meses SET dFecha = @dFechaINI WHERE nOrden = 1 -- --------------------------------------------------------------------------------------------- -- Creas la tabla con los datos fijos que vas a devolver CREATE TABLE #Datos ( sCodArticulo VARCHAR(250) NOT NULL PRIMARY KEY ) -- Añadimos las columnas necesarias a la tabla #Datos -- --------------------------------------------------------------------------------------------- SET @sSQL = '' 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 SET @sSQL = 'ALTER TABLE #Datos ADD ' + @sSQL PRINT @sSQL EXEC(@sSQL) -- --------------------------------------------------------------------------------------------- -- Hace la INSERT en la tabla #Datos poniendo todos los artículos que entran en el filtro -- --------------------------------------------------------------------------------------------- INSERT INTO #Datos (sCodArticulo) SELECT dbo.ARTICULO.COD_ARTICULO FROM dbo.ARTICULO INNER JOIN dbo.DETALLE_BOLETA ON dbo.ARTICULO.COD_ARTICULO = dbo.DETALLE_BOLETA.COD_ARTICULO WHERE DETALLE_BOLETA.FECHA_EGRESO BETWEEN @dFechaINI AND @dFechaFIN GROUP BY dbo.ARTICULO.COD_ARTICULO -- --------------------------------------------------------------------------------------------- -- Ahora, hacemos la UPDATE apoyandonos sobre la tabla #Dias_Meses -- --------------------------------------------------------------------------------------------- SET @nTotal = DATEDIFF(MONTH, @dFechaINI, @dFechaFIN) + 1 SET @lnI = 1 WHILE @lnI <= @nTotal BEGIN SET @sSQL = 'UPDATE A SET A.nCant_' + LTRIM(@lnI) + ' = ISNULL(B.nTotal,0)' SET @sSQL = @sSQL + ' FROM #Datos A' SET @sSQL = @sSQL + ' INNER JOIN ( SELECT dbo.ARTICULO.COD_ARTICULO, SUM(dbo.DETALLE_BOLETA.CANTIDAD) AS nTotal FROM dbo.ARTICULO INNER JOIN dbo.DETALLE_BOLETA ON dbo.ARTICULO.COD_ARTICULO = dbo.DETALLE_BOLETA.COD_ARTICULO' 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' SET @sSQL = @sSQL + ' WHERE DETALLE_BOLETA.FECHA_EGRESO BETWEEN ''' + LTRIM(@dFechaINI) + ''' AND ''' + LTRIM(@dFechaFIN) + '''' SET @sSQL = @sSQL + ' AND DM.nOrden = ' + LTRIM(@lnI) SET @sSQL = @sSQL + ' GROUP BY dbo.ARTICULO.COD_ARTICULO) B ON A.sCodArticulo = B.COD_ARTICULO' EXEC(@sSQL) SET @lnI = @lnI + 1 END -- --------------------------------------------------------------------------------------------- SELECT * FROM #Datos ORDER BY sCodArticulo DROP TABLE #Datos DROP TABLE #Dias_Meses
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
|
|
|