Ir al contenido



Foto

Editor con Access programado entre todos


  • Por favor identifícate para responder
70 respuestas en este tema

#21 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 25 julio 2010 - 04:10

Hola
Tengo el principio de este programa hecho.
Cree un datamodule, con su correspondiente adoconnection y dos adoquery.
El programa al iniciar carga en el combo los datos de las categorias.
Cuando se cambia de categoria se carga la nota adecuada.
El titulo lo coloca en el caption del pagecontrol.
Muestra los datos de quien lo creo, el titulo, el id.
Edita, inserta y guarda todas las notas que se quiera.
Tiene dos botones para recorrer los campos.
Bueno:
Por el momento ya es un paso. (y)
Saludos

Archivos adjuntos


  • 0

#22 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 25 julio 2010 - 04:49

Hola
Tengo el principio de este programa hecho.
Cree un datamodule, con su correspondiente adoconnection y dos adoquery.
El programa al iniciar carga en el combo los datos de las categorias.
Cuando se cambia de categoria se carga la nota adecuada.
El titulo lo coloca en el caption del pagecontrol.
Muestra los datos de quien lo creo, el titulo, el id.
Edita, inserta y guarda todas las notas que se quiera.
Tiene dos botones para recorrer los campos.
Bueno:
Por el momento ya es un paso. (y)
Saludos


¡Espectacular Caral!
Tengo que estudiarlo un buen rato porque esta aplicación que nos has dado está llena de enseñanzas para mí.
Seguro que tengo preguntas, pero quiero primero detectarlas y luego de intentar resolverlas traerlas al Foro.
Muchas gracias Caral por tu tiempo y generosidad
Un saludo
  • 0

#23 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 25 julio 2010 - 04:59

He encontrado un problema cuando intento guardar una nueva nota.
Adjunto la captura
SAludos

Archivos adjuntos


  • 0

#24 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 25 julio 2010 - 06:28

Hola
Es sencillo, fue un error mio, por supuesto  :D
Queria que saliera tanto el nombre como el id y cambie algunas cosas pero se me olvido que tambien cambie el label que contenia el ID, al ser este integer da ese error.
Simplemente en el boton de guardar hay que cambiar el label 5 por el label 11, asi:


delphi
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. begin
  3.   If (DM1.QTemp.State = dsEdit)  then
  4.     begin
  5.       DM1.QTemp.Fields[2].AsString:= Memo1.Text;
  6.       DM1.QTemp.Post;
  7.     end;
  8.   If (DM1.QTemp.State = dsInsert) then
  9.     begin
  10.     DM1.QTemp.Fields[0].Value:= Label8.Caption;
  11.     DM1.QTemp.Fields[1].AsString:= Edit1.Text;
  12.     DM1.QTemp.Fields[2].AsString:= Memo1.Text;
  13.     DM1.QTemp.Fields[3].AsString:= Label11.Caption; // aqui esta el detalle
  14.     DM1.QTemp.Post;
  15.     Panel1.Visible:= false;
  16.     end;
  17.  
  18. end;


Saludos
  • 0

#25 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 25 julio 2010 - 06:32

Hola
Me gustaria que tambien revises el codigo del datamodule, ahi se busca la BD en el mismo directorio en que este el EXE.
Es bueno para aprender a hacer ciertas cosas.
Saludos
  • 0

#26 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 25 julio 2010 - 07:03

¿ Admitís sugerencias ?.

Simplemente en el boton de guardar hay que cambiar el label 5 por el label 11, asi:


Por estos problemas es una buena idea nombrar todos los controles que se ponen en un formulario, o al menos nombrar todos los que son utilizados desde código.

en lugar de :

DM1.QTemp.Fields[3].AsString:= Label11.Caption;

tendríamos algo como :

DM1.QTemp.FieldByName('Nombre').AsString:= txtNombre.Caption;

NOTA: También he cambiado el acceso a los campos por su nombre en lugar de usar el ordinal, ya que también es muy común quitar, añadir o modificar campos, con lo que si accedes con el ordinal estás obligado a revisar todo tu código cada vez.
  • 0

