Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   aplicaion que se conecta a otras bases de datos (https://www.clubdelphi.com/foros/showthread.php?t=68648)

richy08 26-06-2010 20:39:47

aplicaion que se conecta a otras bases de datos
 
buenos tardes compañeros estoy terminando la aplicaion para un hotel, la cual se conecta a una base de datos de access y a otra de mysql para leer cargos, dichas interfaces actualmente funcionan pero con algunas restricciones, para conectar con la de mysql la maquina necesita estar en una red .11, y todas las maquinas estan en la red .10, solo ahi una que esta en la .11 y los usuarios se quejan por que necesitan correr ciertos procesos de la reserva en esa maquina, me piden que eso cambie y las soluciones que he encontrado son dos:


1.- insertar estado de los procesos en una tabla y poner una aplicacion en el servidor que este leyendo todo el tiempo esta tabla, y al ver que cambia el estado que corra esos procesos para quitar la restriccion de la red, la pregunta es no sera demasiado costoso que este corriendo todo el tiempo un programa en el server que este leyendo la tabla???, y otro inconveniente que veo es que algunas reservas no seran tomadas en cuenta ya que llevaran mas prioridad las que esten arriba en la tabla.

2.- la otra (no estoy seguro si se pueda hacer) es crear una aplicacion que mas bien seria coom una funcion y que solo se ejecute cuando alguna maquina le pase parametros, se podria hacer???

nota: el servidor donde corre la aplicaion cuenta condos tarjetas de red por lo cual puede ver las dos redes la .10 y la .11

graciasp or cualquier comentario

manuc 05-07-2010 16:52:26

Hola Richy08,

Puedes hacerlo de varias formas.

Lo que comentas de crear una aplicación que reciba parámetros no está mal encaminada.

Una solución (si no lo has hecho antes, quizás pueda ser algo complicada) sería desarrollar una Servidor TPC, que reciba peticiones en el servidor y ejecute procesos que se conecten a una base de datos u otra.

Igualmente, puedes crear un ActiveX Library, instalarla en el servidor e igual que el caso anterior, recibir peticiones para ejecutarlas en el servidor.

En ambos casos, lo que consigues es los ordenadores clientes realicen peticiones a un software que se ejecuta en el servidor. Este Software que se ejecuta en el servidor, podrá conectar a una base de datos u otra.

Espero que te ayude.

Un saludo.

richy08 05-07-2010 17:12:30

gracias por la respuesta manuc, la verdad aun no he llegado a ese punto donde partire la aplicaion de los ejemplos que me comentas me parecen una buena opcion, pero he buscado en el foro y no encuentro nada de informacion tendras un link para orientarme, otra forma que habia estado pensando es hacerlo via sockets enviar una cadena y pues en el sevidor desbaratarla y ahi tendria mis parametros cree que funcione de esta forma??? y cuales son los inconvenientes de hacerlo asi, que me recomendarias muchas gracias por tu tiempo

manuc 05-07-2010 17:24:15

Hola richy08,

Disculpa, con lo de Servidor TCP me refería exactamente (perdona, no he sido muy preciso) a un Software Servidor por Socket.

En realidad ambas soluciones utilizan conexiones por Socket. Quizás, crear una ActiveX Library, sea más sencillo si no has trabajado antes con Sockets.

¿Con qué versión de Delphi trabajas?

richy08 05-07-2010 17:40:53

a ok jeje disculpa mi ignorancia:o trabajo con delphi 7, y pues alguna ves vi un ejemplo de un tipo chat que utilizaba sockets, pero cualquier informacion me servira de mucha ayuda

manuc 05-07-2010 17:47:20

1 Archivos Adjunto(s)
Entonces imagino que trabajarás con Indy 9.

Te adjunto un ejemplo de como hacer un cliente y servidor con Sockets.

Tiene la extensión .zip, pero realmente es un .rar.

Espero que te ayude.

Un saludo.

richy08 05-07-2010 17:49:18

mil gracias por tu tiempo manuc le voy a echar un vistazo y comento :D

richy08 07-07-2010 19:22:32

hola manuc ya empeze a cambiar mi codigo y estoy analizando los proyectos que me enviaste te has percatado que la cerrar el cliente marca un error??

o es solo en mi maquina saludos.

manuc 07-07-2010 19:31:16

Hola richy08,

¿qué lanza un error o una excepción?

La verdad es que no lo he probado. Sí es normal, que al desconectar el cliente, el servidor lance una excepción.

Un saludo.

richy08 07-07-2010 19:41:56

a ok perfecto de hecho es una excepcion, entonces seguire adelante mil gracias por tu tiempo

manuc 07-07-2010 19:47:46

de nada richy08, encantado de poder ayudar.

Hay que compartir. Llevo años aprendiendo en este foro, gracias a la generosidad de sus participantes y voy devolviendo el favor a medida que puedo.

Un saludo.

richy08 07-07-2010 23:58:47

buenas tardes manu sigo con la aplicacion y he estado probandola y comprendiendola, pero e notado algo extraño tal ves pienso que puede ser al servidor dns de la empresa:eek:, no estoy seguro. el error que le noto es que al querer enviar un mensaje a una maquina en especifico solo la aplicacion del servidor recibe los valores, y a la maquina que va dirigido no, y la duda es mas grande es indy 9 funciona en windows 7 :eek:

manuc 08-07-2010 09:06:17

Hola Richy08,

Yo tengo aplicaciones que utilizan indy9 y funcionan perfectamente en Windows Vista y Windows 7.

El error que comentas, la verdad es que no lo he entendido bien. Cuando dices que intentas enviar a otras máquinas: ¿te refieres a otro ordenador cliente? ¿cómo lo estás haciendo?

richy08 08-07-2010 17:35:09

Cita:

Empezado por manuc (Mensaje 369657)
Hola Richy08,
El error que comentas, la verdad es que no lo he entendido bien. Cuando dices que intentas enviar a otras máquinas: ¿te refieres a otro ordenador cliente? ¿cómo lo estás haciendo?

asi es manuc en la aplicacion queme pasaste estoy tratando de adaptarla a mis necesidades pero al usar el campo recipient (le pongo el nombre de la maquina o la ip) y los mensajes no llegan solo en la parte del server se ven pero al destinatario nunca llegan, alguna idea de que pueda ser :confused:, segun lo que he leido de los componentes en la parte de host del tcp que va en la parte del cliente, ese campo lleva la direccion ip o el nombre de la maquina donde se encuentra el servidor, los he configurado asi ademas modifique el proyecto por que estaba compilando con las librerias y dichas librerias no estan en le cliente, lo extraño de todo esto que los mensajes solo llegan cuando son broadcast.

manuc 08-07-2010 18:05:16

Disculpa richy,

No se si lo que estás intentando es conectar dos tidTCPClients.
Si es así, no podrás hacerlo. Tu arquitectura tiene que seguir siempre un modelo Cliente -> Servidor.

Si lo que quieres es enviar información de un cliente a otro cliente, tendrás que pasar por el servidor y que este redireccione la información.

Si me comentas qué tipo de estructura estás intentando montar, te puedo aconsejar cómo hacerlo.

Un saludo.

richy08 08-07-2010 18:43:30

gracias manuc no efectivamenete estoy siguiendo la estructura cliente - servidor de hecho estoy probando con los ejecutables de los ejemplos que me enviaste, lo que quiero lograr es que al enviar los parametros a la aplicaion esta ejecute el codigo que ya tengo programado y al terminar le envie un message a la maquina que lo mando llamar solamente y diga algo como done¡¡ ahora mismo estoy en sitio donde esta instalada la aplicacion hare pruebas con los mismos ejecutables dentro de su red para descartar que sea el servidor DNS de la empresa saludos

richy08 09-07-2010 00:07:02

hola manuc ya logre que funcione la aplicacion no la he terminado primero me gustaria preguntarte algo, ahora lo unico que hace es que cuando el cliente envia la peticion de conexion le regresa la cadena diciendole que le proceso se hizo, creo que con esto bastara ya despues le agregare mas campos que seran mis variables al record "TCommBlock", este es el codigo que uso en el cliente


//clientes
Código Delphi [-]
procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
     Frm_Posgue.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;

procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not Frm_Posgue.Client.Connected then
      Terminate
    else
    try
      Frm_Posgue.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;

  CBClientActive.Checked:=true;
      if CBClientActive.Checked then
      begin
        try
           Client.Connect(10000);  // in Indy < 8.1 leave the parameter away
           ClientHandleThread := TClientHandleThread.Create(True);
           ClientHandleThread.FreeOnTerminate:=True;
           ClientHandleThread.Resume;
        except
            on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
        end;
      end
      else
      begin
       ClientHandleThread.Terminate;
       Client.Disconnect;
      end;

    CommBlock.Command      := '';//EditCommand.Text;         //     assign the data
    CommBlock.MyUserName   := Client.LocalName;
    CommBlock.Msg          := 'hola';//EditMessage.Text;
    CommBlock.ReceiverName := 'Desarrollo-lap';//EditRecipient.Text;

    Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);

