Fórum Como posso melhorar este código: Usar recursividade!!! #271510
08/03/2005
0
Criei uma função que faz uma leitura por Query em uma Tabela. Basicamente o obejtivo desta função é verificar se uma Conta tem seu PAI. Exemplo: 01.01 - Energia Elétrica. VErificar se a Conta 01 - DESPESAS GERAIS já está cadastrada. A Função está funcionando legal, mas sei que posso reduzir o código usando alguma lógica CICLICA E RECURSIVA para obter as subcontas PAI de uam determinada Conta. Será que vocês poderiam me ajudar?
Obrg.
Segue o Código da Função:
function ChecaContaPai(KeyPai: string): string; begin // Verifica se a Conta Pai já está cadastrada with DataMod.ADOQuery_Checa_Conta_Pai do begin Close; Parameters.ParamByName(´FCodConta´).Value:=KeyPai; Open; if RecordCount = 0 then begin Result := ´0´; end else Result := ´1´; end; end;
Segue a ROTINA QUE DESEJO MELHORAR. Em vez de 5 chamadas posso ficar obtendo as substrings e chamando uma única vez em um LAÇO RECURSIVO. Agradeço sugestões:
/ Verifica se a Cona a ser Inserida tem Conta PAI if Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,9,2) <> ´´ then if ChecaContaPai(Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,7,2)) = ´0´ then begin ShowMessage(´A Conta Pai não está cadastrada!´); form_grupos_contas.FCodConta.SetFocus; Abort; end; if Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,7,2) <> ´´ then if ChecaContaPai(Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,5,2)) = ´0´ then begin ShowMessage(´A Conta Pai não está cadastrada!´); form_grupos_contas.FCodConta.SetFocus; Abort; end; if Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,5,2) <> ´´ then if ChecaContaPai(Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,3,2)) = ´0´ then begin ShowMessage(´A Conta Pai não está cadastrada!´); form_grupos_contas.FCodConta.SetFocus; Abort; end; if Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,3,2) <> ´´ then if ChecaContaPai(Copy(DataMod.ADOTable_Grupos_ContasCON_COD.asstring,1,2)) = ´0´ then begin ShowMessage(´A Conta Pai não está cadastrada!´); form_grupos_contas.FCodConta.SetFocus; Abort; end; If (ADOTable_Grupos_ContasCON_DES.Text = ´´) then begin ShowMessage(´O preenchimento do campo <Descrição da Conta> é obrigatório!´); Form_Grupos_Contas.FDescConta.SetFocus; Abort; end; If (ADOTable_Grupos_ContasCON_CRIT.Text = ´´) then begin ShowMessage(´O preenchimento do campo <Criticidade da Conta> é obrigatório!´); Form_Grupos_Contas.FCritConta.SetFocus; Abort; end;
Alexsandro Áfio
Alexsandro
Curtir tópico
+ 0Posts
08/03/2005
Emerson Nascimento
function ChecaContaPai(Conta: string): boolean; var sAux: string; begin Result := True; // variável auxiliar para manipulação da "conta pai" sAux := Conta; while Result and (sAux<>´´) do begin try sAux := Copy(sAux,1,Length(sAux)-3); except sAux := ´´; end; // Verifica se a Conta Pai já está cadastrada if sAux<>´´ then with DataMod.ADOQuery_Checa_Conta_Pai do begin Close; Parameters.ParamByName(´FCodConta´).Value:=sAux; Open; Result := not IsEmpty; end; end; // não precisa ficar aberta depois da verificação DataMod.ADOQuery_Checa_Conta_Pai.Close; end;
verificação:
// Verifica se a Conta a ser Inserida tem Conta PAI if not ChecaContaPai(DataMod.ADOTable_Grupos_ContasCON_COD.asstring) then begin ShowMessage(´A Conta Pai não está cadastrada!´); form_grupos_contas.FCodConta.SetFocus; Abort; end; If (ADOTable_Grupos_ContasCON_DES.Text = ´´) then begin ShowMessage(´O preenchimento do campo <Descrição da Conta> é obrigatório!´); Form_Grupos_Contas.FDescConta.SetFocus; Abort; end; If (ADOTable_Grupos_ContasCON_CRIT.Text = ´´) then begin ShowMessage(´O preenchimento do campo <Criticidade da Conta> é obrigatório!´); Form_Grupos_Contas.FCritConta.SetFocus; Abort; end;
Gostei + 0
09/03/2005
Alexsandro
Achei sua logica muito boa e era isso que eu procurava. Muito Obrigado.
Alex
Gostei + 0
09/03/2005
Emerson Nascimento
Gostei + 0
09/03/2005
Alexsandro
Fiz confusão. Estava lendo uma dica do Luciano, rs rs rs. Valeu pela força
Alex
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)