Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Hacer mascaras en consultas sql. (https://www.clubdelphi.com/foros/showthread.php?t=29279)

el_barto 17-01-2006 22:57:24

Hacer mascaras en consultas sql.
 
Buenos dias:

estoy haciendo una seleccion de unos proyectos hechos en mi aplicativo pero tengo una duda:

los datos que me imprime son algo asi:

Código:

cod_proyecto    ///// volumen    ///// peso
1                /////      1    /////    0
2                /////      0    /////    1

lo que deseo es cambiar el 1 por Si y cambiar el 0 por No para los campos volumen y peso, es posible hacer el cambio visual solo en la seleccion sin modificar los datos de la base ???

Gracias, esta es mi consulta sql, uso interbase 6.


Código SQL [-]
 
select cod_proyecto, volumen,peso
from transp_total

roman 17-01-2006 23:09:12

Desconozco si IB tiene algún tipo de condicional. En MySql, podrías hacer:

Código SQL [-]
select
  cod_proyecto,
  if(volumen = 1, 'SI', 'NO') as volumen,
  if(peso = 1, 'SI', 'NO') as peso
from
  transp_total

Mira a ver si IB tiene condicionales.

Otra opción es dejar la consulta como está y Utilizar el evento OnGetText del dataset para que muestre los valores que deseas.

// Saludos

vtdeleon 17-01-2006 23:50:33

Saludos

Tambien podrias probar con CASE
Código SQL [-]
select
  cod_proyecto,
  Case volumen when
    1 then 'SI'
  Else
     'NO'
  End,
  Case peso when
    1 then 'SI'
  Else 
     'NO'
  End
from
  transp_total
Ahi tienes para escoger, las dos son validas!

el_barto 18-01-2006 14:18:51

Gracias
 
Cita:

Empezado por roman
Código SQL [-]
select
cod_proyecto,
if(volumen = 1, 'SI', 'NO') as volumen,
if(peso = 1, 'SI', 'NO') as peso
from
transp_total

Ya lo habia intentado hacer asi por simple intuicion pero no me habia funcionado por que no reconocia el if.

Cita:

Empezado por roman
Mira a ver si IB tiene condicionales.

pues despues de leer tu mensaje enseguida me puse a buscar y encontre que no. Aqui :(

Cita:

Empezado por roman
Otra opción es dejar la consulta como está y Utilizar el evento OnGetText del dataset para que muestre los valores que deseas.

No lo estoy haciendo para usarlo en delphi, si no cuadrando el sql para despues pasarlo a Crystal SQL Design.

el_barto 18-01-2006 14:25:00

Cita:

Empezado por vtdeleon
Saludos

Código SQL [-]
select
cod_proyecto,
Case volumen when
1 then 'SI'
Else
'NO'
End,
Case peso when
1 then 'SI'
Else 
'NO'
End
from
transp_total

lo he intentado hacer asi pero me indica :

Cita:

Token unknown - line 3, char 12
when

el_barto 18-01-2006 16:10:38

No lo pude hacer desde ib asi que hice mi reporte normal pero le inserte la siguiente formula y listo me quedo hecho:

Código:

IIF ({Query.PESO} = 1,'Si','No')
Gracias totales :)

maeyanes 18-01-2006 19:26:02

Puedes probar mediante un store procedure...

Código SQL [-]
create procedure sp_transp_total
returns (
  cod_proyecto integer, /* o varchar(n) */
  volumen char(2),
  peso char(2))
as
  declare variable volumen_int integer;
  declare variable peso_int integer;
begin
  for
    select cod_proyecto, volumen, peso from transp_total into
      :cod_proyecto, :volumen_int, : peso_int; /* El : y peso no llevan espacio */
  do
  begin
    if (volumen_int == 1) then
      volumen = 'SI';
    else
      volumen = 'NO';
    if (peso_int == 1) then
      peso = 'SI';
    else
      peso = 'NO';
    suspend;
  end
end^

Y este ya lo puedes usar:

Código SQL [-]
select cod_proyecto, volumen, peso from sp_transp_total



Saludos...

roman 18-01-2006 20:05:59

Algo complicado ¿no? A veces me sorprende la facilidad con que algunas cosas se pueden hacer en MySql. :)

Va otra opción, quizá ésta sí funcione en IB:

Código SQL [-]
select
  cod_proyecto,
  substring('SINO', 2*volumen + 1, 2) as volumen,
  substring('SINO', 2*peso + 1, 2) as peso
from
  transp_total

// Saludos

maeyanes 18-01-2006 20:11:29

Esa también es otra opción, solo que requiere que se agregue la UDF substring a la base de datos... :)


Saludos...

roman 18-01-2006 20:16:54

¡No inventes! :D

¿Por qué es tan complicado IB? Je, je, bueno, sería ridículo de mi parte ponerme a criticar IB pero me gustaría entender la filosofía que hay detrás. ¿Por qué funciones tan elementales (según yo) no vienen por defecto en el lenguaje?

