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 para Ángel - conexión a base de datos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Duda para Ángel - conexión a base de datos Responder citando

gracias, todo lo que me estas diciendo me está funcionando.
supongamos que este programa esta situado en el servidor, no?
las rutas son :
fichero de red acceso="c:\programa\net"
tablas tablas="c:\programa\datos"
mi problema viene ahora...
en un ordenador cliente si creo un acceso directo a este programa
intenta buscar las tablas en su disco duro, entneces lo que he hecho
ha sido cambiar las rutas "//servidor/programa/net" para el archivo de red y "//servidor/programa/datos" para las tablas, todo en el .ini, el alias que crea por defecto con este último path no funciona, por favor necesito ayuda
¿que hago? , dime lo que hay que hacer para el correcto funcionamiento, quiero que por ejemplo tres clientes haccedan a la base de datos del servidor, no se si me he sabido explicar.

necesito tu ayuda ángel !!!estoy a punto de conseguirlo!!!
muchas gracias por tu atención
_________________
Saludo de Eclipse
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

La cuenta de correo que tienes en el perfil (), ¿funciona bien? Te mandé un correo el viernes con un ejemplo. No pasa nada, te lo vuelvo a mandar en cuanto tenga un hueco; tal vez hoy lunes no pueda peor no me olvido de ti. Smile
_________________
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

MIRA, TODO ESTA CORRECTO, COMO LO ESTAS MANEJANDO, LO QUE NECESITAS ES LA FORMA DE CONECTARTE, AL SERVIDOR, QUE ES LA COMPUTADORA QUE CONTIENE LAS TABLAS, PARA ELLO UTILIZA, SI DESEAS, LOS SIGUIENETES ARCHIVOS, QUE PUEDO MANDARTE POR CORREO. DONDE AL IGUAL QUE TU CREA UN ARCHIVO INI DE CONFIGURACION QUE QUE LO PUSE, EN EL FORO, PERO NO RECUERDO EL ENLACE.., SI LOS QUIESIERAS TE LOS MANDO, MI CORREO, ES: ccsg259@hotmail.com., viene la parte basica, para crear un servidor y poder conectarte a las bases del servidor, si te sirve te los envio ahora estan mejorados...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Prueba a conectar el servidor a unidad de red.

Asi cambirarias la ruta "//servidor/progrma/net", por "f:\programa\net".

Espero q sea util.
Volver arriba
Ver perfil de usuario Enviar mensaje privado MSN Messenger
Mensaje    Asunto: Responder citando

mi correo electrónico es robertoloaisa@hotmail.com.
_________________
Saludo de Eclipse
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cita:
Asi cambirarias la ruta "//servidor/progrma/net", por "f:\programa\net"

¿Y si mañana desaparece la conexión a esa unidad de red F? El sistema de conectar a unidades de red yo tuve que dejar de usarlo porque termina dando muchos problemas: cambios de configuración, reinstalaciones, formateos, etc. Es mejor trabajar con direcciones absolutas.

Por cierto: en tu perfil apareces como roberto@hotmail.com. Te pongo aquí también el contenido del mensaje porque no sé a donde diablos ha ido a parar. Es un poco tocho.

Vamos a ver si te he entendido. Has puesto las tablas en un servidor (si en él corre también el programa es independiente). Ahora tienes dos alternativas:

1ª. El ejecutable está instalado en el servidor para TODOS los usuarios; es decir: siempre que el usuario arranca el programa llama al que reside en el servidor.
2ª. Cada usuario tiene en su máquina una copia INDIVIDUAL del ejecutable.

Por lo que te he entendiodo, estás usando la primera de ellas ¿correcto? Si es así, no te lo aconsejo por varias razones:

1ª. Se sobre cargan los recursos del servidor al tener que compartir entre varios usuarios todo (memoria, CPU, accesos, etc.)
2ª. El fichero de configuración, para todos, es el mismo y puede darte problemas como de hecho te está ocurrieno.

