PDA

Ver la Versión Completa : Tabular consulta segun el nivel


Carmelo Cash
12-01-2009, 13:38:26
Hola Foro:

Estoy Utilizando InterBase y Delphi 7 y Necesito hacer una consulta tabulada. Ahora hago

Select nivel, Cuenta
from plan de cuentas

El Resultado es:

Nivel Cuenta
1 Activo
2 Activo Corriente
3 Disponibilidades
4 Bancos
5 Banco PEPE
5 Banco Toto
5 Banco Pipo

Necesito que el campo nivel haga un string para que quede algo así:

Activo
..Activo Corriente
....Disponibilidades
......Bancos
........Banco PEPE
........Banco Toto
........Banco Pipo

Por ahora se me ocurrió crear un campo "Espacios", donde guardo los espacios en blanco de acuerdo al campo nivel, pero no me gusta.
¿Alguna Idea?

Desde ya gracias por su atención.

Neftali [Germán.Estévez]
12-01-2009, 15:35:17
La consulta está bien, lo que necesitas conseguir es que la visualización en pantalla salga "tabulada".
Si buscas información sobre el evento OnGetText en los foros verás que hay muchos ejemplos. Básicamente te permite modificar el valor que se visualiza de un campo cuando lo muestras en un DBGrid. (ej1 (http://www.clubdelphi.com/foros/showthread.php?t=61858&highlight=GetText), ej2 (http://www.clubdelphi.com/foros/showthread.php?t=62201&highlight=OnGetText),...); de esta forma lo único que debes hacer es añadir a tu valor X espacios por delante segun el campo nivel.

Revisa también DupeString para montar una cadena de n espacios.

Caro
12-01-2009, 15:54:53
Hola Carmelo, como te dice el amigo Neftali puedes utilizar el evento OnGetText de tu campo Cuenta y quedaría mas o menos así:


procedure TForm1.Query1CuentaGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
var
Nivel : Integer;
begin
Nivel := Query1.FieldByName('Nivel').AsInteger;
Text := StringOfChar(' ',Nivel*5)+Sender.AsString;
end;


Saluditos

fjcg02
12-01-2009, 16:32:53
Otra forma sería desde la propia SQL hacer un case para concatenar tantos espacios como nivel, así el programa cliente recibiría la información directamente para presentarla en el grid, listado, ... o donde sea.

Saludos

luisgutierrezb
12-01-2009, 17:27:33
los componentes Jedi traen un componente que se llama DBTreeView, que te podria servir, solo que necesita al menos 3 campos, 1 el id del padre, 2 id del elemento en si y 3 el texto o caption del elemento

Carmelo Cash
12-01-2009, 18:12:20
Gracias por su ayuda. Estuve haciendo algunas pruebas y casi me sale.

Probando esto en MySQL sale bién :)

select left('----------------------', (nivel )) + Cuenta
from Cuentas

Quise hacer el equivalente en InterBase, quedaría así:

select Cast('----------------------' as Varchar(nivel ))||Cuenta
from Cuentas

Pero Varchar(nivel ) . No lo reconoce. :(

Seguiré probando, Espero si a alguien se le ocurre una Idea. Porfavor... que no sea Migrar a MySQL.

Saludos y gracias por las sugerencias recibidas.

fjcg02
12-01-2009, 23:47:31
Te dejo una query para que la pruebes.
Probada en Firebird 2.0
Te queda de deberes concatenar los campos y poner los de tu tabla

select case cod_cli
when 1 then '-'
when 2 then'--'
when 3 then '---'
else 'no encontrado'
end as nivel,
cast(cod_cli as varchar(2)) as cod from cliente


resultado
Nivel cod
- 1
-- 2
--- 3
---- 4
no encontrado 27

Suerte ;)

Carmelo Cash
13-01-2009, 10:00:53
Gracias fjcg02, pero esta debe ser una de las diferencias entre IbterBase y FireBird, me da:

"Token unknown - line 2, char 16
when"

select case nivel
when 1 then '-'
when 2 then'--'
when 3 then '---'
end as nivel,
Cuenta
from cuentas

No se... Gracias por sus aportes.

fjcg02
13-01-2009, 23:08:51
En interbase funciona iif() ?
prueba substring('-------', 1,nivel) si es que la funcion existe.
Un procedimiento almacenado ?
¿ Cambiar interbase por firebird ? ;-)

Ya nos dirás.
Saludos