TreeView com plano de contas ?

Delphi

20/05/2004

estou desenvolvendo um sistema de Vendas com controle Financeiro,

criei a tabela do Financeiro assim:

Nome campo tipo tamanho

Cod_conta + * codigo auto incremente
Desc_campo A 50 Descrição do campo
Tipo_conta A 1 Debito ou credito
Obs A 255 Observação
Cod_grupo I Codigo mestre ou codigo conta principal


Esta tabela e baseada no modelo mostrado aqui neste forum, a duvida e o seguinte como eu faço para quanto adicionar um grupo ou um sub grupo sequente no treeview jogar um sobre o outro. como faço a vinculação com o cod_grupo meste ?
peguei um exemplo do treeview aqui no clube delphi mas não estou conseguindo converter para o meu caso.
no campo debido credito uso um dbRadioGrup

Se alguem puder me ajudar agradeço !

Hugo Fabrício


Hugofab

Hugofab

Curtidas 0

Respostas

Motta

Motta

20/05/2004

Este exemplo do Eugenio Reis, talvez te ajude, parte de uma query onde há um nível hierarquico que será usado para montar a TV

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ComCtrls, Buttons, ImgList, Grids, DBGrids;

type
TForm1 = class(TForm)
TreeView1: TTreeView;
Query1: TQuery;
SpeedButton1: TSpeedButton;
ImageList1: TImageList;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
procedure PreencherTreeView( qry : TDataset; tv : TTreeView; Pai :
TTreeNode );
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.PreencherTreeView( qry : TDataset; tv : TTreeView; Pai :
TTreeNode );
function NivelHierarquico( const s : ShortString ) : Byte;
begin
// Descobre o nivel hierarquico através do número de pontos do código
Result := Length( s ) - Length( StringReplace( s, ´.´, ´´, [rfReplaceAll]));
end;
var NivelAtual, NovoNivel, i : Byte;
Descricao : ShortString;
NovoNo : TTreeNode;
begin
NivelAtual := NivelHierarquico( qry.Fields[0].AsString );
repeat
Descricao := qry.Fields[0].AsString + ´ - ´ + qry.Fields[1].AsString;
NovoNivel := NivelHierarquico( qry.Fields[0].AsString );
if NovoNivel = NivelAtual then
begin
NovoNo := tv.Items.AddChild( Pai, Descricao );
NovoNo.ImageIndex := NivelAtual * 2;
NovoNo.SelectedIndex := NivelAtual * 2;
end
else
begin
if ( NovoNivel < NivelAtual ) then
begin
for i := 1 to NivelAtual - NovoNivel do
Pai := Pai.Parent
end
else
begin
Pai := NovoNo;
end;
PreencherTreeView( qry, tv, Pai );
end;
qry.Next;
Application.ProcessMessages;
until qry.EOF;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
query1.open;
try
PreencherTreeView(query1,treeview1,nil);
except
end;
end;

end.


GOSTEI 0
Hugofab

Hugofab

20/05/2004

Obrigado pelo força !


Hugo Fabrício
hugo_fabricio@hotmail.com


GOSTEI 0
Edivaldo_ap

Edivaldo_ap

20/05/2004

Cara seguinte, tentei usar esse exemplo que você postou no grupo, mas parece que a função nivel não está funcionando, pelo menos pra mim não... não entendi ela direito....será que tenho que mudar alguma coisa na função para ela funcionar pra mim.


Edivaldo André Pereira


GOSTEI 0
Zumbi

Zumbi

20/05/2004

vc deve usar seu codigo assim:

001.001.001
001.001.002
....

assim por diante


GOSTEI 0
Edivaldo_ap

Edivaldo_ap

20/05/2004

Cara tudo certo, esse código que você postou funcionou perfeitamente muito obrigado.

Minha dúvida agora é a seguinte, preciso excluir o registro no banco quando eu seleciona-lo na treeview e clicar no botão excluir, mas não to conseguindo ele está excluindo sempre o primeiro registro do banco e não aquele que eu seleciono na tree.

Edivaldo André Pereira.


GOSTEI 0
Edivaldo_ap

Edivaldo_ap

20/05/2004

Aí Motta bele cara... seguinte o código que vc postou nesse tópico está funcionando perfeitamente cara... brigadão... minha dúvida agora é a seguinte....

Como fazer para testar o que o usuário digitou antes de gravar... exemplo...
tenho a seguinte mascara no banco 9.9.9.99.9999

o usuário digita no dbedit o codigo 1.1.1.11.1111, o que eu preciso saber é como testar se as contas
1
1.1
1.1.1
1.1.1.11

tem que testar se elas já estão cadastradas pois se eu cadastrar a última direto o sistema da pau.

sabendo ainda que a mascara o usuario cria num form separado, ou seja, eu não sei que mascara o sistema terá é definida pelo usuario.

Edivaldo


GOSTEI 0
Smfnurrali

Smfnurrali

20/05/2004

para ver se as contas de nivel superior ja existem eu fi o seguinte:
como no meu casa pode variar o n° de digitos nos grupos pra cada cliente´pode variar eu criei um vetor chamado grupo que recebe o n° de digitos de cada nivel qnd cria o form.

depois criei essa função...
//******************************************************************************
function TFormCadastroPlanoContas.VerificaConta(conta,gr,id:integer):boolean;
//******************************************************************************
var qryConta:TIBQuery;
aux:string;
digitos:integer;
begin
digitos := grupo[gr];
aux := copy(inttostr(conta),1,digitos);
qryConta := TIBQuery.Create(self);
qryConta.Database := dtmPrincipal.IBDatabase;
qryConta.SQL.Text := ´select * ´+
´from planocontas ´+
´where ´+
´id_empresa = ´+inttostr(id)+´ and ´+
´conta = ´+ aux;
qryConta.Open;
Result := qryConta.IsEmpty;
end;


que é chamada no on exit

//==============================================================================
procedure TFormCadastroPlanoContas.edtCodigoExit(Sender: TObject);
//==============================================================================
var ct:integer;

begin
inherited;
If dtsPrincipal.State in [dsedit,dsinsert] then
begin
For ct:=1 to 6 do
begin
If Length(edtCodigo.Text) = Grupo[ct] then
begin
If ct > 1 then
begin
If (VerificaConta(strtoint(edtCodigo.Text),ct-1,dtmPrincipal.tblEmpresasID_EMPRESA.AsInteger)) then
begin
dtmPrincipal.MostraMensagem(´CONTA NÃO POSSUI NIVEL SUPERIOR!´);
edtCodigo.SetFocus;
exit;
end;
end;
If not (VerificaConta(strtoint(edtCodigo.Text),ct,dtmPrincipal.tblEmpresasID_EMPRESA.AsInteger)) then
begin
dtmPrincipal.MostraMensagem(´CONTA JÁ CADASTRADA!´);
edtCodigo.SetFocus;
exit;
end;
dtmPrincipal.tblPlanoContasCOD_CONTA.AsInteger := strtoint(CalculaModulo11(edtCodigo.Text));
dtmPrincipal.tblPlanoContasGRUPO.AsInteger := ct;
Exit;
end;
end;
dtmPrincipal.MostraMensagem(´CONTA INVÁLIDA!´);
edtCodigo.SetFocus;
exit;
end;
end;


Talvez isso te dê uma luz...


GOSTEI 0
POSTAR