Personalmente creo mejor que instales una copia del ejecutable en cada uno de los puestos que trabajan con la aplicación. De esta forma, y con el sistema que te expliqué (que es el que uso yo) cada equipo tendrá un fichero de configuración del sistema. Voy a rizar el rizo y te pongo aquí el código que yo uso en los arranques de las aplicaciones que hago para red.Además de todo, te deja elegir la ubicación de los ficheros. Te lo explicaré lo mejor que pueda. Allá va:

1º. En el fichero include
Código:
class TfTablas : public TDataModule
{
__published:    // IDE-managed Components

(El código que va aquí es el que pone el propio Builder. Yo no toco nada de este trozo)

private:    // User declarations
public:        // User declarations
     __fastcall TfTablas(TComponent* Owner);
     int __fastcall Directorio();
     void __fastcall DefineTablas();
     Word Year, Month, Day;
     char cEntorno[128], cTablas[128], cAcceso[128];
     AnsiString cDirectorio, cPuesto, cTarjetas;
     AnsiString cInicio, cSaludo, cUsuario, cAnual;
};

Todas las línes entre int __fastcall Directorio(); y el final son de "cosecha porpia" Smile
2º En el propio formulario (fichero cpp)
Código:
void __fastcall TfTablas::DataModuleCreate(TObject *Sender)
{
     AnsiString cTemp = "", cLista = "";
     cDirectorio = ExtractFilePath(Application->ExeName);
     cPuesto     = cDirectorio + "Puesto.ini";

     if (!FileExists(cPuesto))
     {
          if (Application->MessageBox("Indique la situación de los archivos de datos en el siguiente cuadro de diálogo.", "= INSTALACIÓN =", MB_OKCANCEL | MB_ICONEXCLAMATION) == IDCANCEL)
          {
               Application->MessageBox("No puede iniciarse la sesión. Desconozco la situación de los ficheros.", "¡¡¡ ERROR !!!", MB_OK | MB_ICONERROR);
               Application->Terminate();
          }

          if (Directorio() != 0)
          {
               Application->MessageBox("No puede iniciarse la sesión. Desconozco la situación de los ficheros.", "¡¡¡ ERROR !!!", MB_OK | MB_ICONERROR);
               Application->Terminate();
               return;
          }

//        *************************************************************
//        * CREACIÓN DEL FICHERO DE DEFINICIÓN DEL ENTORNO Puesto.ini *
//        *************************************************************

          WritePrivateProfileString(NULL, NULL, NULL, cPuesto.c_str());
          WritePrivateProfileString("DATOS", "Acceso"   , (cInicio + "\\TPV\\Accesos").c_str(), cPuesto.c_str());
          WritePrivateProfileString("DATOS", "Tablas"   , (cInicio + "\\TPV\\Tablas").c_str() , cPuesto.c_str());
     }

     memset(cTablas   , '\0', 128);
     memset(cAcceso   , '\0', 128);

     GetPrivateProfileString("DATOS", "Tablas"   , cDirectorio.c_str(), cTablas   , 128, cPuesto.c_str());
     GetPrivateProfileString("DATOS", "Acceso"   , cDirectorio.c_str(), cAcceso   , 128, cPuesto.c_str());

     if (!DirectoryExists(cTablas))
          ForceDirectories(AnsiString(cTablas));
     if (!DirectoryExists(cAcceso))
          ForceDirectories(AnsiString(cAcceso));

     Session1->PrivateDir = ExtractFilePath(Application->ExeName);
     Session1->ConfigMode = cmSession;
     Session1->NetFileDir = cAcceso;

     try
     {
          Session1->AddStandardAlias("dTPV", 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();
     Table2->Open();

     Application->CreateForm(__classid(TfForm1), &fForm1);
     fForm1->ShowModal();
     delete fForm1;

     Table1->Close();
     Table2->Close();

     try
     {
          Session1->DeleteAlias("dTPV");
     }

     catch(...)
     {
     }

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

int __fastcall TfTablas::Directorio()
{
     BROWSEINFO bi;
     char WDir[MAX_PATH], FolderName[MAX_PATH], *cPath;
     LPITEMIDLIST ItemID;
     int nDirectorio = 0;

     while (nDirectorio == 0)
     {
          memset(&bi, 0, sizeof(BROWSEINFO));
          memset(WDir, 0, MAX_PATH);
          bi.hwndOwner = NULL;
          bi.pszDisplayName = FolderName;
          bi.lpszTitle = "Seleccione la ubicación de los ficheros de datos";
          ItemID = SHBrowseForFolder(&bi);
          SHGetPathFromIDList(ItemID, WDir);
          GlobalFreePtr(ItemID);
          cInicio = String(WDir);

          if (cInicio == "")
               return (1);

          if (cInicio[1] > 'B')
          {
               cSaludo = "Ha elegido " + cInicio + " para su aplicación.\r\n\r\n";
               if (cInicio.IsPathDelimiter(cInicio.Length()))
                    cInicio.SetLength(cInicio.Length()-1);
               cSaludo = cSaludo + "   » Los datos estarán en: " + cInicio + "\\TPV\\Tablas\r\n";
               cSaludo = cSaludo + "   » Las copias de seguridad en: " + cInicio + "\\TPV\\Copias\r\n";
               cSaludo = cSaludo + "   » El control de acceso en: " + cInicio + "\\TPV\\Accesos\r\n\r\n";
               cSaludo = cSaludo + "¿Son correctos los datos?";
               if (Application->MessageBox(cSaludo.c_str(), "= INSTALACIÓN =", MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
               {
                    nDirectorio = 1;
                    if (chdir(cInicio.c_str()) == -1)
                    {
                         Application->MessageBox("La vía seleccionada no está accesible.\r\nRevise su elección, por favor.", "= INSTALACIÓN =", MB_OK | MB_ICONEXCLAMATION);
                         nDirectorio = 0;
                    }
               }
          }
          else
          {
               Application->MessageBox("Sólo puede instalarse en un disco duro.", "= INSTALACIÓN =", MB_OK | MB_ICONEXCLAMATION);
               nDirectorio = 0;
          }
     }
     return (0);
}
//---------------------------------------------------------------------------

Te voy a explicar algunas cosas que son un poco raras.

La función Directorio() está copiada tal cual de la ayuda del propio Builder. Si pides ayuda sobrre BROWSEINFO te da todos los datos. Una cosa que hago yo es siempre que se inicia la aplicación verificar si existe el fichero de configuración (yo lo he llamado Puesto.ini); caso de no existir, lanza esta función que devuelve la vía de acceso que se seleccione y crea el fichero (conjunto de instrucciones WritePrivateProfileString)

Luego cargo los valores de este fichero (GetPrivateProfileString) en al variables definidas en el include y verifico que existan las carpetas ahí definidas.

A continuación defino los parámetros de TSession y TDatabase (PrivateDir, NetfileDir, etc.) y creo el alias asociándolo a la dirección en la que se guardan las tablas (AddStandardAlias); conecto la base de datos a la sesión y abro la base de datos. Ya se pueden abrir las tablas y lanzar el primer formulario de la aplicación.

Cuando termino, sigo los pasos inversos: borro los formularios, cierro las tablas, elimino el alias y cierro la sesión. A mi me fuinciona bien. De todas formas, ya sabes donde puedes pillarme
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)


Ultima edición por Angel el Mar 21 Oct, 2003 10:06 am, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: consejo Responder citando

Ángel,

probablemente dentro de poco tenga la necesidad de desarrollar un proyecto con base de datos cliente - servidor para varios puestos y por supuesto ya he descartado Paradox.

Hasta ahora solo he usado bases de datos locales (Páradox y Access) en mis proyectos, y no tengo ningún requerimiento del cliente en cuanto a lo que usar, quisiera que me des algún consejo sobre que usar Firebird - Interbase - SQL Server - ... y si tienes algún código de ejemplo para su manejo.


atte
_________________
Adrián

http://adrian.org.ar
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Lo siento, pero ahí si que no puedo ayudarte porque todos los desarrollos que llevo a cabo en el trabajo son con tablas paradox. Los compañeros que trabajan en modo cliente/servidor o para internet están usando Oracle que es la licencia que tenemos, pero no tengo ni idea de como va.
_________________
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
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.