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)
-   -   Consulta con dos bbdd (https://www.clubdelphi.com/foros/showthread.php?t=87519)

Casimiro Notevi 19-01-2015 14:44:49

Cita:

Empezado por Catublipas (Mensaje 487845)
BBDD1

Tabla PROYECTMANAGER

CODIGOPM-->6
PROYECTOS -->1,2,3 ???
NOMBRE--> Carlos

BBDD2

Tabla FACTURAS

PROYECTO-->1
NUMEROFAC-->001,002,003 ???
IMPORTE -->100€,200€,300€

PROYECTO-->2
NUMEROFAC-->004,005,006
IMPORTE -->1500€,2500€,3500€

PROYECTO-->3
NUMEROFAC-->007,008,009
IMPORTE -->50000€,60000€,30000€

A ver, no me digas que los datos están guardados de esa manera, valores separados por comas.
¿A qué lumbreras se le ocurrió esa chapuza inmensa, además dividido en 2 bases de datos?

Creo que necesitas hacer una reestructuración del sistema. Eso es una chapuza tremenda.

Catublipas 19-01-2015 14:53:56

Perdona las comas las he puesto yo, pero ya tengo la solución(aunque tengo un problema):

Código Delphi [-]
procedure TPrueba1Form.Button1Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.Open;
  IBQuery2.Close;
  IBQuery2.Open;
  ClientDataSet1.Open;
  while not IBQuery1.eof do
  begin
    while not IBQuery2.eof do
    begin
      ClientDataSet1.Append;
      if IBQuery1.FieldByName('PROYECTO').Value = IBQuery2.FieldByName('PROYECTO').Value then
      begin
        ClientDataSet1.FieldByName('PROYECTO').Value:= IBQuery1.FieldByName('PROYECTO').Value;
        ClientDataSet1.FieldByName('FACTURA').Value:= IBQuery2.FieldByName('DOCNUM').Value;
        ClientDataSet1.post;
      end;
      IBQuery2.next;
    end;
    IBQuery1.next;
    IBQuery2.First;
  end;
end;

Mi problema ahora es que es extremadamente lento(10 segundos).¿Se te ocurre algo?
Y estoy contigo, es una enorme chapuza, y porque no has visto la base de datos, si no te daría algo.
De todas formas muchas gracias de nuevo! :D

Casimiro Notevi 19-01-2015 15:10:20

Cita:

Empezado por Catublipas (Mensaje 487849)
Perdona las comas las he puesto yo, pero ya tengo la solución(aunque tengo un problema):
Mi problema ahora es que es extremadamente lento(10 segundos).¿Se te ocurre algo?
Y estoy contigo, es una enorme chapuza, y porque no has visto la base de datos, si no te daría algo.
De todas formas muchas gracias de nuevo! :D

Ahora sí que me has dejado "descolocao", ¿cómo que las comas las has puesto tú?
Entonces la estructura de las bases de datos y lo que se guarda en los campos esos, ¿cómo es?, ¿no es como estás informando?, ¿entonces de qué estamos hablando? :confused:

El sistema que empleas es lento porque recorres todo ibquery2 por cada ibquery1.

Catublipas 20-01-2015 08:50:50

Perdona Casimiro,
ha sido que he mostrado yo los datos mal los datos no están separados por comas, en lugar de separarlos por espacios para mostrarte los resultados. Lo he hecho con "," para separarlos pero en la base de datos no hay nada más que el dato.

Por lo que he visto parece buena opción hacer un vínculo ODBC de las BBDD, unificarlas y hacer la consulta como si se tratara de una BBDD.
¿Te parece buena solución? ¿Sabes si hay información en el foro sobre esto?
Ando un poco pegado con esto la verdad.

Un saludo y muchas gracias de nuevo!:D

Casimiro Notevi 20-01-2015 12:06:30

Cita:

Empezado por Catublipas (Mensaje 487869)
Perdona Casimiro,
ha sido que he mostrado yo los datos mal los datos no están separados por comas, en lugar de separarlos por espacios para mostrarte los resultados. Lo he hecho con "," para separarlos pero en la base de datos no hay nada más que el dato.
Por lo que he visto parece buena opción hacer un vínculo ODBC de las BBDD, unificarlas y hacer la consulta como si se tratara de una BBDD.
¿Te parece buena solución? ¿Sabes si hay información en el foro sobre esto?
Ando un poco pegado con esto la verdad.
Un saludo y muchas gracias de nuevo!:D

No hay nada que perdonar :)
Veamos si he comprendido, en esos campos tienes valores separados por espacio, ejemplo: importe=100,25 325,68 489,21
¿Eso es así?

