|
|
Programación: Realizar aplicación en Delphi con tablas Paradox en Red
![]() Os explicamos en este artículo cómo realizar una aplicación en Borland Delphi 6 que utilice como motor de base de datos BDE (Borland Database Engine) y Paradox. Os explicamos cómo configurar adecuadamente el BDE y la propia aplicación para admitir conexiones de varios equipos de la red a estas tablas de forma simultánea (concurrente).
Una aclaración inicial sobre Paradox en redPor definición, Paradox es una base de datos de escritorio, semejante a Microsoft Access, no está diseñada para soportar multitud de conexiones de red de varios usuarios, aunque con lo que os explicaremos a continuación será posible que varios equipos de la red accedan a las mismas tablas Paradox. Hemos de decir que en determinadas circunstancias, sobre todo si no se siguen los pasos al pie de la letra, se pueden corromper los índices, aunque esto no sería un problema grabe pues se pueden volver a regenerar. Para aplicaciones de gestión de las que necesitéis varios usuarios conectados a la vez a las mismas tablas recomendamos utilizar otros motores de bases de datos profesionales, más preparados para soportar cientos y miles de usuarios concurrentes, incluso conexiones a través de Internet. Por ejemplo MySQL, que además de soportar lo que os comentamos, es un motor de base de datos gratuito. Aunque si no hay más remedio, por el motivo que sea, os explicaremos cómo realizar una aplicación en Borland Delphi 6 que utilice Paradox y permita conexión de varios usuarios en red a las mismas tablas. Preparar una aplicación Delphi para Paradox en red (múltiples usuarios conectados a las mismas tablas)Para realizar aplicaciones que utilicen tablas Paradox en red debemos seguir los siguientes pasos: Añadiremos un DataModule a nuestra aplicación desde el menú "File" - "New" - "Data Module", a este DataModule le añadiremos los siguientes componentes:
Quedará algo así: El Data Module (al cual le hemos puesto en la propiedad "Name" "MDatos") tendrá el siguiente código fuente: Explicamos brevemente (pues es bastante sencillo) lo que hace el código anterior:unit UnidadModuloDatos; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Db, DBTables, inifiles, DBIProcs; type TMDatos = class(TDataModule) db: TDatabase; Session1: TSession; Table1: TTable; Table1Id: TAutoIncField; Table1No: TStringField; Table1Si: TDateField; DataSource1: TDataSource; procedure AbrirBD(pw : String); procedure DataModuleCreate(Sender: TObject); procedure Table1AfterPost(DataSet: TDataSet); private { Private declarations } public hacer : boolean; { Public declarations } end; var MDatos: TMDatos; implementation {$R *.DFM} procedure TMDatos.AbrirBD(pw : String); var ruta, rutaprivate, rutanet : string; begin with tinifile.create (changefileext(paramstr(0),'.INI')) do try ruta := readstring ('Datos', 'Ruta', ''); rutanet := readstring ('Datos', 'Ruta net', ''); rutaprivate := readstring ('Datos', 'Ruta PrivateDir', ''); finally free; end; With Session1 do begin AddPassword (pw); End; With db do begin Params.Clear; Params.Add('PATH=' + RUTA); Params.Add('DEFAULT DRIVER=PARADOX'); Params.Add('ENABLE BCD=FALSE'); Connected := true; End; table1.Active := True; {session1.NetFileDir := rutanet; session1.PrivateDir := 'C:\TEMP'; Session1.Active := true; with db do begin Params.Clear; Params.Add('PATH=' + ruta); Params.Add('DEFAULT DRIVER=PARADOX'); Params.Add('ENABLE BCD=FALSE'); Connected := true; end; table1.active := true; } end; procedure TMDatos.DataModuleCreate(Sender: TObject); var ruta, servidor, rutaprivate, rutanet : string; begin with tinifile.create (changefileext(paramstr(0),'.INI')) do try ruta := readstring ('Datos', 'Ruta', ''); rutanet := readstring ('Datos', 'Ruta net', ''); rutaprivate := readstring ('Datos', 'Ruta PrivateDir', ''); servidor := readstring ('Datos', 'Es el servidor', '0'); if ruta = '' then begin while not (ruta <> '') do ruta := InputBox ('Ruta de los datos...', 'Introduzca la ruta de los ficheros *.db', 'c:\p\datos ó \\a\PRed\datos'); writestring ('Datos', 'Ruta', ruta); end; if rutaprivate = '' then begin while not (rutaprivate <> '') do rutaprivate := InputBox ('Ruta de los *.lck...', 'Introduzca el PrivateDir (ruta de los ficheros *.lck)', 'c:\p\temp'); try CreateDir(rutaprivate) except end; writestring ('Datos', 'Ruta PrivateDir', rutaprivate); end; if rutanet = '' then begin while not (rutanet <> '') do rutanet := InputBox ('Ruta net...', 'Introduce la Ruta de la carpeta NET', '\\a\PRed\datos\net'); writestring ('Datos', 'Ruta net', rutanet); END; if servidor = '' then begin while not (servidor <> '') do servidor := InputBox ('Servidor...', '¿Es este equipo el servidor?', 'no/sí'); if (UpperCase(servidor) = 'YES') or (UpperCase(servidor) = 'SÍ') or (UpperCase(servidor) = 'SI') then writestring ('Datos', 'Es el servidor', '1') else writestring ('Datos', 'Es el servidor', '0'); end; finally end; With mdatos.Session1 do begin NetFileDir := RUTANET; PrivateDir := rutaprivate; End; With db do begin Params.Clear; Params.Add('PATH=' + RUTA); Params.Add('DEFAULT DRIVER=PARADOX'); Params.Add('ENABLE BCD=FALSE'); //No testeado si esto funciona //si no funciona por código habrá que hacerlo manual //en la configuración del BDE if uppercase (servidor) <> 'NO' then Params.Add('LOCAL SHARE=TRUE') else Params.Add('LOCAL SHARE=FALSE'); Connected := true; End; table1.active := true; end; procedure TMDatos.Table1AfterPost(DataSet: TDataSet); begin Table1.FlushBuffers; end; end.
A continuación creamos un TForm que será el formulario principal de la aplicación, el que el usuario verá al iniciarla, donde estarán los datos de las tablas Paradox. En este formulario pondremos un TDBNavigator, TDBGrid, TListBox y un TButton, quedará de la siguiente forma:
El formulario tendrá el siguiente código:
unit UnidadPrincipal; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DBTables, BDE,Db, Grids, DBGrids, ExtCtrls, DBCtrls, StdCtrls, inifiles, Buttons, shellapi; type TFormPrincipal = class(TForm) DBNavigator1: TDBNavigator; Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; ListBox1: TListBox; DBGrid1: TDBGrid; Splitter1: TSplitter; Panel4: TPanel; Image1: TImage; Panel5: TPanel; BInfo: TBitBtn; Panel6: TPanel; LWEB: TLabel; procedure BInfoClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure LWEBClick(Sender: TObject); procedure LWEBClick2(Sender: TObject); private { Private declarations } public { Public declarations } end; var FormPrincipal: TFormPrincipal; implementation uses UnidadModuloDatos; {$R *.DFM} procedure TFormPrincipal.BInfoClick(Sender: TObject); VAR TmpCursor: hDbiCur; rslt: dbiResult; UsrDesc: USERDesc; begin LISTBOX1.Items.Clear; LISTBOX1.Items.add('Usuarios conectados:'); Check(DbiOpenUserList(TmpCursor)); try repeat Rslt := DbiGetNextRecord(TmpCursor, dbiNOLOCK, @UsrDesc, nil); if Rslt <> DBIERR_EOF then begin LISTBOX1.Items.add(UsrDesc.szUserName); end; until Rslt <> DBIERR_NONE; finally Check(DbiCloseCursor(TmpCursor)); end; LISTBOX1.Items.add('------+++------'); LISTBOX1.Items.add('Ruta fichero NET: ' + mdatos.Session1.NetFileDir); LISTBOX1.Items.add('Ruta directorio privado (*.lck): ' + mdatos.Session1.PrivateDir); LISTBOX1.Items.add('Ruta directorio datos: ' + mdatos.Session1.Databases[0].Directory); LISTBOX1.Items.add('Nombre del DRIVER: ' + mdatos.Session1.Databases[0].DriverName); LISTBOX1.Items.add('Nombre del Alias del database: ' + mdatos.Session1.Databases[0].GetNamePath); end; procedure TFormPrincipal.FormClose(Sender: TObject; var Action: TCloseAction); begin mdatos.Session1.Close; mdatos.db.CloseDataSets; end; procedure TFormPrincipal.LWEBClick(Sender: TObject); begin ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'), Nil, Nil, SW_SHOWNORMAL); end; procedure TFormPrincipal.LWEBClick2(Sender: TObject); begin ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'), Nil, Nil, SW_SHOWNORMAL); end; end. En realidad sólo es necesario código fuente si queremos hacer alguna acción "fuera de lo normal", Delphi ya incluye componetes como el DBNavigator con botones para añadir, eliminar, refrescar, mover al primero, último, siguiente anterior, etc. que no necesitan código fuente, es suficiente con enlazar el DBNavigator con el DataSource correspondiente. El código fuente anterior sólo lo usamos para mostrar información de la base de datos (como los usuarios que hay conectados) en un ListBox, si no mostrásemos esto no haría falta código fuente. Para el caso del fichero principal del proyecto o aplicación Delphi (el .dpr) tendrá el siguiente código: program P; uses Forms, UnidadPrincipal in 'UnidadPrincipal.pas' {FormPrincipal}, UnidadModuloDatos in 'UnidadModuloDatos.pas' {MDatos: TDataModule}; {$R *.RES} begin Application.Initialize; Application.Title := 'AjpdSoft - Paradox en red/Paradox int Net'; Application.CreateForm(TMDatos, MDatos); Application.CreateForm(TFormPrincipal, FormPrincipal); Application.Run; end. Que se creará de forma automática al ir agregando los formularios y módulos de datos, sólo tendremos que modificarlo si queremos realizar alguna comprobación o tarea antes de iniciar algún formulario. Con lo anterior ya tendremos la aplicación preparada para ser ejecutada por varios usuarios (varios equipos) en la misma red utilizando las mismas tablas paradox. La aplicación en funcionamiento: Instalación y configuración del BDELógicamente tendremos que instalar el BDE (Borland Database Engine) en todos los equipos donde queramos utilizar la aplicación que accederá a tablas Paradox. Lógicamente también todos los equipos deben estar conectados por red al servidor. Tras instalar el BDE, deberemos configurarlo accediendo a "Inicio" - "Configuración" - "Panel de control", abriremos "BDE Administrator": Accederemos a la pestaña “Configuration”, seleccionaremos “System”, abriremos “INIT” y en la pestaña “Definition” cambiaremos el valor de la propiedad: “LOCAL SHARE” a False para el caso de los equipos clientes y True para el servidor. Es fundamental cambiar este valor en todos los equipos para que no haya problemas de corrupción de índices y demás: Compartir la carpeta de datos en el servidor para acceso de los clientesEn el equipo servidor, el que contendrá las tablas Paradox de la aplicación, debemos compartir la carpeta donde se encuentren dichas tablas, con permisos de lectura y escritura para los usuarios de los equipos cliente. Por ejemplo, si la carpeta de la aplicación está en:
Pulsaremos con el botón derecho sobre la carpeta, en el menú emergente seleccionaremos "Compartir y seguridad". En la ventana de propiedades de la carpeta, en la pestaña "Compartir", marcaremos la opción "Compartir esta carpeta", en "Recurso compartido" introduciremos el nombre que tendrá la carpeta compartida, por ejemplo "paradoxred" (es recomendable no utilizar espacios ni nombres muy largos):
Tras compartir la carpeta, si el equipo servidor se llama "pcservidor" ya podremos acceder a la carpeta compartida desde cualquier PC poniendo (en "Inicio" - "Ejecutar"):
En la carpeta
Crearemos las subcarpetas:
Nota importante: la carpeta temporal (PrivateDir) donde se alojarán los .lck no debe coincidir con la carpeta de los datos (tablas paradox).
Contenido del fichero de configuración INI en el equipo servidor y en los clientesEl fichero de configuración de la aplicación será diferente para el equipo servidor y para los equipos cliente. Para el equipo servidor será algo así:
En los equipos clientes:
Nota importante: como se puede observar en el ejemplo la ruta del NET DIR se debe poner tanto en el servidor como en el cliente con la notación UNC (Ej. \\MiServidor\misDatos\net), ambos deben tener el NET DIR escrito así. Lo mismo ocurre con la ruta de la carpeta de los datos.
Artículos relacionados
CréditosArtículo realizado íntegramente por Alonsojpd miembro fundador del proyecto AjpdSoft. Anuncios
Enviado el Sábado, 23 mayo a las 02:24:07 por ajpdsoft
|
|