Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Valores previos únicos en controles data-aware (https://www.clubdelphi.com/foros/showthread.php?t=54487)

gorsan 20-03-2008 13:04:12

Valores previos únicos en controles data-aware
 
Buenos días a todos.
Hoy les planteo la siguiente cuestión:
Trabajo con Delphi 7 e Interbase 6.

Dispongo sobre un formulario una serie de controles data-aware (DBEdit) linkados a los campos de un IBDataSet. En respuesta al click de un botón añado un nuevo registro en blanco:
Código Delphi [-]
procedure TWCpu.TBAddClick(Sender: TObject);
begin
   TBAdd.Enabled:=False;
   TBEditar.Enabled:=False;
   TBBorrar.Enabled:=False;
   TBGrabar.Enabled:=True;
   TBCancelar.Enabled:=True;
   EBuscar.SetFocus;
   with DMCpu.IBCpu do
    try
       DisableControls;
       Close;
       Open;
       Append;
    finally
       EnableControls;
    end;
   DBId_inv_cpu.SetFocus;
end;
Es en este momento donde quiero que salga escrito en algunos de ellos una serie de valores. Pero la cosa no es tan simple porque esos campos están definidos como not null y unique.
Lo que pido es ayuda en la construcción de un mecanismo que escriba valores unicos en esos controles, valores algo asi como NoIp01, NoDominio01, etc, y que luego, al quedar solo escritos en los DBEdit, el usuario pueda introducir sus valores y de no hacerlo, que no salte la excepcion por ser un valor repetido.
He intentado hacerlo con generadores pero estos escriben el valor en la tabla más tarde de lo que yo quiero que lo hagan. En concreto he intentado:

Código Delphi [-]
procedure TDMCpu.IBCpuNewRecord(DataSet: TDataSet);
begin
   with IBSQLValores_Iniciales do
   begin
      close;
      ExecQuery;
      FreeHandle;
   end;
end;
El Stored Procedure que construi al efecto es:
Código SQL [-]
ALTER PROCEDURE "INSERTAR_VALORES_EN_TABLA_CPU" 
AS
BEGIN
 UPDATE CPU
 SET
   "ID_DOMINIO"=GEN_ID(CONTADOR_PARA_ID_DOMINIO_EN_CPU,1),
   "IP"=GEN_ID(CONTADOR_PARA_IP_EN_CPU,1),
   "RACK"=GEN_ID(CONTADOR_PARA_RACK_EN_CPU,1),
   "LP_SIP_ACTUAL"=GEN_ID(CONTADOR_PARA_IMP_EN_CPU,1);
END
 ^
Pero no funciona como yo quiero. ¿Alguien me puede dar una idea de como hacerlo? Muchas gracias por vuestro tiempo.

eduarcol 20-03-2008 13:58:53

En lugar de ejecutar un procedimiento lee el generador por medio de un select, y en el evento de OnNewRecord lo lees en un query.

gorsan 20-03-2008 14:03:59

Gracias por la respuesta. ¿Me puedes indicar como?

eduarcol 20-03-2008 14:19:51

ejecuta esta sentencia desde el query

Código SQL [-]
select GEN_ID(MiGenerador, 1) as Correlativo from rdb$database;

gorsan 20-03-2008 18:49:56

No funciona.
He metido la sentencia que me dices dentro del query, en concreto, dentro de la propiedad SQL del mismo y este query se ejecuta en el evento OnNewRecord pero no sale nada en el control DBEdit.Text correspondiente. Sale una vez que le doy al boton guardar. Otra pega es que de esta forma solo aparece en la propiedad text del DBEdit el numero correlativo del generador y me gustaria que fuera una combinacion de el generador con un texto, por ejemplo No_Ip_10 o similar.

cloayza 20-03-2008 21:40:54

Creo que esta es una posible solucion:

Crear procedimiento que devuelva los valores que necesito.

Código SQL [-]
CREATE PROCEDURE GET_INITIAL_VALUES
RETURNS(ID_DOMINIO AS INTEGER, 
             IP AS INTEGER,
            RACK AS INTEGER, 
            LP_SIP_ACTUAL AS INTEGER)
AS
BEGIN
       ID_DOMINIO=GEN_ID(CONTADOR_PARA_ID_DOMINIO_EN_CPU,1),
       IP             =GEN_ID(CONTADOR_PARA_IP_EN_CPU,1),
       RACK         =GEN_ID(CONTADOR_PARA_RACK_EN_CPU,1),
       LP_SIP_ACTUAL=GEN_ID(CONTADOR_PARA_IMP_EN_CPU,1);
    
      suspend;
END

Código Delphi [-]
procedure TDMCpu.IBCpuNewRecord(DataSet: TDataSet);
begin
     IBStoredProc1.StoreProcName:='GET_INITIAL_VALUES';
     IBStoredProc1.Prepare;
     IBStoredProc1.Open;
       IBCpu.FieldByName('ID_DOMINIO').AsInteger:=IBSQLValores_Iniciales.FieldByName('ID_DOMINIO').AsIntege  r;
IBCpu.FieldByName('IP').AsInteger:=IBSQLValores_Iniciales.FieldByName('IP').AsInteger;
IBCpu.FieldByName('RACK').AsInteger:=IBSQLValores_Iniciales.FieldByName('RACK').AsInteger;
IBCpu.FieldByName('LP_SIP_ACTUAL').AsInteger:=IBSQLValores_Iniciales.FieldByName('LP_SIP_ACTUAL').As  Integer;
     IBSQLValores_Iniciales.Close;
end;

Espero te sirva...
Saludos desde
Concepcion-Chile

gorsan 21-03-2008 00:31:41

Ante todo gracias por la respuesta a Cloayza.
No entiendo bien el método. De lo que dices se deduce que hay tres componenetes: un IBDataSet que es IBCpu, un IBStoredProc y un IBSQL.
Con el IBStoredProc abres el procedimiento GET_INITIAL_VALUES que devuelve los cuatro valores iniciales pero no entiendo bien la funcion de IBSQLValores_iniciales. ¿que ejecuto con el? ¿lo cierras pero no lo abres? Y sobre todo ¿como uso los valores que devuelve el IBStoredProc?
¿Podrias ser un poco mas explicito por favor?

gorsan 21-03-2008 18:54:43

Ok. La cosa ha quedado solucionada, gracias al metodo que me proporciono Cloayza. Muchas gracias a todos por la ayuda.


La franja horaria es GMT +2. Ahora son las 13:44: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