Como posso melhorar este código: Usar recursividade!!!
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:
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:
Alexsandro Áfio
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
Curtidas 0
Respostas
Emerson Nascimento
08/03/2005
nova função (não testei):
verificação:
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
Alexsandro
08/03/2005
Luciano,
Achei sua logica muito boa e era isso que eu procurava. Muito Obrigado.
Alex
Achei sua logica muito boa e era isso que eu procurava. Muito Obrigado.
Alex
GOSTEI 0
Emerson Nascimento
08/03/2005
Luciano???
GOSTEI 0
Alexsandro
08/03/2005
Desculpe Emerson,
Fiz confusão. Estava lendo uma dica do Luciano, rs rs rs. Valeu pela força
Alex
Fiz confusão. Estava lendo uma dica do Luciano, rs rs rs. Valeu pela força
Alex
GOSTEI 0