Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como validar con una DBgrid... (https://www.clubdelphi.com/foros/showthread.php?t=20330)

uper 12-04-2005 20:43:55

Como validar con una DBgrid...
 
Saludos

disculpen, alguien ha tenido que hacer una validacion de un campo, es decir, tengo una tabla llamada etiquetas con un campo Estado definido como Char(1); donde solo admite dos valores T y A.
cuando se da de alta un registro, esta en estado T y cuando ya estan acompletados los datos despues de haber pasado por varios porcesos a evaluar en las areas involucradas se da por echo una Afirmacion = A
me solicitan que cuando ya este en estado A ya no se pueda modificar cierto registro, ni siquera en los componentes dbedit, todos los datos a ver estan en la misma forma: ya sea en una dbGrid y en Dbedit. bueno realize un procediento que cada vez que navege entre los registro evalue el ESTADO pero como seria ahora cuando este posicionado sobre la BDgrid que de igual forma se puede navegar entre registros.

Procedure TfrmEtiquetas.Selecionar;
var
Estado : boolean;
begin
If BD.ibEtiquetasESTADO.Value='A' then
begin
Estado := False;
acModificar.Enabled := Estado;
end

este proc. esta en cada boton personalizado para navegar < > entre registro.

gracias.

roman 12-04-2005 21:06:34

En lugar de abarcar todas las posibles formas de navegar por los registros utiliza el evento AfterScroll del dataset para determinar si el registro actual es o no modificable.

Y para mayor seguridad podrías usar el evento BeforePost del dataset para impedir que se modifique un registro con Estado = 'A'.

// Saludos

uper 13-04-2005 01:15:40

saludos,
a que se refiere a que sea el regitsro actual modificable o no dentro del evento AfterScroll del dataset.
que desde ahi comprueba si tiene el estado A o T ?
e incluir la unidad de la forma al modulo de datos para que desde ahi valide el estado,

alguna opinion.


gracias.

roman 13-04-2005 01:48:18

El evento AfterScroll se lanza cada vez que te mueves de registro,ya sea por código, con un DBNavigator o con un DBGrid. Por ello, en lugar de implementar una revisión del estado para cada posible método de navegación, usas este evento. Cuando el evento se lance bastará que examines el campo ESTADO para habilitar o inhabilitar tus controles.

// Saludos

uper 14-04-2005 21:59:38

saludos,
les comento que con las indicaciones de validar en el evento onAfterscroll de dataset me sirvio, nadamas tengo una duda de que me da un error.
realize un procedimiento para los controles que cambiara la propiedad ReadOnly a True,

Código Delphi [-]
public   /// de la forma etiquetas
procedure SetReadOnly(Value:boolean);
---
procedure TfrmEtiquetas.SetReadOnly(Value:boolean);
var
   PropInfo  : PPropInfo;
   Component : TComponent;
   i         : integer;
 begin
   for i := 0 to ComponentCount - 1 do begin
     Component := Components[ i ];
     if Component is TControl then begin
       PropInfo := GetPropInfo( Component.ClassInfo, 'ReadOnly' );
       if Assigned( PropInfo ) and
          ( PropInfo^.PropType^.Kind = tkEnumeration ) then
         SetOrdProp( Component, PropInfo, integer( Value ) );
     end;
   end;
 end;

el segundo procediento en el Modulo de datos:
en

Código Delphi [-]
Private
 procedure  EstadoEtiq;
 
procedure TBD.EstadoEtiq;
begin
   if ibEtiquetasESTADO.Value='A' then
       begin
        Estado := False;
        frmEtiquetas.acModificar.Enabled:=estado;
        frmEtiquetas.SetReadOnly(true);
      end
    else
      begin
       Estado := true;
       frmEtiquetas.acModificar.Enabled:=estado;
       frmEtiquetas.SetReadOnly(false);
      end;
end;
 
procedure TBD.ibEtiquetasAfterScroll(DataSet: TDataSet);
begin
  HayImagen;  ----->funcion para comprobar si hay imagen isnull
  EstadoEtiq;  ------>>>Linea agregada
end;

Si agrego estadoEtiq me da un errror de acess violation at adress 009ee93b in modulo ventas.exe read or adress ffffffff cuando voy al menu de etiquetas;
esto es lo raro si la agrego me da error y despues tengo que volver al menu y entrar a etiquetas.

Que puediera ser, alguna razon
gracias

roman 14-04-2005 22:23:22

Cita:

Empezado por uper
esto es lo raro si la agrego me da error

¿Y por qué es raro esto? Al agregar código de fuerza aumentan las posibilidades de error.

Para empezar yo no usaría RTTI a no ser que fuera absolutamente necesario e imposible hacerlo de otra forma. Si no se domina, las probabilidades de encontrarse un "Access Violation" son altísimas ya que se hace un uso fuera de lo común (en Delphi) de apuntadores.

Por ejemplo, tu haces la verificación

Código Delphi [-]
if Assigned(PropInfo) and (PropInfo^.PropType^.Kind = tkEnumeration) then

La primera parte de la condición ciertamente te garantiza que PropInfo no es nil pero en la segunda parte no sólo referencias PropInfo sino que vas hasta PropInfo^.PropType^.Kind. ¿Quién te garantiza que PropInfo^.PropType no es nil?

Y como te decía, ¿realmente te es necesario usar RTTI?

// Saludos

jachguate 14-04-2005 22:28:38

Seguramente no ha sido creada la forma la primera vez que se ejecuta el código. Bastaría añadir un IF al método EstadoEtiq para verificar que la variable frmEtiquetas no sea nil.

En particular, este tipo de manipulación de componenetes visuales, y principalmente para evitar las referencias en el módulo de datos a formas, yo me valgo del evento OnDataChange del DataSource.

Hasta luego.

;)