#27 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 25 julio 2010 - 07:12

Hola
Es muy cierto amigo Marc, pero aveces no es tan conveniente, por ejemplo:
Si tengo 20 labels y quiero cambiarlos, hacerlos no visibles u otro si tengo un nombre distinto para cada label lo tendré que hacer uno por uno, pero, si tengo los label con su nombre original simplemente los recorro y listo.
Osea: Aveces si es conveniente, aveces no, depende de que es lo que se quiera hacer.
Saludos
PD: Aparte de esto: Amigo nos gustaría que aportaras también, por supuesto que se aceptan comentarios y tambien codigo. (y)
  • 0

#28 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 26 julio 2010 - 01:59

Hola

Hola
Es muy cierto amigo Marc, pero aveces no es tan conveniente, por ejemplo:
Si tengo 20 labels y quiero cambiarlos, hacerlos no visibles u otro si tengo un nombre distinto para cada label

lo tendré que hacer uno por uno, pero, si tengo los label con su nombre original simplemente los recorro y listo.
Osea: Aveces si es conveniente, aveces no, depende de que es lo que se quiera hacer.
Saludos
PD: Aparte de esto: Amigo nos gustaría que aportaras también, por supuesto que se aceptan comentarios y tambien

codigo.


Para estas ocasiones yo me defino un objeto TList en el que agrupar estos controles de forma que pueda hacer los recorridos que comentas.

Tiene el inconveniente de que durante el FormCreate debes inicializar el TList, indicándole los controles que quieres agrupar. Pero a cambio ganas en que el código del resto del formulario es mucho más legible y sobretodo más fácil de mantener.

Ejplo.

En la sección private me defino : ControlesDireccion: TList;

Después, en el FormCreate indico la lista de controles que quiero agrupar :



delphi
  1. procedure Form1.FormCreate;
  2. begin
  3.   inherited;
  4.   ControlesDireccion := TList.Create;
  5.   ControlesDireccion.Add(txtNombre);
  6.   ControlesDireccion.Add(txtCodigoPostal);
  7.   ControlesDireccion.Add(txtPoblacion);
  8.   ...
  9.   ...
  10. end;


Ya está, ahora esto me permite poder recorrer estos controles en cualquier otro momento con un simple bucle. Por ejemplo, para ponerlos todos en solo lectura, haría :



delphi
  1. for i := 0 to ControlesDireccion.Count - 1 do begin
  2.   (TObject(ControlesDireccion[i]) as TEdit).ReadOnly := True;
  3. end;



Incluso si quieres, el mismo control lo puedes asignar a varias agrupaciones distintas, para tenerlo en diferentes recorridos.
  • 0

#29 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 26 julio 2010 - 05:19

Hola
Muy interesante, no lo conocía.
Saludos
  • 0

#30 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 26 julio 2010 - 05:31

Hola
Es sencillo, fue un error mio, por supuesto  :D
Queria que saliera tanto el nombre como el id y cambie algunas cosas pero se me olvido que tambien cambie el label que contenia el ID, al ser este integer da ese error.
Simplemente en el boton de guardar hay que cambiar el label 5 por el label 11, asi:


delphi
  1. procedure TForm1.Button3Click(Sender: TObject);
  2. begin
  3.   If (DM1.QTemp.State = dsEdit)  then
  4.     begin
  5.       DM1.QTemp.Fields[2].AsString:= Memo1.Text;
  6.       DM1.QTemp.Post;
  7.     end;
  8.   If (DM1.QTemp.State = dsInsert) then
  9.     begin
  10.     DM1.QTemp.Fields[0].Value:= Label8.Caption;
  11.     DM1.QTemp.Fields[1].AsString:= Edit1.Text;
  12.     DM1.QTemp.Fields[2].AsString:= Memo1.Text;
  13.     DM1.QTemp.Fields[3].AsString:= Label11.Caption; // aqui esta el detalle
  14.     DM1.QTemp.Post;
  15.     Panel1.Visible:= false;
  16.     end;
  17.  
  18. end;


