Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   trabajar en red con base de datos paradox (https://www.clubdelphi.com/foros/showthread.php?t=24235)

Sayuri 12-08-2005 13:18:56

trabajar en red con base de datos paradox
 
He realizado una aplicación en Delphi con tablas paradox, quiero trabajar con ella en red con otro equipo. Tengo un alias para la base de datos, y mi equipo va a ser el servidor. El otro equipo no tiene instalado delphi ni tampoco el bde
¿cómo puedo conectarle a mi equipo para que funcione con la misma base de datos?

Lepe 12-08-2005 14:16:00

Revisa este hilo para el BDE.

Para la red, mira en la seccion Columnas, el archifamoso artículo "paradox en red".

Y ya de camino el programa Caerques, que seguro que los indices se te corromperán tarde o temprano :D

Un saludo.

Sayuri 16-08-2005 10:30:47

la verdad es que no me entero muy bien con el artículo ni con la columna. Una pregunta.
al tener un alias creado con el bde para tablas paradox, ¿que tipo de alias hay que crear? porque yo puse standard... ¿está bien?

Lepe 16-08-2005 11:26:17

Si es STANDARD.

Te aconsejo que leas ese artículo muy detenidamente, varias veces y lo vayas masticando poco a poco, aunque no lo parece tiene mucha información, y debe ser leido con mucha calma.

Si no entiendes alguna cosa, revisa la ayuda de delphi, al principio te sonará chino, despues de hacer una lectura general de todos los componentes, Tdatabase, Tsession, etc, conseguirás un concepto más claro.

Para dudas concretas tienes el foro, pero dado que hay muchas formas de conectarse, y muchos parámetros, la única solución viable es que entiendas qué tienes que hacerlo y como; no hay código que se diga "esto va así".

Un saludo

Casimiro Notevi 16-08-2005 11:52:10

Lepe se refiere a este artículo

Sayuri 16-08-2005 19:37:29

Sayuri
 
Según el artículo tienes dos opciones (al menos hasta donde llego yo a entender) o hacerlo mediante el alias (que es lo que yo hago) o sino mediante lo de TSession. Yo tengo en el ordenador cliente el alias redirigido a donde se supone que va el servidor ¿no? y la primera vez, es decir, nada más arrancar todo va bien, lo malo está en que al introducir datos en uno de los dos (servidor o cliente) el otro no lo ve, a no ser que los dos cierren la aplicación y la vuelvan a arrancar. ¿Tengo que activar / desactivar los componentes TTable para que se muestren bien?

Sayuri 17-08-2005 12:36:32

Leyendo el artículo me encuentro con :

Cita:

Siguiendo con el ejemplo anterior en nuestro DataModule deberemos tener un componente Tsesion y otro TdataBase, cuando se crea el DataModule asignamos los valores, bien manteniéndolos prefijados por programa o leyéndolos de un fichero a nuestro gusto ( un INI?),

Código Delphi [-]
MiDataModule.OnCreate;
 
Begin
 
With MiSesion do begin
NetFileDir := '\\MiServer\MisDatos\NET';
PrivateDir := 'c:\Temp';
End;
 
With MiDataBase do begin
Params.Clear;
Params.Add('PATH='+'\\MiServer\MisDatos');
Params.Add('DEFAULT DRIVER=PARADOX');
Params.Add('ENABLE BCD=FALSE');
Connected := true;
End;
 
End;

Lógicamente todas las tablas del datamodule deberán, hacer referencia a la session y la Database modificada.

y si yo utilizo un alias ¿necesito poner tambien ese código? el problema está en que aunque tengo el archivo PDOXUSRS.NET dentro de una carpeta '\NET' que a su vez está dentro de la carpeta que contiene las tablas, al ejecutar el programa, me crea por defecto ese mismo archivo 'PDOXUSRS.NET' en 'C:\' directamente.
Yo no tengo ningùn datamodule dentro del programa porque todas las tablas las asocio al alias ni tampoco tengo ningún componente TSession, porque en el artículo especifica que podría ser de las dos formas.

Sayuri 17-08-2005 23:19:41

Hola compañeros, siento ser pesada, pero necesito una respuesta.¿nadie me puede ayudar?

Muchas gracias

Lepe 18-08-2005 10:49:40

Siento no haber contestado antes, pero ayer tambien era fiesta local, por tanto, no estaba yo para usar internet ;)

