Ir al contenido


Foto

Como manejo la integridad relacional de mi BD en Lazarus.


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

#1 oscargvh

oscargvh

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 29 mayo 2018 - 02:38

Voy a comenzar un pequeño proyecto para comenzar con lazarus, pero me saltan algunas dudas espero me pueda apoyar.
 

1.- La relaciones se realiza en la BD, pero como se realiza dentro del código para mantener esa relación dentro del formulario.

2.- Como se hace uso de las tablas que funcionarían como catalogos.

3.- Como se realiza el guardado en dos o mas tablas si están relacionadas. 
 
Lo anterior suponiendo que ya tengo mi conexión a la base de datos.
 
 
Espero haberme dado a entender. Gracias espero me puedan apoya.

 


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.290 mensajes
  • LocationArgentina

Escrito 29 mayo 2018 - 05:08

 

Voy a comenzar un pequeño proyecto para comenzar con lazarus, pero me saltan algunas dudas espero me pueda apoyar.
 

1.- La relaciones se realiza en la BD, pero como se realiza dentro del código para mantener esa relación dentro del formulario.

2.- Como se hace uso de las tablas que funcionarían como catalogos.

3.- Como se realiza el guardado en dos o mas tablas si están relacionadas. 
 
Lo anterior suponiendo que ya tengo mi conexión a la base de datos.
 
 
Espero haberme dado a entender. Gracias espero me puedan apoya.

 

 

¡Bienvenido oscargvh! esperamos que DelphiAccess te sea de mucho agrado.

¿Recién te estás introduciendo en el mundo Object Pascal?

 

Déjame ver si voy entiendo tus dudas.

1. Las relaciones formalmente se definen en cuanto uno diseña la base de datos. Y para ello se hace uso de las claves primarias y foráneas.

Por lo cual en principio, al sistema no le compete como está estructurado/relacionado la base de datos con la cual interactúa. Este comportamiento es transparente para el sistema. Lo máximo que puede serle útil y necesario es compartir y avisar de alguna violación a la identidad referencial.

Esto se logra capturando el error tras alguna operación "ABM" en una o más tablas de la/s base/s de datos e informando del conflicto al usuario, en un nivel de abstracción adecuado.

Por ejemplo: un conflicto de clave duplicada se debiera de traducir en un aviso del tipo "Está intentando introducir el mismo artículo" por ejemplo.

 

El motor de base de datos es quien se encarga de manejar esto. A nivel sistema a lo sumo necesitarías implementar evaluaciones de validación para ciertos tipos de datos, restringir posibles valores (como por ejemplo impedir que pase valores negativos, o fuera de un rango necesario) y demás reglas de negocio. Para que luego en la base de datos los datos lleguen de manera consistente.

 

2. ¿Que es tabla catalogos? El término me es ajeno. Quizá al concepto lo conozco por otro nombre. ¿Serías tan amable de explicarte?

3. El guardado de información de dos o más tablas relacionadas obecede la regla de integridad referencial: primero se guardan los registros en las tablas maestras, y luego en las tablas dependientes/esclavas/detalles.

 

Este procedimiento es independiente de los componentes/suite de acceso a base de datos que utilices. Ya sea Zeos, u otra. El orden es el mismo.

 

Si eres muy nuevo en el mundo Object Pascal, ya sea que estés utilizando Lazarus o Delphi lo mejor para familizarse e introducirse es el libro "La Cara Oculta de Delphi 4" Puede que sea viejo, y que se trate de Delphi, pero creeme ¡sigue siendo Object Pascal! Y los conceptos allí vertidos son aplicables en Lazarus y/o CodeTyphon inclusive. Este libro expone el ABC y más.

Hay un libro también sobre Lazarus, aunque no lo he leído.

Lazarus tiene una Wiki, puedes consultar el apartado de bases de datos para mayor información. Desde dicha página puedes acceder a una serie de tutoriales para algunas suites de acceso de datos.

 

Cualquier duda que tengas puedes seguir y te animo a seguir consultándonos. Si puedes ampliar más tus dudas podríamos ser más precisos en como y en que asesorarte. Nos sería de mucha ayuda para darte mejor asistencia que nos indiques que motor de base de datos estás utilizando y que componentes/suites de acceso empleas (y el numero de version de paso, para revisar el tema de compatibilidades)

 

Saludos,


  • 0

#3 oscargvh

oscargvh

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 29 mayo 2018 - 07:17

¡Bienvenido oscargvh! esperamos que DelphiAccess te sea de mucho agrado.

¿Recién te estás introduciendo en el mundo Object Pascal?

 

Déjame ver si voy entiendo tus dudas.

1. Las relaciones formalmente se definen en cuanto uno diseña la base de datos. Y para ello se hace uso de las claves primarias y foráneas.

Por lo cual en principio, al sistema no le compete como está estructurado/relacionado la base de datos con la cual interactúa. Este comportamiento es transparente para el sistema. Lo máximo que puede serle útil y necesario es compartir y avisar de alguna violación a la identidad referencial.

Esto se logra capturando el error tras alguna operación "ABM" en una o más tablas de la/s base/s de datos e informando del conflicto al usuario, en un nivel de abstracción adecuado.

Por ejemplo: un conflicto de clave duplicada se debiera de traducir en un aviso del tipo "Está intentando introducir el mismo artículo" por ejemplo.

 

El motor de base de datos es quien se encarga de manejar esto. A nivel sistema a lo sumo necesitarías implementar evaluaciones de validación para ciertos tipos de datos, restringir posibles valores (como por ejemplo impedir que pase valores negativos, o fuera de un rango necesario) y demás reglas de negocio. Para que luego en la base de datos los datos lleguen de manera consistente.

 

2. ¿Que es tabla catalogos? El término me es ajeno. Quizá al concepto lo conozco por otro nombre. ¿Serías tan amable de explicarte?

3. El guardado de información de dos o más tablas relacionadas obecede la regla de integridad referencial: primero se guardan los registros en las tablas maestras, y luego en las tablas dependientes/esclavas/detalles.

 

Este procedimiento es independiente de los componentes/suite de acceso a base de datos que utilices. Ya sea Zeos, u otra. El orden es el mismo.

 

Si eres muy nuevo en el mundo Object Pascal, ya sea que estés utilizando Lazarus o Delphi lo mejor para familizarse e introducirse es el libro "La Cara Oculta de Delphi 4" Puede que sea viejo, y que se trate de Delphi, pero creeme ¡sigue siendo Object Pascal! Y los conceptos allí vertidos son aplicables en Lazarus y/o CodeTyphon inclusive. Este libro expone el ABC y más.

Hay un libro también sobre Lazarus, aunque no lo he leído.

Lazarus tiene una Wiki, puedes consultar el apartado de bases de datos para mayor información. Desde dicha página puedes acceder a una serie de tutoriales para algunas suites de acceso de datos.

 

Cualquier duda que tengas puedes seguir y te animo a seguir consultándonos. Si puedes ampliar más tus dudas podríamos ser más precisos en como y en que asesorarte. Nos sería de mucha ayuda para darte mejor asistencia que nos indiques que motor de base de datos estás utilizando y que componentes/suites de acceso empleas (y el numero de version de paso, para revisar el tema de compatibilidades)

 

Saludos,

 

Hola 

 

SI!!!!!    estoy iniciando en el mundo de Object Pascal.

 

Gracias por la bienvenida.

 

 

 

De acuerdo a los puntos, comento:

 

1.- Ya me quedo mas claro, pero me salta otra duda como todo novel, como capturo el error que manda la BD para indicarle al usuario que esta infringiendo una regla de negocio, que comando uso?.

 

2.- Los catálogos..... el concepto va mas o menos así, son tablas donde proporcionan información para completar datos en la captura, un ejemplo seria poner un ID en una librería para venta y ese ID me trae los datos que se encuentran en otra tabla ya con los datos del libro, precio, descripción, etc. para completar la compra. (Espero me de a entender).

 

3.- Igual ya me quedo mas claro este punto y utilizare de entrada "SQLdb" que trae lazarus para las conexiones a la BD. (no se si exista alguna mejor).

 

 

 

Leeré "La cara  oculta de delphi4". (Es mas conveniente esta que la cara oculta de delphi 6).

 

El motor de BD que pretendo usar el Firebird en su versión 3.

 

 

Mil gracias por la respuesta y si acá seguiré consultando, me es grato la bienvenida Delphius y Dios los Bendiga por compartir el conocimiento.


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.290 mensajes
  • LocationArgentina

Escrito 29 mayo 2018 - 08:12

Hola 

 

SI!!!!!    estoy iniciando en el mundo de Object Pascal.

 

Gracias por la bienvenida.

 

 

 

De acuerdo a los puntos, comento:

 

1.- Ya me quedo mas claro, pero me salta otra duda como todo novel, como capturo el error que manda la BD para indicarle al usuario que esta infringiendo una regla de negocio, que comando uso?.

 

2.- Los catálogos..... el concepto va mas o menos así, son tablas donde proporcionan información para completar datos en la captura, un ejemplo seria poner un ID en una librería para venta y ese ID me trae los datos que se encuentran en otra tabla ya con los datos del libro, precio, descripción, etc. para completar la compra. (Espero me de a entender).

 

3.- Igual ya me quedo mas claro este punto y utilizare de entrada "SQLdb" que trae lazarus para las conexiones a la BD. (no se si exista alguna mejor).

 

 

 

Leeré "La cara  oculta de delphi4". (Es mas conveniente esta que la cara oculta de delphi 6).

 

El motor de BD que pretendo usar el Firebird en su versión 3.

 

 

Mil gracias por la respuesta y si acá seguiré consultando, me es grato la bienvenida Delphius y Dios los Bendiga por compartir el conocimiento.

 

Antes que nada, disculpa que te corrija un poco. En Object Pascal no existen comandos. Se les llama métodos, procedimientos, y/o funciones.

 

Ahora bien, para capturar excepciones se utiliza la cláusula try-except:


delphi
  1. try
  2. //Hacer algo
  3. except
  4. on E: TipoException do
  5. // Hacer esto si se produce una excepcion de este tipo
  6. end;

El uso de try-except permite que se realicen todas las sentencias que estén dentro de la "sección" try, y si se eleva alguna excepción (lo que se suele decir error) se ejecute la sección "except".

También existe el uso de try-finally que suele usarse para otras situaciones.

 

En el libro de la Cara Oculta de Delphi 4 hay un capítulo dedicado al tema de las excepciones y al uso del try.

 

Ahora bien, enfocadose el problema para el caso de excepciones a nivel de base de datos, lo que debes de capturar son las excepciones que pudiera arrojar los componentes en cuestión. Esto depende de la suite que elijas y debes leer su documentación al respecto. Otra alternativa es forzar a que se produzcan excepciones y anotarlas para luego añadirlas en la sección "except" y actuar en consecuencia.

Y una tercera opción es directamente capturar la madre de las excepciones sin distinción alguna:


delphi
  1. try
  2. ...
  3. except
  4. ShowMessage('Se ha producido un error dentro del try');
  5. end;

La cuestión es que las excepciones no te van a decir que cometiste una violación a una regla de negocio. Es responsabilidad del desarrollador dar forma de regla de negocio a la excepción y al error capturado.

Una regla de negocio es una definición formal que se le da, dentro del contexto del ambiente/emprendimiento/empresa, como respuesta a una serie de requisitos y condiciones que deben cumplirse y respetarse para que la actividad diaria funcione. Por ejemplo, Hagamos de cuenta que estamos  desarrollando un sistema para administrar la distribución de materiales para un emprendimiento metalúrgico o una fábrica, y que durante el análisis recabamos la información de que cuando se está por registrar el movimiento de entrada de la materia prima el encargado del área destinada al stock o inventario realiza un control previo y necesita un diagrama ABC.

Tu ahora como desarrollador debes implementar un control que garantice esa regla de negocio u operación. Entonces, cuando se esté por ejemplo por intentar de dar una orden de "alta" de materias primas debes comprobar que efectivamente se haya realizado ese control.

En como lo traduces ese control en la aplicación, ya es cosa de creatividad y diseño del desarollador.

He aquí que no toda excepcion necesariamente va a dar una respuesta de regla de negocio, como así también no toda excepción proveniente desde una base de datos se convertirá en una excepcion a la regla de negocio.

Puede que para llevar a ese control se requiera leer desde una base de datos, hacer algunos cálculos (que para hacer el diagrama ABC si lo es) y después producir una "salida" adecuada. ¿Una excepción producida por un error de conexión de base de datos justifica dar aviso de que no se puede ingresar materia prima porque el ABC no se hizo? NO. Pero puede que si hay una excepción dentro de los cálculos que impida que se complete el ABC si justifique elevar una excepción mayor y aquí si estaríamos en una violación de la regla de negocio. Ya que la operatoria no ha podido realizarse de manera correcta.

En ocasiones se necesita capturar una excepción para dar aviso de una excepción que la "envuelva".

 

El tema de las excepciones da para mucho más material. Te invito a que sigas leyendo ese libro, y busques en los foros sobre try-except. Vas a encontrar un buen par de hilos que tratan el tema.

Espero que con lo que te he dicho, por el momento, se me entienda al menos superficialmente. Sino habrá que analizar en detalle con un ejemplo en concreto. Para ello, si tienes dudas o problemas bien específicos inicia un hilo en el foro más conveniente a la temática y lo analizamos.

 

Sobre el punto 2, disculpa pero sigo sin entender. Si tienes algun material de lectura al que pudiera consultar lo que dices, o si te puedes explayar más te lo agradecería.

 

Y sobre el punto 3, no me animaría a decir que suite es mejor que otra. Cada una tiene sus cosas... Yo he trabajado con Zeos y si bien me ha sido al comienzo un tanto "raro" ya que venía de trabajar con IBX en Delphi 6 y en Zeos trabaja diferente.

Pero cual sería la mejor... la verdad no lo se. Lo que tiene la suite SQLdb es que es la "oficial" de Lazarus, y fue pensada para dar soporte genérico a varios motores y no necesitas de algo extra para acceder a la DB y de esta forma como que tienes asegurado el soporte y documentación al respecto. Si usas otras suites, y tienes dificultades especificas con estas, debes acudir a terceros.

 

Aquí estaremos para seguir asesorándote.

 

Saludos,


  • 0

#5 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 104 mensajes

Escrito 29 mayo 2018 - 08:33

Hola oscargvh, respecto del componente para conectar las bases de datos, utilizo ZeosLib, la ventaja es que permite conectar cualquier tipo de base de datos, se utiliza un solo conjunto de compentes, por ejemplo: el componente TZConnection te permite conectar con cualquier DB (Firebird, SQLite, MariaDB, etc.) y lo mismo con el resto de sus componentes como TZQuery. Es decir que si cambias en la DB será muy poco el código a modificar. Pero es cuestión de gustos y necesidades.

 

El manejo de excepciones casi no lo utilizo, pero existe, hay que buscar la documentación indicada.

 

Lazarus se instala con una carpeta examples que contiene demos de varios componentes.

 

"La cara oculta de Delphi" es bueno, pero en lo que respecta a bases de datos atrasa mucho (1997) y todo sobre un solo sistema operativo: Windows 95/98.

 

Libros de Lazarus y Free Pascal hay muy pocos, yo conseguí uno que compré por Amazon: "Iniciar con Lazarus y Free Pascal", está en castellano, pero la traducción es horrible, te lo recomiendo en inglés, es bueno, a mí al menos me sirvió bastante.

 

Un tutorial de Lazarus muy conocido, aunque de apenas 78 páginas, año 2015: https://drive.google...LUd2azlTQkl1N3c

 

Documentación de Zeos: https://drive.google...UEEyR2xINmNmaEE

 

Libro: Introducción a la programación con Object Pascal (y Lazarus) 152 páginas año 2012: https://drive.google...MKiOKxOsN45boPG

 

CUPAS Curso de programación con Pascal, 310 páginas año 2010: https://drive.google...iew?usp=sharing

 

En cuanto al código, es 99,9% el mismo el de Delphi y Free Pascal, cuando hagas búsquedas (que harás y muchas) no descartes ningún resultado de Delphi.

 

Y desde ya este foro y el de Lazarus, que tiene un subforo en español, aunque en nuestro idioma, obtendrás mejores respuestas en este foro sin lugar a dudas. Si te manejas con el inglés, ahí cambia la cosa, pues puedes dar en el foro de Lazarus directamente con algunos de sus desarrolladores que participan del foro.

 

Saludos.


  • 1

#6 oscargvh

oscargvh

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 29 mayo 2018 - 08:52

Muchas Gracias Delphius y Gaston.

 

Se agradece las respuestas y comentarios, leeré los documentos y libro que me proporcionaron.

Acá seguiré aprendiendo de todos ustedes.

Nuevamente gracias por la bienvenida, es grato encontrar personas como ustedes que apoyan a los noveles. 

 

Gracias totales.

 

Y seguiré más adelante con preguntas y dudas, espero en breve aportar también al foro y si se ve mas movido este foro que el en español de lazarus. 


  • 0

#7 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.290 mensajes
  • LocationArgentina

Escrito 29 mayo 2018 - 08:53

Hola oscargvh, respecto del componente para conectar las bases de datos, utilizo ZeosLib, la ventaja es que permite conectar cualquier tipo de base de datos, se utiliza un solo conjunto de compentes, por ejemplo: el componente TZConnection te permite conectar con cualquier DB (Firebird, SQLite, MariaDB, etc.) y lo mismo con el resto de sus componentes como TZQuery. Es decir que si cambias en la DB será muy poco el código a modificar. Pero es cuestión de gustos y necesidades.

 

El manejo de excepciones casi no lo utilizo, pero existe, hay que buscar la documentación indicada.

 

Lazarus se instala con una carpeta examples que contiene demos de varios componentes.

 

"La cara oculta de Delphi" es bueno, pero en lo que respecta a bases de datos atrasa mucho (1997) y todo sobre un solo sistema operativo: Windows 95/98.

 

Libros de Lazarus y Free Pascal hay muy pocos, yo conseguí uno que compré por Amazon: "Iniciar con Lazarus y Free Pascal", está en castellano, pero la traducción es horrible, te lo recomiendo en inglés, es bueno, a mí al menos me sirvió bastante.

 

Un tutorial de Lazarus muy conocido, aunque de apenas 78 páginas, año 2015: https://drive.google...LUd2azlTQkl1N3c

 

Documentación de Zeos: https://drive.google...UEEyR2xINmNmaEE

 

Libro: Introducción a la programación con Object Pascal (y Lazarus) 152 páginas año 2012: https://drive.google...MKiOKxOsN45boPG

 

CUPAS Curso de programación con Pascal, 310 páginas año 2010: https://drive.google...iew?usp=sharing

 

En cuanto al código, es 99,9% el mismo el de Delphi y Free Pascal, cuando hagas búsquedas (que harás y muchas) no descartes ningún resultado de Delphi.

 

Y desde ya este foro y el de Lazarus, que tiene un subforo en español, aunque en nuestro idioma, obtendrás mejores respuestas en este foro sin lugar a dudas. Si te manejas con el inglés, ahí cambia la cosa, pues puedes dar en el foro de Lazarus directamente con algunos de sus desarrolladores que participan del foro.

 

Saludos.

 

Muchas gracias Gaston por nutrir con más material.

Respecto a que La Cara Oculta D4 "atrasa" discrepo. Si es cierto que expone los conceptos de base de datos en base a Interbase de hace unos cuantos años pero en los fundamentos teóricos, y en algunos tantos prácticos no ha cambiado significativamente la cosa.

¿Cambiaron los modos en como se usa data-ware? No. ¿Cambió el manejo de excepciones? Tampoco. ¿La POO en Object Pascal ha cambiado? Pues, salvando la extensión que se ha realizado para dar soporte a genéricos, helpers, records, y sintaxis estricts NO. ¿Se ha caído el paradigma? Para nada.

Y a pesar de que cuando fue escrito se usaba Windows 98, al día de hoy siguen habiendo desarrollos en la no tan conocida D5 y la ampliamente difundida D7 funcionando sin problemas en un Windows 10 así que no hay impedimentos en el SO tampoco.

 

Lo cierto es que a pesar de los años ese libro ayuda mucho a aprender como funciona Delphi, y su par open source Lazarus/CodeTyphon. Puede que algunas cosas necesiten trasladarse a lo "nuevo", pero en sus escencias su contenido sigue vigente.

 

Saludos,


  • 0

#8 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 104 mensajes

Escrito 29 mayo 2018 - 11:00

Delphius, sabía que me ibas a saltar a la yugular ;) estaba en mis cálculos :D

Ahora en serio, tus argumentos son válidos pero más apuntando al mundo Delphi: Interbase, Windows, D5 y D7. Mi opinión del libro es solo en el tema DB y para alguien nuevo en Lazarus y que utiliza Firebird, sostengo que hay mejor material. De hecho recién vi que Oscar encontró un excelente tutorial en el foro oficial de Lazarus y paso el link porque es muy completo y puede servirle a alguien: https://www.webscom....s-zeos-firebird

 

Saludos.


  • 0

#9 oscargvh

oscargvh

    Newbie

  • Miembros
  • Pip
  • 5 mensajes

Escrito 01 junio 2018 - 08:27

Este link me parece muy bueno y ya estoy en ello.

Pero esta en portugues pero te lleva de la mano, para herencia de clases con formulario, algo que andaba buscando.

 

https://www.youtube....h?v=hYY5VGZghBU

 

 

Espero no infringir ninguna regla.

Saludos.

 

 

 

 

----------------------------

 

  • 0