Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Select mostrando otro dato (https://www.clubdelphi.com/foros/showthread.php?t=13268)

el_enigma1 12-08-2004 02:32:39

Select mostrando otro dato
 
Hola que tal.
Quiero seleccionar un dato de una tabla pero que el dato que me muestre se otro, es decir en una tabla cliente quiero mostrar sus campos, tiene uno que se llama tipo el cual es un caracter y puede ser uno de los siguientes valores e,b,r o m. e de excelente, b de bueno, r de regular y m de malo y quiero saber como si es que es posible en sql, lograr que si el cliente en el campo tipo tiene un valor e me retorne excelente, si tiene un valor de b me retorne bueno y asi respectivamente.
De antemano gracias.

jachguate 12-08-2004 05:20:39

esto no tiene una solución estándar... y si es posible y cómo conseguirlo dependerá del motor que uses.

Hasta luego.

;)

Neftali [Germán.Estévez] 12-08-2004 10:10:42

Cita:

Empezado por el_enigma1
Quiero seleccionar un dato de una tabla pero que el dato que me muestre se otro, es decir en una tabla cliente quiero mostrar sus campos, tiene uno que se llama tipo el cual es un caracter y puede ser uno de los siguientes valores e,b,r o m. e de excelente, b de bueno, r de regular y m de malo y quiero saber como si es que es posible en sql, lograr que si el cliente en el campo tipo tiene un valor e me retorne excelente, si tiene un valor de b me retorne bueno y asi respectivamente.

Como bien te han dicho si lo quieres hacer en el SGBD, dependerá de cual usas, por ejemplo en SQLServer puedesutilizar algo similar a ésto:

Código SQL [-]
// consulta normal; decimales es un número
select decimales, * from tmoneda
 
// Para que los decimales salgan con letra... 
select 
 Cuantosdecimales = case decimales
   when '1' then '1 decimal'
   when '2' then '2 decimales'
   when '3' then '3 decimales'
   when '4' then '4 decimeles'
   when '5' then '5 decimales'
   when '6' then '6 decimales'
   else '...demasiados'
 end,
 * from TMoneda

Si usas otro, talvez puedas buscar si hay algo similar

Otra opción es hacerlo sobre el DBGrid (si es que los Datos los estás sacando finalmente en el DBGrid); Se trata de programar el evento OnDrawColumnCell y a partir del valor de la columna pintar otra cosa.

Código Delphi [-]
  DBGrid.Canvas.TextRect(
     Rect{parámetro del evento}, 
     Left{cambialo segun la alineación que le quieras dar al texto}, 
     Rect.Top{a que altura se pinta el texto}, 
     Text{texto nuevo que quires pintar});

jachguate 12-08-2004 17:44:49

Cita:

Empezado por Neftali
Otra opción es hacerlo sobre el DBGrid (si es que los Datos los estás sacando finalmente en el DBGrid); Se trata de programar el evento OnDrawColumnCell y a partir del valor de la columna pintar otra cosa.

En mi opinión, es preferible a esto, por su sencillez, valerse del método onGetText del TField asociado, te recomiendo que leas el help sobre él, y veras que es muy sencillo devolver el significado de cada letra o indice.

De cualquier manera, creo que lo que querias es obtenerlo mediante SQL, ¿no?. Antes de ver todas las posibles soluciones en todos los posibles motores, preferiría que digas en cual trabajas...

Hasta luego.

;)

el_enigma1 12-08-2004 23:51:45

Cita:

Empezado por jachguate
De cualquier manera, creo que lo que querias es obtenerlo mediante SQL, ¿no?. Antes de ver todas las posibles soluciones en todos los posibles motores, preferiría que digas en cual trabajas...

;)

Estoy trabajando con interbase 6.
Y voy probar las sugerencias que me dieron, tal vez con eso sea suficiente.

roman 13-08-2004 01:29:15

Las opciones que te presentan son del todo correctas pero quizá antes de esto cabe preguntarse si no sería mejor agregar la 'tabla de significados' a la base de datos y usar relaciones de tablas como dios manda.

// Saludos

el_enigma1 14-08-2004 02:22:36

Cita:

Empezado por roman
Las opciones que te presentan son del todo correctas pero quizá antes de esto cabe preguntarse si no sería mejor agregar la 'tabla de significados' a la base de datos y usar relaciones de tablas como dios manda.

// Saludos

La verdad nunca he utilizado 'tabla de significados'.
Como quedaria el select?

roman 14-08-2004 02:33:35

Bueno, el término es de mi propia invención :) aunque no desde luego el concepto. A este tipo de tablas yo las conozco como catálogos. Proveen una descripción asociada a un código.

En tu caso, tienes la tabla clientes, digamos:

clientes = (id, nombre, domicilio, telefono, tipo_id)

Agregarías la tabla de descripciones a tu base de datos:

tipos = (id, tipo)

con los datos:

Código:

id  | tipo
----+----------
e  | exccelente
b  | bueno
r  | regular
m  | malo

En estos términos puedes consultar la tabla de clientes así:

Código SQL [-]
select c.id, c.nombre, t.tipo
from clientes c
left join tipos t on t.id = c.tipo_id

// Saludos

el_enigma1 17-08-2004 09:43:10

Neftali:
La opcion de sql no me funciona(uso interbase6 y talvez en este no se puede o giual lo hice mal) y la del evento onDrawCell no me gusta mucho.

jachguate:
Con el onGetText hace lo quiero.

roman:
Es una buena opcion.


Gracias por su ayuda, seguie buscando e intentando a ver si me queda en sql pero todo parece indicar que no.

Paoti 19-08-2004 02:09:30

La solucion de Roman, es excelente!!!!!!!!!


yo haria lo siguiente: usaria campos calculados.....


en la lista de campos de tu dataset, agregaria un campo calculado llamado tipoCliente, por ejemplo, y en el evento oncalcFields del dataset, comprobaria los valores del campo (donde estan guardados e, b, r, m ) y en base a esos valores asignarle el respecitvo valor a el campo TipoCliente




espero haberte ayudado



P.S. no es desde sql como tu querias, pero funciona

el_enigma1 02-09-2004 20:42:58

Cita:

Empezado por Paoti
La solucion de Roman, es excelente!!!!!!!!!


yo haria lo siguiente: usaria campos calculados.....


en la lista de campos de tu dataset, agregaria un campo calculado llamado tipoCliente, por ejemplo, y en el evento oncalcFields del dataset, comprobaria los valores del campo (donde estan guardados e, b, r, m ) y en base a esos valores asignarle el respecitvo valor a el campo TipoCliente




espero haberte ayudado



P.S. no es desde sql como tu querias, pero funciona

Con lo que dijo roman y jachuate se hace lo que quiero bueno de diferente manera cada uno pero funcionan ambos. Ahora solo tango que decidir por cual metodo me decido, en un principio pense en el de jachuate por que no secesito meter mas datos a la base de datos, pero de la otra manera puedo agregar mas registros a la base de datos asi que en este caso seria mejor la opcion de roman (se puede manipular la base de datos sin modificar el programa), aunque creo que todos los datos van a ser fijos(todavia no se deciden) realmente no necesitaria ingresar mas registros, por lo tanto no tendria que modificar el programa(en este caso la opcion de jachuate seria una mejor)

roman 02-09-2004 20:52:45

Cita:

Empezado por el_enigma1
aunque creo que todos los datos van a ser fijos(todavia no se deciden) realmente no necesitaria ingresar mas registros, por lo tanto no tendria que modificar el programa

Mi recomendación: agrega la tabla.

Si en todos estos días aún no han decidido lo más probable es que, aunque decidan tenerlos fijos, apenas entregues la aplicación, te pedirán que agregues alguna otra categoría. Es la ley de Murphy.

La opcion de OnGetText yo la usaría sólo en bases cuya estructura no puedo modificar, pero si tengo la opción pues prefiero agregar el catálogo.

// Saludos

jachguate 02-09-2004 23:36:56

Creo sinceramente que siempre que haya alguna posibilidad de que la tabla de significados cambie, es mejor usar la base de datos. En casos específicos (como el sexo, por ejemplo) en que no hay posibilidades que surgan nuevos (:rolleyes: bueno, habrá quien opine lo contrario, :D) la solución del OnGetText es válida y funcional, dandote la ventaja de no tener que hacer viajar las descripciones por la red.

En fin, la experiencia es la que te va dando un mejor criterio para decidir...

Hasta luego.

;)

roman 03-09-2004 00:00:32

Cita:

Empezado por jachguate
bueno, habrá quien opine lo contrario

No seré yo quien te contradiga :D

Pero nada más por llevar la contraria :rolleyes: diré que, incluso en casos como éste puede convenir tener la tabla ya que la descripción puede cambiar. Un día puede ser (Hombre, Mujer) y al otro (Masculino, Femenino).

En cuanto a lo de viajar a través de la red bueno, es cierto, pero en el caso de catálogos que se van a usar una y otra vez en varios lados de la aplicación se pueden cargar al inicio en un ClientDataSet para no estar molestando a la bd en cada ocasión.

// Saludos

el_enigma1 05-09-2004 00:35:51

Cita:

Empezado por roman
No seré yo quien te contradiga :D

En cuanto a lo de viajar a través de la red bueno, es cierto, pero en el caso de catálogos que se van a usar una y otra vez en varios lados de la aplicación se pueden cargar al inicio en un ClientDataSet para no estar molestando a la bd en cada ocasión.

// Saludos


Como hago lo del ClienDataSet?

el_enigma1 05-09-2004 00:39:53

Cita:

Empezado por jachguate

En fin, la experiencia es la que te va dando un mejor criterio para decidir...

Hasta luego.

;)

Eso que ni que, tienes mucha razon.(no me ayuda en nada poner este comentario pero bueno cuando alguien tiene razon no hay mas que discutir)


La franja horaria es GMT +2. Ahora son las 22:36:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi