<html><head><style type='text/css'>p { margin: 0; }</style></head><body><div style='font-family: times new roman,new york,times,serif; font-size: 12pt; color: #000000'>Hola, por aportar otro punto de vista<div><br></div><div>Una unit ( denominada por ejemplo Global ) con</div><div> - Uses a los datamodules, Zeos, db, etc</div><div> - Declaración de una clase del modo TMyDataSet = class(TZQuery)</div><div> - Initialization (Crea el / los datamodulos que necesites) así como clases adicionales comunes a toda la aplicación</div><div> - finalization (Destruye o libera el / los datamodulos) así como clases adicionales creadas en initialization</div><div> - Funciones generales a la aplicación entre las que se encuentran funciones como GetQry, DeleteRecords, etc ... que te devuelven una query tipo TMyDataSet o realiza operaciones de SQL</div><div><br></div><div>De esta manera en cualquier parte o unit del programa sólo debemos hacer use de Global. Si queremos una query pues llamamos Global.GetQry ya configurada y conectada con nuestra conexión en el datamódulo, si sabemos el sql a ejecutar pues usamos una de las funciones de Global que directamente ejecutan la SQL y devuelven el resultado. Cuando quiero cambiar el tipo de conexión simplemente cambio el datamodulo a crear, si deseo cambiar de Zeos a otro componente pues cambias la unit Global y el resto de aplicación queda sin tocar.</div><div><br></div><div>Espero haber aportado otra manera que pueda ser útil ...</div><div><br></div><div>Un saludo.</div><div><br><hr id="zwchr"><div style="color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>De: </b>alfred@arsistemes.com<br><b>Para: </b>"Spanish version of Lazarus List" <lazarus-es@lists.lazarus.freepascal.org><br><b>CC: </b>"Spanish version of Lazarus List" <lazarus-es@lists.lazarus.freepascal.org><br><b>Enviados: </b>Martes, 9 de Julio 2013 22:10:09<br><b>Asunto: </b>Re: [Lazarus-es] forms i querys<br><br>Gracias por la respuesta.<br><br>Tomo buena nota de todo y creo que es una excelente exposición.<br>Especialmente interesante el punto 2-C.<br><br>El punto 6 tiene ventajas e inconvenientes. Por un lado la claridad, pero<br>alguna vez en la que utilizo creación-modificación de controles en el form<br>creo que es especialmente útil poder hacer un bucle para cambiar<br>determinadas propiedades de todos y para eso es super pràctico tener<br>Label1, Label2, Label3, Label4... en lugar de Nombre, apellido,<br>direccion, otra cosa, etc... (eso sí, si hay muchos controles se acaba<br>perdiendo el tiempo en averiguar que es què y sale más a cuenta<br>identificarlos claramente).<br><br>Pero me parece que no voy a ser capaz de quitarme la manía de escribir<br>código de vez en cuando (de forma impulsiva y aparentemente aleatoria O_o)<br>para evitar utilizar en algún momento decisivo el DataModule.<br><br><br><br>> Colegas:<br>><br>> Aunque he llegado tarde al debate deseo expresar mi punto de vista:<br>><br>> 0- Como bien se ha comentado es una buena práctica de programación<br>> llevar los objetos de acceso a los datos en un TDataModule.<br>> Ejemplo: TZConnection, TZQuery, TZTable, TZStoredProc, TDatasource.<br>><br>> 1- Usted puede añadir tantos TDataModule como estime y/o necesite;<br>> esto era posible incluso en Borland Delphi7.<br>><br>> 2- En el caso de Lazarus el MVC podría verse de la siguiente forma:<br>> a) Modelo: podrían ser SQLDB, ZEOSDB o similares.<br>> b) Vista: podrían ser los DataControls, LazReport o similares.<br>> c) Controlador: aquí la cosa se complica algo pues el controlador<br>> responde a eventos (usualmente acciones del usuario) e invoca<br>> peticiones al 'modelo' por lo que se puede pensar en los<br>> siguientes: TDatasource, TSqliteDataset, TSqlite3Dataset, etc.<br>> Quizás en la Wiki aparezca algo relacionado con este tema.<br>><br>> 3- Debe incluir en las «uses» de cada TForm el nombre del TDataModule<br>> que almacena los Objetos de Acceso a Datos.<br>><br>> 4- Es aconsejable que el/los TDataModules se creen de forma automática,<br>> así evitamos que un DataControl intente acceder a datos cuando aún<br>> no está activa la conexión a la Base de Datos, incluso en ocasiones<br>> debe iniciarse primero que el Form principal; esto depende de como<br>> el programador desarrolla su app.<br>><br>> 5- En ocasiones para el manejo de Bases de Datos en Lazarus debemos<br>> añadir manualmente en «uses» la unidad «db».Ejemplo cuando deseamos<br>> utilizar el procedimiento «Locate» desde un TForm y los Objetos de<br>> Acceso a Datos están en un TDataModule.<br>><br>> 6- Algo muy importante que se recomienda como buena práctica de<br>> programación y que nos ayuda a seleccionar el objeto adecuado entre<br>> los tantos que podamos tener en un TDataModule es «los nombres de las<br>> clases/objetos, variables, constantes, funciones y procedimientos;<br>> deben tener nombres que de manera intuitiva nos digan para que son o<br>> que hacen».<br>><br>> 7- Recuerden que el exceso de modulos (TForm, TDataModule), hace nuestra<br>> aplicación más grande y lenta, una alternativa es crear los TForm<br>> dinámicos o en tiempo de ejecución.<br>><br>> Este árbol o grafo ilustra como podrían verse los objetos en un<br>> TDataModule:<br>> TZConnection<br>> /\<br>> / \<br>> / \<br>> / \<br>> TZQuery TZTable<br>> / \<br>> / \<br>> TDatasource TDatasource<br>><br>><br>> Saludos<br>> Maikel<br>><br>><br>> El jue, 04-07-2013 a las 20:24 -0300, Martin Gomez escribió:<br>>> No estoy muy seguro al respecto (tendría que recurrir a la<br>>> documentación) pero hasta Delphi 7 sólo podía haber 1 datamodule por<br>>> proyecto... En Lázarus creo que no existe esa limitación.<br>>><br>>><br>>> 2013/7/4 Ulises Díaz <udiaz60@hotmail.com><br>>> Hola<br>>><br>>><br>>> Si, Aprendí en Visual Basic, pero cuando se trata de<br>>> aplicaciones Web utilizo MVC, separando los datos de la<br>>> lógica de negocio, se me hace difícil hacerlo acá, sobre todo<br>>> por lo confuso que es tener un datamodule con todas las<br>>> querys, a menos que por cada sección o formulario del programa<br>>> se cree un datamodule, cosa que utilice una vez pero por cada<br>>> datamodule necesitaba una conexión, lo que no me gustó.<br>>><br>>><br>>> Voy a volver a intetarlo pero quetal si creamos un datamodule<br>>> ("prinicpal") que tenga la conexion y para cada form creamos<br>>> otro data module cuyas querys se asignen a la conexion de<br>>> datamodule "principal", que opinan? o les parece poco<br>>> funcional. Lo que busco es mejor organización.<br>>><br>>><br>>> Gracias por la recomendación.<br>>><br>>><br>>><br>>><br>>><br>>> ______________________________________________________________<br>>> Date: Thu, 4 Jul 2013 18:49:31 -0300<br>>> From: mmgomez@gmail.com<br>>> To: lazarus-es@lists.lazarus.freepascal.org<br>>> Subject: Re: [Lazarus-es] forms i querys<br>>><br>>><br>>> Está considerado una "buena practica" el separar el acceso a<br>>> datos con un datamodule, al menos esa es la recomendación de<br>>> Borland desde el Delphi 1.<br>>><br>>><br>>> Si venías del Visual Basic es una costumbre dificil de<br>>> adoptar, pero una vez que te acostumbras empiezan los<br>>> beneficios :)<br>>><br>>><br>>> 2013/7/4 Ulises Díaz <udiaz60@hotmail.com><br>>> Hola<br>>><br>>><br>>> Me pasaba igual, a veces pienso igual, por un tiempo<br>>> utilicé un Data Module con una conexión, las querys<br>>> (tzquery de Zeos) y el datasource de cada formulario<br>>> juntos, luego empecé a ver algo confuso tantas querys<br>>> que decidí crear un datamodule con una única conexión<br>>> desde la que se conectan las querys que se encuentran<br>>> en cada formulario junto con su datasource, agregó la<br>>> unidad del datamodule en los uses de cada form y<br>>> asigno la propiedad de conexion de las querys a la<br>>> mencionada conexión.<br>>><br>>><br>>> Muchas veces no utilizo componentes gráficos,<br>>> especificamente en los casos que tengo que cargar<br>>> información a listas, stringGrids, realizar inserts o<br>>> udpates desde stringGrids, entre otros si no que lo<br>>> hago por código en el evento OnCreate de los forms,<br>>> por ejemplo:<br>>><br>>><br>>> var<br>>> QCargarComboboxs : tzquery; //declaro la query, Zeos<br>>> begin<br>>> QCargarComboboxs : tzquery.create(nil); //Instancio<br>>> QCargarComboboxs.conection :=<br>>> MiDataModule.conexion; //asigno la conexión del<br>>> datamodule.<br>>><br>>><br>>><br>>><br>>> QCargarComboboxs .SQL.add('select * from years');<br>>> QCargarComboboxs.execsql;<br>>> //Realizo la consulta<br>>><br>>><br>>> //Cargo un combo por ejemplo<br>>> While not QCargarCombobox.Eof do<br>>> begin<br>>> Combo1.add(QCargarComboboxs.fielbyname('year').asstring);<br>>> //Adiciono el elemento al combo<br>>> QCargarComboboxs.next; //siguiente registro<br>>> end;<br>>><br>>> .<br>>> .<br>>> .<br>>> Luego utilizo la misma query para cargar otros<br>>> combos.<br>>><br>>><br>>> Bueno se puede crear una función que realice esta<br>>> operación pasandole como argumentos el nombre de la<br>>> tabla, los campos, y los combobox a rellenar.<br>>><br>>><br>>> Para lo demás me gusta utilizar componentes gráficos,<br>>> todo depende de las circunstancias.<br>>><br>>><br>>><br>>><br>>> Esperaré otras respuestas tal vez me sirvan para<br>>> mejorar la forma en que programo.<br>>><br>>><br>>><br>>><br>>> Espero que sea de utilidad, saludos desde Colombia<br>>><br>>><br>>><br>>><br>>> Ulises Díaz<br>>> Ingeniero de Sistemas, UNAD.<br>>><br>>><br>>><br>>><br>>><br>>> > Date: Thu, 4 Jul 2013 22:51:30 +0200<br>>> > From: alfred@arsistemes.com<br>>> > To: lazarus-es@lists.lazarus.freepascal.org<br>>> > Subject: [Lazarus-es] forms i querys<br>>><br>>> ><br>>> > Saludos de nuevo,<br>>> ><br>>> > Estoy incorporando forms para editar registros con<br>>> doble click en un<br>>> > dbgrid lazarus + Zeoslib + postgres<br>>> ><br>>> > Por algún motivo que desconozco siempre acabo<br>>> dudando entre usar el<br>>> > Datamodule... incorporar el query y el Datasource en<br>>> el mismo form o<br>>> > incluso realizarlo todo por código.<br>>> ><br>>> > No acabo de decidirme por uno u otro método y voy<br>>> alternando según va<br>>> > saliendo.<br>>> ><br>>> > ¿Existe algun convenio sobre cuál es el mejor<br>>> método ?<br>>> ><br>>> > Gracias<br>>> ><br>>> > _______________________________________________<br>>> > Lazarus-es mailing list<br>>> > Lazarus-es@lists.lazarus.freepascal.org<br>>> ><br>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>>><br>>><br>>> _______________________________________________<br>>> Lazarus-es mailing list<br>>> Lazarus-es@lists.lazarus.freepascal.org<br>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>>><br>>><br>>><br>>><br>>><br>>> --<br>>> Try not to become a man of success but rather to become a man<br>>> of value. Albert Einstein<br>>><br>>> _______________________________________________ Lazarus-es<br>>> mailing list Lazarus-es@lists.lazarus.freepascal.org<br>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>>><br>>> _______________________________________________<br>>> Lazarus-es mailing list<br>>> Lazarus-es@lists.lazarus.freepascal.org<br>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>>><br>>><br>>><br>>><br>>><br>>> --<br>>> Try not to become a man of success but rather to become a man of<br>>> value. Albert Einstein<br>>> _______________________________________________<br>>> Lazarus-es mailing list<br>>> Lazarus-es@lists.lazarus.freepascal.org<br>>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>><br>><br>><br>> --<br>><br>> Este mensaje le ha llegado mediante el servicio de correo electronico que<br>> ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema<br>> Nacional de Salud. La persona que envia este correo asume el compromiso de<br>> usar el servicio a tales fines y cumplir con las regulaciones establecidas<br>><br>> Infomed: http://www.sld.cu/<br>><br>><br>> _______________________________________________<br>> Lazarus-es mailing list<br>> Lazarus-es@lists.lazarus.freepascal.org<br>> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br>><br><br><br><br>_______________________________________________<br>Lazarus-es mailing list<br>Lazarus-es@lists.lazarus.freepascal.org<br>http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es<br></div><br></div></div></body></html>