Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 12-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #3  
Antiguo 13-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 13-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #5  
Antiguo 14-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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

Última edición por roman fecha: 14-04-2005 a las 22:16:29.
Responder Con Cita
  #6  
Antiguo 14-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #7  
Antiguo 14-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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;
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 15-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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
Responder Con Cita
  #9  
Antiguo 15-04-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 15-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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
Responder Con Cita
  #11  
Antiguo 15-04-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Revisa la propiedad Visible del formulario en el inspector de objetos y asegúrate de que esté en false.

// Saludos
Responder Con Cita
  #12  
Antiguo 18-04-2005
uper uper is offline
Miembro
 
Registrado: abr 2004
Posts: 296
Poder: 21
uper Va por buen camino
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.
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


La franja horaria es GMT +2. Ahora son las 11:46:40.


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