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 18-05-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
Módulos (ABM)

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 [-]
//------------------------------------------------------------------------------
//***************************************************[ Al Crearse el Fom ]******
// Cosas que queremos que haga según se cree el Form
//------------------------------------------------------------------------------
begin
     IBT:=UDM.DM.IBTransaction1;// Aquí especificar el modulo y el IBTransaction a usar Si usas Firebird
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 [-]
//------------------------------------------------------------------------------
//*******************************************[ Creamos un nuevo registro ]******
//------------------------------------------------------------------------------
begin
  DSPrincipal.DataSet.Insert;                             //insertamos la posibilidad de un nuevo registro
  DBEdit3.SetFocus;                                        //Nos posicionamos en el componente que queremos
end;

Código Delphi [-]
//------------------------------------------------------------------------------
//*******************************************[ Editar el actual registro ]******
//------------------------------------------------------------------------------
begin
   if DsPrincipal.DataSet.IsEmpty<>true then     //Comprobamos que la tabla no este vacía evitando un error si lo esta
   begin
      DSPrincipal.DataSet.Edit;                         //Editamos el registro en el que estamos posicionado
      DBEdit3.SetFocus;                                  //Nos posicionamos en el componente que queremos
   end else ShowMessage('No hay registros disponibles para editar')       //Si esta vacía nos da un aviso
end;

Código Delphi [-]
//------------------------------------------------------------------------------
//*******************************************[ Borrar el Actual Registro ]******
//------------------------------------------------------------------------------
begin                                //Cambiar por el mensaje elegido
   if not DsPrincipal.DataSet.IsEmpty then   //Comprobamos que la tabla no este vacía evitando un error si lo esta
   begin
     if (MessageBox(0, '¿Esta seguro  de eliminar el registro actual?',   //nos da un mensaje para asegurarnos de querer borrar el registro
     'Eliminar Registro', MB_ICONSTOP or MB_YESNO or MB_DEFBUTTON2) = ID_No) then abort
     else begin
        DSPrincipal.DataSet.Delete;     //Borra el registro, en este caso aún no se ha confirmado la Transaction, que se haría añadiendo la linea IBT.CommitRetaining; 
        ShowMessage('El registro ha sido eliminado');  //Nos avisa de que el registro ha sido borrado
     end;
   end else ShowMessage('No hay registros que poder borrar');  //Si esta vacía nos da un aviso
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 [-]
//------------------------------------------------------------------------------
//********************************************************[ Grabar datos ]******
//------------------------------------------------------------------------------
begin
  try    //Bloque de control por si hay errores
    DSPrincipal.DataSet.Post;  
{Confirmo los cambios, en este caso no hay que controlar que no estén campos nulos, ya que los campos principales los inserto realmente al pulsar nuevo registro 
  con el siguiente código:

  DsPrincipal.DataSet.FieldByName('MODULO').Value:=VarSNomMod;
  DsPrincipal.DataSet.FieldByName('CODIGO').Value:=VarsCod;

}
    IBT.CommitRetaining;    //Confirmamos la Transaction grabando de manera firme los datos
  except  //si se produce el error
    on E: Exception do   //Capturamos el error
    begin
        MessageBeep(1000);   //HAcemos sonar un sonido de aviso
        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');   //En este caso mostramos un mensaje con la unidad, el modulo, donde se ha producido y la case y el error
        if DsPrincipal.DataSet.State in [dsEdit, dsInsert] then DSPrincipal.DataSet.Cancel;  //Si el registro aun esta en edición o en inserción lo cancelamos
        IBT.RollbackRetaining;    //Le decimos a la Transaction que olvide los cambios desde la última Transaction confirmada
    end;
  end;
end;

Código Delphi [-]
//------------------------------------------------------------------------------
//*****************************************************[ Cancelar Proceso]******
//------------------------------------------------------------------------------
begin
  DSPrincipal.DataSet.Cancel;  //Cancelamos la inserción o edición de datos actual
  IBT.RollbackRetaining;    //Le decimos a la Transaction que olvide los cambios desde la última Transaction confirmada
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);
//------------------------------------------------------------------------------
//******************************************************[ Abrir Busqueda ]******
//------------------------------------------------------------------------------
begin
   GBBuscar.Visible:=True;    //Hacemos que el GroupBox sea visible
   Ebusqueda.SetFocus;       //Ponemos el Foco En el Edit
end;

Código Delphi [-]
procedure TFContactos.EbusquedaChange(Sender: TObject);
//------------------------------------------------------------------------------
//*************************************[ Mientras se escribe en busqueda ]******
//------------------------------------------------------------------------------
begin
    BBuscarClick(sender);   //Pulsamos por código el botón buscar según va cambiando el contenido del edit
end;

Código Delphi [-]
procedure TFContactos.BLimpiarClick(Sender: TObject);
//------------------------------------------------------------------------------
//**************************************************[ Limpia la busqueda ]******
//------------------------------------------------------------------------------
begin
   Ebusqueda.Text:='';    //vaciamos el contenido del edit
   Ebusqueda.SetFocus;  //Ponemos el Foco En el edit
