Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 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
  #2  
Antiguo 06-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Lo veo todo perfecto, pero tento una duda:

Código Delphi [-]
carpeta:=DBGetPathAlias(nombre); //ruta del servidor.

Carpeta debe estar definido como \\nombreservidor\unidad\carpeta, si es así, DirectoryExist encontrará la carpeta y entonces el LocalShare no quedará configurado.

Si Carpeta está definida como c:\bla blah, el BDE no trabajará bien en red.

Una opción es guardar en el archivo de configuración si ese es el servidor o no. Cuando vayas a hacer el instalador, pues haces 2 copias del archivo, uno como servidor y otro como Cliente y según la instalación copias uno u otro.

En cuanto al error que dices, parece que va por otro lado. Se supone (por el error que dá) que es una tabla que forma una relación Master-Detail con otra tabla, y en ese caso, primero tienes que abrir la tabla Maestra y despues la de detalle, siempre en ese orden.

No veo que abras la Session y conectes el TDatabase por ningún lado, supongo que para no alargar mucho el código, como sabes, ambos deben abrirse antes de abrir una tabla. Además si están abiertos en tiempo de diseño, al ejecutarse el programa te dará errores, tienes que tener ese detalle en cuenta y desconectar el TDatabase y cerrar la Session en tiempo de diseño, al ejecutarlo lo conectas por código.

En cuanto a Windows XP /98 solo he detectado un pequeño problema que el propio Windows lo dice al compartir la carpeta de la Base de Datos. Windows 98 no puede conectarse a un recurso de red que tenga más de 12 carácteres o espacios en blanco en su nombre (con el código que has puesto no sé como lo tienes, lo comento por si acaso ).

Un detalle más. En caso de que el alias no esté definido, tambien puede darte errores, puedes subsanarlo así:
Código Delphi [-]
if not Session.IsAlias(fprincipal.nombreAlias) then
begin
  Session.Config := cmAll;
  Session.AddStandardAlias(fprincipal.nombreAlias, 'ruta de la base de datos');
  Session.SaveConfig; // guardar el alias en windows.
end;

Saludos, da gusto ver cómo la gente hace los deberes (muy currado el código)
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 06-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 21
URBANO Va por buen camino
Vamos por parte:

1º.- Lo que me comentas de la duda, no te has dado cuenta que mas abajo, vuelvo a inicializar "carpeta" de esta forma:

Código:
carpeta:=ExtractFilePath(ParamStr(0))+'Datos\NET';
Con esto lo que pretendo es que si existe la carpeta "net" dentro de datos estamos en el servidor y si no existe, estamos en el cliente. Por supuesto, con el instalador distingo entre servidor y cliente.

2º.- Como tu comentas, el error parece producido por un problema de relacion, pero no lo entiendo, ya que si ejecuto el programa desde el servidor (con win98) y habro las tablas no se produce ningún error, mientras que si ejecuto el programa desde el cliente (con winxp) me da este error. El programa es el mismo, con las mismas lineas de codigo y en el mismo orden, con lo cual no entiendo como en un lado puede darme un error de maestro-detalle y por el otro lado no. Los dos programas acceden a la misma base de datos. Asi pues, pienso que el error debe de estar producido por otro motivo. Por cual? esa es la cuestión.

3º.- Si por ahorrar codigo, no lo he puesto pero hago todo lo que dices antes de abrir las tablas.

4º.- Con la unidad de red no hay problema, ya que es el equipo que tiene WinXP el que se conecta a la base de datos a traves de ella. El que tiene Win98 tiene la base de datos de forma local.

5º.- Lo del alias, gracias por el codigo, pero yo lo que hago es que en la instalacion creo directamente los alias.

Bueno, gracias por tus comentarios, pero el error sigue produciendose. Seguiré probando. Si alguien me suguiere alguna otra idea, será bien recibida.

Saludos.
__________________
El saber no ocupa lugar.
Responder Con Cita
  #4  
Antiguo 06-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No ví que cambiabas el valor de "carpeta" porque como has usado las etiquetas "code" se ve todo en negro y no resalta, con las etiquetas "delphi" se vería mejor