la pregunta aqui es en que momento desconecto la conexion :confused: ya que la mayoria de los procesos de las interfaces se llevan en esta pantalla al ir presionando botones segun cambie de estado la reservacion.


//Server
Código Delphi [-]
procedure TFrm_Interfaces.CBServerActiveClick(Sender: TObject);
begin
  Server.Active := CBServerActive.Checked;
end;

procedure TFrm_Interfaces.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;
begin
GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS         := AThread.Connection.LocalName;
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      :=AThread;

  AThread.Data:=TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;

  Protocol.Lines.Add(TimeToStr(Time)+' Connection from "'+NewClient.DNS+'"');
end;

procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
  ActClient, RecClient: PClient;                                                                              
  CommBlock, NewCommBlock: TCommBlock;
  RecThread: TIdPeerThread;
  i: Integer;
begin
  if not AThread.Terminated and AThread.Connection.Connected then
  begin
    AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
    ActClient := PClient(AThread.Data);
    ActClient.LastAction := Now;  // update the time of last action
     // unknown command given
      Protocol.Lines.Add (TimeToStr(Time)+' !! "'+CommBlock.MyUserName+'": '+CommBlock.Command);
      NewCommBlock.Command := 'DIALOG';       // the message should popup on the client's screen
      NewCommBlock.MyUserName := '[Server]';  // the server's username
      NewCommBlock.Msg := 'The process was done  "'+CommBlock.Command+'"';  // the message to show
      NewCommBlock.ReceiverName := '[return-to-sender]'; // unnecessary
