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.
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.