Lógica difícil, é de quebrar a cabeça.
Tenho um cadastro de setores de uma empresa, que representam as contas desta, como um plano de contas contábil. Por exemplo:
Administração
-Higiene
-Agua
--Esgoto
--Refeição
---Básica
----Arroz
----Feijão
Esta é a árvore de como ficaria estas contas dos setores em um relatório.
Quando cadastro estas contas, tenhos três campos fundamentais: Código, Pertence a e Nível.
Código -> é o código do setor
Pertence a -> a que conta ele pertence, se não for nenhuma ela será um setor mestre.
Nível -> se a conta estiver com ´Pertence a´ [b:b8c142d922]null[/b:b8c142d922] então o nível é 1. Senão o nível será igual ao nível da conta de ´Pertence a´ + 1.
O Problema é: O relatório tem que ficar como descrevi acima, com as contas em ordem e seus respectivos níveis logo abaixo, só que o número de níveis que a conta [b:b8c142d922]mestre[/b:b8c142d922] terá é indeterminado, o usuário pode colocar quantos níveis desejar. O que dá para saber é o [b:b8c142d922]mestre[/b:b8c142d922] e o último nível desta conta, que será a [b:b8c142d922]que tem o valor do nível mais alto e que ´Pertence a´ é igual ao código da mestre[/b:b8c142d922].
A cada item eu tenho que verificar se ele possui mais algum nível dentro dele, e cada nível dentro dele tenho que verificar se possui mais algum dentro e assim sucessivamente a cada nível e a cada conta.
Se eu colocar para listar as [b:b8c142d922]mestres[/b:b8c142d922] primeiro dá pra ter um começo, mas não sei como fazer isto a cada nível.
O desafio está lançado. Me ajudem por favor.
[i:b8c142d922]Leia as Regras de Conduta - Saviski[/i:b8c142d922]
Administração
-Higiene
-Agua
--Esgoto
--Refeição
---Básica
----Arroz
----Feijão
Esta é a árvore de como ficaria estas contas dos setores em um relatório.
Quando cadastro estas contas, tenhos três campos fundamentais: Código, Pertence a e Nível.
Código -> é o código do setor
Pertence a -> a que conta ele pertence, se não for nenhuma ela será um setor mestre.
Nível -> se a conta estiver com ´Pertence a´ [b:b8c142d922]null[/b:b8c142d922] então o nível é 1. Senão o nível será igual ao nível da conta de ´Pertence a´ + 1.
O Problema é: O relatório tem que ficar como descrevi acima, com as contas em ordem e seus respectivos níveis logo abaixo, só que o número de níveis que a conta [b:b8c142d922]mestre[/b:b8c142d922] terá é indeterminado, o usuário pode colocar quantos níveis desejar. O que dá para saber é o [b:b8c142d922]mestre[/b:b8c142d922] e o último nível desta conta, que será a [b:b8c142d922]que tem o valor do nível mais alto e que ´Pertence a´ é igual ao código da mestre[/b:b8c142d922].
A cada item eu tenho que verificar se ele possui mais algum nível dentro dele, e cada nível dentro dele tenho que verificar se possui mais algum dentro e assim sucessivamente a cada nível e a cada conta.
Se eu colocar para listar as [b:b8c142d922]mestres[/b:b8c142d922] primeiro dá pra ter um começo, mas não sei como fazer isto a cada nível.
O desafio está lançado. Me ajudem por favor.
[i:b8c142d922]Leia as Regras de Conduta - Saviski[/i:b8c142d922]
Biscalquini
Curtidas 0
Respostas
Marconi
29/09/2003
Eu faria tal qual as contas da contabilidade
Voce classifica em um campo string do tamanho que quiser
1 - Nivel Primario 1
11 - Subnivel 1 do Nivel Primario 1
111 - Subnivel do anterior
2 - Nivel primario 2
.. E não uso QuickReport ou qualquer outro programa de relatórios. Prefiro fazer no braço, pois faço da maneira que quiser sem me preocupar com as ferramentas de cada um.
Se a tabela estiver indexada neste campo, ela fatalmente estará na ordem que voce deseja. Voce até pode ter uma somente para este controle. Na tabela de controle voce só tem o código de niveis e o código da conta, que até podem ser o mesmo.
Voce começa a varrer a tabela de controle do primeiro item até o último, e na tabela com os dados voce vai filtrando por nivel e subnivel para verificar se existem dados para o relatório. Vou tentar montar um exemplo
....
....
var conta:string; i:word;
begin
i:=1;
tabelacontrole.first;
while not tabelacontrole.eof do begin
conta:=copy(tabelacontrole,1,i);
tabela.filter:=´conta = ´´´+conta+´*´´´;
tabela.filtered:=true;
// neste momento voce tem na tabela todos os registros que começam com primeiro caracter da conta, se for mais do que 1 é porque tem subniveis, então voce anota o nome da conta e faz uma outra filtragem com dois digitos.
if tabela.recordcount>1 then
//....<anota os dados do nivel> e separa os subniveis>
tabelacontrole.next; // passa para o proximo nivel
if tabelacontrole.eof then exit;
...
inc(i); // i agora vale 2.
conta:=copy(tabelacontrole,1,i);
conta:=copy(tabelacontrole,1,i);
... e assim por diante até que tabela.recordcount=1, e voce chegou no subnivel máximo.
// é sá anotar os numeros e passar para o próximo
tabelacontrole.next;
end;
Voce classifica em um campo string do tamanho que quiser
1 - Nivel Primario 1
11 - Subnivel 1 do Nivel Primario 1
111 - Subnivel do anterior
2 - Nivel primario 2
.. E não uso QuickReport ou qualquer outro programa de relatórios. Prefiro fazer no braço, pois faço da maneira que quiser sem me preocupar com as ferramentas de cada um.
Se a tabela estiver indexada neste campo, ela fatalmente estará na ordem que voce deseja. Voce até pode ter uma somente para este controle. Na tabela de controle voce só tem o código de niveis e o código da conta, que até podem ser o mesmo.
Voce começa a varrer a tabela de controle do primeiro item até o último, e na tabela com os dados voce vai filtrando por nivel e subnivel para verificar se existem dados para o relatório. Vou tentar montar um exemplo
....
....
var conta:string; i:word;
begin
i:=1;
tabelacontrole.first;
while not tabelacontrole.eof do begin
conta:=copy(tabelacontrole,1,i);
tabela.filter:=´conta = ´´´+conta+´*´´´;
tabela.filtered:=true;
// neste momento voce tem na tabela todos os registros que começam com primeiro caracter da conta, se for mais do que 1 é porque tem subniveis, então voce anota o nome da conta e faz uma outra filtragem com dois digitos.
if tabela.recordcount>1 then
//....<anota os dados do nivel> e separa os subniveis>
tabelacontrole.next; // passa para o proximo nivel
if tabelacontrole.eof then exit;
...
inc(i); // i agora vale 2.
conta:=copy(tabelacontrole,1,i);
conta:=copy(tabelacontrole,1,i);
... e assim por diante até que tabela.recordcount=1, e voce chegou no subnivel máximo.
// é sá anotar os numeros e passar para o próximo
tabelacontrole.next;
end;
GOSTEI 0