Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-03-2008
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 20-03-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
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.
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 20-03-2008
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
Gracias por la respuesta. ¿Me puedes indicar como?
Responder Con Cita
  #4  
Antiguo 20-03-2008
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
ejecuta esta sentencia desde el query

Código SQL [-]
select GEN_ID(MiGenerador, 1) as Correlativo from rdb$database;
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #5  
Antiguo 20-03-2008
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 20-03-2008
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 913
Poder: 22
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
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
Responder Con Cita
  #7  
Antiguo 21-03-2008
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
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?

Última edición por gorsan fecha: 21-03-2008 a las 00:48:17.
Responder Con Cita
  #8  
Antiguo 21-03-2008
gorsan gorsan is offline
Miembro
 
Registrado: jun 2003
Ubicación: Alcala de Henares (Madrid)
Posts: 87
Poder: 21
gorsan Va por buen camino
Ok. La cosa ha quedado solucionada, gracias al metodo que me proporciono Cloayza. Muchas gracias a todos por la ayuda.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Missing data provider or data packet mcalmanovici Providers 1 11-09-2007 05:55:15
Data-aware o no data-aware... esa es la cuestión! __marcsc Debates 22 09-07-2006 21:32:36
Data Aware vs Clases Carlosj Varios 1 10-05-2006 15:04:26
Distincion de mayusculas en campos unicos xerkan Firebird e Interbase 4 01-09-2004 18:45:46
Valores unicos en tablas mySQL jmselesan MySQL 1 05-08-2003 16:26:48


La franja horaria es GMT +2. Ahora son las 17:24:33.


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