Hasta luego;

uper 15-04-2005 16:52:48

saludos,
comento que ya realice unos cambios para comprobar si es frmEtiquetas no sea nil, y para los dos eventos tanto OnDataChange como onAfterscroll ya no da error, coloque las sig. lineas probando en uno de los dos eventos, solo me queda una duda.

procedure TBD.dsEtiquetasDataChange(Sender: TObject; Field: TField);
begin
if frmEtiquetas = nil then
frmEtiquetas := TfrmEtiquetas.Create(nil);
frmEtiquetas.Show;
// frmEtiquetas.ShowModal;
estadoEtiq;
end;
Si mi forma es showmodal me da un mensaje: cannot make a visible windows modal, en caso contrario con Show puedo ver mi form sin problemas, ¿Hay alguna manera de que pueda mostrar mi form en showmodal?


gracias

jachguate 15-04-2005 17:11:13

De alguna manera la forma ya está visible cuando llamas a ShowModal. Revisá tus fuentes o seguí la ejecución con el depurador para determinar en que momento se hace una llamada a Show y eliminala.

Hasta luego.

;)

uper 15-04-2005 23:26:49

hola,

pues no esta visible la form al llamarla desde el menu por decirlo, la hago desde el evento OnDataChange de DataSource.
en el menu Eiquetas solo abro las tablas:
TfrmVentasInnova.acEtiquetasExecute(Sender: TObject);
begin
ibEtiquetas.open;
end;

Existe alguna manera asignar una forma a showmodal desde el modulo de datos ?

gracias

roman 15-04-2005 23:34:12

Revisa la propiedad Visible del formulario en el inspector de objetos y asegúrate de que esté en false.

// Saludos

uper 18-04-2005 17:45:00

Saludos

tengo una duda, hay en un menu que uno se refiere a llamar a etiquetas y otro a ordenes, estoy observando que en ordenes tiene relacion con otras tablas entre ellas etiquetas y ordenes.. para el primer caso de llamar una forma desde un modulo de datos, lo que unico que se me ocurrio es hacer una llamada a la forma que se cree y se muestre en forma.Show sin embargo ahora que estoy viendo que en el menu de ordenes esta tabla hace relacion con otras, al entrar a esta opcion se ejecutan las dos pantallas primero Frmetiquetas y luego Ordenes al realizar una busqueda en frmEtiqueta se queda inmovil, por que se ejecuto antes de que yo realizara la busqueda.

procedure TBD.dsEtiquetasDataChange(Sender: TObject; Field: TField);
begin
if frmEtiquetas = nil then
frmEtiquetas := TfrmEtiquetas.Create(nil);
frmEtiquetas.Show;
// frmEtiquetas.ShowModal;
estadoEtiq;
end;
Como en este evento datachange tiene definido que se creee la forma de etiquetas, cuando voy al menu de ordenes me trae con sigo tambien la form_etiquetas
se puede hacer algo para que no se ejecute sino hasta que uno se le indique
en este caso al realizar una busqueda,
gracias.


La franja horaria es GMT +2. Ahora son las 18:17:50.

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