Cita:

Según el artículo tienes dos opciones (al menos hasta donde llego yo a entender) o hacerlo mediante el alias (que es lo que yo hago) o sino mediante lo de TSession. Yo tengo en el ordenador cliente el alias redirigido a donde se supone que va el servidor ¿no?
No. Es una única opción, tienes que definir el alias, y además establecer las propiedades del Session.

las propiedades Privatedir y NetFileDir, pertenecen al objeto TSession, tu no creas ninguno, pero delphi cuando pones un TDatabase en tu programa, lo crea implicitamente. Por tanto, debes añadir ese código por fuerza.

En lugar de usar "MiSesion" puedes poner "Session" delphi te lo reconocerá.

Todas las tablas y consultas, deben apuntar a ese Session, es decir, en su propiedad SessionName, tienes que poner el "Default" que te deja elegir de la lista.

En cuanto a varios .Net, ten en cuenta que Delphi (el IDE de programación) es un usuario más de tus tablas, por tanto tambien crea un .Net, y el propio Database Desktop tambien, por eso puedes ver el .Net en c:\

El hecho de que un ordenador no vea al otro, es la prueba de que la session o el BDE no está bien configurado.

¿Habrás cambiado la propiedad LOCAL SHARE verdad?.

Cuando al modificar un mismo registro desde 2 ordenadores te salga el cartelito diciendo que el registro está bloqueado por otro usuario, entonces, y solo entonces, tienes bien configurado el BDE y la Session.

Un saludo

Lepe 18-08-2005 10:53:01

Por cierto, No dejes ningún cabo suelto, si el artículo dice "hay que hacer esto": hazlo, si no lo haces, ten por seguro que algo fallará.

Un saludo de nuevo y Suerte.

Sayuri 18-08-2005 10:59:29

muchas gracias lepe
 
Ante todo muchas gracias, me voy a poner ahora mismo con el tema, pero una cosa

Cita:

Empezado por Lepe

¿Habrás cambiado la propiedad LOCAL SHARE verdad?.

te diría que si... pero creo que no¿que significa que si lo habré configurado?

Gracias de nuevo

Sayuri 18-08-2005 11:23:25

pero me encuentro perdida... tengo que añadir un componente TDataBase, pero... ¿sólo eso?no necesito añadir ningún TSession?Además que tengo que poner en las propiedades del anterior. yo hasta ahora sólo usaba el alias y metía en las tablas el alias y a correr, entonces me encuentro perdida, además pone que tengo que poner el código en
Código Delphi [-]
object Label2: TLabel
  Left = 152
  Top = 112
  Width = 189
  Height = 26
  Caption = 'Nº Pacientes totales :'
  Font.Charset = DEFAULT_CHARSET
  Font.Color = 8388863
  Font.Height = -19
  Font.Name = 'Comic Sans MS'
  Font.Style = []
  ParentFont = False
end

mmmmmmm ¿que es el datamodule? jeje
lo siento, soy inutil

muchas gracias

Lepe 18-08-2005 11:24:06

Pues va a ser que no lo has modificado.

Busca por el foro por "local share", Marcos Zorrilla posteó una función para modificar esa entrada del registro de windows por código.

Debes poner el LOCAL SHARE a true en el ordenador que tiene las tablas. En el resto de ordenadores de la red local, deben estar a false.

bye

Sayuri 18-08-2005 11:46:00

he escrito más cosas antes... espero que las leas

Lepe 18-08-2005 12:01:04

TDataModule: Es un contenedor donde poner las tablas y objetos no visuales. Normalmente se utiliza para no tener desperdigadas las tablas por todos las ventanas, pero tambien, en determinadas aplicaciones, no se usa de esta forma.

En tu caso, yo añadiría un TDatamodule, File -->new --> Datamodule, como verás parece una ventana pero con fondo blanco, estará oculta en tu aplicación siempre, no tiene métodos para mostrarlo, ya que no tiene sentido, solo es un contenedor de objetos.

