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)
-   -   TADOQuery.Sort, problema con campos con el mismo nombre (https://www.clubdelphi.com/foros/showthread.php?t=87264)

AgustinOrtu 05-12-2014 08:11:32

TADOQuery.Sort, problema con campos con el mismo nombre
 
Que tal compañeros del club

Antes que nada aclarar que trabajo con Delphi 2010, MS SQL Sever 2005 Express, y me conecto a través de ADO

Resulta que tengo la desgracia de tener dos tablas mas o menos así

Código SQL [-]
TABLA A: Id | FK | Importe | mas campos..
TABLA B: Id | Importe | mas campos..

Es decir tengo campos en distintas tablas pero con el mismo nombre y tipo. El campo que me esta dando problemas es el que se llama importe en ambas tablas A y B y lo tengo definido como tipo moneda

La cuestion es la siguiente:

Tengo un query similar a algo como esto

Código SQL [-]
SELECT * FROM A LEFT JOIN B ON (A.FK = B.Id) 
WHERE ... condiciones de busqueda
ORDER BY algun campo

El cual funciona perfectamente y me devuelve el resultado deseado ordenado como yo quiero. Hasta ahí bien. Luego lo que se hace es volcar todos esos datos en un TStringGrid, proceso en el cual no hay problema alguno

El tema es cuando se desea ordenar el resultado una ves presentado el "orden por defecto"

Para eso agregue un manejador en evento OnMouseDown del Grid, el cual utilizo en tooodos mis grid y funciona bien

Código Delphi [-]
procedure TForm.GridMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var LGcCoord: TGridCoord; //Define las cordenadas del mouse en el grid;
begin
    LGcCoord:= TCustomGrid(Grid).MouseCoord(x,y);
    if (Button = mbleft) and (LGcCoord.Y = 0) then
    begin
        case LGcCoord.X of
        COL_Importe:
            if (TADOQuery(DS).Sort = 'Importe ASC') or (TADOQuery(DS).Sort = '') then
                TADOQuery(DS).Sort:= 'Importe DESC'
            else
                TADOQuery(DS).Sort:= 'Importe ASC';
        // resto de los campos...los cuales funcionan bien!
       ActualizarGrid; // proceso que se encarga de listar en pantalla
       end;
end;

COL_Importe es una costante que utilizo para identificar cada columna del Grid (no hay problemas con esto)

Cuando entra en el case para ordenar por el campo IMPORTE ordena por cualquier cosa :D y el problema es evidentemente porque hay dos campos que se llaman IMPORTE. Si le saco el join al query funciona bien el ordenamiento... pero claro pierdo la mitad de la informacion :(

Otra solucion que encontre es usar alias. Es decir:

Código SQL [-]
SELECT A.Id...., A.Importe AS A_IMPORTE, B.Id......, B.Importe AS B_IMPORTE FROM A LEFT JOIN B ON (A.FK = B.Id) 
WHERE ... condiciones de busqueda
ORDER BY algun campo

Lo cual es un problema para mi porque tendria que escudriñar por todo el codigo buscando donde estoy usando los campos (no estan definidos como persistentes). Al utilizar FieldByName para obtener el valor, el error se produciria en ejecucion, si al menos no dejara compilar.. pero bueno

Lo extraño es que las consultas estas cuando tienen campos repetidos, el propio motor le va agregando _1, _2 al final del nombre para diferenciarlos. Pero cuando asigno por ejemplo Importe_1 en la propiedad Sort me lanza una excepcion indicando que no se encuentra el campo. Ahora bien, si puedo hacer lo siguiente:

Código Delphi [-]
FieldByName('Importe').AsCurrency; // me trae el valor de la tabla A
FieldByName('Importe_1').AsCurrency // trae el de la tabla B

Alguna idea??

Casimiro Notevi 05-12-2014 10:05:06

Eso no es una desgracia, eso es lo normal :)

tbArticulos
id
nombre

tbVentas
id
idarticulo
cantidad
precio


Obtenemos todos los nombres de artículos de una venta:
Código SQL [-]
select v.id, v.idarticulo, v.cantidad, v.precio, a.nombre
from tbVentas v
inner join tbArticulos a on a.id=v.idarticulo
where v.id=232

AgustinOrtu 06-12-2014 05:16:14

Jajaj parece ser que estoy condenado, voy a tener que hacer un metodo con el mismo query pero usando alias, ya me pegaré los quebraderos de cabeza cuando haya que acordarse de mantener los dos metodos

Casimiro Notevi 06-12-2014 10:32:39

Hummm... no entiendo lo que dices, ¿condenado a qué? :confused:

AgustinOrtu 07-12-2014 00:34:12

jaja es una expresion al estilo "estoy perdido!", como que no hay otra salida

Al final preferi retocar los report con los campos con alias y todo salio andando bien.. eso si, son el tipo de cosas que uno se quiere evitar pero bueno :D


La franja horaria es GMT +2. Ahora son las 04:37:14.

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