***************************************
realmante es muy interesante lo q dices, es bueno saber el orden de los eventos como se disparan.
Bueno; Basicamente hago refernecia a dos conjuntos de datos , una es una tabla donde almaceno mis productos representado por un ADOTable (tbArticulos) y el otro es una lista de precios para mis productos representado por un ADOQuery (qryListaPrecios), ademas tengo un formulario de busqueda de articulos
como mensione antes tengo un DBGrid conectado a qryListaPrecios
donde el campo1 almacena el item del registro, el campo2(id_articulo) es donde ingreso el codigo del articulo ya sea digitandolo o llamando al formulario de busqueda de articulos
aqui les muestro el codigo real
Código Delphi
[-]procedure TfrmListaPrecios.BuscarProducto;
begin
frmBuscarArticulo := TfrmBuscarArticulo.Create(Application);
try
if frmBuscarArticulo.ShowModal = mrOk then
begin
if qryListaprecios.State = dsBrowse then
qryListaprecios.Edit;
qryListaprecios.FieldByName('id_articulo').AsString
:= frmBuscarArticulo.qryBuscarArticulo.FieldByName('id_articulo').AsString;
end;
finally
frmBuscarArticulo.Free;
end;
end;
procedure TfrmListaPrecios.qryListapreciosid_articuloValidate(
Sender: TField);
begin
if not tbArticulos.Locate('id_articulo', Sender.Text, []) then
begin
MessageDlg('No existe el producto', mtWarning, [mbOk], 0);
Abort;
end;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select id_articulo from _listaprecios_detalle');
Query1.SQL.Add('where id_articulo = ''' + Sender.Text + '''' );
Query1.SQL.Add('and id_listaprecios = ''' + cboLista.KeyValue + '''' );
Query1.Open;
if not Query1.IsEmpty then
begin
MessageDlg('Ya existe el producto en lista de precios actual', mtWarning, [mbOk], 0);
Abort;
end;
qryListaprecios['UM_compra'] := tbArticulos['um_compra'];
qryListaprecios['UM_venta'] := tbArticulos['um_venta'];
qryListaprecios['UM_consumo'] := tbArticulos['um_consumo'];
qryListaprecios['precio_compra'] := 0;
qryListaprecios['precio_venta'] := 0;
qryListaprecios['precio_consumo'] := 0;
qryListaprecios['precio_compra'].FocusControl;
end;
procedure TfrmListaPrecios.DBGrid1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = VK_F1) and (DBGrid1.selectedIndex = 1) then
BuscarProducto;
end;
cuando ingreso tecleando en el campo id_articulo (segunda columna de mi grilla) no hay problema, si digamos ingreso un articulo q ya esta registrado en la lista de precios aparece el mensaje advirtiendome q ya existe en la lista de precios actual y luego aborta la oparacion sin problemas
el problema es es cuando presiono F1 para llamar a mi formulario de busqueda y selecciono un articulo que ya esta ingresado en la lista de precios, al momento de aparecer el mensaje es donde se repite en valor del articulo validado en todas las filas, pense que se trataria de formulario de busqueda o d mi query pero me di cuenta que resumiendolo hasta lo mas sencillo causa ese problema con BDE, ADO tabla y/o consulta
aunque pasando la logica al evento Onchange y BeforePost, resulta bien, pero me gustaria saber si se puede gestionar las validaciones en OnValidate
Muchas Gracias denuevo!!!!