Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-05-2005
inferno inferno is offline
Miembro
 
Registrado: may 2005
Posts: 10
Poder: 0
inferno Va por buen camino
hola Hector ,es Julio ramos mi problema es el siguiente muy paresido al de JoanKa:Tengo las siguiente tablas:
CREATE TABLE tblfacturas (
COD_factura long NOT NULL,
NOMB_CLI VARCHAR(30),
);
CREATE TABLE tbltiene
(
COD_factura long NOT NULL, /* este campo esta referenciado al campo clave de tblfacturas*/

cod_articulo VARCHAR(10) NOT NULL/* este campo esta referenciado al campo clave de tblarticulo*/
);


CREATE TABLE tblarticulo
(

cod_articulo VARCHAR(10) NOT NULL,
nomb_articulo VARCHAR(50) NOT NULL
);


asi como este Procedimiento almacenado

CREATE PROCEDURE INSERTAR_factura (
COD_factura VARCHAR(10),
NOM_cli VARCHAR(30),
AS
begin
INSERT INTO tblfacturas (CODI_factura, NOMB_CLI, )
values (:COD_factura, :NOM_cli);
end


tengo este trigger
CREATE GENERATOR CODI_GENER;
SET GENERATOR CODI_GENER TO 0;


CREATE TRIGGER INSERTAR_CODI FOR CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.cod_factura is null) then
new.cod_factura=gen_id(codi_gener,1);/*este numero hay manera de sacarlo al momento de ser generado por alguna consulta,porcedimeinto desde delphi,el manejador*/
end
como puedes ver necesito el numero que genera el trigger al momento de insertar el tabla factura para colocarlo en tabla tbltiene en el campo cod_factura
este procedure lo puede hacer la cosa es que si el sistema esta en red me entiendes varias aplicaciones conectadas a la misma base de datos (cliente servidor).Porque un cliente "a" ejecuta el procedimiento insertar_factura y otro cliente "b" tambien ejecuta el procedimiento insertar_factura entoces caimos en esto que el cliente "b" ejecuta primero el procedimiento que retorna el numero generado por ejemplo el procedimeinto tu yo (CREATE PROCEDURE GET_NEXT_CODI_CLIE), al momento de seleccionar el valor selecciona la correcta o selecciona el ultimo numero generado y no es la correcta por primero el cliente "a" solicito el procedimiento insertar_factura.
CREATE PROCEDURE GET_NEXT_CODI_CLIE
RETURNS (NUEVO_CODI_CLIE long)
AS
BEGIN
/*Obtienes el valor actual del generador sin incrementarlo*/
/*Observa el incremento en cero en la función gen_id*/
NUEVO_CODI_CLIE=CAST(gen_id(codi_gener,0)+1 AS VARCHAR(7));
SUSPEND;
END

espero que me puedas ayudar....
Responder Con Cita
  #2  
Antiguo 30-05-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
Hola nuevamente!

Cita:
Empezado por inferno
como puedes ver necesito el numero que genera el trigger al momento de insertar el tabla factura para colocarlo en tabla tbltiene en el campo cod_factura
Bueno, voy a suponer que estás utilizando Delphi, tengo una respuesta que tal vez se ajuste a tus necesidades, las siguientes líneas las saqué de este hilo:

Conectar Trigger con Delphi:

http://www.clubdelphi.com/foros/show...2152#post82152

Cita:
Empezado por HECTOR RANDOLPH
Si utilizas los componentes IBX que vienen con el Delphi, me refiero a IBDataSet o IBQuery puedes encontrar una propiedad que se llama GeneratorField

Las opciones que tienes que configurar son :

Primero indicas cual es el generador y campo que afecta

Generator: CODI_GEN
Field: COD_FACTURA
Increment By: 1

Después indicas en que momento se actualiza el generador

Apply Event
- On New Record
- On Post
- On Server

La selección de Apply Event es al gusto del cliente, por jemplo si seleccionas On New Record el generador se dispara al momento de insertar un registro (IBQuery1.Insert) y el campo COD_FACTURA se actualiza inmediatamente con el valor correspondiente en la secuencia, el inconveniente en este caso es que si cancelas la inserción (IBQuery1.Cancel) el generador ya se actualizó y se salta ese número de la secuencia.

Para evitar esto puedes elegir On Post de esta forma el generador se actualiza cuando guardas el registro (IBQuery1.Post).

La última opción On Server como su nombre lo indica es dejar que el servidor se encarge de actualizar el generador.
En teoría, si aplicas este método, el campo COD_FACTURA de la tabla tblfacturas tendrá siempre el valor correcto del generador después de una inserción.

Espero que sea útil y seguimos en contacto.
Responder Con Cita
  #3  
Antiguo 31-05-2005
JoanKa JoanKa is offline
Miembro
 
Registrado: ene 2005
Posts: 92
Poder: 20
JoanKa Va por buen camino
Vamos a ver.

Yo lo resolvi este problema de la Siguiente Manera

1° Tenia que crear un SP donde obtendria el codigo siguiente a grabar, es decir,

CREATE PROCEDURE CODIGO_SIGUIENTE
RETURNS (
NUEVO_CODI_CLIE VARCHAR(10))
AS
begin
NUEVO_CODI_CLIE='CLI' || CAST(gen_id(codi_gener,0)+1 AS VARCHAR(7));
suspend;
end

2. En delphi agrege Un IBQuery y Un DataSource
3. En la propiedad SQL del IBQUERY escribi : Select * from CODIGO_SIGUIENTE
4. En la Propiedad DATASET del DATASOURCE coloque IBQuery1
5. Ahora en el Objeto TBEDIT en su propiedad DATASOURCE escribi DATASOURCE1
6. y por ultimo en el Objeto TBEDIT en su propiedad DATAFIELD coloque: NUEVO_CODI_CLIE (que es el valor que retorna el SP).

Espero que te sirva.

Es obvio que para esto tienes que tener : IBDATABASE, IBTRANSACTION, y ver que haya conexion con Firebir

SALudos a TOdos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:46:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi