PDA

Ver la Versión Completa : Valores previos únicos en controles data-aware


gorsan
20-03-2008, 13:04:12
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:

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:


procedure TDMCpu.IBCpuNewRecord(DataSet: TDataSet);
begin
with IBSQLValores_Iniciales do
begin
close;
ExecQuery;
FreeHandle;
end;
end;

El Stored Procedure que construi al efecto es:

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

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.


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



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.