Saludos

Hola Caral:
Luego de modificar el código en Botón Guardar sigo teniendo el problema.
Hago lo sgte.:
1- Nueva nota
2- Ingreso Título
3-Escribo la nota
4- Guardar
Recibo el mensaje que adjunto

Estoy mirando el código del DataModule como me indicaste.

Saludos

Archivos adjuntos


  • 0

#31 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2010 - 06:59

He hecho algunas modificaciones al programa y también he cambiado en la DB
el tipo de datos (de Autoincremental a numero) de de las claves principales de las tablas Notas,
Tags y Tareas, con el fín de hacer posible un manejo más eficiente de las relaciones Maestro-Detalles
entre  dichas tablas.

He utilizado nuevos elementos y nuevos conceptos como por ejemplo:

Un TDatasetProvider y 3 TClientDatsets basándome en el concepto de Datasets anidados para dar buen
manejo a la relación maestro-detalle en este caso entre las tablas Notas(maestra) y Tags y tareas (detalles).

Nótese que aunque haga cambios en las tablas de detalles  e incluso haga un Post (DbNavigators de las tabalas de detalles)
sobre estas, los cambios no se guardaran en la DB hasta que lo haga con el Botón  Aceptar (que aplica cambios en el ClientDataset maestro)
de la parte superior, si Ud hace cambios en los detalles y sale cerrando el Form o con el botón cancelar estos cambios no serán guardados.

También nótese que a lo largo del programa lo único que abro es el TClientDataset de nombre cdNotas.

He hecho uso de un TActionList para facilitar  le habilitación y deshabilitación de botones según corresponda.

Haciendo dobleClik en le grid de el form principal si hay registros  abre el form de edición y está listo para editar, y si no hay registros
queda listo para insertar.

Haciendo click en el título de las columnas del mismo grid se ordenaran los datos según convenga (ascendente o descendente) por deicha columna.

Las búsquedas se hacen al introduccir texto en el edit de busqueda.

Para agregar un nuvo creador o una nueva categoría hay dispuestos sus respectivos botones.

Quedan faltando muchos detalles que los iremos refinando de a pocos.

Si esto es mas o menos lo ESocrates esperaba, entonces con un poco mas de tiempo iré explicando y subiendo capturas de pantalla de cada
detalle de la configuración de los objetos del TDataModule que creo que es en donde radican las cosas mas complejas del ejemplo o de
de las partes que se consideren necesarias.

Saludos

PD : Revisar archivo adjunto

Archivos adjuntos


  • 0

#32 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 26 julio 2010 - 07:11

Hola Wilson:
¡Muchas gracias!
Todo detalle, explicación y demás vale oro. Cuanto más comentarios mejor para el que,como yo, está aprendiendo.
Se están produciendo enseñanzas a cada momento.
Un saludo y hasta pronto
  • 0

#33 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 26 julio 2010 - 07:32

Hola
Bueno: ya el programa de Wilson es un editor completo, muy completo.
Gracias por el aporte, vamos a aprender mucho con el. (y)
Saludos
  • 0

#34 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 26 julio 2010 - 07:41

Hola
Bueno: ya el programa de Wilson es un editor completo, muy completo.
Gracias por el aporte, vamos a aprender mucho con el. (y)
Saludos

Seguramente, como también con el tuyo. De eso no tengo dudas.
Un saludo
  • 0

#35 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2010 - 02:26

Hola
Bueno: ya el programa de Wilson es un editor completo, muy completo.
Gracias por el aporte, vamos a aprender mucho con el. (y)
Saludos


Todos hemos aprendido mucho de ti Carlos, creo que ostentas el record de descargas en los foros de Delphi en español con unverdadero  clásico como es el  Tutorial de Facturación.

Solo queremos aportar un poco para los novatos(como yo) que recién se incician en la programación con bases de datos.