end;

Código Delphi [-]
procedure TFContactos.BBuscarClick(Sender: TObject);
//------------------------------------------------------------------------------
//**************************************************************[ Buscar ]******
//------------------------------------------------------------------------------
var Campo:string;
begin
     Campo:='NOMBRE';  {Dato a rellenar  el nombre del campo en la búsqueda. Hay que tener en cuenta, que podríamos poner por ejemplo un combo con los campos 
                                  por los que podríamos hacer la búsqueda, con lo cual sólo cambiaríamos el valor de esta variable}
     DSPrincipal.DataSet.Locate(Campo,Ebusqueda.Text,[loCaseInsensitive,loPartialKey]);  //en este caso usamos el Locate pero podría ser por Sql
end;

Código Delphi [-]
procedure TFContactos.BCerrarClick(Sender: TObject);
//------------------------------------------------------------------------------
//*****************************************************[ Cerrar Búsqueda ]******
//------------------------------------------------------------------------------
begin
   BLimpiarClick(Sender);  //Pulsamos el botón limpiar así nos queda limpio y preparado para la próxima vez que tengamos que usarlo
   GBBuscar.Visible:=False;   //Que no se vea el GroupBox
end;

Espero sea de ayuda y como siempre estoy abierto a sugerencias, cambios y comentarios.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 18-05-2013
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 22
José Luis Garcí Va camino a la fama
Aquí os pongo mas detallado el proceso de borrado de un registro, usado en una de mis aplicaciones


Código Delphi [-]
procedure TFCLIENTES.SbBorrarClick(Sender: TObject);
//------------------------------------------------------------------------------
//*******************************************[ Borrar el Actual Registro ]******
//------------------------------------------------------------------------------
begin                                //Cambiar por el mensaje elegido
   PGc.ActivePage:=DATOS;
   if (MessageBox(0, '¿Esta seguro  de eliminar el registro actual?',   //Aqui no se porque me manda la última comilla simple y la coma a la linea de abajo, por favor subir al final de la linea anterior
   'Eliminar Registro', MB_ICONSTOP or MB_YESNO or MB_DEFBUTTON2) = ID_No) then abort
   else begin
      VarsCod:=DBEdit1.Field.Value;
      Case Application.MessageBox(pchar('El Registro ha sido eliminado, desea  seguir adelante o recuperar lo?'                                                         +#13#10
                                        +#13#10
                                        +#13#10+'Si elige [ SI ] se borrara permanente, así como los datos derivados'
                                        +#13#10+'Si elige  [ NO ] se recupera el registro borrado'), pchar('Registro Eliminado'), 4+48+256) of
         6:begin      //Si
               //Direcciones
               try
                 ActIbdataset(DM.IBDirecciones,'DELETE FROM DIRECCIONES WHERE (DIRECCIONES.MODULO = '+QuotedStr('CLIENTES')+') AND (DIRECCIONES.CODIGO = '+QuotedStr(VarsCod)+')');
                 ActIbdataset(DM.IBDirecciones,'SELECT * FROM DIRECCIONES');
              
                 DSPrincipal.DataSet.Delete;
                 IBT.CommitRetaining;
               except
                 Case Application.MessageBox( pchar(  'Se ha producido un error y no se ha podido borrar todos los datos'
                                                    +#13#10
                                                    +#13#10+'Que desea hacer?'
                                                    +#13#10
                                                    +#13#10+'ACEPTAR  y eliminar de manera permanente los datos si borrados'
                                                    +#13#10+'CANCELAR  y no borrar nada'), pchar('Se ha producido un error'), 1+48+256) of
                     1:IBT.CommitRetaining;       //Aceptar
                     2:IBT.RollbackRetaining;        //Cancelar
                 end;
               end;
           end;
         7:begin       //No
              IBT.RollbackRetaining;  //anulamos la eliminación
           end;
      end;
   end;
end;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #3  
Antiguo 18-05-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular

.........
Responder Con Cita
  #4  
Antiguo 18-05-2013
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Muy buena idea, gracias José Luis.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 18-05-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 José Luís.

Muy buen aporte, muchas gracias
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 19-05-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
José Luis Garcí,

Gracias por el aporte

Nelson.
Responder Con Cita
  #7  
Antiguo 19-05-2013
Avatar de ElKurgan
[ElKurgan] ElKurgan is offline
Miembro Premium
 
Registrado: nov 2005
Posts: 1.234
Poder: 20
ElKurgan Va camino a la fama
Thumbs up

Gracias por el aporte, amigo, se ve muy interesante
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
Sistema separado en modulos ramflores OOP 4 18-05-2011 22:44:30
Una aplicacion, varios modulos mjjj Varios 3 09-03-2010 16:32:08
Lazarus y dos módulos de datos PabloTech Lazarus, FreePascal, Kylix, etc. 12 03-09-2008 23:20:52
ejecutar modulos .so en apache jac000y Linux 3 02-01-2007 22:37:13
Modulos Globales senpiterno Varios 2 15-04-2004 00:38:38


La franja horaria es GMT +2. Ahora son las 05:20:18.


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