Catublipas 20-01-2015 12:39:54

Perdona, lo que yo quería mostrar con las comas, eran los datos que contienen esas tablas. No ha sido la mejor forma de mostrar los datos, perdón.
Ejemplo:

Código SQL [-]
    ProyectM  Proyectos       Factura        Importe  
     6            1             001           200€
     6            1             002           300€
     6            1             003           5400€
     6            2             004           100€
     6            2             005           700€
     6            3             006           1200€

Casimiro Notevi 20-01-2015 13:31:04

Y la otra tabla, pon un ejemplo similar, por favor.

Catublipas 20-01-2015 14:07:14

Rectifico esa sería la interseccion te muestro las dos tablas:

TABLA PROYECTMANAGER

Código SQL [-]
    ProyectM  Proyectos        
     6            1                                                             
     6            2                                         
     6            3

TABLA FACTURAS

Código SQL [-]
Proyectos       Factura        Importe  
  1               001           200€
  1               002           300€
  1               003           5400€
  2               004           100€
  2               005           700€
  3               006           1200€

Casimiro Notevi 20-01-2015 18:39:35

Pero si lo tienes hecho. De la BD1 extraes los proyectos:
Código SQL [-]
select proyectos from froyectmanager where proyectm= : parametro
Luego puedes crear un string con el resultado, mediante un bucle, algo similar a:
Código Delphi [-]
cProyectos:=''
while not query1.eof do
  cProyectos = cProyectos + query.fields[0].asstring + ','
  query1.next
end;
Ahora tienes en cProyectos algo así: 1,2,3,
Quitas la última coma, que sobra.
Ahora montas una sql para la BD2
ibquery2.selectsql.text='select proyecto,factura,importe where proyecto in (' + cProyectos + ')'
Y la ejecutas.
Ya tienes los resultados en el ibquery2, que si lo enlazas mediantes un datasource a un dbgrid... ya está.

Catublipas 21-01-2015 08:24:49

Eyyy que buena idea :).
Lo pruebo este mediodía y te digo algo :D.
Muchas gracias!!

Catublipas 27-01-2015 10:32:18

Buenas Casimiro,
estoy retomando el tema y tiene muy buena pinta, porque me quitaría un bucle anidado.
Una pregunta ¿Como recorro el String para que se tome como parámetro la variable cProyectos en la segunda consulta?

Muchas gracias!:)

Casimiro Notevi 27-01-2015 10:40:53

Cita:

Empezado por Catublipas (Mensaje 488166)
¿Como recorro el String para que se tome como parámetro la variable cProyectos en la segunda consulta?

No tienes que recorrer el string, solamente quitarle la última coma, que no sirve.
Por ejemplo, si en cProyectos tenemos '1,2,5,14,22,' quitamos la última coma y la sentencia quedará como he puesto antes:
Código Delphi [-]
unavariable = 'select proyecto, factura, importe where proyecto in (' +cProyectos+ ')'
Por lo que la variable unavariable tendría:
Código SQL [-]
select proyecto, factura, importe where proyecto in ( 1,2,5,14,22 )
Lo asignas al query y lo ejecutas, nada más.

Catublipas 27-01-2015 10:48:11

