Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problema con logica de programacion en delphi y base de datos (https://www.clubdelphi.com/foros/showthread.php?t=48840)

chelox 05-10-2007 05:58:27

problema con logica de programacion en delphi y base de datos
 
Tengo una lista de direcciones para enviar un fichero a cada direccion
estoy utilizando el uso de los treath para cada envio.

para saber que fichero envio, debo consultar en la base de datos.

entonces:
con parte de esa direccion hago la consulta.

luego espero que vuelva la consulta con el resultado del fichero que tengo que enviar.
Pero ya no tengo la dirección!!!

Como puedo hacer para que la dirección esté asociado a la respuesta de la
consulta a la base de datos.

Otra cosa:
no se si es posible tengo un FOR donde recorro las direcciones y por cada dirección hace una consulta, esto funciona automáticamente creando diferentes hilos de consulta y respuesta???


Luego pensando un poco, se me ocurrión hacer la consulta de la base dentro de los treath.
Pero desde la unidad donde tengo las base de datos no me deja llamar a un treath. Me parece obvio, porque una unidad no puede saber de que hilo la está llamando.
Lo que pasa que yo utilizo la función AfterOpen de una consulta SQL.

Bueno, espero de su ayuda.
Muchas Gracias.

Neftali [Germán.Estévez] 05-10-2007 10:08:28

Explicas el problema, pero eres poco concreto en los que necesitas.
Además, has intrioducido muchos conceptos que no son sencillos (threads) y es difícil hacerdse una idea sin algo de código.

Intenta ser más concreto en lo que necesitas y si puedes añadir algo de código, seguro que aclarará las csas.

duilioisola 05-10-2007 11:40:57

Cita:

entonces:
con parte de esa direccion hago la consulta.

luego espero que vuelva la consulta con el resultado del fichero que tengo que enviar.
Pero ya no tengo la dirección!!!
Si tienes la dirección para hacer la consulta, y la consulta te da el fichero, pues tienes las dos cosas, ¿no?

Pon parte del código donde haces la consulta, para ver dónde se te pierde la dirección.

Cita:

Como puedo hacer para que la dirección esté asociado a la respuesta de la
consulta a la base de datos.
Pon la parte de código donde haces la consulta. Si es por SQL podría ser algo asi:
Código SQL [-]
/*fichero (id_fichero integer, fichero blob)*/
select 'direccion@servidor.com', fichero from ficheros where id_fichero=123

chelox 05-10-2007 13:28:40

aca va el código.
 
de anoche a hoy me parece que me di cuenta de algo...

que no puedo hacer consultas seguidas, si ya estoy usando una tabla
así que el problema es otro ahora

supongo que tendré que hacer una consulta por vez y cuando termina una, debo seguir con la otra, de esta forma puedo guardar la direccion en una variable


El sistema lo que hace, es enviar ficheros a dispositivos celulares



EL CODIGO:





procedure Tform1.procesar(s:String;n:Integer);
Begin
if (self.procesando_list.Count<strtoint(self.c_config.Items.Strings[0])) Then
Begin
if (objeto<>'') Then
Begin
self.procesando_list.Items.Add(s);
// antes enviaba siempre el mismo fichero
// enviar(s,self.c_config.Items.Strings[1] + 'objetos\' + objeto)
// ahora tiene que buscar en la base de datos segun el prefijo de la direccion, el fichero que corresponda
buscarModelo(s:String);
End;
End;
End;




procedure Tform1.buscarModelo(s:String);
var
i:Integer;
coma,servicios_dato,dato:String;
servicios: TBFBluetoothServices;
servicio: TBFBluetoothService;
prefijo: String;
Begin
servicios := EnumServices(s,true,Dongle);
servicios_dato := '';
coma := '';
for i:=0 to servicios.Count - 1 do
Begin
servicio := servicios.Service[i];
dato := coma + inttostr(i) + ':' + inttostr(servicio.Channel) + ':' + inttostr(servicio.UUID16);
servicios_dato := servicios_dato + dato;
coma := ',';
End;
prefijo := stringReplace(s,':','',[rfReplaceAll]);
prefijo := copy(prefijo,2,6);
// segun el prefijo de la direccion y los servicios pertenece a un grupo
d2.tgrupo.Close;
d2.tgrupo.SQL.Clear;
d2.tgrupo.SQL.Add('SELECT modelos.id, modelos.marca, modelos.modelo, agrupar.grupo');
d2.tgrupo.SQL.Add('FROM modelos');
d2.tgrupo.SQL.Add('INNER JOIN agrupar ON (modelos.id = agrupar.modelo)');
d2.tgrupo.SQL.Add('WHERE (modelos.prefijo = ' + '''' + prefijo + '''' + ')');
d2.tgrupo.SQL.Add('AND (modelos.servicios = ' + '''' + servicios_dato + '''' + ')');
d2.tgrupo.Open;
End;

procedure Tform1.encontroModelo(datos:TDataSet);
var
objeto2:String;
p1,largo,n, grupo, modelo, il:Integer;
s,busca:String;
Begin
n := datos.RecordCount;
if (n>0) Then
Begin
grupo := datos.fieldByName('grupo').Value;
modelo := datos.fieldByName('id').Value;
End
else
Begin
grupo := 0;
modelo := 0;
End;
// esto es porque guardo la lista de ficheros en una lista pero le pongo 1,fich.. 2,fich etc...
busca := inttostr(grupo) + ',';
il := BuscarEnLista(lista_objetos.Items,busca);
objeto2 := lista_objetos.Items.Strings[il];
largo := length(objeto2);
p1 := pos(',',objeto2);
objeto2 := copy(objeto2,p1+1,largo - p1);
// ahora debera enviar el fichero encontrado
// de donde saco la dirección???
enviar(ACALADIRECCION,self.c_config.Items.Strings[1] + 'objetos\' + objeto2)
end;



// en la unidad de las base de datos:
procedure Td2.tgrupoAfterOpen(DataSet: TDataSet);
begin
form1.encontroModelo(DataSet);
end;

chelox 05-10-2007 13:29:45

aca va el código.
 
de anoche a hoy me parece que me di cuenta de algo...

que no puedo hacer consultas seguidas, si ya estoy usando una tabla
así que el problema es otro ahora

supongo que tendré que hacer una consulta por vez y cuando termina una, debo seguir con la otra, de esta forma puedo guardar la direccion en una variable


El sistema lo que hace, es enviar ficheros a dispositivos celulares



EL CODIGO:





procedure Tform1.procesar(s:String;n:Integer);
Begin
if (self.procesando_list.Count<strtoint(self.c_config.Items.Strings[0])) Then
Begin
if (objeto<>'') Then
Begin
self.procesando_list.Items.Add(s);
// antes enviaba siempre el mismo fichero
// enviar(s,self.c_config.Items.Strings[1] + 'objetos\' + objeto)
// ahora tiene que buscar en la base de datos segun el prefijo de la direccion, el fichero que corresponda
buscarModelo(s:String);
End;
End;
End;




procedure Tform1.buscarModelo(s:String);
var
i:Integer;
coma,servicios_dato,dato:String;
servicios: TBFBluetoothServices;
servicio: TBFBluetoothService;
prefijo: String;
Begin
servicios := EnumServices(s,true,Dongle);
servicios_dato := '';
coma := '';
for i:=0 to servicios.Count - 1 do
Begin
servicio := servicios.Service[i];
dato := coma + inttostr(i) + ':' + inttostr(servicio.Channel) + ':' + inttostr(servicio.UUID16);
servicios_dato := servicios_dato + dato;
coma := ',';
End;
prefijo := stringReplace(s,':','',[rfReplaceAll]);
prefijo := copy(prefijo,2,6);
// segun el prefijo de la direccion y los servicios pertenece a un grupo
d2.tgrupo.Close;
d2.tgrupo.SQL.Clear;
d2.tgrupo.SQL.Add('SELECT modelos.id, modelos.marca, modelos.modelo, agrupar.grupo');
d2.tgrupo.SQL.Add('FROM modelos');
d2.tgrupo.SQL.Add('INNER JOIN agrupar ON (modelos.id = agrupar.modelo)');
d2.tgrupo.SQL.Add('WHERE (modelos.prefijo = ' + '''' + prefijo + '''' + ')');
d2.tgrupo.SQL.Add('AND (modelos.servicios = ' + '''' + servicios_dato + '''' + ')');
d2.tgrupo.Open;
End;

procedure Tform1.encontroModelo(datos:TDataSet);
var
objeto2:String;
p1,largo,n, grupo, modelo, il:Integer;
s,busca:String;
Begin
n := datos.RecordCount;
if (n>0) Then
Begin
grupo := datos.fieldByName('grupo').Value;
modelo := datos.fieldByName('id').Value;
End
else
Begin
grupo := 0;
modelo := 0;
End;
// esto es porque guardo la lista de ficheros en una lista pero le pongo 1,fich.. 2,fich etc...
busca := inttostr(grupo) + ',';
il := BuscarEnLista(lista_objetos.Items,busca);
objeto2 := lista_objetos.Items.Strings[il];
largo := length(objeto2);
p1 := pos(',',objeto2);
objeto2 := copy(objeto2,p1+1,largo - p1);
// ahora debera enviar el fichero encontrado
// de donde saco la dirección???
enviar(ACALADIRECCION,self.c_config.Items.Strings[1] + 'objetos\' + objeto2)
end;



// en la unidad de las base de datos:
procedure Td2.tgrupoAfterOpen(DataSet: TDataSet);
begin
form1.encontroModelo(DataSet);
end;

duilioisola 05-10-2007 14:31:30

Por lo que entiendo:
- con BUSCARMODELO posicionas una tabla en un registro
- con ENCONTROMODELO haces algo con los datos de ese registro.

Supongo que la solución sería que BUSCARMODELO te devolviera los datos que vas a uar en ENCONTROMODELO y se los pasaras.
(n, grupo y modelo deberán ser variable globales al thread)
Quizás también agregaría un tGrupo.Close después de la consulta en BUSCARMODELO, si no es necesario que quede abierto.

Código Delphi [-]
procedure Tform1.procesar(s:String;n:Integer);
Begin
   if (self.procesando_list.CountThen
   Begin
      if (objeto<>'') Then
      Begin
         self.procesando_list.Items.Add(s);
         // antes enviaba siempre el mismo fichero
         // enviar(s,self.c_config.Items.Strings[1] + 'objetos\' + objeto)
         // ahora tiene que buscar en la base de datos segun el prefijo de la direccion, el fichero que corresponda
         buscarModelo(s, n, grupo, modelo);
      End;
   End;
End;




procedure Tform1.buscarModelo(s:String; var n, grupo, modelo : integer);
var
i:Integer;
coma,servicios_dato,dato:String;
servicios: TBFBluetoothServices;
servicio: TBFBluetoothService;
prefijo: String;
Begin
   servicios := EnumServices(s,true,Dongle);
   servicios_dato := '';
   coma := '';
   for i:=0 to servicios.Count - 1 do
   Begin
      servicio := servicios.Service[i];
      dato := coma + inttostr(i) + ':' + inttostr(servicio.Channel) + ':' + inttostr(servicio.UUID16);
      servicios_dato := servicios_dato + dato;
      coma := ',';
   End;
   prefijo := stringReplace(s,':','',[rfReplaceAll]);
   prefijo := copy(prefijo,2,6);
   // segun el prefijo de la direccion y los servicios pertenece a un grupo
   d2.tgrupo.Close;
   d2.tgrupo.SQL.Clear;
   d2.tgrupo.SQL.Add('SELECT modelos.id, modelos.marca, modelos.modelo, agrupar.grupo');
   d2.tgrupo.SQL.Add('FROM modelos');
   d2.tgrupo.SQL.Add('INNER JOIN agrupar ON (modelos.id = agrupar.modelo)');
   d2.tgrupo.SQL.Add('WHERE (modelos.prefijo = ' + '''' + prefijo + '''' + ')');
   d2.tgrupo.SQL.Add('AND (modelos.servicios = ' + '''' + servicios_dato + '''' + ')');
   d2.tgrupo.Open;

   n := datos.RecordCount;
   grupo := datos.fieldByName('grupo').Value;
   modelo := datos.fieldByName('id').Value;
   tGrupo.Close {Esto solo si no se necesita para otra cosa}
End;

procedure Tform1.encontroModelo(datos:TDataSet; n, grupo, modelo : integer);
var
objeto2:String;
p1,largo,n, grupo, modelo, il:Integer;
s,busca:String;
Begin
   { viene como parámetro
   n := datos.RecordCount;}
   if (n>0) Then
   Begin
      { vienen como parámetros
      grupo := datos.fieldByName('grupo').Value;
      modelo := datos.fieldByName('id').Value;
      }
   End
   else
   Begin
      grupo := 0;
      modelo := 0;
   End;
   // esto es porque guardo la lista de ficheros en una lista pero le pongo 1,fich.. 2,fich etc...
   busca := inttostr(grupo) + ',';
   il := BuscarEnLista(lista_objetos.Items,busca);
   objeto2 := lista_objetos.Items.Strings[il];
   largo := length(objeto2);
   p1 := pos(',',objeto2);
   objeto2 := copy(objeto2,p1+1,largo - p1);
   // ahora debera enviar el fichero encontrado
   // de donde saco la dirección???
   enviar(ACALADIRECCION,self.c_config.Items.Strings[1] + 'objetos\' + objeto2)
end;



// en la unidad de las base de datos:
procedure Td2.tgrupoAfterOpen(DataSet: TDataSet);
begin
   form1.encontroModelo(DataSet, n, grupo, modelo);
end;

Neftali [Germán.Estévez] 05-10-2007 17:49:33

Cita:

Empezado por chelox (Mensaje 236367)
EL CODIGO:

No estaría mal que utilizaras TAG's cuando escribas código Delphi.
Una vez que veas cómo se colocan, puedes editar tu mensaje y añadirlas.


La franja horaria es GMT +2. Ahora son las 14:22:04.

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