CONCATERNAR EM MASCARA

VILANOVA 03/10/2012 14:54:45
#411163
pessoal boa tarde, estou com um probleminha aqui se alguem puder ajudar.. veja so estou fazendo um relatorio financeiro e tenho uma estrutura de centro de custo dinamica.. o cliente pode definir a mascara da estrutura.. ate ai tudo bem.. so que.. estou fazendo um relatorio gerencial.. dando um sum nas tabelas e preciso fazer como se fosse uma apuracao.. a estrutura e o resultado e mais ou menos o seguinte..



3 DESPESAS
3.1 DESPESAS GERAIS
3.1.1 DESPESAS ADMINISTRATIVAS
3.1.1.01 LOJA 1
3.1.1.01.001 * Agua
3.1.1.01.002 * Luz
3.1.1.01.003 * Telefone
3.1.1.02 LOJA 2
3.1.1.02.001 * Agua
3.1.1.02.002 * Luz
3.1.1.02.003 * Telefone


entao.. no relatorio eu quero pegar somente a razao do grupo e a respectiva conta.. exemplo..

LOJA 1
3.1.1.01.001 100,00
3.1.1.01.002 200,00
3.1.1.01.003 600,00
LOJA 2
3.1.1.02.001 900,00
3.1.1.02.002 1200,00
3.1.1.02.003 50000


Ou seja.. nao vou precisar daquele tanto de conta la em cima..
3 DESPESAS
3.1 DESPESAS GERAIS
3.1.1 DESPESAS ADMINISTRATIVAS

sei que posso fazer atraves de split.. tentei fazer o seguinte..

csql = [Ô]select b.ctb_codcontacompleta from [Ô] & cTab1 & [Ô] a [Ô]
csql = csql & [Ô] inner join ctb_contascontabeis b on b.id = a.idconta [Ô]

Set rs = ExecutaSQL(csql)

Do While Not rs.EOF
vTemp = Split(rs!ctb_codcontacompleta, [Ô].[Ô])
cAux = [Ô][Ô]
For nI = 0 To UBound(vTemp) - 1
If cAux = [Ô][Ô] Then
cAux = vTemp(nI)
Else
cAux = cAux & [Ô].[Ô] & vTemp(nI)
End If
cn.Execute [Ô]insert into [Ô] & cTab1 & [Ô] select id,0 from ctb_contascontabeis where ctb_codcontacompleta = [ô][Ô] & cAux & [Ô][ô] group by id order by ctb_codcontacompleta limit 1[Ô]
Next
rs.MoveNext: DoEvents
[ô]153 Prg.Value = Prg.Value + 1
Loop


porem ele pega todas as contas que se iniciam com o gripo.. nao dando certo.. ou seja imprimindo tudo ..

KERPLUNK 03/10/2012 15:08:03
#411168
Como é a estrutura da tabela?
VILANOVA 03/10/2012 15:24:21
#411173
codigoconta,descricao da conta,analitica

ex :
1 , RECEITA , 0
1.1 , RECEITA ADM, 0
KERPLUNK 03/10/2012 15:34:32
#411175
1 - Da maneira como você fez, vai ficar bastante complicado e consequentemente lento
2 - Para fazer esse tipo de [Ô]escada[Ô], você precisa ter uma tabela com o cadastro de cada conta, e informar de quem ela é filha. Mais ou menos assim:

IDConta -> int(PK)
CodigoConta -> varchar(x)
IDContaPai -> int
Descricao -> varchar(x)

Então, quando cadastrar fazer assim:
IDConta |CodigoConta |IDContaPai |Descricao
1 |3 |null |Despesas
2 |1 |1 |Despesas Gerais
3 |1 |2 |Despesas Administrativas
4 |01 |3 |Loja 1
5 |001 |4 |* Agua
6 |002 |4 |* Luz
7 |003 |4 |* Telefone
8 |02 |3 |Loja 2
9 |001 |8 |* Agua
10 |002 |8 |* Luz
11 |003 |8 |* Telefone




Então, quando gravar cada lançamento, grave o IDConta junto, assim, você pode montar a estrutura da maneira que quiser, incluindo em [Ô]árvore[Ô] que é o que você quer
VILANOVA 03/10/2012 15:49:39
#411177
veja so.. organlizar é tranquilo, o processamento se torna rapido, pois jogo os dados em tabelas temporarias para montar o relatorio, da uma força ai so no seguinte..
vTemp = Split(rs!ctb_codcontacompleta, [Ô].[Ô])
como eu faço para ler essa linha acima da direita para esquerda?
FEDERHEN 03/10/2012 16:04:56
#411179
Faz um select com de todas as contas e trata somente aquelas que pertencem aos dois últimos níveis atraves de IF, pois
pelo que percebí a conta de nível 4 é a razão do grupo e a conta de nível 5 é a conta analitica.



csql = [Ô]select b.ctb_codcontacompleta from [Ô] & cTab1 & [Ô] a [Ô]
csql = csql & [Ô] inner join ctb_contascontabeis b on b.id = a.idconta [Ô]

Set rs = ExecutaSQL(csql)

Do While Not rs.EOF
nivel = 1
for i = 1 to len(rs!ctb_codcontacompleta)
if mid(rs!ctb_codcontacompleta,i,1)=[Ô].[Ô] then nivel = nivel + 1
next i
if nivel = 4 or nivel = 5 then
[ô]... msgbox [Ô]conta = [Ô] & rs!ctb_codcontacompleta & vbcrlf & [Ô]descrição = xxxxxx[Ô] & vbcrlf & [Ô]valor = 0000[Ô]
endif
rs.MoveNext
Loop



VILANOVA 04/10/2012 08:37:06
#411217
Citação:

:
Faz um select com de todas as contas e trata somente aquelas que pertencem aos dois últimos níveis atraves de IF, pois
pelo que percebí a conta de nível 4 é a razão do grupo e a conta de nível 5 é a conta analitica.



csql = [Ô]select b.ctb_codcontacompleta from [Ô] & cTab1 & [Ô] a [Ô]
csql = csql & [Ô] inner join ctb_contascontabeis b on b.id = a.idconta [Ô]

Set rs = ExecutaSQL(csql)

Do While Not rs.EOF
nivel = 1
for i = 1 to len(rs!ctb_codcontacompleta)
if mid(rs!ctb_codcontacompleta,i,1)=[Ô].[Ô] then nivel = nivel + 1
next i
if nivel = 4 or nivel = 5 then
[ô]... msgbox [Ô]conta = [Ô] & rs!ctb_codcontacompleta & vbcrlf & [Ô]descrição = xxxxxx[Ô] & vbcrlf & [Ô]valor = 0000[Ô]
endif
rs.MoveNext
Loop




o seu raciocinio esta certo so que.. nao deu certo nao... ele nao achou nenhum a conta..
VILANOVA 04/10/2012 08:46:08
#411219
vejam so.. se eu conseguir pegar somente ate o quarto nivel por exemplo.. o problema esta resolvido.. vejamos..


3.1.1.01
3.1.1.01.001

entao se eu remover o ultimo nivel vai dar.. 3.1.1.01

MARCELO.TREZE 04/10/2012 08:48:09
#411220
vila nova em algum momento este numero

3.1
3.1.1

pode virar algo tipo

3.13.1
3.1.17

se não o mid funciona bem, porém eu aconselharia coloca-lo no select, desde que o campo seja do tipo texto.



Tópico encerrado , respostas não são mais permitidas