Ver Mensaje Individual
  #1  
Antiguo 06-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Reputación: 21
URBANO Va por buen camino
Error al abrir tabla en Winxp, pero en Win98 funciona, por que?

Hola foro, tengo una aplicacion realizada en delphi 5 y que utiliza tablas en paradox 7 . He estado leyendo distintos hilos sobre paradox en red y he llegado a generar el siguiente codigo:

Código:
const
     ENV_TEMP: PChar = 'TEMP';
     ENV_TMP: PChar = 'TMP';

type
  Talias= Record
    ano: integer;
    nombre: string[50];
    end;

var
  Fprincipal: TFprincipal;
  alias: Talias;
  Archivoatm: File of Talias;


procedure TFprincipal.configuracionred();
var
temp: PChar;
nombre,carpeta: string;
begin
//para solucionar problemas de impresion del qreport
//con windows2000 y xp.
//Con estas Lineas se corrigue el error que se daba con los
//listados grandes.
//El problema es por que la ruta del directorio
//temporal es muy larga y con esto la acortamos
//El directorio debe existir y en el se guardaran los distintos ficheros
//temporales que genera la aplicacion cuando realiza consultas a las tablas.
TEMP:= Pchar(ExtractFilePath(ParamStr(0))+'TEMPORAL');
SetEnvironmentVariable(ENV_TMP, TEMP);
SetEnvironmentVariable(ENV_TEMP, TEMP);

//Definir el directorio Privado y el Net
//El directorio privado "privatedir" contiene los ficheros *.LCK--> (LOCK)
//Archivos de bloqueo, se crean en cuanto un usuario edita un registro,
//contiene la información de qué registros está modificando un usuario,
//se creena en el directorio que indiquemos en "PrivateDir". Este directorio
//debe estar de forma local, en cada maquina.

Session.PrivateDir := ExtractFilePath(ParamStr(0)) + 'PRIV';

//El directorio "Net" contien al fichero *.NET --> Archivo que contiene
//los usuarios que estan accediendo a las tablas, por eso es MUY importante
//que todas las PCs apunten al servidor. Se crea, logicamente en la carpeta
//previamente compartida NETFILEDIR. Es decir, este directorio debe estar
//en el servidor.

//buscamos el alias seleccionado.
 AssignFile(archivoatm,ExtractFilePath(ParamStr(0))+'Datos\ALIAS.DAT');
 Reset(archivoatm);
 while not eof(archivoatm) do
 begin
 try
   read(archivoatm, alias);
 except on exception do
 begin
        showmessage('Fallo de lectura del alias.');
        abort;
 end;
 end;
 if fprincipal.aliasnombre.text = inttostr(alias.ano) then
   nombre:= alias.nombre;

 end;
 closefile(archivoatm);

carpeta:=DBGetPathAlias(nombre); //ruta del servidor.

Session.NetFileDir:= carpeta+'\NET';

//definimos el el BDE si el programa esta en modo cliente (datos en otro eq.)
//"LOCAL SHARE = FALSE" o esta en modo servidor (datos en el eq.)
//"LOCAL SHARE = TRUE".
carpeta:=ExtractFilePath(ParamStr(0))+'Datos\NET';
if DirectoryExists(carpeta) then //estamos en el servidor
begin
 LocalShareTrue();
end
else
begin //estamos en el cliente.
 LocalShareFalse();
end;

end;

//Esta funcion necesita en los  uses a:  Registry
// Function sets the "LOCAL SHARE" registry setting
// to TRUE in the BDE (32-bit BDE only).
procedure TFprincipal.LocalShareTrue();
var
  Reg : TRegistry;
const
  BDE_LOCAL_SHARE_KEY = '\Software\Borland\Database Engine\Settings\SYSTEM\INIT';
begin
  Reg := TRegistry.Create;
  With Reg Do
    begin
      Access := KEY_READ or KEY_WRITE;
      RootKey := HKEY_LOCAL_MACHINE;

      { Write the BDE keys }
      OpenKey(BDE_LOCAL_SHARE_KEY, True);
      WriteString('LOCAL SHARE', 'TRUE');
    end;
  Reg.Free;
end;

//Esta funcion necesita en los  uses a:  Registry
// Function sets the "LOCAL SHARE" registry setting
// to FALSE in the BDE (32-bit BDE only).
procedure TFprincipal.LocalShareFalse();
var
  Reg : TRegistry;
const
  BDE_LOCAL_SHARE_KEY = '\Software\Borland\Database Engine\Settings\SYSTEM\INIT';
begin
  Reg := TRegistry.Create;
  With Reg Do
    begin
      Access := KEY_READ or KEY_WRITE;
      RootKey := HKEY_LOCAL_MACHINE;

      { Write the BDE keys }
      OpenKey(BDE_LOCAL_SHARE_KEY, False);
      WriteString('LOCAL SHARE', 'FALSE');
    end;
  Reg.Free;
end;
Con este codigo defino (eso creo yo) los distintos directorios donse se alojaran los ficheros que intervienen en la gestion de paradox en red e identifico cuando la aplicacion esta ejecutando en modo cliente o en el servidor.

Este codigo lo ejecuto antes de crear el datamodule que contiene todas mis tablas.
El codigo lo ejecuto y va perfectamente (creo yo). Independientemente que la aplicacion este instalada en win98 o en winxp.
El problema esta en el momento que habro una tabla, ya que si lo hago desde el servidor no me da ningun tipo de problema, pero si lo hago desde el cliente
me da el siguiente:
Cita:
Detail Table Open operation failed.
Table: proveedores.DB
Siempre me da este error, habra la tabla que habra.
En el servidor tengo instalado win98 y en cliente winxp.
Ya he probado a reparar la base de datos con sysutil y TUtility, pero ambas utilidades me dicen que las tablas estan bien.

Haber si alguien puede hecharme una mano. Gracias.
__________________
El saber no ocupa lugar.
Responder Con Cita