<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>