// Saludos

maeyanes 18-01-2006 20:22:50

Pues quien sabe... es algo que hasta ahora todavía no entiendo... Tal vez es así para apegarse lo más posible al estándar SQL92, no se, podría ser cualquier cosa... jejeje



Saludos...

roman 18-01-2006 20:34:23

Mmmm.. Hubiera jurado que substring era parte del standard.

// Saludos

maeyanes 18-01-2006 20:59:11

Las funciones que soporta IB son: AVG, CAST, COUNT, EXTRACT, GEN_ID, MAX, MIN, SUM y UPPER. Esto lo saqué de la documentación de la versión 7.

La función substring no está soportada, y solo se puede hacer usando la UDF substr.




Saludos...

el_barto 18-01-2006 21:15:32

store procedure perfect ¡¡¡¡ :) lo probe mas no lo implemente en mi reporte dado que como lo explique anteriormente es muy facil desde crystal reports, y como dice roman para que complicarce si existen maneras mas sencillas para solucionar mi caso, claro, un store procedure podria ser mas optimo para otros casos

maeyanes 18-01-2006 21:18:23

Prueba la consulta que hace uso de la UDF, es más simple de implementar... jejeje

el_barto 18-01-2006 21:20:24

Te prometo que lo intentare :)

roman 18-01-2006 21:26:09

el_barto

De tu último mensaje eliminé la cita al código de maeyanes. Te pido que no cites mensajes completos, hace más difícil la lectura.

cuburu 19-01-2006 02:20:46

Cita:

Empezado por el_barto
store procedure perfect ¡¡¡¡ :) lo probe mas no lo implemente en mi reporte dado que como lo explique anteriormente es muy facil desde crystal reports, y como dice roman para que complicarce si existen maneras mas sencillas para solucionar mi caso, claro, un store procedure podria ser mas optimo para otros casos

Pues yo pienso que si puedes dejar todo el trabajo pesado a la BD y programas lo minimo indispensable es mejor.

Cuando manejas esta clase de condiciones por medio de Store Procedures, Views o cualquer caso y que la BD puede hacerlo, es mejor dejarselo a ella.

La respuesta que doy es muy simple.

Qué pasaria si de repente te dicen que necesita hacerse una reestructuración de todo el programa o se necesita hacer otra aplicación en un lenguaje diferente para trabajar los mismos datos en la misma BD. Pues ya no tendrías que volver a codificar este tipo de operaciones en la otra aplicación pues ya las tienes dentro de la misma BD. Solo tendrías que llamarlas.

Ademas, cuando se trabaja con grandes volumenes de información, es mejor dejar todo el asunto de integridad referencial, updates, commits, rollbacks y todas esas cosas a la BD y no tratar de controlarlas desde nuestra aplicación..... despues de todo, para que un negocio funcione cada quien debe de hacer su trabajo, y si la BD nos puede ahorrar dolores de cabeza tratando de contener posibles errores en la BD pues hagamoslo.
:p

roman 19-01-2006 03:17:01

Cita:

Empezado por cuburu
Pues yo pienso que si puedes dejar todo el trabajo pesado a la BD y programas lo minimo indispensable es mejor.

Al César lo que es del César... :)

Trabajo pesado habrá de ambos lados, aplicación y servidor.

Cita:

Empezado por cuburu
Cuando manejas esta clase de condiciones por medio de Store Procedures, Views o cualquer caso y que la BD puede hacerlo, es mejor dejarselo a ella.

No sé si una UDF pueda considerarse parte del servidor, pero en el caso de MySql, las funciones mencionadas sí que lo son.

Cita:

Empezado por cuburu
Qué pasaria si de repente te dicen que necesita hacerse una reestructuración de todo el programa o se necesita hacer otra aplicación en un lenguaje diferente para trabajar los mismos datos en la misma BD. Pues ya no tendrías que volver a codificar este tipo de operaciones en la otra aplicación pues ya las tienes dentro de la misma BD. Solo tendrías que llamarlas.

De acuerdo. Pero toma en cuenta que no todas las aplicaciones son susceptibles de cambios tan drásticos y hay que tener cuidado con "¿qué pasa si...?" pues puede uno terminar complicandose la vida por una supuesta futura necesidad. Trabajo en un sistema hecho sobre MySql, y ha funcionado bien durante más de tres años. Y aún cuando he pensado en la posibilidad de migrar a FireBird, mientras no lo haga, me siento cómodo con él y todas las funciones predefinidas que incluye; no las cambiaría en aras de una estandarización o hipotéticos reajustes futuros.

// Saludos

cuburu 21-01-2006 00:11:51

En eso tienes toda la razón. Es incoherente tratar de controlar algo que no sabes si se va apresentar o no.

Quizas el error mio fue darle un enfoque basado en experiencia propia. Por lo regular trabajo con sistemas de esta indole y es más sencillo realizar este tipo de "maniobras". :)


La franja horaria es GMT +2. Ahora son las 22:18:31.

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