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)
-   -   como puede mi aplicacion asignar el NETFILEDIR?? (https://www.clubdelphi.com/foros/showthread.php?t=6499)

lemon-club 10-01-2004 19:02:39

como puede mi aplicacion asignar el NETFILEDIR??
 
Hola a todos.

Tengo una aplicación con la base de datos paradox en red y no consigo asignar correctamente el directorio de red NETFILEDIR del BDE para que se bloqueen los registros que están en edición para otros usuarios.

Mi intención es que mi aplicación pueda asignar este directorio antes de conectar la base de datos, pues lo hice leyendo en varios libros y en el artículo de esta web "paradox en red" y tal cual venía explicado.
Con un TSession y un TDataBase, completando cada una de sus propiedades, especialmente la propiedad NETFILEDIR del TSession que es igual para todos los ordenadores que utilizan la misma base de datos.

Cuando intento abrir cualquier tabla me da el siguiente error:

Not initialized for accessing network files.
table: \\SERVIDOR\tablas\clientes.db

Pues hasta la fecha únicamente puedo hacer funcionar correctamente la aplicación en red si cambio la variable en el BDE manualmente:
BDE Administrator->configuration->drivers->native->paradox->NET DIR

Repito que completo minuciosamente las propiedades del Tsession y tdatabase:
tsession.PrivateDir
tsession.NETFILEDIR
tdatabase.Params.Values['PATH'] := '\\SERVIDOR\tablas'
...

...pero no sé por qué no puedo cambiar la variable del NETDIR del BDE dinámicamente a través de mi aplicación.

Se os ocurre qué puede estar fallando??

P.D.: la variable LOCALSHARE la tengo para todos los ordenadores = FALSE. Lo he probado también cambiando esta propiedad a TRUE manualmente en el servidor y no he notado ninguna diferencia.

graciass de nuevo!

lemon-club 11-01-2004 13:45:54

Hola de nuevo,
No sé si no me he explicado bien, no quería aburriros pero me planteo 2 únicas preguntas que tal vez resuelvan mi duda ya que no puedo hacer pruebas porque no tengo una red en mi casa:

-¿¿¿ Puedo hacer funcionar una aplicación en red dejando vacía la variable del BDE: "BDE Administrator->configuration->drivers->native->paradox->NET DIR" y utilizando correctamente los componentes Tsession y tdatabase, especialmente la propiedad session.NETFILEDIR ????

o por el contrario, ¿¿ Debo poner también manualmente la variable en el BDE Administrator ''paradox->NET DIR'' ??

Lo que busco es hacerlo yo a través de mi aplicación y no marear al cliente.

-Si es necesario poner el NET DIR correctamente en el BDE Administrator, ¿¿ abeis alguna forma de editar el fichero IDAPI.CFG (fichero de configuración del BDE)??

gracias otra vez

Lepe 11-01-2004 20:12:49

La cara oculta de delphi 4 de ians marteens deja claro como hacerlo, aqui te pongo un trocito de código que yo uso.

notas:
MensajeAdd es simplemente un log de inicio de sesion que hago para detectar errores.
gl.db es un registro global de la aplicación donde se guarda las opciones (las inicializo desde un TiniFile)
Código:

if misession.Active then
  misession.Close;
    with MiSession do
  begin
  try
  MensajeAdd(true,'1  Configurar la sesion' );
  MensajeAdd(true,'1.1 Usando Carpeta de Red: '+gl.DB.NetFileDir );
    NetFileDir:=gl.DB.NetFileDir ;
  MensajeAdd(true,'1.2 Usando carpeta temporal: '+gl.DB.PrivateDir );
    PrivateDir:= gl.DB.PrivateDir  ;
  MensajeAdd(true,'1.3 Modo Sesion: cmAll');
  ConfigMode := cmAll;
  MensajeAdd(true,'1.4 Modo servidor: '+BooltoStr(ini.ReadInteger('Settings','RGClient',1)= 0,true));
  MensajeAdd(true,'2  Alias' );

  if IsAlias(gl.DB.Alias) then
  begin
    MensajeAdd (true,'2.1 Usando alias existente: '+gl.DB.Alias);
  end
  else
  begin
    MensajeAdd(true,'2.1 Creando Alias: '+gl.DB.Alias +' para la carpeta:'+gl.DB.DatabaseDir  );
    AddStandardAlias(gl.DB.Alias , gl.DB.DatabaseDir, 'Paradox');
  end;
  except
    on E:Exception do HandleException('Error al configurar la sesion',E);
  end;

  end;

  with dtbppal do
  begin
    try
      MensajeAdd(true,'3  Configurar Base de datos:');
    DatabaseName    := gl.DB.Alias ;
    MensajeAdd(true,'3.1 Asignando Controlador');
    DriverName:= 'STANDARD';
    MensajeAdd(true,'3.2 Carpeta de Base de Datos: '+ gl.DB.DatabaseDir );
  params.Add('PATH='+gl.DB.DatabaseDir );
  params.Add('DEFAULT DRIVER=PARADOX');
  params.Add('ENABLE BCD=FALSE');
      MensajeAdd ( true, '3.1 Asignado Alias a la Base de Datos. ');
  except
      on E:exception do HandleException('Error de BDE',E);
    end;

  end;  // dtbppal
    MensajeAdd(true,'4  Alias: '+ gl.DB.Alias );

try
  for i:=0 to pred(ComponentCount) do
    if (components[i] is TTable) then
        TTable(components[i]).DatabaseName:= gl.DB.Alias
    else
        if (components[i] is TQuery) then
          TQuery(components[i]).DatabaseName:=gl.DB.Alias;


    MensajeAdd(true,'4.1 Alias asignado' );

    Misession.Open;

    MensajeAdd(true,'5  Sesion Activa');

    dtbppal.Open;

    MensajeAdd(true,'6 **Conectado a Base de Datos**');
except
  on E:Exception do
    HandleException('No se ha podido Abrir la Base de Datos.',E);
end; // except

// saludos

lemon-club 12-01-2004 16:38:19

gracias Lepe, seguí pasao a paso lo que me indicaba ians marteens en la cara oculta de D4 pero:
¿¿hay que dejar la variable del Paradox->NETDIR en el BDEAdministrator vacía??

Así lo hice pero no me bloquea los registros al acceder varios usuarios si la dejo vacía. Si pongo el correspondiente directorio en el NETDIR del BDEAdministrator manualmente SÍ que funciona perfectamente.

Puede alguien responderme a la primera pregunta??

cenquiu

Lepe 12-01-2004 18:54:35

En mi caso, Si.

Yo asigno todo por codigo, si creas el alias en tiempo de ejecución y asignas ahí el NETFILEDIR de la Sesion, que yo sepa, no estas usando el driver NATIVE de paradox, sino que te basas en él, para crearte el alias.

No he podido arrancar la red ahora para hacer las pruebas, así que las he hecho mediante 2 instancias, eso si, cada una de ellas con alias distintos (creados dinamicamente) y controlando que el directorio TEMP para ambas sea distinto. Controla bien los bloqueos

ahhh, por cierto en el driver nativo de paradox NET DIR he puesto c:\pepito y desde luego esa carpeta no existe. Tambien he probado a dejarlo en blanco, y repito, los bloqueos van bien.

Imagina que usas 2 Databases y 2 componentes Sessions en la misma aplicación, para tranferir datos de una a otra. Si tuvieses que modificar el parámetro NATIVO NET DIR con el bdeAdministrator, seria imposible trabajar con dicha aplicación. Veo lógico dejar ese parámetro en blanco y configurarlo por cada sesión.

No puedo darte una respuesta 100 % segura :( y esto, es lo único que puedo asegurarte al 100 % :D

lemon-club 12-01-2004 19:50:24

gracias otra vez.
Lo natural es dejar la variable del BDEAdministrator en blanco si asignamos el directorio de red en ejecución, eso es lo que intento desde hace tiempo pero no consigo que me funcione.
Partiendo de que se debe dejar esa variable en blanco sé que debo estar haciendo algo mal. Repasaré todas las propiedades del Tsession y del Tdatabase por enésima vez a ver qué se me ha escapao :S

hasta pronto :rolleyes:

Lepe 13-01-2004 12:04:55

crees que el MensajeAdd ese lo hice por capricho?? :D Bastantes dolores de cabeza me dió.

PD: el modo de sesion yo puse cmAll en lugar del que viene por defecto cmConfig, en la ayuda explica mejor que hace cada modo.

Seguro que es una tonteria, de esas que cuando la encuentras es para darte de porrazos contra la pared, pero mientras se encuentra y no..... :(


La franja horaria es GMT +2. Ahora son las 20:11:16.

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