 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
sergiopareja Cdt

Registrado: 10 Mar 2011Mensajes: 7
|
Publicado: Mie 10 Oct, 2012 7:22 am Asunto: duda sobre aplicacion multipuesto |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mie 17 Oct, 2012 8:03 am Asunto: |
|
|
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 |
|
 |
sergiopareja Cdt

Registrado: 10 Mar 2011Mensajes: 7
|
Publicado: Jue 01 Nov, 2012 9:41 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 02 Nov, 2012 8:47 am Asunto: |
|
|
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 |
|
 |
sergiopareja Cdt

Registrado: 10 Mar 2011Mensajes: 7
|
Publicado: Sab 25 May, 2013 8:57 pm Asunto: |
|
|
| Muchas gracias Angel por tu respuetan, deje aparcado el proyecto un tiempo y ahora acabo de probar y funciona perfectamente. |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|