Fórum Como posso melhorar este código: Usar recursividade!!! #271510

08/03/2005

0

Boa Noite Meus amigos,

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

Alexsandro

Responder

Posts

08/03/2005

Emerson Nascimento

nova função (não testei):

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;



Responder

Gostei + 0

09/03/2005

Alexsandro

Luciano,

Achei sua logica muito boa e era isso que eu procurava. Muito Obrigado.

Alex


Responder

Gostei + 0

09/03/2005

Emerson Nascimento

Luciano???


Responder

Gostei + 0

09/03/2005

Alexsandro

Desculpe Emerson,

Fiz confusão. Estava lendo uma dica do Luciano, rs rs rs. Valeu pela força

Alex


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar