Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-07-2013
Avatar de lbidi
lbidi lbidi is offline
Miembro
 
Registrado: oct 2003
Ubicación: Montevideo- URUGUAY
Posts: 417
Poder: 21
lbidi Va por buen camino
Validar datos en una grilla/tabla

Estimados.

Tengo una grilla de n filas por 2 columnas, asociada a una tabla. En la misma debo ingresar/modificar solamente números los cuales no se pueden repetir en ninguna otra celda de la tabla.

No me doy cuenta en cual evento puedo controlar esto, si en alguno de la tabla o de la grilla, porque
debo hacer todos los controles sobre todos las posibles salidas de la celda actual, sea con Enter o movimientos de cursor.

Se agradece cualquier sugerencia y/o comentario.

Saludos

Leo
Responder Con Cita
  #2  
Antiguo 09-07-2013
Avatar de ozsWizzard
ozsWizzard ozsWizzard is offline
Miembro
 
Registrado: may 2004
Ubicación: Murcia
Posts: 190
Poder: 21
ozsWizzard Va por buen camino
Solución 1
En el DataSet hay un beforesinsert y un beforeupdate, y validas antes de grabar en la tabla.

Eso se me ocurre.

Solución 2
Yo tengo un StringGrid (porque dices una grilla y he asumido que es un DBGrid) al que le creé el evento "ExitCell", pero esta solución te hace cargar los datos a mano en el Grid

Definición, justo después del uses
Código Delphi [-]
  TExitCell = procedure(Sender: TObject; const ACol, ARow: Integer) of object;

  TStringGrid = class(Vcl.Grids.TStringGrid)
      private
         FCol:    Integer;
         FRow:    Integer;
         FEntrar: Boolean;
         EditCel: Boolean;

         FExitCell:    TExitCell;
      protected
         function SelectCell(ACol, ARow: LongInt): Boolean; override;

         procedure DoEnter; override;
         procedure DoExit; override;
      public
         property ColAux: Integer read FCol    write FCol    default 0;
         property RowAux: Integer read FRow    write FRow    default 0;
         property Entrar: Boolean read FEntrar write FEntrar;

         //Eventos
         property OnExitCell: TExitCell read FExitCell write FExitCell;
  end;

Implementación
Código Delphi [-]
{ TStringGrid }

procedure TStringGrid.DoEnter;
begin
   inherited;
   ColAux := Col;
   RowAux := Row;
   Entrar := true;
end;

procedure TStringGrid.DoExit;
begin
   if Assigned(OnExitCell) then OnExitCell(Self, ColAux, RowAux);
   inherited;
end;

function TStringGrid.SelectCell(ACol, ARow: LongInt): Boolean;
begin
   //Para no repetir el evento OnExitCell cuando se entra al StringGrid
   if Entrar then
      Entrar := false
   else
      if Assigned(OnExitCell) then OnExitCell(Self, ColAux, RowAux);
   inherited;
   ColAux := ACol;
   RowAux := ARow;

   EditCel := false;
   Result := true;
end;


Solamente falta crear el procedimiento y asignarlo en tiempo de ejecución a la propiedad "OnExitCell".

También se puede meter en una unidad y ponerla siempre después de Grids.
__________________
La Madurez se llama...
~~~Gaia~~~
Responder Con Cita
  #3  
Antiguo 09-07-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Ibidi.

Otra opción, usando un TDBGrid, es aprovechar el evento OnValidate de los dos campos que no deberán repetirse (vg. CAMPO1 y CAMPO2):
Código Delphi [-]
...
procedure TForm.FormCreate(Sender: TObject);
begin
  tuTabla.FieldByName('CAMPO1').OnValidate := tbCamposValidate;
  tuTabla.FieldByName('CAMPO2').OnValidate := tbCamposValidate;
end;

procedure TForm.tbCamposValidate(Sender: TField);
begin
  tuQuery.Close;
  tuQuery.SQL.Clear;
  tuQuery.SQL.Add('SELECT Campo1 FROM ATABLA');
  tuQuery.SQL.Add('WHERE Campo1 = :PVALUE OR Campo2 = :PVALUE');
  tuQuery.ParamByName('PVALUE').AsInteger := Sender.AsInteger;
  tuQuery.Open;
  if not tuQuery.IsEmpty then
    raise Exception.Create('Valor existente');
  tuQuery.Close;
end;
...
procedure TForm.FormDestroy(Sender: TObject);
begin
  tuTabla.FieldByName('CAMPO1').OnValidate := nil;
  tuTabla.FieldByName('CAMPO2').OnValidate := nil;
end;
Para que sea mas claro asigné el evento OnValidate en tiempo de ejecución. Pero lo podes hacer mediante el Object Inspector creando los campos persistentes en diseño y ahorrándote la asignación por código.

Saludos.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Validar Datos de una tabla de memoria nickolas Conexión con bases de datos 5 26-05-2013 00:48:07
Recorrer Una Tabla O Dbgrid Para Validar Datos donpedro Conexión con bases de datos 10 18-07-2011 17:33:06
como ver un tipo de datos de una grilla en otra grilla en el mismo form? calistian Varios 5 01-10-2008 19:29:04
validar datos contra un valor de una tabla robertillo Varios 5 25-05-2007 18:58:15
Ancho de grilla segun columnas de tabla lbidi Tablas planas 1 24-01-2005 19:38:32


La franja horaria es GMT +2. Ahora son las 16:18:06.


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