Quizás esto te sirva, es para modificar:

- los bloqueos oportunistas de WinNt (desactivar )
- la cache de escritura en segundo plano (desactivar la cache en los ordenadores clientes, en tu caso, es precisamente el XP)

Otra cosa no se me ocurre de momento

Saludos y Suerte.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 10-10-2007 a las 20:56:52.
Responder Con Cita
  #5  
Antiguo 08-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 21
URBANO Va por buen camino
Es verdad, utilizare las etiquetas delphi.
Aun no he probado lo que me has comentado, pero te indico una situacion que se esta produciendo y no me habia dado cuenta.

Como veras en el código, el directorio PrivateDir es la carpeta "Priv" que se encuentra en el patch donde se encuentra el ejecutable (ej: C:\PROG\TRANS\PRIV) y la base de datos esta alojada en "C:\PROG\TRANS\DATOS". Segun el codigo que yo pongo, los ficheros "paradox.lck" y "pdoxusrs.lck" deben crearse dentro de "Priv" y es así, pero además se crean en "DATOS", es decir, cuando ejecuto la aplicacion se crean dos ficheros (paradox.lck, pdoxusrs.lck) en "Priv" y otros dos en "Datos". Creo que esto no debe ser así. Y ademas, cuando cierro la aplicación se eliminan de forma automatica los ficheros que se habian creado en "Datos", pero los de "Priv" no se eliminan.

Anteriormente me comentaste que si abria la sesion y he estado revisando el codigo y despues de asignar los directorios a la sesion , lo que hago es que al database y a las tablas le asigno el alias que apunta a la BD. Lo siguiente que hago es abrir una tabla (Tusuarios.open) y no tengo puesto nada como "Session.open".
Puede ser esto la causa?
Donde tendría que abrir la session? y Como?
Antes de cerrar el programa, debo cerrar la session con codigo o se cierra ella de forma automatica?

Bueno, haber si con estos nuevos datos, se te ocurre algo.

Gracias por tus comentarios. Saludos.
__________________
El saber no ocupa lugar.
Responder Con Cita
  #6  
Antiguo 08-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Los archivos lck se crean en ambas carpetas. Se deben crear en el servidor para que Paradox sepa los registros que se estan editando en toda la red.

Primero borras los lck de las 2 ubicaciones, despues abres la session y despues conectas el TDabase, por último abres las tablas. En principio, al abrir una tabla, Delphi mira a que Session pertenece, si no tiene Session, mira en el TDatabase, por último conecta el TDatabase (todo lo hace automáticamente).

Ya puestos a borrar, borra tambien el archivo .NET del servidor al mismo tiempo de borrar los LCK, porque se queda en un corte de luz o apagados bruscos del sistema.

Para cerrar, al revés, primero cierras la Session y despues el TDatabase, Delphi lo hace automáticamente al destruir los objetos, si obtienes algún problema puedes añadirlo, total, son 2 lineas y aclaras el código .

Al usar el ConfigXP no notarás nada en especial, pero se sabe que hay que retocar esas propiedades del registro, Ians Marteens lo dice en su artículo "añadiendo estabilidad a Paradox".

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #7  
Antiguo 10-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 21
URBANO Va por buen camino
Creo que me estoy liando un poco.

Vamos a ver:

- Los ficheros *.lck , donde se deben crear, en el servidor o en el cliente. Es decir:

Código Delphi [-]
Session.PrivateDir := ruta-del-ejecutable-del-cliente + 'PRIV';
Con este codigo le indico al programa que los cree en el cliente, luego existiran un par de estos ficheros por cada ejecución del programa.´

ó

Código Delphi [-]
Session.PrivateDir := \\Servidor\ruta-del-ejecutable-que-existe-en-el-servidor + 'PRIV';
Con este codigo le indico al programa que los cree en el servidor, luego existiran un único par de ficheros lck, independientemente del número de clientes que se este ejecutando.

Cual de las dos formas es la correcta???? ; En el código que puse antes arriba esta puesta la primera.

- Estos ficheros ( los lck) son los que se encargan de controlar que registros se estan editando y teóricamente si yo en un cliente estoy editando el registro dos de la tabla proveedores y ejecuto otro cliente e intento editar el resgistro dos de la tabla proveedores, debería dar un error. Es esto correcto?
Por que con el código que yo he puesto antes, esto a mi no me pasa. Es decir que desde dos clientes puedo editar el mismo registro a la vez.

- Ya he probado lo de desactivar la cache y los bloqueos, pero sigue dandome el mismo error al abrir las tablas. Yo creo que debe haber una incompatibilidad de winxp a win98, ya que he probado ejutando el programa en modo servidor en el equipo que tiene el winxp y habre bien las tablas.

Haber si me voy aclarando un poco.
__________________
El saber no ocupa lugar.
Responder Con Cita
  #8  
Antiguo 14-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Cita:
Empezado por URBANO
Código Delphi [-]
Session.PrivateDir := ruta-del-ejecutable-del-cliente + 'PRIV';
Esta es la correcta.

Y se crean 2 pares de archivos LCK. Un par en el servidor y otro par en la carpeta PrivateDir, y no me preguntes por qué, porque no lo sé , es más, el par de archivos LCK del PrivateDir puede que no lo veas, sólo aparece mientras se edita el registro.

Cita:
Empezado por URBANO
Es decir que desde dos clientes puedo editar el mismo registro a la vez.
Este es el síntoma principal de que el BDE no está configurado bien.

Como dices, debe aparecer una excepción diciendo "no se puede editar el registro porque otro usuario lo está utilizando" (mensaje en inglés). te aconsejo hacerlo todo por código, incluso crear los alias, ¿por qué? por la configuración del driver, la ruta del servidor, etc.

