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 Upper en sentencia SQL (https://www.clubdelphi.com/foros/showthread.php?t=88134)

jafera 16-04-2015 16:14:04

Uso de Upper en sentencia SQL
 
Buenas a todos.

Llevo unos dias intentando solucionar un problema de uso de upper dentro de una sql firebird.
La consulta original es esta y funciona bien:

Código SQL [-]
SELECT  A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL FROM TR0004C A, TR0002 B
WHERE B.IDPROVEIDOR = A.IDPROVEIDOR
ORDER BY IDCOMPRA

Lo que yo quiero es hacer un filtrado en el Edit1.Exit con el siguiente código:

Código Delphi [-]
procedure TF_BuscarCompraProv.Edit1Change(Sender: TObject);
var C:String;
begin
        OrdenarGrid.Close;
        if ComboBox1.Text='RAO_COMERCIAL' then
                C:= 'B.'+ComboBox1.Text
        else
                C:= 'A.'+ComboBox1.Text;
        OrdenarGrid.SQL[1] := 'WHERE B.IDPROVEIDOR = A.IDPROVEIDOR  AND UPPER (C) like ''%'+AnsiUpperCase(Edit1.Text)+'%''';
        OrdenarGrid.SQL[2] := ' ORDER BY '+Combobox1.Text;
        OrdenarGrid.Open;
end;

Cuando entro en la consulta original funciona de perlas, pero cuando voy al Edit 1 y escribo algo me manda un error de column unknow C in line.......

Me olvido algo?
He probado con QuotedStr(C) y tampoco, con [QuotedStr(C)] tampoco nada.

Gracias por si alguien me puede ayudar.

Josep

TOPX 16-04-2015 16:47:20

Buenas.

En el evento OnBeforeOpen de OrdenarGrid haga que se despliegue un mensaje con la sentencia SQL a ejecutar,
de manera que Ud. pueda verificar que está correcta.

Con algo así:
Código Delphi [-]
procedure TF_BuscarCompraProv.OrdenarGridBeforeOpen(DataSet: TDataSet);
begin
  ShowMessage(OrdenarGrid.Sql.Text);
end;
-

Al González 16-04-2015 17:07:36

No queda muy claro el objetivo. Pero puedes ayudarnos un poco:

Por favor, pon un ejemplo de la sentencia SQL Select que debería llegarle a Firebird si la condición ComboBox1.Text='RAO_COMERCIAL' se cumpliera. Y otro ejemplo de cómo sería la sentencia si esa condición no se cumpliera.

Así, viéndolo desde la perspectiva del servidor de base de datos, podríamos tener más claro qué cosa quieres solicitarle desde Delphi. No olvides usar la etiqueta Resaltar sintaxis SQL (la opción de la esquina superior derecha del editor de mensajes).

Saludos. :)

Al González.

jafera 16-04-2015 17:15:16

Gracias por vuestra respuestas.

La sentencia SQL final deberia quedar así si ComboBox1.Text = RAO_COMERCIAL:

Código SQL [-]
SELECT  A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL FROM TR0004C A, TR0002 B
WHERE B.IDPROVEIDOR = A.IDPROVEIDOR AND UPPER B.RAO_COMERCIAL LIKE ''%'+AnsiUpperCase(Edit1.Text)+'%'''
ORDER BY B.RAO_SOCIAL

En los otros casos, quedaria así (ejemplo de un caso)

Código SQL [-]
SELECT  A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL FROM TR0004C A, TR0002 B
WHERE B.IDPROVEIDOR = A.IDPROVEIDOR AND UPPER A.IDPROVEIDOR LIKE ''%'+AnsiUpperCase(Edit1.Text)+'%'''
ORDER BY A.IDPROVEIDOR

El motivo es que los campos estan en tablas distintas.

Si ejecuto con F8, C toma el valor A.IDCOMPRA, A.IDPROVEIDOR, A.DATA_COMPRA o B.RAO_COMERCIAL, por eso me extraña que luego no encuentre la columna C

Saludos

jafera 16-04-2015 17:25:33

Cita:

Empezado por TOPX (Mensaje 491412)
Buenas.

En el evento OnBeforeOpen de OrdenarGrid haga que se despliegue un mensaje con la sentencia SQL a ejecutar,
de manera que Ud. pueda verificar que está correcta.

Con algo así:
Código Delphi [-]procedure TF_BuscarCompraProv.OrdenarGridBeforeOpen(DataSet: TDataSet); begin ShowMessage(OrdenarGrid.Sql.Text); end;

-

El resultado obtenido es:

Código SQL [-]
SELECT  A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL FROM TR0004C A, TR0002 B
WHERE B.IDPROVEIDOR = A.IDPROVEIDOR AND UPPER (C) LIKE '%6%'
ORDER BY A.IDCOMPRA

Evidentemente no se puede evaluar C

Saludos

ecfisa 16-04-2015 17:53:45

Hola jafera.

Primero, en la línea,
Código Delphi [-]
OrdenarGrid.SQL[1] := 'WHERE B.IDPROVEIDOR = A.IDPROVEIDOR  AND UPPER (C) like ''%'+AnsiUpperCase(Edit1.Text)+'%''';
estas tratando a "C" como un caracter no como la variable cuyo valor (supongo) queres pasar a mayúscula.

