Você está na página 1de 5

Centro Universitário do Leste de Minas Gerais

Cursos de Sistema de Informação

Mini-Curso Delphi com Banco de Dados – Parte 2

Objetivo: Criação de um formulário de aluno e seus cursos, sendo que o mesmo é do tipo Mater/Detalhe. Na parte superior será cadastrado os dados do aluno, e na parte inferior os cursos deste aluno utilizando para isto a tabela relacionante AlunoCurso.

1. Abra o projeto PrjCursos gravado em sua máquina.

2. Crie neste projeto um novo formulário (File/New Form). Altere seu nome para FrmCadAluno salvando sua unit como uFrmCadAluno. Altere a propriedade FormStyle para fsMDIChild. Altere a propriedade BorderStyle para bsSingle. Lembre-se também do código do evento OnClose.

Região Master do Formulário

3. Adicione a este formulário um componente Query e UpdateSQL e um componente DataSource da paleta de componentes. Configure-os conforme descrito abaixo:

4. Altere a propriedade DatabaseName para dbCursos. Altere a propriedade CachedUpdates para True. Altere seu nome de Query1 para QryAluno e altere a instrução SQL para:

SELECT * FROM ALUNO WHERE 1 = 0 ORDER BY NMALUNO;

CachedUpdates . Quando mudamos esta propriedade para True, estamos redirecionando as alterações da Query para

CachedUpdates. Quando mudamos esta propriedade para True, estamos redirecionando as alterações da Query para a memória cache, fazendo com que ao se fechar o formulário, todas as alterações sejam perdidas. Para que isto não ocorra devemos escrever o código QryAluno.ApplyUpdates; no evento AfterPost e AfterDelete da Query.

5. Devemos ligar ao Query um componente UpdateSQL que é na realidade o componente que efetua as atualizações no banco de dados, através de instruções SQL que nele são criadas.

6. Portanto, altere a propriedade UpdadeObject do QryAluno com o nome do UpdateSQL1. Carregue os componentes TFields com um duplo clique na Query e escolhendo a opção Add All Fields com o botão direito do mouse.

7. Altere o nome do UpdateSQL1 para UpdAluno. Dê um duplo clique no UpdAluno para abrir uma janela tal qual a janela da figura 1. Escolha o(s) campo(s) chave da tabela e clique no botão Generate SQL e depois no botão OK.

8. Para o componente DataSource, altere a propriedade DataSet escolhendo o nome do QryAluno ao qual este DataSource irá se conectar e altere o nome para DtsAluno.

9. Antes de configurar os componentes de controle (DbEdit), adicione ao formulário um componente ToolBar (Guia Win32). Adicione a este componente, 10 (dez) componentes SpeedButton (Guia Additional) e um componente DbNavigator (Somente os 4 primeiros botões devem ficar habilitados), todos separados por Separator como pode ser visto na figura 2.

separados por Separator como pode ser visto na figura 2. Figura 1 - Tela de configuração

Figura 1 - Tela de configuração do UpdateSQL

Autor: Profº Cláudio Portes (profclaudioportes@gmail.com) - 1 de 5

10. A configuração desta parte do formulário se dá tal qual a configuração dos formulários anteriores, exceto, que existe neste formulário um botão a mais do que os outros. Este botão chama-se BtnBuscar. As demais configurações não serão mostradas novamente. Em caso de dúvida consulte o guia anterior.

11. O que veremos agora é como configurar os campos CdBairro e CdCidade, visto que ambos são chave estrangeira neste formulário. Como o projeto visa diminuir a tráfego na rede, não utilizaremos o componente DbLookupComboBox (Caixa de combinação), pois, este componente traz para a memória todos os registros da tabela. Isto não é bom. Iremos aqui, utilizar o recurso de um formulário de consulta, onde o usuário escolherá o nome do bairro ou cidade em uma lista e o programa se encarregará de gravar o código correspondente.

12. Portanto, adicione à frente dos DbEdit de bairro e cidade, um componente Label. Altere o nome deles para LblNmBairro e LblNmCidade respectivamente. Altere também os nomes dos DbEdit's para EdtCdBairro e EdtCdCidade.

13. Copie para seu usuário, se você ainda não tem, para a pasta do projeto o arquivo chamado uFrmConsulta.pas e uFrmConsulta.dfm. Estes são os arquivos do nosso formulário de consulta. Após copia-los, vá ao menu Project / Add to Project e adicione o formulário que acabou de copiar.

14. Selecione os dois componentes DbEdit (EdtCdBairro e EdtCdCidade). Acesse a guia Events do Object Inspector e selecione o evento OnEnter. Com um duplo clique na parte branca do mesmo, crie o procedimento para o evento OnEnter dos DbEdit's e escreva o seguinte código:

OnEnter dos DbEdit's e escreva o seguinte código: Figura 2 – Configuração do PageControl / TabSheet

Figura 2 – Configuração do PageControl / TabSheet

BtnBuscar.Enabled := True;.

15. Realize a mesma operação porém agora para o evento OnExit dos DbEdit's e escreva o seguinte código:

BtnBuscar.Enabled := False;.

Estes códigos farão com que o botão buscar fique habilitado toda vez que qualquer um dos dois DbEdit's receber o foco. E o mesmo botão será desabilitado quando nenhum dos dois DbEdit's estiver com o foco.

16. Agora vamos configurar a ação do botão Buscar. Primeiramente, acesse a propriedade Enabled do mesmo e altere-a para False. Depois, com um duplo clique sobre ele, abra o procedimento de seu evento OnClick e escreva o seguinte código:

procedure var Retorno, Sql: String; begin try if EdtCdBairro.Focused then begin Sql := 'SELECT CDBAIRRO, NMBAIRRO FROM BAIRRO WHERE 1=0'; FrmConsulta := TFrmConsulta.Create(Self); Retorno := FrmConsulta.Consultar(Sql, 'Bairro', 'Tabela Bairro'); if Retorno <> '' then begin if not (QryAluno.State in [dsEdit, dsInsert]) then QryAluno.Edit; QryAlunoCDBAIRRO.AsInteger := FrmConsulta.QryConsulta.Fields[0].AsInteger; LblNmBairro.Caption := FrmConsulta.QryConsulta.Fields[1].AsString; end; end else if EdtCdCidade.Focused then begin Sql := 'SELECT CDCIDADE, NMCIDADE FROM CIDADE WHERE 1=0'; FrmConsulta := TFrmConsulta.Create(Self); Retorno := FrmConsulta.Consultar(Sql, 'Cidade', 'Tabela Cidade'); if Retorno <> '' then begin if not (QryAluno.State in [dsEdit, dsInsert]) then QryAluno.Edit; QryAlunoCDCIDADE.AsInteger := FrmConsulta.QryConsulta.Fields[0].AsInteger; LblNmCidade.Caption := FrmConsulta.QryConsulta.Fields[1].AsString; end; end;

Autor: Profº Cláudio Portes (profclaudioportes@gmail.com) - 2 de 5

finally

FrmConsulta.Free;

end;

end;

17. Agora com um duplo clique sobre o componente QryAluno, abra o editor de campos e selecione o campo CDBAIRRO. Através do Object Inspector, crie o procedimento para o evento OnValidate deste campo e escreva o seguinte código (que será explicado pelo professor):

procedure var QryCons: TQuery; begin if QryAlunoCDBAIRRO.IsNull then Exit; QryCons := TQuery.Create(self); with QryCons do begin DatabaseName := QryAluno.DatabaseName; Sql.Text := 'SELECT * FROM BAIRRO WHERE CDBAIRRO = ' + QryAlunoCDBAIRRO.AsString; Open; if RecordCount = 0 then begin ShowMessage('Desculpe, mas este código de Bairro não existe'); Abort; end else begin LblNmBairro.Caption := QryCons.FieldByName('NMBAIRRO').AsString; end; end; end;

18. Refaça o item 17, só que agora para o campo CdCidade.

19. Selecione o QryAluno e crie o procedimento do evento AfterScroll e acrescente o seguinte código:

QryAlunoCDBAIRROValidate(nil);

QryAlunoCDCIDADEValidate(nil);

Isto fará com que ao navegarmos entre os registros, a descrição do bairro e da cidade seja atualizada.

Quando um formulário faz referência a outro (neste caso o formulário de Aluno faz referência
Quando um formulário faz referência a outro (neste caso o formulário de Aluno faz referência ao
formulário de Consulta), ao compilar o código (F9), uma mensagem aparece na tela com as opções Yes, No
e Cancel. Neste caso, a opção Yes deve ser acionada. Veja um exemplo desta tela na figura 3.
Figura 3 – Mensagem de informação que aparece na compilação do programa

Região Detalhe do Formulário

20. O que será feito agora é configurar a parte detalhe do formulário, visto que, este formulário é do tipo Master/Detalhe onde na parte superior cadastramos os alunos (tabela Aluno), e na parte inferior seus cursos (tabela AlunoCurso).

21. Acrescente abaixo do PageControl um componente GroupBox. Altere sua propriedade Align para alClient e sua propriedade Caption para Cursos do Aluno.

22. Acrescente a este GroupBox um componente ToolBar ou copie da parte superior do formulário o outro ToolBar, deixando apenas os quatro primeiros botões e o navigator. Veja figura 4 abaixo.

23. Acrescente ao formulário um componente Query, um UpdateSQL e um DataSource. Altere o nome do Query para QryAlunoCurso. Configure sua propriedade DataBaseName. Altere sua propriedade SQL para:

SELECT A.*, C.NMCURSO FROM ALUNOCURSO A INNER JOIN CURSO C ON (A.CDCURSO = C.CDCURSO) WHERE A.CDALUNO = :CDALUNO ORDER BY C.NMCURSO

Autor: Profº Cláudio Portes (profclaudioportes@gmail.com) - 3 de 5

Observe que foi criado um parâmetro (:CDALUNO) para a Query. Este parâmetro representa o campo

Observe que foi criado um parâmetro (:CDALUNO) para a Query. Este parâmetro representa o campo CDALUNO da tabela de aluno. Será através dele que iremos ligar a tabela AlunoCurso com a tabela Aluno.

24. Para isto, clique na reticência da propriedade Params e abra o editor de parâmetros. Feito isto, selecione o parâmetro existente ali e mude para ftInteger a propriedade DataType. Altere a propriedade DataSource da QryAlunoCurso para DtsAluno a fim de completar a conexão entre Aluno e AlunoCurso.

25. Para configurar o UpdateSQL devemos tomar cuidado com o campo NmCurso, pois, o mesmo não pertence fisicamente a tabela de AlunoCurso. Portanto, selecione como chave da tabela os campos CDALUNO e CDCURSO e como Update Fields os mesmos campos, deixando de fora em ambas as listas o campo NMCURSO.

26. Configure o componente DataSource e DbGrid de forma

adequada.

o componente DataSource e DbGrid de forma adequada. Figura 4 - Formulário Aluno e seus Cursos

Figura 4 - Formulário Aluno e seus Cursos

27. Com um duplo clique sobre o componente QryAlunoCurso, abra seu editor de campos e carregue-o. Faça o mesmo

para o DbGrid. Após carregar os campos no DbGrid, exclua o campo CDALUNO, pois o mesmo não deve aparecer no grid (Apage-o somente no DbGrid).

28. Para o evento OnShow do formulário, acrescente as seguintes linhas de código:

QryAluno.Open;

QryAlunoCurso.Open;

29. Renomeie os botões da parte inferior com os seguintes nomes: BtnDIncluir, BtnDExcluir, BtnDEditar, BtnDCancelar e BtnDGravar.

30. Agora vamos fazer com que os botões funcionem. Com um duplo clique em cada um deles crie a manipulação para o evento Onclick onde deverão ser colocados os seguintes códigos:

BtnDIncluir

QryAlunoCurso.Append;

BtnDExcluir

if MessageBox(Handle, 'Excluir este curso?', 'Confirmação', MB_OKCANCEL + MB_DEFBUTTON1) = idOk then QryAlunoCurso.Delete;

BtnDCancelar

QryAlunoCurso.Cancel;

BtnDGravar

QryAlunoCurso.Post;

QryAlunoCurso.Close;

QryAlunoCurso.Open;

31. Como a chave primária da tabela AlunoCurso é composta pelo código do aluno e código do curso, ao incluir um novo curso para o aluno, é necessário incluir automaticamente o código do aluno visto que o código do curso será fornecido pelo usuário. Para isto, inclua o seguinte código no evento OnNewRecord da QryAlunoCurso:

QryAlunoCursoCDALUNO.AsInteger := QryAlunoCDALUNO.AsInteger;

Dando mais consistência ao formulário

Observe que quando o formulário é aberto, os 5 (cinco) primeiros botões vêm todos habilitados. Isto não é correto, pois, se clicarmos no botão BtnGravar ocorrerá um erro, visto que, a Query de aluno não se

encontra no estado de edição ou inclusão. Veja os principais estados que um DataSet pode assumir na figura

4.

principais estados que um DataSet pode assumir na figura 4. Figura 4 - Estados da Tabela
principais estados que um DataSet pode assumir na figura 4. Figura 4 - Estados da Tabela

Figura 4 - Estados da Tabela

Autor: Profº Cláudio Portes (profclaudioportes@gmail.com) - 4 de 5

32. Construa para o evento OnStateChange do componente DtsAluno o código abaixo:

BtnIncluir.Enabled := QryAluno.State = dsBrowse; BtnEditar.Enabled := ((BtnIncluir.Enabled) and (QryAluno.RecordCount > 0)); BtnExcluir.Enabled := ((BtnIncluir.Enabled) and (QryAluno.RecordCount > 0)); BtnCancelar.Enabled := not BtnIncluir.Enabled; BtnGravar.Enabled := not BtnIncluir.Enabled; NvgCadastro.Enabled := BtnIncluir.Enabled; TbsCadastro.Enabled := QryAluno.State in [dsEdit, dsInsert];

33. Faça o mesmo para o DtsAlunoCurso, pois, os botões da região detalhe funcionam da mesma forma.

34. Logo após, faça com que o evento AfterScroll do QryAluno chame o procedimento OnStateChange do DtsAlunoCurso acrescentando o código:

DtsAlunoCursoStateChange(nil);

35. Faça o código de validação de chave primária duplicada tal como foi feito nos formulários anteriores.

Autor: Profº Cláudio Portes (profclaudioportes@gmail.com) - 5 de 5