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 Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-05-2005
JoanKa JoanKa is offline
Miembro
 
Registrado: ene 2005
Posts: 92
Poder: 20
JoanKa Va por buen camino
Trigger, generador y SP relacionarlo con Delphi

Ante todo gracias por la atencion prestada.

Bueno les cuento que recien estoy empezando con esto de Firebird, es decir los triggers, SP y generadores y soy novato en esto y tengo algunos problemas


Tengo la siguiente tabla:
CREATE TABLE CLIENTE (
CODI_CLI VARCHAR(10) NOT NULL,
NOMB_CLI VARCHAR(30),
ALTA_CLI DATE,
OBSE_CLI BLOB SUB_TYPE 2 SEGMENT SIZE 8192,
PAGO_CLI FLOAT
);


asi como este Procedimiento almacenado

CREATE PROCEDURE INSERTAR_CLIENTE (
COD VARCHAR(10),
NOM VARCHAR(30),
ALT DATE,
OBS BLOB SUB_TYPE 1 SEGMENT SIZE 80,
PAG FLOAT)
AS
begin
INSERT INTO Cliente (CODI_CLI, NOMB_CLI, ALTA_CLI,PAGO_CLI, OBSE_CLI)
values (:COD, :NOM, :ALT, :PAG, :OBS);
end


y en Delphi hago lo siguiente:

with IBStoredProc1 do
begin
Params[0].AsString := txt_codigo.Text;
Params[1].AsString := txt_nombre.Text;
Params[2].AsDate := StrToDate(txt_fecha.Text);
Params[3].AsMemo := txt_observaciones.Text;
Params[4].AsFloat :=StrToFloat(txt_pago.Text);
ExecProc;
end;


Lo que hago con esto es registrar a un cliente y me lo hace correctamente hasta aca no tengo problemas todo OK.

Pero ahora quiero que el CODI_CLI SE EJECUTE AUTOMATICAMENTE, para eso
en firebird e creado un generador y un trigger.
Es decir.

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.codi_cli is null) then
new.codi_cli=gen_id(codi_gener,1);
end

Ahora mis preguntas son las siguientes:

1.- Quiero que objeto txt_codigo se edite el CODI_CLI de la siguiente manera :
CLI0010001,
CLI0010002,
CLI0010003,
CLI0010004.......

Para esto me parece que tengo que tener 2 partes CLI + NUMERO, es decir la la palabra CLI fija y NUMERO autoincremental (quiero que sea apartir de 1000). Como lo podria hacer esto.

2. Como se haria para relacionar el procedimiento almacenado y el trigger con delphi para que pueda registrar al cliente.
Viendo por alli informacion tengo que eliminar la linea siguiente

Params[0].AsString := txt_codigo.Text;

ya que el trigger me lo haria automaticamente.

3. Como puedo poner el codigo en delphi para llamar al trigger.


Gracias y Saludos a todos
Responder Con Cita
  #2  
Antiguo 27-05-2005
Avatar de defcon1_es
defcon1_es defcon1_es is offline
Miembro
 
Registrado: mar 2004
Ubicación: Cuenca - España
Posts: 533
Poder: 21
defcon1_es Va por buen camino
Cita:
Empezado por JoanKa
Pero ahora quiero que el CODI_CLI SE EJECUTE AUTOMATICAMENTE
Lo que quieres es que se le asigne un valor automáticamente, ¿no?

Cita:
Empezado por JoanKa
1.- Quiero que objeto txt_codigo se edite el CODI_CLI de la siguiente manera :
CLI0010001,
CLI0010002,
CLI0010003,
CLI0010004.......

Para esto me parece que tengo que tener 2 partes CLI + NUMERO, es decir la la palabra CLI fija y NUMERO autoincremental (quiero que sea apartir de 1000). Como lo podria hacer esto.
Prueba esto:
Código SQL [-]
CREATE TRIGGER INSERTAR_CODI FOR CLIENTE
ACTIVE BEFORE INSERT POSITION 0
AS
begin
/* if (new.codi_cli is null) then 
No hace falta que preguntes si tiene valor o no, 
porque quieres asignarle el valor automaticamente SIEMPRE.
*/ 
new.codi_cli = "CLI" || CAST(gen_id(codi_gener,1) AS VARCHAR(7));
end
Pruebalo, yo no he podido comprobar si funciona, te lo escribo "de cabeza".
Ten cuidado por si el resultado es mayor de 10 caracteres, que es la long. máxima que le has dado a ese campo.
Puede producirse el error "Aritmetic exception or numeric overflow"


