sábado, 15 de abril de 2017

Função que retorna mais de um valor

Olá..
Hoje vamos trabalhar uma função que retorna mais de um valor, é bem simples, e por várias situações precisamos deste função já que a função padrão retorna somente um valor, na verdade ele retorna só um valor, mas com muito valores embutidos neste valor, vamos utilizar uma TStringList para isso.

E também nós vamos utilizar o Delphi xe5, Firebird 2.5, e FIREDAC, mas se você  não quiser utilizar esses componentes de acesso, pode ser com outros componentes de acesso à dados a sua escolha.

Primeiramente vamos criar uma tabela simples no BD, somente para fins didáticos conforme abaixo:

CREATE TABLE CONDICAOPAGAMENTO (
    CON_ID          INTEGER NOT NULL PRIMARY KEY,
    CON_NOME        VARCHAR(30),
    CON_AVISTA      VARCHAR(3),
    CON_MODALIDADE  VARCHAR(20)
);


Insira alguns dados para os testes conforme abaixo:


Agora vamos ao Delphi.

Criei um novo projeto e salvei a Unit como uPrincipal e o projeto como TesteFuncao.
Mudei a Propriedade Name do Form para fPrincipal.

Para não alongar muito o nosso post, resolvi colocar os componentes de acesso a dados diretamente no Form, normalmente utiliza-se um Data Module para isso.

Adicionei:
Da Paleta FireDac: 1 FDConnection, 1 FDQuery.
Da Paleta FireDacLinks: 1 FDPhysFBDriverLink.
Da Paleta FireDac UI: 1 FDGUIxWaitCursor.

Vamos configurar as propriedades do nosso  FDConnection1 dando um duplo clique no componente surgirá a janela abaixo:


Configure o DataBase conforme a localização do seu BD.
Altere a propriedade  LoginPrompt do componente FDConnection1  para False.

Altera a Propriedade Name do FDQuery1 para qCondicoes e SQL coloque (SELECT * FROM CONDICAOPAGAMENTO) este comando é somente para fins didáticos muito cuidado com o "* from" com tabelas com muitos campos e dados, o ideal seria selecionar somente os campos necessários.


Desenhe o form Principal de acordo com a imagem abaixo:


Vamos a implementação da função, depois do primeiro uses antes do Type coloque:

type
   f_condicoes      = record
   cond_id          : integer;
   cond_nome        : string[30];
   cond_avista      : string[3];
   cond_modalidade  : string[20];
end;

E mais abaixo no var, coloque
var
  fPrincipal: TfPrincipal; //Criado automaticamente na criação do form
  Lista:TStringList;
  ft_condicao  : f_condicoes;

Em public do form coloque:
  public
    { Public declarations }
    Function RetornaCondicao(aCodigo:Integer):f_condicoes;
  end;

Tecle Shif+Ctrl+C para criar a função.

function TfPrincipal.RetornaCondicao(aCodigo: Integer): f_condicoes;
var
  Localizar:Variant;
begin
   Localizar:=aCodigo;
   if Not qCondicoes.Locate('con_id', Localizar, []) then
     Result.cond_id :=0
   else
     Result.cond_id          :=qCondicoes.FieldByName('con_id').AsInteger;
     Result.cond_nome        :=qCondicoes.FieldByName('con_nome').AsString;
     Result.cond_avista      :=qCondicoes.FieldByName('con_avista').AsString;
     Result.cond_modalidade  :=qCondicoes.FieldByName('con_modalidade').AsString;

end;

E no OnKeyDown do edtCodigo coloque:
procedure TfPrincipal.edtCodigoKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
Var
  retorno:f_condicoes;
begin
   if key=VK_RETURN then begin
     if Length(edtCodigo.Text)>0 then begin
       Retorno:=RetornaCondicao(StrToInt(edtCodigo.Text));
       if retorno.cond_id=0 then begin
         ShowMessage('Código não cadastrado');
         edtCodigo.SetFocus;
         abort;
       end;
       edtNome.Text      :=retorno.cond_nome;
       edtAVista.Text    :=retorno.cond_avista;
       edtModalidade.Text:=retorno.cond_modalidade;
     end;
   end;
end;

Executando a aplicação.

Veja o form em tempo de execução:

Código não encontrado, retorna a mensagem.



Se encontrar retorna os dados.


Muito simples Né?


Comente e até o próximo post.