Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Uso de clausula in con parametro de valores diferentes de cadenas (https://www.clubdelphi.com/foros/showthread.php?t=75700)

Tcmn 13-09-2011 14:46:06

Uso de clausula in con parametro de valores diferentes de cadenas
 
Hola, estoy trabajando con Delphi 6 y Paradox en windows XP, y deseo hacer una consulta SQL sobre una tabla que contiene un listado de Giros Comerciales. La consulta real conlleva el uso de otras tablas y estaba en funcionamiento, solo que ahora el patron pide hacer "filtros" sobre un campo string y deseo hacerlo directo en la consulta. La consulta originalmente esta asi:


Código SQL [-]
 
SELECT C.NCONTRATO, C.FECHA, Ct.RAZON_SOCIAL, Cm.MEDIDA, 
Cm.COLORES, Cm.PREC_VENTA, Cm.STATUS_DESIGNE,Cm.GIRO_A_COLOCAR, 
Ct.MUNICIPIO, C.Vendedor, C.Abonado, C.Tipo 
FROM Contratos C 
INNER JOIN Clientes Ct ON (Contratos.NUM_CLI = Clientes.NUM_CLI)
INNER JOIN Cont_mov CmON (Contratos.NCONTRATO = Cont_mov.NCONTRATO)
ORDER BY Cm.GIRO_A_COLOCAR,Ct.RAZON_SOCIAL


El asunto es que ahora desean establecer rango sobre el campo Cm.GIRO_A_COLOCAR que almacena el nombre del giro comercial (ABOGADO, LICORERIA, ETC), para que por ejemplo se muestren solo los registros que en el campo GIRO_A_COLOCAR tengan giros que vayan desde la "A" a "C", por lo que se incluiria


ABOGADOS, ABARROTES-MAYOREO.....CARPINTERIAS.

La seleccion de rango es en base a otra tabla donde estan guardados todos los giros comerciales existentes.

Trate de solucionarlo como se sugiere en el siguiente hilo:
http://www.clubdelphi.com/foros/show...hlight=CADENAS
pero no me da resultado por que las cadenas que se guardan en el StringList a veces vienen con comillas("") supongo yo, aunque la verdad no se porque salen con comillas pues los registros no estan almacenados con comillas.

El codigo como trato de hacerlo en Delphi es de la siguiente manera:

Código:


procedure TForm1.Button1Click(Sender: TObject);
var GirosAceptados:TstringList;
LetraFinal:String;
begin
QueryTodosGiros.Locate('Giro',Edit1.Text,[loCaseInsensitive]);
GirosAceptados:=TStringList.Create;
LetraFinal:=copy(QueryTodosGirosGiro.Value,0,1);
while LetraFinal<>Edit2.Text do
begin
GirosAceptados.Add(QueryTodosGirosGiro.Value);
QueryTodosGiros.Next;
LetraFinal:=copy(QueryTodosGirosGiro.Value,0,1);
end;//while
QueryGirosFiltrados.Close;
QueryGirosFiltrados.ParamByName('GirosAceptados').Value:=GirosAceptados.CommaText;
QueryGirosFiltrados.Open;
end;

Espero haberme explicado, y gracias de antemano si alguien tiene otra idea o tal vez me marca algo en lo que estoy fallando

DarKraZY 13-09-2011 15:05:05

No sé si el SQL de Paradox te permite la cláusula BETWEEN pero quizás es lo que necesitas.
Código SQL [-]
SELECT C.NCONTRATO, C.FECHA, Ct.RAZON_SOCIAL, Cm.MEDIDA, 
Cm.COLORES, Cm.PREC_VENTA, Cm.STATUS_DESIGNE,Cm.GIRO_A_COLOCAR, 
Ct.MUNICIPIO, C.Vendedor, C.Abonado, C.Tipo 
FROM Contratos C 
INNER JOIN Clientes Ct ON (Contratos.NUM_CLI = Clientes.NUM_CLI)
INNER JOIN Cont_mov CmON (Contratos.NCONTRATO = Cont_mov.NCONTRATO)
WHERE
  Cm.GIRO_A_COLOCAR BETWEEN :TEXTO_INICIAL AND :TEXTO_FINAL
ORDER BY Cm.GIRO_A_COLOCAR,Ct.RAZON_SOCIAL

y los parámetros TEXTO_INICIAL podría ser 'C%' por ejemplo.

¿Algo así te serviría?

Tcmn 13-09-2011 15:11:41

Muchas gracias por respuesta primeramente. Y nunca se me habia ocurrido ese metodo. Casi logra lo que ocupo. Con tu recomendacion hice una prueba con la siguiente consulta:

Código SQL [-]
 
SELECT GIRO_A_COLOCAR, COLORES, MEDIDA
FROM  CONT_MOV
WHERE GIRO_A_COLOCAR BETWEEN 'A%' AND 'F%'
ORDER BY GIRO_A_COLOCAR

el detalle es que no me incluyo los de la letra final. En la consulta anterior por ejemplo no me incluyes los registros que inician con "F" no los incluye. Asi que por decirlo asi, debo de poner la letra siguiente a la que realmente deseo que sea el limite de la consulta. ¿Hay manera de que incluya tambien el "final" del rango?

oscarac 13-09-2011 15:19:58

podrias cambiarlo mas o menos asi

Select campos from tabla where campo >= 'A' and camop <= 'F' order by campo

Tcmn 13-09-2011 15:24:01

Si estoy seguro, de hecho probe desde la "D" hacia adelante y siempre saca los registros hasta la letra anterior a la que digo

oscarac 13-09-2011 15:26:05

sorry edite la respuesta ahi te deje otra

Tcmn 13-09-2011 16:10:02

Gracias por la otra sugerencia pero me sigue pasando lo mismo de que no incluye los registros sino hasta la letra anterior a cuando se esta haciendo el filtro. Intente lo siguiente tambien pero no funciono:
Código SQL [-]
select nombre
from clientes
where (nombre>='A%') and(nombre<='F%')
y luego probe con
Código SQL [-]
select nombre
from clientes
where (nombre>='A%') and
((nombre<'F%')or(nombre='F%'))

pero no hay nada. Sigue incluyendo los registros anteriores a la "F".

Ya que esto lo ejecuto desde Delphi pienso en seleccionar la siguiente letra de la que haya seleccionado el usuario para despues generar la consulta pero se que no es el mejor modo.

oscarac 13-09-2011 16:25:08

prueba asi

Código Delphi [-]
 
Select nombre from tabla where Left(nombre,1) >= 'A' and Left(nombre,1) <= 'F' order by nombre

Tcmn 13-09-2011 16:56:14

La consulta que me pasas no funciona.

La probe en DatabaseDekstop con paradox (que es el tipo de base de datos que estoy usando) y no funciona.

Pero en IbExpert con Firebir funciona a la perfeccion, lo malo que apenas empeze a usar Firebird en mis aplicaciones y en esta que hice hace unos 6 años pues use Paradox.

DarKraZY 13-09-2011 17:49:08

Cita:

Empezado por Tcmn (Mensaje 412005)
La consulta que me pasas no funciona.

Supongo que Paradox no tendrá la función LEFT.

¿Tienes alguna forma de obtener la letra siguiente?

Por ejemplo:
Si el usuario quiere los giros de A a C.

Tu pasas a la consulta de A a D.

:rolleyes:

Tcmn 13-09-2011 17:53:13

No tengo la opcion pero voy a crearla con un listado de letras interno yo creo y pues ya hacerlo "a mano".

Muchas gracias por la ayuda, de cualquier manera sera mas facil y efectivo que como planeaba hacerlo.


La franja horaria es GMT +2. Ahora son las 15:47:34.

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