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; 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';
ActualizarGrid; 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

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; FieldByName('Importe_1').AsCurrency
Alguna idea??