Cita:
Empezado por JoanKa
2. Como se haria para relacionar el procedimiento almacenado y el trigger con delphi para que pueda registrar al cliente.
El trigger es automático, y como se activa antes de insertar el registro,
con hacer "DataSet.Insert" (y luego el Post) sería suficiente.

Cita:
Empezado por JoanKa
3. Como puedo poner el codigo en delphi para llamar al trigger.
DataSet.Insert o DataSet.Append
__________________
Progress Openedge
https://abevoelker.com/progress_open...dered_harmful/


Delphi forever...
Responder Con Cita
  #3  
Antiguo 27-05-2005
JoanKa JoanKa is offline
Miembro
 
Registrado: ene 2005
Posts: 92
Poder: 20
JoanKa Va por buen camino
Hola defcon1_es .

Sabes me fue de maravilla todo ok.

Creo que no me di a entender en el Tercer Punto a ver si me explico:

Supongamos que el ultimo cliente tiene el codigo
...
...
CLI15201 | Pedro Pablo | 11/05/2005 | Probando Observaciones.... | 100,50

Ahora ejecuto mi programa en delphi y tengo un textbox en el cual quiero que me muestre el codigo siguiente al ultimo ingresado (CLI15201) es decir me debe mostrar el codigo actual, es decir, CLI15202 y luego lo grabare en la base de datos.

Como se podria hacer esto en delphi.
Responder Con Cita
  #4  
Antiguo 27-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 Joanka!

Como bien lo dice Daniel en su respuesta anterior el Trigger no lo puedes llamar desde Delphi porque ese trabajo la corresponde sólo al servidor en Firebird, pero en su lugar puedes llamar un procedimiento almacenado para obtener el valor del generador.

Por ejemplo:

Código SQL [-]
CREATE PROCEDURE GET_NEXT_CODI_CLIE 
RETURNS (NUEVO_CODI_CLIE VARCHAR(10))
AS
BEGIN
   /*Obtienes el valor actual del generador sin incrementarlo*/
  /*Observa el incremento en cero en la función gen_id*/
  NUEVO_CODI_CLIE="CLI" || CAST(gen_id(codi_gener,0)+1 AS VARCHAR(7));
  SUSPEND;
END

Bueno por lo pronto te doy la idea, no tengo el Delphi a la mano y no he podido probarlo.

Un Saludo!
Responder Con Cita
  #5  
Antiguo 29-05-2005
JoanKa JoanKa is offline
Miembro
 
Registrado: ene 2005
Posts: 92
Poder: 20
JoanKa Va por buen camino
Hola Amigos Gracias por la respuesta pero tengo un problemilla al momento de mostrar o recibir el codigo siguiente (es decir si en la Tabla tengo como ultimo cliente el CLI10052 en el textbox me debe mostrar el siguiente: CLI10053) en el TextBox (txt_codigo) pero no me lo muestra,

txt_codigo.Text := IBStoredProc2.Params[0].AsString;

El procedimiento es el que me dijo HECTOR

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
No se que estara pasando o estoy recibiendo mal el parametro que se envia del SP..

Gracias
Responder Con Cita
  #6  
Antiguo 29-05-2005
Avatar de kinobi
kinobi kinobi is offline
Miembro
 
Registrado: may 2003
Posts: 2.621
Poder: 24
kinobi Va por buen camino
Hola,

si el valor del código se va "armar" en el cliente, yo recastaría el valor del generador con una consulta:

Código SQL [-]
select gen_id(MiGenerador, 0) from rdb$database

o

select gen_id(MiGenerador, 0)+1 from rdb$database

así evito tener que crear un procedimiento en el servidor. Si no se quiere hacer la conversión de tipos en el cliente, aplicar los CAST correspondientes en la consulta.

Saludos.

Última edición por kinobi fecha: 29-05-2005 a las 12:47:41.
Responder Con Cita
Respuesta



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 17:22:23.


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