FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
problema con visibilidad de transacciones
saludos..., estoy creando un mantenimiento en el que pretendo que
uno de los campos claves (codigobanco) se autoasigne en el Triguer de la base de datos 'beforeinsert'. 1.-) Cuando creo un nuevo registro en el mantenimiento, en la aplicación cliente no veo el valor de dicho campo clave en ningun momento, es decir cuando creo un nuevo registro el valor del campo clave asignado por el triguer aparece vacio, incluso después de grabar el campo tambien aparece vacio, en cámbio, cuando cierro y abro la aplicación si que aparece automáticamente el registro con el valor asignado por el triguer correctamente. De hecho, incluso despues de grabar dicho nuevo registro ,hojeando la base de datos en el 'sql Manager' observo que se ha generado correctamente el valor del campo. Utilizo el componente tfibdataset de los fibplus 2.-) Por otro lado, si en el evento afterinsert de dicho componente, intento asignar el foco de edifición en un dbedit con por ejemplo 'editnombre.setfocus', recibo un accesviolation ¿? este es el código de la base de datos. Código:
CREATE TABLE FAC_MAE_FABAN ( EMPRESA VARCHAR(3) CHARACTER SET NONE NOT NULL COLLATE NONE, CODIGOBANCO INTEGER NOT NULL, NOMBREBANCO VARCHAR(40) CHARACTER SET NONE COLLATE NONE, ENTIDAD VARCHAR(4) CHARACTER SET NONE COLLATE NONE, SUCURSAL VARCHAR(4) CHARACTER SET NONE COLLATE NONE, DC VARCHAR(2) CHARACTER SET NONE COLLATE NONE, CUENTA VARCHAR(10) CHARACTER SET NONE COLLATE NONE, POBLACION VARCHAR(40) CHARACTER SET NONE COLLATE NONE, DIRECCION VARCHAR(40) CHARACTER SET NONE COLLATE NONE, PROVINCIA VARCHAR(20) CHARACTER SET NONE COLLATE NONE, TELEFONO DEF_TFNO_FAX, FAX DEF_TFNO_FAX, OBSERVACION BLOB, CUENTACONTABLE VARCHAR(8) CHARACTER SET NONE COLLATE NONE, CLAVELIBROPOSICION VARCHAR(10) CHARACTER SET NONE COLLATE NONE, RIESGOMAXIMOPAGARES NUMERIC(11, 2) DEFAULT 0.0, RIESGOMAXIMORECIBOS NUMERIC(11, 2) DEFAULT 0.0, RIESGOMAXIMO COMPUTED BY (RIESGOMAXIMORECIBOS+RIESGOMAXIMOPAGARES)); ALTER TABLE FAC_MAE_FABAN ADD CONSTRAINT PK_FAC_MAE_FABAN PRIMARY KEY (EMPRESA,CODIGOBANCO); CREATE INDEX FAC_MAE_FABAN_IDX1 ON FAC_MAE_FABAN(NOMBREBANCO); SET TERM ^ ; SET TERM ^ ; CREATE TRIGGER FAC_MAE_FABAN_BI FOR FAC_MAE_FABAN ACTIVE BEFORE INSERT POSITION 0 AS DECLARE VARIABLE NULTIMO INTEGER DEFAULT 0; BEGIN nultimo = 0; if (new.codigobanco is null) then begin select max( codigobanco ) from fac_mae_faban Where (empresa = new.empresa) into :nultimo; nultimo = nultimo+1; new.codigobanco = nultimo; end END^ SET TERM ; ^ |
#2
|
|||
|
|||
valores por defecto
me contesto a mi mismo....
En cuanto a la visiblidad , bueno, he podido solucionarlo simplemente cerrando y volviendo a abrir el dataset, el único problema es que al hacerlo, por defecto el dataset se desplaza al último registro, me gustaria conseguir que si por ejemplo el usuario confirma los cambios de edición del registro con el código 25, al confirmar los cámbios no se desplaze al registro con el código 41 (último). Por otro lado, sigo sin conseguir visualizar el valor asignado por el triguer 'before insert' hasta que hago el post..., he estado haciendo pruebas con los componentes 'fibevents', pero me doy cuenta de que su función principal es la 'refrescar' los contenidos de la base de datos a otros clientes conectados. saludos,, sigo buscando soluciones... |
#3
|
|||
|
|||
resuelto con stored procedure
simplemente comentar que estaba equivocado, los triggers before insert se ejecutan justo antes de efectuar la inserción del registro, no para suministrar valores por defecto iniciales que era mi intención.
al final lo he solucionado, llamando a un stored procedure desde el evento afterinsert del componente tfibdataset. me queda por resolver el hecho de recuperar el puntero después de guardar una edición de un registro, al cerrar y abrir el componente, se posiciona en el último registro. saludos... |
#4
|
||||
|
||||
¿Probaste con refresh?, con esto te refresca el registro en el que estás posicionado sin actualzar todo, de otra forma para posicionarte en el registro que quieres utiliza el locate de tu componente.
Saludos |
#5
|
|||
|
|||
refresh
Cita:
al cerrar y volver a abrir el mantenimiento, aparece todo correcto al final lo he solucionado haciendo dataset.close; dataset.open; dataset.locate( 'registrox') // solo para los casos de edición. aunque funciona, imagino que el cerrar y volver a abrir el conjunto de datos no es la mejor solución por el mayor consumo de registros que representa: nota: en el efecto afterpost del dataset tengo la siguiente cadena tpfibdataset( dataset ).transaction.commitretaining; gracias por la ayuda... |
#6
|
|||
|
|||
Hola,
empezar diciendo que no uso los FIb, uso MDO, pero son similares. Cita:
Tu mismo dices que te funciona, pero que no ves el dato añadido hasta que vuelves a abrir el dataset. Entonces, asignar el valor funciona, el problema es que no lo ves en ese momento. ¿Estas seguro de que es la misma transaccion?? Los FIb tienen un componente de transaccion independiente del dataset?? Has comprobado la opcion (AutoCommit) por defecto del dataset?? Cita:
Si te preocupa el close y open, te deberia preocupar mucho más el locate, que no utiliza ningun indice para hacer la busqueda, y se trae todos los datos del dataset hasta encontrar el que coincide. Creo que la opcion de usar bookmarks puede servirte mejor. Cita:
Si funciona bien, lo que hacer es un commit de la transaccion, más la apertura del dataset asociado (y quizas me equivoque, pero creo que deberia colocar el cursor en el punto donde estaba anteriormente), lo cual efectivamente consume recursos, tiempo y red. Puede que estes haciendo otras cosas que interfieran, si puedes poner más informacion, el codigo que utilizas, etc... |
#7
|
||||
|
||||
Cita:
Debes de saber además que los FIBPlus tienen los siguientes procedimientos:
__________________
Gracias, Rolphy Reyes |
#8
|
|||
|
|||
gracias por contestar
Cita:
tengo entendido que no se puede utilizar un select del tipo select last 20 from ..... para recuperar los últimos 20 registros,,según el índice activo..¿ es correcto ? Cita:
|
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Articulo: Atributos de visibilidad en Delphi | marceloalegre | Varios | 4 | 25-03-2008 16:29:15 |
Visibilidad de un objeto instanciado en Form1 desde otra unit | lujansantos | OOP | 2 | 18-07-2007 16:33:13 |
Problema con transacciones en Access y Delphi | Capi666 | SQL | 1 | 11-01-2007 21:49:14 |
Problema con TClientDataSet y Transacciones | dieleo | Conexión con bases de datos | 0 | 01-09-2006 02:06:32 |
Problema en el uso de Transacciones | AGAG4 | Conexión con bases de datos | 13 | 15-06-2005 19:56:49 |
|