Ahi pones el TDatabase, solo tienes que modificar la propiedad DatabaseName, donde eliges el alias que tengas definido, y ya puedes poner el código:
Código Delphi [-]
MiDataModule.OnCreate;
 
Begin

With Database1.Session do begin
  NetFileDir := '\\MiServer\MisDatos\NET';
  PrivateDir := 'c:\Temp';
End;
 
With DataBase1 do begin
  Params.Clear;
  Params.Add('PATH='+'\\MiServer\MisDatos');
  Params.Add('DEFAULT DRIVER=PARADOX');
  Params.Add('ENABLE BCD=FALSE');

End;
  Database1.Session.Open;
  Database1.Connected:= True; 
End;

Tendrás que leer en la ayuda de delphi, que es un TDatabase, y para que se usa este componente. Como idea general, es el componente que se encarga de la conexion a las tablas, y mantiene una lista con todas las tablas que usas en tu aplicación

El TSession no lo añadas en el Datamodule. Ya ves que se accede a través del TDatabase.

Ahora a cada tabla y consulta que tengas, tienes que modificar la propiedad SessionName y elegir "Default"

Todas estas cosas pueden hacerse de mil maneras, por eso es tan lioso :(.

Te recomiendo el libro de la , la cara oculta de Delphi 4. Viene mucha información sobre lo que estas haciendo.

PD: No eres inutil, eres ignorante, como todos los que empezamos una tarea nueva. La ignorancia es pasajera si pones de tu parte ;).

Sayuri 18-08-2005 12:16:53

primero.... muchisimas gracias por tu ayuda
y segundo... siguen las preguntas :p
las propiedades del DataBase me pide nombre alias (que es donde pongo el mio)... sólo ahí verdad? porque si lo pongo en DataBaseName... es cuando da error

Sayuri 18-08-2005 12:30:19

y otra duda final ¿tengo que añadir el componente TSession? que propiedades le pongo?

Lepe 18-08-2005 16:35:49

Cita:

Empezado por Ayuda delphi
property DatabaseName: string;

Description

Use DatabaseName to specify the name of the database to use with a database component. If DatabaseName is the same as an existing Borland Database Engine (BDE) alias, then the AliasName and DriverName properties need not be set. If DatabaseName does not match an existing BDE alias, then either the application must also supply a valid alias in the AliasName property in addition to the DatabaseName, or it must supply the DriverName and Params properties.

DatabaseName can be a fully qualified path name when connecting to a Paradox or dBASE database.

Note: Attempting to set DatabaseName when the Connected property is True raises an exception.
Tip: At design time double-click a TDatabase component to invoke the Database editor and set the DatabaseName.

Cita:

Empezado por Lepe
El TSession no lo añadas en el Datamodule. Ya ves que se accede a través del TDatabase.

:confused:

Sayuri 18-08-2005 16:48:17

Siento volverte loco
gasias ;-) y perdón

Sayuri 19-08-2005 09:53:17

hola amigos,
llevaba mucho sin dar la brasa en este hilo, y no podía ser jeje, a ver sólo me queda un cabo sin agarrar, a ver si me podeis echar una mano (al cuello no vale ;-) )
El artículo acaba con

Cita:

Como no todo es perfecto o bien nuestro programa puede colgarse en un momento dado, o un usuario con prisas puede apagar el ordenador sin mas, aveces quedan ficheros *.LCK en el directorio de datos sin que este ningún usuario conectado, en este caso cuando nuestro programa intenta inicializar el BDE, este nos da un error que las tablas están "busy", siendo falso. El remedio es verificar que hay usuarios conectados y antes de abrir las tablas comprobar la existencia de tales ficheros, si no hay usuarios y los ficheros están el directorio nuestra aplicación deberá ser lo suficientemente inteligente para borrarlos y olvidares del tema. Este proceso lo haremos una vez activa la session pero sin tablas abiertas.
vale... creo que lo entiendo, corregirme si me explico mal:
Al iniciar la aplicación tengo que ver en el directorio de las tablas que no hay ningún archivo *.LCK sin que ningún usuario este conectado. Me parece muy bien, pero ¿cómo hago eso?

Se que estoy pez, pero es la primera vez que realizo un programa para trabajar en red.

Muchas gracias

