FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
Cita:
Cita:
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:
con hacer "DataSet.Insert" (y luego el Post) sería suficiente. Cita:
__________________
Progress Openedge https://abevoelker.com/progress_open...dered_harmful/ Delphi forever... |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
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:
Bueno por lo pronto te doy la idea, no tengo el Delphi a la mano y no he podido probarlo. Un Saludo! |
#5
|
|||
|
|||
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 |
#6
|
||||
|
||||
Hola,
si el valor del código se va "armar" en el cliente, yo recastaría el valor del generador con una consulta:
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. |
|
|
|