//****************************************************
//codigo de los procesos a ejecutar "segun yo" 
//****************************************************
      AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true);  // and there it goes...
    //end;
  end;
end;

procedure TFrm_Interfaces.ServerDisconnect(AThread: TIdPeerThread);
var
 ActClient: PClient;
begin
  ActClient := PClient(AThread.Data);
  Protocol.Lines.Add (TimeToStr(Time)+' Disconnect from "'+ActClient^.DNS+'"');
  try
    Clients.LockList.Remove(ActClient);
  finally
    Clients.UnlockList;
  end;
  FreeMem(ActClient);
  AThread.Data := nil;
end;


procedure TFrm_Interfaces.FormCreate(Sender: TObject);
begin
  Clients := TThreadList.Create;
end;

procedure TFrm_Interfaces.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  Server.Active := False;
  Clients.Free;
end;
entre estas etiquetas creo que debe de ir el codigo de los procesos ver arriba en el codigo del server
//****************************************************
//codigo de los procesos a ejecutar "segun yo"
//****************************************************
la pregunta aqui es que pasa si dos estaciones abren esta pantalla las dos trabajando sobre diferente records y por asares del destino mientras los querys estan haciendo los procesos de la peticion de una maquina, que pasa si otra manda llamar al mismo proceso lso querys seguiran ejecutando la peticion de la otra maquina y esperaran a que terminen para comenzar con la nueva transaccion

gracias.

richy08 09-07-2010 20:34:57

sigo con las pruebas y si al parecer me hace falta algo, ya que al ejecutar los querys y simular un enpalme de peticiones de dos maquinas diferentes me marca un error y la aplicaion server se queda pasmada, el error que me marca es que no se pueden completar las operaciones de forma asincrona, algun manual donde pueda ver como sincronizar las operaciones gracias :)


La franja horaria es GMT +2. Ahora son las 00:02:49.

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