Lepe 19-08-2005 11:11:33

Saber el número de usuarios

Por supuesto, el usuario que usa esa rutina tambien cuenta, por tanto el verdadero resultado es:

Código Delphi [-]
Usuarios := GetUsers - 1;

Por cierto, para borrar archivos, puedes usar el Deletefile('\\Miservidor\...'), no da problemas con rutas de red.

Si es que paradox es mucho paradox.... Verás cuando te pidan que hagas copia de seguirdad de la base de datos.... :D, con FireBird, un simple comando con Gbak y listo, aquí puffff.

Un saludo

Sayuri 23-08-2005 13:42:46

ya hacía mucho q no tocaba la gaita por aquí, pero estoy repasando tu último comentario y al copiar tu función:
Código Delphi [-]
function GetUsers():Integer;
var
  UserList: TStringlist;
  TmpCursor: hDbiCur;
  rslt: dbiResult;
  UsrDesc: USERDesc;
begin
  Result:=0;
  Check(DbiOpenUserList(TmpCursor));
  UserList := TStringList.Create;
  try
    UserList.Clear;
    repeat
      Rslt:= DbiGetNextRecord(TmpCursor, dbiNOLOCK, @UsrDesc, nil);
      if Rslt <> DBIERR_EOF then
        UserList.Add(UsrDesc.szUserName);
    until Rslt <> DBIERR_NONE;
    Result := UserList.Count;
  finally
    Check(DbiCloseCursor(TmpCursor));
    FreeAndNil(UserList);
  end;
end;
me da problemas al compilar y los tipos de las variables no me las reconoce... ¿que unidad hay que añadir' muchas gracias

Sayuri 23-08-2005 14:24:46

esto es una locura.. al arrancar la aplicación no entra en MiDataModule.OnCreate, y ya me empiezan a llegar las dudas, ..¿tengo que meter los objetos ttable y el datasource dentro del datamodule?¿Cuando introduzco el database a parte de poner el alias tengo que conectarlo? es que me dan sólo q errores... necesito ayuda... :-(

Sayuri 23-08-2005 14:44:28

Bueno, fallo mio si que entra en midatamodule on create, pero al entrar me da un error y me dice que las tablas están abiertas, y claro, yo el programa lo ejecuto con los ttables y las sql activas desde el tiempo de diseño... a lo mejor es por eso por lo que me da problemas... ¿las debo desactivar todas y activar al terminar de cargar la aplicación?

JVC Soft 23-08-2005 19:26:00

Sayuri
Mandame tu dirección de email y te haré llegar una explicación detallada de lo que debes hacer, pues ya yo me rompí la cabeza con eso una vez antes de dar con lo que era y me funciona chévere. (También todo el interesado)
La mía es jvc@cnci.co.cu
Saludos

Sayuri 24-08-2005 09:30:06

ya te he mandado un e-mail. muchas gracias JVC_Soft

Lepe 24-08-2005 13:41:37

Para dejar constancia en el foro de ese error, simplemente haz clic en el editor de código sobre la función o método que te dice "Undeclared identifier" y pulsa F1. El compilador no sabe donde está, pero la ayuda de delphi si, y te dice la unidad que debes añadir.


Un saludo

Sayuri 24-08-2005 14:10:40

uso delphi 5 .... por si te vale de algo y no me indica la unidad simplemente al decirle F1 me indica lo que es un identificador no declarado

Besines

Lepe 24-08-2005 15:26:45

El foco del editor no está sobre el código fuente, sino sobre el área de notificación de Errores de compilación. Haz clic sobre el código fuente, justo en la palabra que da error (normalmente es el nombre de una función y/o Tipo de datos) y despues pulsa F1

(Me he pasado con el nombrecito.... pero no sé decirlo de otra forma :D)

Perdona que no te diga los "Uses", pero no lo tengo a mano, además, si te digo los "uses", para otra vez tendrás el mismo problema; de esta forma sabrás "buscarte las habichuelas" en futuras ocasiones.

Un saludo

Sayuri 24-08-2005 16:40:21

Una pregunta tonta.... ¿al salir de la aplicación tengo que desconectar el database y los datasets?

Lepe 24-08-2005 18:57:56

Es una pregunta interesante y además con truco incluido.

En principio no. Cuando se va a destruir el Datamodule, se destruye antes todos los componentes que tenga dentro, tables, database, etc, si estan abiertos se cierran primero y despues se destruye.

Si una de las tablas está en edición (el usuario está modificando algo) y cierra el programa, esos cambios no se guardarán; el usuario puede esperar que si se guarden !!.

Se puede usar un bucle recorriendo todos los componentes del Datamodule, si son tablas y estan en modo edición, hacer un Post de esa tabla (cuidado con relaciones Maestro-Detalle).

Si usas Database1.Close; tambien se cierran automáticamente todas las tablas que esten asociadas a ese Database. Sin embargo, al abrir (connected:= true) el database, no se abren las tablas asociadas.

Lo mismo ocurre con la Session, se cierra y se destruye al destruir el Datamodule.

Por cierto: A preguntas distintas, crear distintos hilos ;)