Y como lo pidió el queridísimo amigo Egostar trataré de explicar a partir del siguiente post y en cuanto mi tiempo me lo permita los detalles del ejemplo propuesto, iniciando por el diseño de la DB, todo de acuerdo a los reqquerimientos del amigo Esocrates.

Saludos

Y como el dermatólogo al grano.
  • 0

#36 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2010 - 02:28

Diseño de la DB, con las etiquetas de SQL utilizaré pseudodigo.



sql
  1. TABLA CATEGORIAS /* Aquí almacenaremos los diferentes tipos de categorías de Notas.*/
  2. /* Aunque podríamos haber creado simplemente un campo "CATEGORIA" directamente en la tabla NOTAS */
  3. /*podríamos algún día cometer un error de ortografía o tipografía y escribir por ejemplo en un registro */
  4. /*CATEGORIA = Mensajes  y en otro registro CATEGORIA = Mensages; aunque queremos hacer referencia a la */
  5. /*misma categoría tenemos dos cosas distintas, y a la hora que consultemos no sabemos si preguntar por */
  6. /* Mensajes o por Mensages. Por lo tanto se hace necesaria otra tabla que podamos referenciar unívocamente*/
  7. Id_Categoria : Autoincremental  /*Este será la clave principal. Access genera automáticamente este número*/
  8. Categorias : Texto(20)  /*Aquí las categorías en si.*/
  9. /* Hubiésemos podido crear un solo campo de tipo texto que fuera a la vez clave principal, pero cuando hay muchos*/
  10. /* registros es mas eficiente un entero como clave principal a la hora de hacer cosultas complejas*/
  11.  
  12. TABLA CREADORES /*Aquí vamos a almacenar los nombres de los creadores de las Notas*/
  13. /*Los comentarios de la tabla anterior aplican de igual forma a esta tabla*/
  14. Id_Creador :Autoincremental
  15. Creador :Texto(20)
  16.  
  17. TABLA NOTAS /*Esta es nuestra tabla principal, quí almacenaremos las notas*/
  18. Id_Nota :Numero /*Lo hemos declarado de tipo número(entero) y no autoincremental porque nuestro diseño utiliza un TDatasetProvider*/
  19. /*que arma al vuelo una sentencia SQL para la inserción, por lo tanto nesecitamos tener un valor para este campo antes de que llegue*/
  20. /*la sentencia de inserción a la DB (comentaremos a fondo sobre esto cuando estemos en la parte del modulo de datos), este número lo */
  21. /* obtendremos de una tabla llamada GENERADOR, ya que Access genera el número autoincremental solo hasta el final, y lo nesecitamos antes*/
  22. Id_Categoria : Numero /* Aquí colocaremos el número correspondiente a la categoría deseada y que se encuentra en la tabla CATEGORIAS*/
  23. /*hemos creado una relación de Integridad referencial en donde  un registro de la tabla CATEGORIA puede estar en varios registros */
  24. /*de la tabla NOTAS, por ejemplo tenemos el registro Id_Categoria = 1 y Categoria = Mensajes en la tabla CATEGORIAS, entonces es posible*/
  25. /*que hayan muchas Notas que pertenecen a la categoría "Mensajes" por lo tanto el campo Id_Categoria de la tabla NOTAS se llenará*/
  26. /*con el valor 1 que hace referencia a la Categoria Mensajes. La relación de integridad referencial tambien exige que el número de*/
  27. /*Id_Categoria en la tabla NOTAS tiene que nesesariamente existir en la tabla CATEGORIAS*/
  28. NombreNota: Texto(20)/*Nombre de la nota*/
  29. Nota : Memo /* La nota en si*/
  30. Id_Creador : Numero /*Aplican los mismos comentarios de IdCategoria solo que hace referencia a la tabla CREADORES y al campo Id_Creador*/
  31. Observaciones : Memo /*La verdad pienso que este campo sobra, pues la nota debería contener todo, mas sin embargo me  apego al diseño*/
  32. /*original de Esocrates*/
  33.  
  34. TABLA TAGS /*La implementamos como otro criterio para facilitar las búsquedas con palabras claves de la nota*/
  35. Id_Tag : Numero /* Este hace referencia al identificador único de cada Tag, y como en el caso de Id_Nota de la tabla NOTAS tampoco nos sirve*/
  36. /*autoincremental por que hace parte de una relación de detalles y nesecitamos conocer su valor antes de que llegue a la DB en las inserciones*/
  37. /*también lo obtendremos de la tabla GENRADOR*/
  38. Id_Nota : Numero /* Aquí existe una relación de Integridad referencial contraria las relaciones entre las tablas CREADORES y CATEGORIAS con*/
  39. /*la tabla NOTAS. Esta vez un registro en la tabla NOTAS puede estar en varios registros de la tabla TAGS, por ejemplo las palabras claves*/
  40. /* o tags de la Nota número 1 son caso, carro y finca, cada palabra de estas será un registro diferente en la tabla TAGS pero cada uno de estos*/
  41. /*tendrá el número 1 como ientificador de la Nota, de la misma manera este campo solo acepta valores existentes en la tabla NOTAS*/
  42. Tag : Texto(20)/* Aquí loas palabras clave*/
  43.  
  44. TABLA TAREAS/* Táreas que pueda necesitar una nota, aquí aplican los comentarios de la tabla TAGS*/
  45. Id_Tarea : numero/*Aplica comentario Id_Tag*/
  46. Id_Nota : Numero /* Aplica comentario de la tabla TAGS*/
  47. Tarea : Texto (255) /*La tarea*/
  48.  
  49. TABLA GENERADOR/* De aquí obtendremos números únicos para las claves proncipales de las tablas CATEGORIAS, TAGS Y TAREAS*/
  50. Numero :Numero/*Cada vez que obtengamos un número de aquí lo incrementaremos mediante un ADOComand*/


  • 0

