Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
consulta valores no consecutivos mismo campo

Buenas, necesito hacer una consulta masiva dentro del mismo campo de una tabla en sql.

El ejemplo que quería poner para entendernos sería, que la tabla llamada 'MOTIVOS' tiene dos campos: año, HechoRelevante.

Quiero seleccionar 20 años de las 100 del siglo XX que yo elija no tienen que ser consecutivos, y sacar el hecho relevante de ese año elegido.

Al no ser consecutivos se complica y tengo que buscar uno a uno, podía usar un ListBox que contenga esos años que yo selecciono pero tendría que usar lines1, lines2,lines3 o bien edit como pongo en el ejemplo.

Código SQL [-]

              'select * motivos where año=' + Quotedstr (edit1.text) + 'and año=' Quotedstr (Edit2.text)

La pregunta es cómo puedo usar la línea SQL, para que no se haga tan larga, he buscado en internet y en el foro y no he encontrado ningún ejemplo que me dé respuesta.
Responder Con Cita
  #2  
Antiguo 24-07-2024
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.934
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Para esto se usa la cláusula:


Código SQL [-]
select * from motivos where año
IN
(2001, 1988, 1700, 2100)
__________________
El malabarista.
Responder Con Cita
  #3  
Antiguo 25-07-2024
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 638
Poder: 22
mRoman Va por buen camino
Propuesta

Puede ser -como te lo menciona mamcx-, pero con una variante/parámetro

Código SQL [-]
select * from motivos where año
IN :anios

Lo cual el parámetro "anios", contendría una cadena como la que sigue
Cita:
(1979,2001,2010)
, el cual se llenaría mediante programación en una variable y se asignaría al parámetro:

Ejemplo:

Código Delphi [-]
procedure OnClick(Sender: TObject);
var
    cAnios : String;
begin
      cAnios:=cAnios+Edit1.Text+',';
end;

Y luego ejecutaría el procedimiento

Código Delphi [-]
procedure EjecutarProc(Sender: TObject);
var
    cAnios2 : String;
begin
       
       cAnios2:='('+cAnios+')'
       spEjecutar.Prepared;
       spEjecutar.ParamByName('ANIOS').AsString:=cAnios2
       spEjecutar.ExecProc;
end;


Algo mas o menos asi lo haría, no tengo a la mano Delphi para probar, pero podrías intentarlo y nos dices si mas o menos te sirvio.

Saludos.
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #4  
Antiguo 25-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
En principio

Código SQL [-]
                    select * from motivos where año
                    IN
                    (2001, 1988, 1700, 2100)

Me da error y no puedo ejecutarlo


Por otro lado

Código SQL [-]
                      procedure OnClick(Sender: TObject);
                  var
                    cAnios : String;
                  begin
                    cAnios:=cAnios+Edit1.Text+',';
                 end;

yo la última línea la he modificado directamente a:

Código SQL [-]
                   cAnios:=cAnios+'1925'+'1955')

y me tomaría (19251955) como si fuera un número global.

He intentado los siguientes ejemplos:

Código SQL [-]
                     'select * motivos where año IN (1925,1955);

Código SQL [-]
                     'select * motivos where  año IN :cAnios;

Código SQL [-]
                     'select * motivos where año in: + Quotdstr (cAnios);

Ninguno de los de arriba funciona,

El único que funciona de momento, pero la cadena sería muy grande para 15 ó 20 años.

Código SQL [-]

              'select * motivos where año=' + Quotedstr ('1925') + 'OR año=' Quotedstr ('1955');
Responder Con Cita
  #5  
Antiguo 25-07-2024
marco3k marco3k is offline
Miembro
 
Registrado: feb 2015
Posts: 94
Poder: 11
marco3k Va por buen camino
Lo que te escribió roman esta bien, pero veo que tu campo es texto porque dices que te funciono esto:
Código SQL [-]
'select * motivos where año=' + Quotedstr ('1925') + 'OR año=' Quotedstr ('1955');
Al poner "Quotedstr" le es estas diciendo a delphi que le pongas comillas simples, entonces prueba en tu consulta así:
Código SQL [-]
select * from motivos where año IN ('2000','2005','2012')
Responder Con Cita
  #6  
Antiguo 25-07-2024
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Poder: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Una tercera opción es tener una segunda tabla donde se rellenen los años seleccionados.

Código:
MOTIVOS
--------------------
AÑO  |  HECHORELEVANTE
1900 |  'AAAA'
1901 |  'BBBB'
1902 |  'CCCC'
...

SELECCION
--------------------
AÑO  |  SELECCIONADO
1900 |       X
1901 |       _
1902 |       X
...
y luego harías un join para ver solo los motivos de los años que estén marcados.

Código SQL [-]
SELECT M.* FROM MOTIVOS M
JOIN SELECCION S ON M.AÑO = S.AÑO
WHERE
S.SELECCION = 'X'
ORDER BY M.AÑO

De esta forma puede seleccionar solo un año o varios o todos...
Responder Con Cita
  #7  
Antiguo 25-07-2024
GINMARMENOR GINMARMENOR is offline
Miembro
 
Registrado: feb 2016
Posts: 71
Poder: 10
GINMARMENOR Va por buen camino
Buenas de nuevo, y gracias en serio.

La siguiente secuencia funciona BIEN que es la que MRoman, por un lapsus dije no.

Código SQL [-]
          select * motivos where año IN (1925,1955);

Pero el texto completo es el siguiente que no lo puse por simplificar:

Código SQL [-]
           ibQueryMotivos.close;
           IbQueryMotivos.Clear;
           IbQueryMotivos.text:='select * motivos where año IN (1925,1955)';
           IbQueryMotivos.open;

Con esto puedo meter los datos filtrados en un dbgrid, stringGrid, Rave Reports, etc etc sin problemas pero al estar en unas comillas sólo puedo elegir los años (1925, 1955, etc.etc) en modo diseño y no en modo ejecucion, lo que necesitaría es meter los años en un Listbox, en una Variable u otro contenedor, y de ahí diseñar el Query para que sólo salgan los años que necesito.
Responder Con Cita
  #8  
Antiguo 25-07-2024
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.934
Poder: 26
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por marco3k Ver Mensaje
Lo que te escribió roman esta bien, pero veo que tu campo es texto

Eso debería ser un integer...
__________________
El malabarista.
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
SELECT para encontrar registros con diferentes valores en el mismo campo gustavosv SQL 12 17-10-2014 22:34:35
Consulta de un mismo campo rufo Varios 10 16-08-2012 03:26:28
Consulta de valores consecutivos Guillermosalva SQL 5 27-07-2007 08:49:15
Pasar un campo calculado a un campo del mismo DbGrid maravert Conexión con bases de datos 3 12-05-2006 00:31:30
Campo de tabla con valores con un mismo nombre kakesoft Conexión con bases de datos 14 28-11-2005 14:40:46


La franja horaria es GMT +2. Ahora son las 19:08:07.


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