Club Delphi  
    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 Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 19-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Catublipas Ver Mensaje
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.
Responder Con Cita
  #22  
Antiguo 19-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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!
Responder Con Cita
  #23  
Antiguo 19-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Catublipas Ver Mensaje
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!
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?

El sistema que empleas es lento porque recorres todo ibquery2 por cada ibquery1.
Responder Con Cita
  #24  
Antiguo 20-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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!

Última edición por Catublipas fecha: 20-01-2015 a las 08:55:11.
Responder Con Cita
  #25  
Antiguo 20-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Catublipas Ver Mensaje
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!
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í?
Responder Con Cita
  #26  
Antiguo 20-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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€
Responder Con Cita
  #27  
Antiguo 20-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Y la otra tabla, pon un ejemplo similar, por favor.
Responder Con Cita
  #28  
Antiguo 20-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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€
Responder Con Cita
  #29  
Antiguo 20-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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á.
Responder Con Cita
  #30  
Antiguo 21-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Eyyy que buena idea .
Lo pruebo este mediodía y te digo algo .
Muchas gracias!!
Responder Con Cita
  #31  
Antiguo 27-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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!
Responder Con Cita
  #32  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Catublipas Ver Mensaje
¿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.
Responder Con Cita
  #33  
Antiguo 27-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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?
Responder Con Cita
  #34  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Catublipas Ver Mensaje
¿Por qué puede ser esto?
Haz un copia->pega de tu código para que pueda verlo
Responder Con Cita
  #35  
Antiguo 27-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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.
Responder Con Cita
  #36  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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

Responder Con Cita
  #37  
Antiguo 27-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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 .
Responder Con Cita
  #38  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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)
Responder Con Cita
  #39  
Antiguo 27-01-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Código:
171,18  1,196,
¡Ah, ya veo el fallo! hay un espacio ahí, ¿eso cómo puede ser?
Responder Con Cita
  #40  
Antiguo 27-01-2015
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
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.
Responder Con Cita
Respuesta



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
Escuchar BBDD Guti13 Conexión con bases de datos 2 03-11-2014 17:49:23
Acceso a BBDD hybrid Conexión con bases de datos 1 14-11-2009 17:55:03
Consulta a tabla de bbdd Firebird externa Gonbamon Firebird e Interbase 4 05-07-2008 05:32:26
copia de bbdd majosf Conexión con bases de datos 3 18-11-2005 20:49:19
BBDD database.wrk ??? Mulero Conexión con bases de datos 8 03-11-2005 11:24:31


La franja horaria es GMT +2. Ahora son las 08:31:12.


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
Copyright 1996-2007 Club Delphi