#37 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2010 - 02:38

Imagen de las relaciones in Access:

Imagen Enviada


  • 0

#38 esocrates

esocrates

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 102 mensajes
  • LocationArgentina

Escrito 26 julio 2010 - 06:23

Hola Wilson y Caral:
Evidentemente tenemos dos proyectos encarados en forma diferente.
Dado que es mi interés aprender porque soy nuevo en esto trato de examinar los conceptos que estos ejemplos ilustran y ponen en práctica.
Por ejemplo en este momento trato de entender el diagrama que aporta Wilson de la relación entre tablas de acuerdo a la explicación en su post inmediato anterior.
Lo que trato de entender es la dirección de las flechas entre tablas, cual manda, digamos así, en cada caso. Creo entender que la que manda será la que aporta el ID
Es lo que estoy viendo por el momento
Estoy muy agradecido por la generosidad de Uds.
Sigo estudiando los ejemplos
Saludos



  • 0

#39 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 26 julio 2010 - 07:18

Hola
En realidad mi proyecto es muy básico, muy para novatos, en cambio el de Wilson lo siento mas avanzado.
Lo que me parece muy bien es que la explicación del manejo de las tablas y sus relaciones es bastante claro. (y)
Me gustaría que nos acercara un poco mas al uso de los componentes que usa, para que, como y por que ya que el uso de transacciones lo hace de una forma desconocida para mi hasta ahora.
Si bien no es complicado entenderlo seria bueno que nos ampliara en sus parablas cuales son los pro y contras, la idea es aprender.
Este proyecto tiene muchos detalles interesantes, de aqui se sacan muchas enseñanzas, por eso es bueno los comentarios adicionales, asi a mas de uno se le despejaran dudas.
Estoy muy contento como va avanzando esto. (y) (b)
Saludos

  • 0

#40 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.993 mensajes
  • LocationMéxico

Escrito 26 julio 2010 - 07:57

Me gusta mucho la forma como están abordando el tema, yo también estoy aprendiendo :)

Salud OS
  • 0