He eliminado la coma última, y he hecho lo que me has puesto, pero me salen los campos vacíos, sin embargo si en cProyectos lo igualo a un solo numero de proyecto, si que me coge los datos. Pero el string lleno de proyectos no. Es decir, solo con un numero de proyecto si que va, con varios separados por comas no.:(

¿Por qué puede ser esto?

Casimiro Notevi 27-01-2015 10:55:58

Cita:

Empezado por Catublipas (Mensaje 488168)
¿Por qué puede ser esto?

Haz un copia->pega de tu código para que pueda verlo ;)

Catublipas 27-01-2015 12:04:04

Con este ejemplo si que funciona, ha sido una prueba que quería hacer ya que con la variable asignada a un solo proyecto si que funciona :P, ademas superrapido.
Código SQL [-]
begin
  cProyectos:='';
  IBQuery1.Close;
  IBQuery1.Open;
  while not IBQuery1.Eof do
  begin
    cProyectos := cProyectos + IBQuery1.Fields[0].AsString + ',';
    IBQuery1.Next;
  end;
  cProyectos := Copy(cProyectos,0,Length(cProyectos)-1);
  cProyectos := '3132';   //Es una prueba, solo he asignado un proyecto
  IBQuery2.SQL.Text:='select * from FACTURAS where PROYECTOS in ('+ cProyectos +')';
  IBQuery2.Close;
  IBQuery2.Open;

Y este sería el código que debería funcionar:

Código SQL [-]
begin
  cProyectos:='';
  IBQuery1.Close;
  IBQuery1.Open;
  while not IBQuery1.Eof do
  begin
    cProyectos := cProyectos + IBQuery1.Fields[0].AsString + ',';
    IBQuery1.Next;
  end;
  cProyectos := Copy(cProyectos,0,Length(cProyectos)-1);
  IBQuery2.SQL.Text:='select * from FACTURAS where PROYECTOS in ('+ cProyectos +')';
  IBQuery2.Close;
  IBQuery2.Open;

La segunda al dejar la variable con los proyectos separados por ',' no muestra resultado, sin embargo la primera va clavada, muestra los resultados de ese proyecto.

Casimiro Notevi 27-01-2015 12:21:10

Esto va al revés:
Código Delphi [-]
IBQuery2.Close;  // primero cerramos
IBQuery2.SQL.Text:='select * from FACTURAS where PROYECTOS in ('+ cProyectos +')';   // asignamos la sql
IQuery2.Open;  // abrimos
De todas formas, pon un breakpoint en la línea IBQuery2.Open y cuando se detenga ahí, mira el valor de IBQuery2.SQL.Text


Catublipas 27-01-2015 12:27:19

El valor de
Código Delphi [-]
Self.IBQuery2.FText 'select * from FACTURA where PROYECTO in (9,10,30,31,32,43,59,62,71,77,79,80,81,86,130,134,136,139,140,145,146,151,158,161,163,165,167,171,18  1,196,197,199,211,237,242,266,310,314,316,323,359,377,379)'#$D#$A

Me pilla perfecto todos los proyectos, pero no los muestra :(.

Casimiro Notevi 27-01-2015 12:29:39

Coge la sentencia (copy/pega) y ejecútala en el flamerobin, ibexpert o en el 'manager' que uses.
Código SQL [-]
select * from FACTURA where PROYECTO in (9,10,30,31,32,43,59,62,71,77,79,80,81,86,130,134,136,139,140,145,146,151,158,161,163,165,167,171,18  1,196,197,199,211,237,242,266,310,314,316,323,359,377,379)

Casimiro Notevi 27-01-2015 12:30:55

Código:

171,18  1,196,
¡Ah, ya veo el fallo! hay un espacio ahí, ¿eso cómo puede ser?

Catublipas 27-01-2015 12:33:34

Pongo otro ejemplo mas corto

Código Delphi [-]
Self.IBQuery2.FText 'select * from FACTURA where PROYECTO in (12,38,156)'#$D#$A

y me sigue sin mostrar. y aquí no ha espacio.


La franja horaria es GMT +2. Ahora son las 20:05:17.

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