Cita:
Empezado por URBANO
- Ya he probado lo de desactivar la cache y los bloqueos, pero sigue dandome el mismo error al abrir las tablas. Yo creo que debe haber una incompatibilidad de winxp a win98, ya que he probado ejutando el programa en modo servidor en el equipo que tiene el winxp y habre bien las tablas.
(
Te aconsejo que te centres en una sola configuración o te volverás loco (por ejemplo: Win98 Servidor, WinXP Cliente).

MensajeAdd añade textos a un Memo para ver todos los parámetros de configuración.
Código Delphi [-]

// Tendrás que crear un FormXX que tenga un Memo dentro.
procedure TFPrincipal.MensajeAdd(VerFecha: Boolean; str: String);
begin
  if VerFecha then
    FormXX.Memo1.Add(datetimetostr(now) + ' >> ' + str)
  else
    FormXX.Memo1.Add(str); 

end;
DtbPpal es el TDatabase

Todo esto va dentro de tu procedimiento "Configuracionred".
Verás que te he puesto la definición de un registro TGlobal y TParadoxConfig,
lo he hecho para que solo tengas que modificar lo mínimo posible:
- Buscar "dtbppal" y sustituir por el nombre de tu componente TDatabase.
- sustituir las lineas "ini.ReadString...." por tus rutas de la base de datos, del .net etc.
Código Delphi [-]

type
  TParadoxConfig = record
    NetFileDir:    String[255];     
    PrivateDir:    String[255];
    DatabaseDir:   String[255];
    Alias:         String[20];
  end;

  Tglobal = record
    ModoServidor:Boolean;
    DB:         TParadoxConfig;
  end;
var
  GL: TGlobal;
begin

// modifica esto con tus valores
  gl.DB.NetFileDir    := ini.ReadString('Paradox', 'NetFileDir', '\\');
  gl.DB.PrivateDir    := ini.ReadString('Paradox', 'PrivateDir', GetTmpDir);
  gl.DB.DatabaseDir   := ini.ReadString('Paradox', 'DatabaseDir', '\\');
  gl.DB.Alias         := ini.ReadString('Paradox', 'Alias', 'prog1');
  GL.ModoServidor := ini.ReadInteger('Settings', 'RGClient', 1) = 0;


  if GL.ModoServidor then // SERVIDOR
    LocalShareTRUE
  else   // es un ordenador cliente
    LocalShareFALSE;

  if dtbppal.Connected then  // si se queda abierto en diseño, nos dará problemas
    dtbppal.Close;

  if DtbPPal.Session.Active then // si se queda abierto en diseño, nos dará problemas
    DtbPPal.Session.Close;

  // DONE -c MOTOR BD : borrados los *.LCK

//  borraarchivos([lck, net]);

  //_________________________ SESSION Y ALIAS____________________________________
  with DtbPPal.Session do
  begin
    MensajeAdd(true, '2   Alias');
    if IsAlias(gl.DB.Alias) then  // un string que es el nombre del alias
      MensajeAdd(true, '2.1 Usando alias existente: ' + gl.DB.Alias)
    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;


      MensajeAdd(true, '1   Configurar la sesion');
      NetFileDir := GL.DB.NetFileDir; // un string del tipo '\\nombreservidor\prog\net'
      MensajeAdd(true, '1.1 Usando Carpeta NET: ' + NetFileDir);
      MensajeAdd(true, '1.2 Usando carpeta temporal: ' + gl.DB.PrivateDir);
      PrivateDir := gl.DB.PrivateDir; // un string del tipo 'c:\temp'
      MensajeAdd(true, '1.3 Modo Sesion: cmAll');
      ConfigMode := cmAll;
      MensajeAdd(true, '1.4 Modo servidor: ' + BoolToStrSP(GL.ModoServidor));  // Gl.ModoServidor es un Boolean, me indica si está o no en el servidor.
      OnPassword := MiSessionPassword; // para la contraseña de la BBDD 

  end;//with session
      //_________________________ SESSION _______________________________________
//_________________________ DATABASE __________________________________________
  with dtbppal do
      MensajeAdd(true, '3   Configurar Base de datos:');
      DatabaseName := gl.DB.DatabaseDir; // un string del tipo '\\nombreservidor\prog\datos'
      MensajeAdd(true, '3.1 Asignando Controlador');
      //    DriverName:= 'STANDARD';
      MensajeAdd(true, '3.2 Carpeta de Base de Datos: ' + GL.DB.DatabaseDir);
      MensajeAdd(true, '3.3 Asignando parámetros de Base de Datos (dtbppal) ');
      Params.Clear;
      params.Add('PATH=' + DatabaseName);
      MensajeAdd(True, 'PATH = ' + DatabaseName);
      params.Add('DEFAULT DRIVER=PARADOX');
      params.Add('ENABLE BCD=FALSE');

  MensajeAdd(true, '4   Alias: ' + gl.DB.Alias);
  MensajeAdd(true, '4.1 Alias asignado');
  //_________________________TDATABASE_________________________________________FIN

  DtbPPal.Session.Open;
  MensajeAdd(true, '5   Sesion Activa');
  DtbPPal.Connected := True;

{
El siguiente código asigna el Alias a todas las tablas y Querys que uso
De esta forma si en tiempo de ejecución, se crea un Alias nuevo, 
se configura todo el sistema.
}
    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, '6 **Conectado a Base de Datos**');

// AHORA FALTA ABRIR LAS TABLAS EN EL ORDEN CORRECTO según la
// relación Maestro - Detalle.
El resultado para mí es:
Código:
 
-------------------------------
      INICIO DE SESION
-------------------------------
14/06/2006 10:31:01 >> 2   Alias
14/06/2006 10:31:01 >> 2.1 Creando Alias: prog1 para la carpeta: \\prog\tablas
14/06/2006 10:31:01 >> 1   Configurar la sesion
14/06/2006 10:31:01 >> 1.1 Usando Carpeta NET: \\PC1\prog\
14/06/2006 10:31:01 >> 1.2 Usando carpeta temporal: C:\windows\TEMP
14/06/2006 10:31:01 >> 1.3 Modo Sesion: cmAll
14/06/2006 10:31:01 >> 1.4 Modo servidor: Si
14/06/2006 10:31:01 >> 3   Configurar Base de datos:
14/06/2006 10:31:01 >> 3.1 Asignando Controlador
14/06/2006 10:31:01 >> 3.2 Carpeta de Base de Datos: \\PC1\prog\tablas
14/06/2006 10:31:01 >> 3.3 Asignando parámetros de Base de Datos (dtbppal) 
14/06/2006 10:31:01 >> PATH = \\PC1\prog\tablas
14/06/2006 10:31:01 >> 4   Alias: prog1
14/06/2006 10:31:01 >> 4.1 Alias asignado
14/06/2006 10:31:01 >> 5   Sesion Activa
14/06/2006 10:31:01 >> 6 **Conectado a Base de Datos**
En tu archivo Alias.Dat, escribe un nombre nuevo, es decir, un Alias que no exista, así este código creará un Alias nuevo y lo configura TODO.

Como verás, el archivo .Net lo tengo configurado en el mismo sitio que el ejecutable en el servidor, (no tengo una carpeta especial para él) aunque eso da igual.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 14-06-2006 a las 11:26:36.
Responder Con Cita
  #9  
Antiguo 22-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 21
URBANO Va por buen camino
Hola, perdona por no haber contestado antes, pero estoy bastante liado, por culpa de este error.

He utilizado el codigo que me has puesto, sustituyendo lo que me comentabas y creando un alias que no existia. Pero, , el problema sigue siendo el mismo. Si ejecuto el programa en el servidor (tiene win98) no hay problemas, pero si ejecuto el programa desde el cliente (tiene winxp) al abrir cualquier tabla me da el siguiente error:

Código:
Detail Table Open Operation failed
Table: detfacturas.DB
La segunda linea varia en funcion de la tabla que habro. El orden de habrir las tablas es el correcto, no hay problema de relaciones.

Estoy desesperado, aburrrido y cansado, no hay manera, pero hay que seguir insistiendo. Haber si se te ocurre otra cosa. Gracias.
__________________
El saber no ocupa lugar.
Responder Con Cita
  #10  
Antiguo 22-06-2006
URBANO URBANO is offline
Miembro
 
Registrado: jul 2003
Ubicación: Huelva
Posts: 126
Poder: 21
URBANO Va por buen camino
Comento otra cosa que tambien ocurre, haber si ayuda en algo.

Despues de ejecutar el programa en el ordenador cliente y haber dado el error que comento antes, cierro el programa y ejcuto la herramienta DatabaseExplorer, he intento entrar en la pestaña "Dictoniary" y me da el siguiente error:

Cita:
File name is too long for a Paradox Version 5.0 table.
Creo que comente que las tablas estan realizadas en Paradox 7.0, con el Database Desktop que viene con el Delphi 5.

Haber si ayuda.
__________________
El saber no ocupa lugar.
Responder Con Cita
  #11  
Antiguo 22-06-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
No solo ayuda, es que diste en el clavo. Deja todos los archivos de tablas con 8 caracteres máximo, sin espacios, es decir, al viejo estilo de ms-dos.

Ahora que lo mencionas, me ocurrió tambien en una de las tablas

Con eso fijo que se quita el error.

La explicación es sencilla, Win98 siempre usa el formato de nombres cortos para gestionar los archivos (siempre lo traduce a formato 8.3 caracteres cuando los maneja). WinXP sin embargo, acepta el uso de archivos con nombres largos e intenta abrirlos con ese formato.

Este error no tiene nada que ver con el de "El registro no se puede editar porque otro usuario de la red ya lo está haciendo". Ahora puedes concentrarte en este error e intentar editar un mismo registro en 2 ordenadores, debe darte un error al hacerlo.
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 22-06-2006 a las 09:54:45.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Conexion de base de datos en win98 y winxp monicasierrar Conexión con bases de datos 6 25-05-2005 19:54:51
Paradox en Red con WinXP y Win98 EstebanWeb Conexión con bases de datos 17 11-03-2005 18:10:58
Capturar el usuario de WinXp y Win98?? danytorres API de Windows 1 25-01-2005 22:08:21
Mi Exe no funciona en Win98 pcicom OOP 3 13-12-2004 16:43:38
Al llevar .dpr de WinXP a Win98 no existe .dpr y problema nombres archivo largos images Varios 2 10-09-2004 23:25:27


La franja horaria es GMT +2. Ahora son las 07:41:27.


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
Copyright 1996-2007 Club Delphi