Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-12-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
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
  #2  
Antiguo 05-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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
Responder Con Cita
  #3  
Antiguo 06-12-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 06-12-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Hummm... no entiendo lo que dices, ¿condenado a qué?
Responder Con Cita
  #5  
Antiguo 07-12-2014
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema Al Llenar Sort monfa Varios 2 22-10-2013 08:43:49
Ficheros con el mismo nombre en el mismo directorio Casimiro Notevi La Taberna 7 04-03-2011 16:52:07
usar dos archivos .pas del mismo nombre robinsongm Varios 3 31-10-2007 13:02:30
Mostrar nombre de campos y filtar nombre de tablas .db en un combobox Coco_jac Varios 1 24-06-2006 01:34:29
TADOQuery y campos Memo SnaKe Conexión con bases de datos 4 29-10-2003 09:45:46


La franja horaria es GMT +2. Ahora son las 06:48:52.


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
Copyright 1996-2007 Club Delphi