Un saludo

Sayuri 24-08-2005 21:55:53

y yo que no tengo las tablas dentro del datamodule.... al cerrar tengo que desactivar las tablas y por otra parte desconectar el datamodule

muchísimas gracias lepe y a todos por vuestra ayuda

Lepe 24-08-2005 22:12:43

Tambien tiene ventajas al poner las tablas en los formularios. Puedes abrir 2 ventanas de facturas a la vez, mientras en una editas una factura, en la otra ventana puedes ver otras facturas para ver "datos de interes".

Quien dice Facturas, dice Ventana de Clientes, albaranes, etc. Es muy común cuando estas dando de alta, ver los datos de otro cliente, (porque el domicilio es en la misma calle, por si está dado de alta con otro nombre, etc).

Si tienes las tablas en el Datamodule, y dos ventanas de clientes, ambas ventanas apuntan al mismo cliente, al cambiar una, tambien cambia la otra... Cuestión de diseño ;).

Sayuri 24-08-2005 23:58:25

pero no me has contestado... tengo que poner el datamodule disconnected al cerrar y desactivar los ttables?
siento ser pesada

Por cierto que el compañero JVC Soft me indicó que se puede ejecutar la misma aplicación mediante un acceso directo en el ordenador cliente (es decir los dos ejecutan el mismo .exe) pero eso va en contra del Local Share que me indicasteis.
Muchas gracias

Sayuri 25-08-2005 09:42:54

por cierto, ya he conseguido compilar con la función getusers, y la unidad que faltaba era BDE... muchas gracias, pero al ejecutar me da problema al entrar en la función....

Código Delphi [-]
function GetUsers:Integer;
var
  UserList: TStringlist;
  TmpCursor: hDbiCur;
  rslt: dbiResult;
  UsrDesc: USERDesc;
begin
  Result:=0;
  Check(DbiOpenUserList(TmpCursor));
  UserList := TStringList.Create;
  try
    UserList.Clear;
    repeat
      Rslt:= DbiGetNextRecord(TmpCursor, dbiNOLOCK, @UsrDesc, nil);
      if Rslt <> DBIERR_EOF then
        UserList.Add(UsrDesc.szUserName);
    until Rslt <> DBIERR_NONE;
    Result := UserList.Count;
  finally
    Check(DbiCloseCursor(TmpCursor));
    FreeAndNil(UserList);
  end;
end;

Exactamente me dice :
Cita:

An error ocurred while attemping to initialize the Borland Database engine (error $2A06)

Lepe 25-08-2005 10:33:45

Cita:

Empezado por Sayuri
pero no me has contestado... tengo que poner el datamodule disconnected al cerrar y desactivar los ttables?

Ahhh, ¿pero tenía que contestar?. Si te fijas, no lo estabas preguntando, sino afirmando :D

No. En el Destroy del Datamodule pones Database1.Close y listo, se cerrará el Database y todas las tablas.

En cuanto a desconectar el Datamodule, la verdad, no sé a que te refieres, supongo que te referías al Database.

Cita:

Empezado por Sayuri
Por cierto que el compañero JVC Soft me indicó que se puede ejecutar la misma aplicación mediante un acceso directo en el ordenador cliente (es decir los dos ejecutan el mismo .exe) pero eso va en contra del Local Share que me indicasteis.

