FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Cita:
Si, uso JVCL, y si, he visto las lindezas que tiene y he aprendido a vivir con ellas. Que yo no digo que sean una mierda de componentes, es solo que esto me parece "una chapuza" por el problema concreto que estoy teniendo. Ademas, que existan componentes peores o mejores no es excusa. Como dice Al, mejoraron la solucion de los IBX, un punto a su favor, y si bien yo anteriormente calificaria a los componentes como "EXCELENTES", ahora entenderas que no pueden tener la misma nota, y no sabria que nota ponerles, quizas utilizarlos sea un poco arriesgado. Cita:
Cita:
Mismo nombre de tabla, misma tabla de codigos, todo igual. |
#2
|
|||
|
|||
A sugerencia de Coso, le añadi un timetostr(now) al nombre del cursor. Le añadi tambien un numero aleatorio de 1 digito y ya no aparece el error en mi equipo, el lunes lo probaré en el cliente, pero con la hora y 8 digitos aleatorios.
Esto deberia ser suficiente para que no se repitan. Vale, ya lo se, cada 24 horas.... el tiempo comienza a repetirse, pero los 8 digitos aleatorios deberian ser suficientes. He pensado en añadirele tambien el dia del mes, ¿que pensais vosotros?? PD: Dejar un espacio en blanco en el nombre del cursor lo trunca. Por ejemplo "cursor, portate bien" quedaria como "cursor," |
#3
|
|||
|
|||
Sobre el 'name', creo que andas equivocado: después del create es cuando se le asignan los valores del inspector de propiedades al objeto, y seria muy raro que no se asignara nombre si haces, por ejemplo
si esto te muestra una cadena vacia, hay un problema gordo Sobre lo del tiempo, usaria todas las cifras de fecha y hora : nunca son iguales
s tendria que ser '21032003130923' Cita:
Última edición por coso fecha: 14-12-2008 a las 16:31:05. |
#4
|
|||
|
|||
OK Coso, me ha sido de mucha ayuda.
Si, tengo un randseed, y es lo que me anda provocando el problema, lo tengo bastante claro. Tengo un timer que encripta y envia una información cada cierto tiempo. Es algo opcional, parece que solo este cliente lo tiene activado. Al encriptar utilizo una rutina que inicializa el randseed. Cuando hicimos las pruebas, no esperamos el tiempo suficiente para que los cursores empezaran a repetirse, asi que todo parecia estar correctamente. Ya sabemos las "determinadas circunstancias" en las que los MDO daran problemas. Es mas, creo que los IBX tambien tendran el mismo problema. La solucion pasa por eliminar los cursores aleatorios y convertirlos en unicos. Lo de que la fecha y la hora no se repiten es relativo. Si el cliente modifica la fecha y hora del windows hacia atras comenzaria la pesadilla. Tambien con los cambios de horario de verano/invierno. Lo ideal seria conseguir numeros unicos, quizas utilice GUI, si es que no se ve afectado por el randseed Voy a hacer las pruebas activando la opcion que reinicia la semilla y os comento. |
#5
|
||||
|
||||
Yo no gastaría más tiempo en el randseed, está claro que al ejecutarlo reinicializa la semilla y es cuando empiezan los problemas.
¿puedes crear un simple número Int64 e ir incrementándolo cada vez que se crea un nuevo cursor? Obviamente lo pasas a string y ya tienes números bastante grandes. Incluso puedes guardarlo en un archivo .ini y continuar con él hasta cierto número predeterminado, después de eso lo reinicias: Los GUID son creados por Microsoft y por ello no sabemos cómo están hechos, (al menos yo). Ya puesto, puedes mezclar y el formato de fecha y hora, incluyendo milisegundos con un Int64:
El problema según creo entender son esos cursores que acceden a las tablas de sistema ¿no? Suerte
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 14-12-2008 a las 16:53:19. |
#6
|
|||
|
|||
Lo que propone Lepe estaria bien, pero resulta que el name nunca llega hasta el codigo donde se crea el cursor.
He puesto un comprobante para que salte si al crear el cursor name<>'', y ninguno de los cursores recibe valor en name. Ni los puestos en tiempo de diseño, ni los creados en ejecucion (añadiendo query.name explicitamente), tanto querys como datasets. Creo que Al Gonzaléz me advirtió de que esto pasaria, aunque no se como lograr que funcione. Yo pude reproducir el error con cursores de un solo digito, y las sentencias más afectadas eran las de tablas de sistema, ya que no se en que transacción estan, ni cada cuanto tiempo se abren y cierran. Con las sentencias SQL que creo yo acostumbro a abrir la transaccion, ejecutar el SQL y cerrarla. Como los cursores creo que tienen ambito a nivel de transacion, no es facil que coincidan dos cursores abiertos con el mismo nombre. |
#7
|
||||
|
||||
Creo que no estoy entendiendo algo.... no puede ser tan fácil, a ver, yo he hecho lo siguiente:
- en mdosql.pas he añadido una nueva propiedad pública al TMDOSQL:
y ahora en el Prepare:
FCursor es una variable protegida, ni propiedad ni nada, es una simple y mortar variable, pues la reuso y me quedo tan pancho. - Guardo y cierro todo. - Abro el paquete de los mdo que está en la carpeta "source" con nombre mdo_dX, pulso F12 para que aparezca la ventanita de compilación y pulso el botón compilar. - Listo, Ahora ya tengo una propiedad en el TMDOSQL que se llama "UniqueCursorName:string" que desde mi programa principal puedo asignar su valor. En el caso de que se te olvide asignar esa propiedad, en ejecución obtendrás una excepción muy bonita. Además no creo que se te olvide nunca... ¿qué es lo que me estoy perdiendo? PD: Si ahora me alguien con aquello de que esto es una chapuza más grande, pues que lo pinte de amarillito y con flores Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. Última edición por Lepe fecha: 14-12-2008 a las 22:46:56. |
#8
|
|||
|
|||
Sin haberlo probado, y arriesgo de equivocarme, ¿cual seria el cursor de las sentencias que acceden a las tablas del sistema? Creo que estaria vacio.
Y en los Dataset que tienen las 4 sentencias de SELECT, INSERT, UPDATE y DELETE?? Y en los script, backup, restore?? El problema es que name llega en blanco al crear el cursor, si llegase el nombre del query (dataset, script, ...) ya lo podriamos usar como identificador, y si le añadimos la hora, o la randomstring o las dos cosas ya tendriamos un identificador unico para cualquier SQL que pase por cualquier MDO. Yo no se como resolver lo del name, no tengo ni idea de porque no llega hasta el codigo donde se asigna al cursor. De momento, he dejado la linea del cursor asi: La rutina que ejecuta el randseed seguira puesta en el timer, reiniciandolo cada 5 minutos. En cuanto lo pruebe os comento. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Mensaje de error extraño | Sick boy | Firebird e Interbase | 0 | 12-12-2008 11:22:26 |
Error Extraño | SysAdminGCS | Varios | 1 | 18-08-2007 16:30:49 |
Error Extraño | Esau | SQL | 4 | 17-06-2005 22:44:16 |
error extraño | gilberto_1126 | Varios | 2 | 05-09-2004 01:01:01 |
Error Extraño | Esau | OOP | 5 | 19-11-2003 18:01:32 |
|