Segundo te aconsejo el uso de parámetros frente a la composición de cadenas

Saludos :)

jafera 16-04-2015 18:37:43

Gracias de nuevo.

Ecfisa, tienes razon con lo de los parametros, pero como encajo despues del upper algo como :campo.
Lo he probado a la brava y evidentemente no va.

Sigo investigando

Saludos

Casimiro Notevi 16-04-2015 19:07:58

Esto no tiene nada que ver con OOP, lo paso a SQL

ecfisa 16-04-2015 19:12:10

Hola Josep.

Me refiero a algo parecido a esto:
Código Delphi [-]
var
  C: string;
begin
  if ComboBox1.Text = 'RAO_COMERCIAL' then
    C:= 'B.'+ ComboBox1.Text
  else
    C:= 'A.'+ ComboBox1.Text;
  with OrdenarGrid do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL');
    SQL.Add('FROM TR0004C A INNER JOIN TR0002 B ON B.IDPROVEIDOR = A.IDPROVEIDOR');
    SQL.Add(Format('AND UPPER(%s) = UPPER(:PARAM)', [C]));
    SQL.Add(Format('ORDER BY %s', [C]));
    ParamByName('PARAM').AsString:= Edit1.Text;
    Open;
  end;
end;
No probé si hace lo que buscas, es sólo a modo orientativo.

Saludos :)

jafera 16-04-2015 19:12:20

Ok Casimiro.

Lo he puesto en OPP ya que creia que hacia efecto al componente IBQuery, pero es mas sensato colocarlo en SQL, ahí dudé yo.

Gracias y no tendras una solucioncilla por ahí escondida? jejeej

Saludos

jafera 16-04-2015 19:22:51

Gracias Ecfisa.

Ahora ya no da error, pero no puedo hacer la busqueda incremental con el like?
Solo me da valores en la busqueda si el campo es fijo

Saludos

ecfisa 16-04-2015 19:29:59

Cita:

Empezado por jafera (Mensaje 491428)
Ahora ya no da error, pero no puedo hacer la busqueda incremental con el like?

Si Josep, sólo tenes que reemplazar el "=" por el operador LIKE:
Código Delphi [-]
var
  C: string;
begin
  if ComboBox1.Text = 'RAO_COMERCIAL' then
    C:= 'B.'+ ComboBox1.Text
  else
    C:= 'A.'+ ComboBox1.Text;
  with OrdenarGrid do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL');
    SQL.Add('FROM TR0004C A INNER JOIN TR0002 B ON B.IDPROVEIDOR = A.IDPROVEIDOR');
    SQL.Add(Format('AND UPPER(%s) LIKE UPPER(:PARAM)', [C]));
    SQL.Add(Format('ORDER BY %s', [C]));
    ParamByName('PARAM').AsString:= '%' + Edit1.Text + '%';
    Open;
  end;
end;

Saludos :)

jafera 17-04-2015 09:46:40

Gracias Daniel.

He probado con el like sustituyendo el '=' como dices y no me hace el incremental como lo hacia antes, ahora solo filtra cuando encuentra la palabra completa.
Además si selecciono el campo ID_PROVEIDOR, no me encuentra nada de lo escrito en el Edit1.
Sigo investigando.

Saludos

Josep

ecfisa 17-04-2015 11:50:29

Hola Josep.

La verdad que no se que decirte, este es el código que use en la prueba:
Código Delphi [-]
procedure TForm1.Edit1Change(Sender: TObject);
var
  C: string;
begin
  if ComboBox1.Text = 'RAO_COMERCIAL' then
    C:= 'B.'+ ComboBox1.Text
  else
    C:= 'A.'+ ComboBox1.Text;
  with OrdenarGrid do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT A.IDCOMPRA, A.DATA_COMPRA, A.IDPROVEIDOR, B.RAO_COMERCIAL');
    SQL.Add('FROM TR0004C A INNER JOIN TR0002 B ON B.IDPROVEIDOR = A.IDPROVEIDOR');
    SQL.Add(Format('AND UPPER(%s) LIKE UPPER(:PARAM)', [C]));
    SQL.Add(Format('ORDER BY %s',[C]));
    ParamByName('PARAM').AsString:= '%'+Edit1.Text+'%';
    Open;
  end;
end;

Y como podrás ver, filtra de modo correcto:


Saludos :)

jafera 17-04-2015 11:56:45

Perfecto, ahora si filtra, no se si habia algo mal puesto (Ctrl+C-CTtrl+V......).
Solo tengo una duda en el campo DATA_COMPRA que es una fecha y aqui si que no filtra, debo hacer algo como DateToStr?

Gracias

Josep

ecfisa 17-04-2015 13:14:44

Hola Josep.

No sabía el tipo de DATA_COMPRA, lamentablemente el operador LIKE no va a realizar la acción que buscas sobre una columna de tipo fecha.

Para obtener un resultado ordenado vas a tener que ingresar la fecha completa y evaluar por <, <=, =, >= ó >.

Saludos :)


La franja horaria es GMT +2. Ahora son las 01:53:20.

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