Además estás sobrecargando la red, ya que estas ejecutando un programa de forma remota (irá más lento).

En el ordenador cliente:
- instala el bde
- configura el alias para que apunte al ordenador que actua de Servidor
- Metes el .exe y si acaso un archivo .ini de configuración.
- Listo.

Seguimos con GetUsers:

Antes de ejecutar tu programa debes cerrar en tiempo de diseño (como mínimo):
- las tablas
- el Database

Ten mucho cuidado, ya que cada vez que añades un campo a una tabla, el Database.Connected se pone a True él solito, así que debes ponerlo a false.

Ten en cuenta que Delphi tambien es un usuario más del BDE, por tanto, tambien cuenta. Las pruebas que vayas a hacer sobre GetUsers, cierra el proyecto de Delphi y ejecuta tu programa desde el explorador de windows.

Para poder usar la función GetUsers, debes tener la session y el Database Abiertos en tiempo de ejecución, y por supuesto el BDE debe estar instalado.

El tema de GetUsers se abrió para borrar los archivos *.LCK. Tienes 2 alternativas:
- Abrir la session y el Database, consultar el número de usuarios y si es 1 (tú sola), entonces cierras el database, borras los archivos y despues vuelves a conectar. (demasiado complejo....)
- Puedes borrar los archivos *.LCK sin más. Si alguien los está utilizando, no se borrarán, ya que Windows no lo permitirá (y no saca ningun error utilizando DeleteFile). Si nadie los está utilizando se borran.

Sayuri 25-08-2005 11:01:57

cuando dices
Cita:

Ten mucho cuidado, ya que cada vez que añades un campo a una tabla, el Database.Connected se pone a True él solito, así que debes ponerlo a false
te refieres a añadir un campo nuevo a la tabla ¿no? es decir añadir a la tabla un campo más (nombre, por ejemplo) y no a añadir un registro... Se que parecerá una bobada de pregunta pero es para evitarme una pequeña confusión

Lepe 25-08-2005 11:35:31

exacto, un campo nuevo.

Añades el campo con el Database Desktop, y despues cuando actualizas la tabla en delphi (doble clic a la tabla, boton derecho, Add all fields / Add field) justo ahora es cuando se pone en True el Connected.

Tambien se pone en activo en otras situaciones, pero con las prisas no me he fijado.

Un saludo

Sayuri 25-08-2005 19:17:55

una pregunta... borro los archivos *.lck, pero borro todos porque me daban problemas los que se guardaban en C:\Temp... pero claro lo que he hecho es compartir tambien esa carpeta. Tal vez lo que debería hacer es borrar el C:\Temp de cada ordenador ¿o me equivoco?

Te acuerdas que ponía:
Código Delphi [-]
With MiSesion do begin
NetFileDir := '\\MiServer\MisDatos\NET';
PrivateDir := 'c:\Temp';
End;
 
With MiDataBase do begin
Params.Clear;
Params.Add('PATH='+'\\MiServer\MisDatos');
Params.Add('DEFAULT DRIVER=PARADOX');
Params.Add('ENABLE BCD=FALSE');
Connected := true;
End;

Creo que tengo que borrar el del ordenador en el que se esté trabajando... pero necesito que me lo asegures.. :-)

Lepe 26-08-2005 12:02:09

Te aseguro que no es seguro :D

La carpeta PrivateDir, debe ser distinta para cada ordenador, (no debes compartirla en el servidor).

Borra los archivos NET de la carpeta NETFILEDIR y los
Archivos LCK (todos los que haya) en la carpeta PrivateDir y
DatabaseDir en ambas carpetas se crean (comprobado).

Nota: Los archivos LCK solo se crean si se usa una configuración de red. (red local instalada y funcionando en windows)
Si se usan carpetas locales el BDE no los crea.

Lo mejor es:
- Cada ordenador que arranca, borra el .NET del ordenador "servidor" y los LCK de la carpeta PrivateDir y DatabaseDir, y debe hacerse antes de abrir la session y el Database.

PD: No te puedo pasar el código para borrar porque hago uso de la librería NkFiles.pas de las NKLIBS.

Un saludo


La franja horaria es GMT +2. Ahora son las 01:40:50.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi