Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

duda sobre aplicacion multipuesto

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: duda sobre aplicacion multipuesto Responder citando

hola, tengo una duda respecto a como cambiar una aplicacion realizada en BC6.
el problema es que hasta ahora se estaba ejecutando en un solo puesto pero necesito que se ejecute en otros 3 puestos mas.
en el foro en visto que se debe hacer con el componente tsession y tdabase.
no tengo muy claro como hacerlo o que pasos seguir. agradeceria si algien puede ayudarme. gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Te explico como lo hago yo con BCB5 y con tablas Paradox.

Efectivamente necesitas esos dos componente (TDatabase y Tsession). Para conectar yo hago esto:
Código:
try
{
     fPersonas->Session1->PrivateDir = ExtractFilePath(Application->ExeName);
     fPersonas->Session1->ConfigMode = cmSession;
     fPersonas->Session1->NetFileDir = cAcceso;
}
catch(...)
{
     ShowMessage("Ha tenido lugar un error en la conexión a la base de datos.");
     if (fPersonas->Session1->IsAlias("dGesAfi21"))
     {
          try
          {
               fPersonas->Session1->DeleteAlias("dGesAfi21");
          }
          catch(...)
          {
          }
     }
     Application->Terminate();
}

try
{
     fPersonas->Session1->AddStandardAlias("dGesAfi21", cTablas, "PARADOX");
}
catch(...)
{
}

// *************************************************************************
// * Se activan la sesión, la base de datos y las tablas que correspondan. *
// *************************************************************************

fPersonas->Session1->Active     = true;
fPersonas->Database1->Connected = true;
fPersonas->Session1->OpenDatabase(fPersonas->Database1->DatabaseName);

Table1->Open();

Las variables cAcceso y cTablas yo la guardo en un fichero ini y las recupero con GetPrivateProfileString. cAcceso es la carpeta en la que se ponen los ficheros de control para la red (PDOXUSRS.NET) y cTablas es la carpeta en la que se encuentran las tablas de la base de datos.

Además de esto, en cada TQuery y TTable que uses asociado a esa base de datos deberás poner en la propiedad DatabaseName el alias que se define en AddStandardAlias (en el código es dGesAfi21) y en SessionName el nombre que le hayas dado a TSession en la propiedad SessionName.

Para cerrar la sesión yo hago esto:
Código:
Table1->Close();

if (Session1->IsAlias("dGesAfi21"))
{
     try
     {
          Session1->DeleteAlias("dGesAfi21");
     }

     catch(...)
     {
     }
}

Session1->DropConnections();
Session1->Active     = false;
Database1->Connected = false;

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Angel gracias por responderme, acabo de probar lo que me has comentado y me funciona correctamente en el primer pc que ejecuta la aplicacion.
si abro la aplicaion en un segundo pc muestra el siguiente mensaje:
Directory is controller by other .NET file.
Directory c:\
File:Z\DATA\PDOXUSR.LCK
Las rutas que tengo puestas son estas:

AnsiString cAcceso, cTablas;
cAcceso="C:\\";
cTablas="Z:\\DATA";

la unidad z es una unidad compartida de red que tengo cargada en todos lo equipos que van a ejecutar la aplicacion y donde estan guardadas las tablas en la carpeta DATA.
El ejecutable de la aplicacion lo tengo copiado en cada equipo para ejecutarlo en local desde cada pc.

podrias darme alguna pista de donde puede estar el problema?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Te pongo todo el código que uso yo.

1. Leer las variables de entorno.
Código:
char cEntorno[128], cTablas[128], cAcceso[128];
memset(cEntorno, '\0', sizeof(cEntorno));
memset(cAcceso , '\0', sizeof(cAcceso));
memset(cTablas , '\0', sizeof(cTablas));

GetPrivateProfileString("DATOS", "Entorno", "C:\\Datos\\Aplica.ini", cEntorno, sizeof(cEntorno), (ExtractFilePath(Application->ExeName) + "Puesto.ini").c_str());
GetPrivateProfileString("DATOS", "Acceso" , "C:\\Datos\\Acceso" , cAcceso , sizeof(cAcceso) , (ExtractFilePath(Application->ExeName) + "Puesto.ini").c_str());
GetPrivateProfileString("DATOS", "Tablas" , "C:\\Datos\\Tablas" , cTablas , sizeof(cTablas) , (ExtractFilePath(Application->ExeName) + "Puesto.ini").c_str());

Yo uso dos ficheros ini. En un de ellos (que he llamado aquí Puesto.ini) guardo los valores de la red. Por ejemplo:
Código:
[DATOS]
Entorno=D:\DatAfi21\Gia.ini
Acceso=D:\DatAfi21\Acceso
Tablas=D:\DatAfi21\Tablas

Lo grabo con WritePrivateProfileString. Mira en la ayuda esta instrucción. En el ejemplo que te he puesto la base de datos está en local, pero vale igual para unidades de red; de hecho, el ejemplo que te pongo está corriendo en red.

El otro (Aplica.ini) guarde los valores de la instalación que te hagan falta (Nombre de la empresa, domicilio, etc.); los que te hagan falta. Este yo suelo ponerlo en la carpeta donde está la base de datos para que no haya que hacer una copia del fichero en cada puesto de la red.

2. Conectar la base de datos.
Código:
ShowMessage("Conexión de base de datos");

try
{
     Session1->PrivateDir = ExtractFilePath(Application->ExeName);
     Session1->ConfigMode = cmSession;
     Session1->NetFileDir = cAcceso;
}
catch(...)
{
     ShowMessage("Ha tenido lugar un error en la conexión a la base de datos.");
     if (Session1->IsAlias("dGesAfi21"))
     {
          try
          {
               Session1->DeleteAlias("dGesAfi21");
          }
          catch(...)
          {
          }
     }
     Application->Terminate();
}

try
{
     Session1->AddStandardAlias("dGesAfi21", cTablas, "PARADOX");
}
catch(...)
{
}

// *************************************************************************
// * Se activan la sesión, la base de datos y las tablas que correspondan. *
// *************************************************************************

Session1->Active     = true;
Database1->Connected = true;
Session1->OpenDatabase(Database1->DatabaseName);

Table1->Open();

Si te aconsejo una cosa: Reemplaza la unidades de red (Z en tu caso) por su dirección absoluta (por ejemplo \\Servidor\Datos). De esta forma evitarás que si cambia el nombre de la unidad de red no se encuentre la conexión.

Sobre la estructura que tienes montada. Yo lo hago de esta forma (no sé si será la mejor, pero a mi me funciona):
    - Creo una carpeta (por ejemplo Datos).
    - Dentro de ella creo otras:
      * Tablas, que contendrá los ficheros de la base de datos.
      * Acceso: Donde se gestionarán los controles por parte del motor.

Ten en cuenta que esos ficheros LCK tiene que atender todas las peticiones de la red. Con eso te quedaría:
Código:
AnsiString cEntorno, cAcceso, cTablas;
cEntorno="Z:\\DATA";
cAcceso="Z:\\DATA\\ACCESO";
cTablas="Z:\\DATA\\TABLAS";

El problema que comentas con los ficheros LCK la verdad es que me da bastantes veces pero me basta con colver a arrancar la aplicación y tira de frente. Prueba a borrarlos, los LCK y los PDOXUSRS.NET que pueda haber en la instalación; este último controla los accesos de la red.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Muchas gracias Angel por tu respuetan, deje aparcado el proyecto un tiempo y ahora acabo de probar y funciona perfectamente.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.