Club Delphi  
    Paypal   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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 24
ArdiIIa Va por buen camino
En pruebas...

Bueno Caral, espero que no me sometas a un tercer grado.... Vamos a ver los pasos que he seguido hasta ahora...

En el FormMain meto este componente
Código Delphi [-]
IdUDPServer: TIdUDPServer
  BufferSize = 4028
  BroadcastEnabled = True
  Bindings = <>
  DefaultPort = Tupuerto8080
  OnUDPRead = IdUDPServerUDPRead
  Left = 628
  Top = 64
end

En el FormMain lo activo o no, dependiendo si es el caso, dado que como es el mismo programa para todas las máquinas, no todas han de actuar como servidores de esta informaón


Código Delphi [-]
procedure TFormMain.FormShow(Sender: TObject);
begin
LoadOptions;
IdUDPServer.Active := Unit_Opciones.Servidor;
blablabla....
end;


Resultando que si ha sido el caso, esta máquina se pone como servidora UDP
y en el evento UDPRead, debemos atender las peticiones de los clientes...
Código Delphi [-]
procedure TFormMain.IdUDPServerUDPRead(Sender: TObject; AData: TStream;  ABinding: TIdSocketHandle);
var
 str:string;
 DataStringStream: TStringStream;
 Mensaje:String;
begin
try
DataStringStream := TStringStream.Create('');
DataStringStream.CopyFrom(AData, AData.Size);
str:='';
str:=DataStringStream.DataString;
If Pos(FormMain.HostName,DataModule1.IBDatabase1.DatabaseName) <> 0 then
Mensaje := DataModule1.IBDatabase1.DatabaseName
else
Mensaje := HostName + ':' + DataModule1.IBDatabase1.DatabaseName;


if str='$Database_Path$' then
    Abinding.SendTo(Abinding.PeerIp,Abinding.PeerPort,Mensaje[1],Length(Mensaje));
finally
 DataStringStream.Free;
end;

end;

En este procedimiento lo que hago es primero obtener la ubicación de la base de datos con las comprobaciones pertinentes... con respecto a la base de datos y nombre de la máquina.
También pregunto "if str='$Database_Path$' then" esto es la cadena que se espera del cliente que pide la información. Fijate que en este caso, se podrían controlar diversas cadenas y por supuesto devolver diversa información... Que era lo que comentaba seoane.

Bueno pues si los pasos se cumplen, respondemos con el socket recibido en el evento...
Código Delphi [-]
Abinding.SendTo(Abinding.PeerIp,Abinding.PeerPort,Mensaje[1],Length(Mensaje));
y la fase servidor ya está terminada.

En este paso, ahora mismo, me surge la duda de como le envío el nombre de la máquina y el path completo de la BD, no se si este debe ir tal cual o con dobles barras
Ejp: "edu:d:\\data\\mybase.fdb"



Ahora vamos con el cliente.... El problema surgen porque no saben o no quieren configurar el path de la BD, que tal como dije antes, es configurable desde el módulo de configuración del programa y en este paso procedemos así:

En el Form de configuración introducimos un:
Código Delphi [-]
IdUDPClient: TIdUDPClient
  BufferSize = 4028
  BroadcastEnabled = True
  Port = Tupuerto8080
  Left = 292
  Top = 152
end

Especial importancia en la propiedad "BroadcastEnabled = True" que era lo que comentaba seoane, de este modo nos aseguramos que el mensaje se difunda por toda la red... (todavía no probado).

También el el form de configuración he puesto dos botones
"autoconfigurar" y "cancelar autonconfigurar".

cuando pulsamos auto configurar hacemos esto:

Código Delphi [-]
procedure TFormConfig.ButtonAutoConfigClick(Sender: TObject);
Var cTemp : String;
begin
Autoconfig := True;
ButtonAutoConfig.Enabled := False;
ButtonCancelarAuto.Enabled := True;
IdUDPClient.Broadcast('$Database_Path$',Tupuerto8080);

cTemp := '';
while (cTemp = '') and Autoconfig DO
Begin
  cTemp := IdUDPClient.ReceiveString(3);
  Application.ProcessMessages;
End;
AutoConfig := False;
ButtonAutoConfig.Enabled := True;
Button1.Enabled := False;
if Trim(cTemp) <> '' then
Begin
  FilenameEdit1.FileName := cTemp;
  FilenameEdit1.Refresh;
  ButtonTestClick(Sender);
  End;
end;

