Hola compañeros, tengo un amigo que lleva tiempo en delphi al que le enseñe algo y el resto ha ido de autodidacta como yo, qeu me ha mandado asu hijo para que le enseñe los principios básicos, de programación, ya le he enseñado varias cosas y como ahora toca los módulos ABM (Altas, bajas y modificaciones), hemos pensado que podría explicarlo a través del Club que podría ayudar a otros compañeros, aparte de que serviría para mejorar nuestros sistemas con las aportaciones de otros compañeros, así que procedo, tener en cuenta que yo lo expongo desde mi punto de vista y trabajo con componentes estándar de delphi y míos propios que ya he aportado al club.
El modulo ABM
en este caso trabajo con un datasource que se llama DsPrincipal y a través del cual hacemos todas las operaciones, así no importa que base de datos usamos y como se trata del modulo y no de mis componentes no especifico el OnActive ni OnClose ni el OnKeyPress, pero si voy al OnCreate
En el Oncreate ponemos si usas firebird
Código Delphi
[-]begin
IBT:=UDM.DM.IBTransaction1;end;
donde UDM.DM.IBTransaction1 es el módulo o unidad y nombre donde se encuentra en mi caso el IBTransaction, por supuesto debes insertar la unit del modulo después de implementation de esta manera
Código Delphi
[-]implementation
{$R *.dfm}
uses UDM;
Vamos con los botones, usamos los cuatro estándar de un dbnavigator, en mi caso los he cambiado por botones con sus llamadas
El código para los cuatro de izquierda a derecha (cada linea a un botón)
Código Delphi
[-]
DSPrincipal.DataSet.First;
DSPrincipal.DataSet.Prior;
DSPrincipal.DataSet.Next;
DSPrincipal.DataSet.Last;
Ahora lo que yo llamo navigator plús, estos nos permiten movernos una cantidad determinada de registros en una dirección seleccionada, que elegimos en el SpinEedit que llame SEMobeByX y que yo en mi caso lo limite entre 5 y 25 registros cada vez que pulsamos (cada botón una linea del código)
Código Delphi
[-]
DSPrincipal.DataSet.MoveBy(-SEMobeByX.Value);
DSPrincipal.DataSet.MoveBy(SEMobeByX.Value);
Como podemos ver la diferencia entre uno y otro es el simbolo - antes del SEMobeByX.Value
Ahora los botones principales
El código lo divido entres partes una por botón
Código Delphi
[-]begin
DSPrincipal.DataSet.Insert; DBEdit3.SetFocus; end;
Código Delphi
[-]begin
if DsPrincipal.DataSet.IsEmpty<>true then begin
DSPrincipal.DataSet.Edit; DBEdit3.SetFocus; end else ShowMessage('No hay registros disponibles para editar') end;
Código Delphi
[-]begin if not DsPrincipal.DataSet.IsEmpty then begin
if (MessageBox(0, '¿Esta seguro de eliminar el registro actual?', 'Eliminar Registro', MB_ICONSTOP or MB_YESNO or MB_DEFBUTTON2) = ID_No) then abort
else begin
DSPrincipal.DataSet.Delete; ShowMessage('El registro ha sido eliminado'); end;
end else ShowMessage('No hay registros que poder borrar'); end;
Ahora toca a los botones Grabar y cancelar, en estos debo decir que no deben estar visibles o por lo menos accesibles, hasta que el registro esta siendo insertado o editado, yo para esto uso de base a los botones mi componente NewPanelDB que conecta con el datasource, poniendo en este caso su propiedad Action en Xvisble, evitando tener que escribir código y controles (separo el código de ambos botones)
Código Delphi
[-]begin
try DSPrincipal.DataSet.Post;
IBT.CommitRetaining; except on E: Exception do begin
MessageBeep(1000); ShowMessage('Se ha producido un error y el proceso no se ha podido terminar Unidad:[ UContactos ] Modulo:[ Grabar ]' + Chr(13) + Chr(13)
+ 'Clase de error: ' + E.ClassName + Chr(13) + Chr(13)
+ 'Mensaje del error:' + E.Message+Chr(13) + Chr(13)
+ ' '+Chr(13) + Chr(13)
+ 'El proceso ha quedado interrumpido'); if DsPrincipal.DataSet.State in [dsEdit, dsInsert] then DSPrincipal.DataSet.Cancel; IBT.RollbackRetaining; end;
end;
end;
Código Delphi
[-]begin
DSPrincipal.DataSet.Cancel; IBT.RollbackRetaining; end;
y ya por último mi botón buscar, como podéis ver en la primera imagen, el GroupBox no se ve, asi que pongo primero el código del botón buscar, luego el del edit y luego el de cada uno de los botones
Código Delphi
[-]procedure TFContactos.SBBuscarClick(Sender: TObject);
begin
GBBuscar.Visible:=True; Ebusqueda.SetFocus; end;
Código Delphi
[-]procedure TFContactos.EbusquedaChange(Sender: TObject);
begin
BBuscarClick(sender); end;
Código Delphi
[-]procedure TFContactos.BLimpiarClick(Sender: TObject);
begin
Ebusqueda.Text:=''; Ebusqueda.SetFocus; end;
Código Delphi
[-]procedure TFContactos.BBuscarClick(Sender: TObject);
var Campo:string;
begin
Campo:='NOMBRE';
DSPrincipal.DataSet.Locate(Campo,Ebusqueda.Text,[loCaseInsensitive,loPartialKey]); end;
Código Delphi
[-]procedure TFContactos.BCerrarClick(Sender: TObject);
begin
BLimpiarClick(Sender); GBBuscar.Visible:=False; end;
Espero sea de ayuda y como siempre estoy abierto a sugerencias, cambios y comentarios.