Ver Mensaje Individual
  #1  
Antiguo 05-12-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 17
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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 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??
Responder Con Cita