Que lo que hace es difundir el mensaje "IdUDPClient.Broadcast('$Database_Path$',Tupuerto8080);" y esperar a recibir respuesta en el bucle... En el caso de no querer esperar, damos al botón CancelarAutoconfig, que es el que cambia el estado de la variable Autoconfig y detiene el bucle.
En el caso de que hayamos recibido una respuesta, la procesamos asignando el valor que hemos recibido del "servidor" y ya de paso, hacemos un click en el botón que realiza un test de conexión, para verificar que el parámetro obtenido es el correcto.


También he montado un checkbox en el módulo config, para que exista al menos una máquina servidora y que también hace alguna verificación para evitar que haya más de una máquina como servidor...
Código Delphi [-]
procedure TFormConfig.CheckBoxServidorClick(Sender: TObject);
begin
CheckBoxServidor.OnClick := NIL;
If Pos(FormMain.HostName,DataModule1.IBDatabase1.DatabaseName) <> 0 then
Begin
  FormMain.Aviso('ESTE ORDENADOR NO PUEDE ESTABLECERSE COMO SERVIDOR' );
  CheckBoxServidor.Checked := False;
End;
 OptionsChange(Sender);
 CheckBoxServidor.OnClick := CheckBoxServidorClick;
end;
Y esto es todo... de momento... lo he probado en local y aparentemente funciona. Mañana veré si pasa la prueba de fuego
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #2  
Antiguo 08-02-2007
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 185
Poder: 20
jlrbotella Va por buen camino
Cambios de máquina

Una buena solución si teneís un windows server, es configurar el dhcp para que le asigne la ip, así como los dns que correspondan.

En los dns puedes asignarle un alias donde este tu máquina servidor, y en los pc's cliente los llamas por el alias, y el nº de puerto.

Saludos,
JL
Responder Con Cita
  #3  
Antiguo 08-02-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 24
ArdiIIa Va por buen camino
Bueno, pues hemos pasado la prueba de momento...
El procedimiento funciona a la perfección, desde máquinas clientes se pregunta al servidor y este devuelve correctamente el path de la BD...
Eso sí, en alguna máquina con firewall ha habido problemillas (salvables)...
Esta tarde continuaremos con más máquinas.
Lo bueno de este sistema es que lo ha realizado "la secretaria", no ha hecho falta ningún "genio" de mantenimiento, y yo me he ahorrado 100 km de viaje...
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #4  
Antiguo 09-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 31
Lepe Va por buen camino
Cita:
y yo me he ahorrado 100 km de viaje..
¡¡ Chico, pero si en eso es donde se saca más beneficio !!

PD: Coincido plenamente, normalmente tienes más interés en echar esas 2 horas programando o tomando un café, que viajando .
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 07-03-2007
Troffed Troffed is offline
Miembro
 
Registrado: mar 2004
Posts: 51
Poder: 23
Troffed Va por buen camino
Lo acabo de probar dentro de la red y perfecto.

Muchas gracias.
__________________
"De la ignorancia nos equivocamos,
de los errores aprendemos."
---
www.softinspain.com
Responder Con Cita
  #6  
Antiguo 14-03-2007
valdorre valdorre is offline
Registrado
 
Registrado: abr 2006
Posts: 7
Poder: 0
valdorre Va por buen camino
hola, me podrian decir que componente es ese de udp,

cito:
En el FormMain meto este componente
Código Delphi [-]IdUDPServer: TIdUDPServer
BufferSize = 4028
BroadcastEnabled = True
Bindings = <>
DefaultPort = Tupuerto8080
OnUDPRead = IdUDPServerUDPRead
Left = 628
Top = 64
end

como inserto esto en el main
saludos

Osvaldo
[/font]

Última edición por valdorre fecha: 14-03-2007 a las 05:19:33.
Responder Con Cita
  #7  
Antiguo 14-03-2007
jlrbotella jlrbotella is offline
Miembro
 
Registrado: ene 2007
Posts: 185
Poder: 20
jlrbotella Va por buen camino
Es un componente de Indy (Pestaña Servers). Mira a ver si lo tienes instalado este paquete. Si no te lo puedes descargar desde: http://www.indyproject.org/Sockets/D...es/Indy10.aspx
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Recursos en Español D7 IBX 7.07 cacuna Varios 15 24-09-2004 16:41:48
Evaluador de Recursos marto Varios 3 22-01-2004 18:16:49
Recursos para D7 hgiacobone Varios 1 21-07-2003 12:16:13


La franja horaria es GMT +2. Ahora son las 19:22:52.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi