PROGRAMAÇÃO DE COMPUTADORES II PROFESSOR RAFAEL BARRETO TABELAS RELACIONADAS: CAPTURANDO VALOR DE OUTRA TABELA ATRAVÉS DE DBGRID Imagine que estejamos trabalhando com tabelas relacionadas e que, em determinado momento, você necessite de valores que estão em outra tabela que não a que está sendo usada no cadastro. Tomaremos como exemplo as seguintes tabelas: Como podemos perceber, para se cadastrar um produto é necessário que haja um setor cadastrado e, no momento do cadastro de um produto, pelo relacionamento, teríamos que digitar um código de setor. O grande problema é quando temos muitos setores cadastrados. Possíveis soluções seriam: 1. Criar um relatório com os setores para consulta; 2. Criar uma tela de consulta que seria aberta para a memorização do código a ser digitado; Em caso de esquecimento, a consulta teria que ser aberta novamente; 3. Popular uma combobox com os códigos (prática comum), mas a combobox mostraria apenas os códigos; Nossa intenção aqui é ter certeza que estamos escolhendo o código correto para o setor, portanto, visualizar o código e respectivo setor ao mesmo tempo minimizaria a possibilidade de erros. Esta é a solução proposta neste exemplo. Criaremos um banco de dados de exemplo, com as tabelas conforme a ilustração acima; Faremos a configuração do ODBC; Abriremos o Delphi e criaremos um DataModule conforme o exemplo a seguir:
Teremos aqui um DataSource e um objeto Table para cada tabela criada. Criaremos então um formulário como no exemplo a seguir: O DBNavigator será conectado ao objeto TB_PRODUTO, afinal, queremos controlar o cadastro de um produto. Fica óbvio aqui que os DBEdits deste formulário também são do objeto TB_PRODUTO. O DBGrid, por sua vez ficará conectado ao objeto TB_SETOR, pois nossa intenção é consultar um setor, mostrando também seu respectivo nome e sua propriedade Visible será True, para que o mesmo só apareça no momento da busca de código e seu nome será DBG_SETOR. Selecionaremos agora a DBEdit do código do setor, acessando em Events o evento OnClick, onde colocaremos a seguinte linha de código: procedure TFrmDados.DBEdit3Click(Sender: TObject); end; DBG_SETOR.Visible:=True; Ou seja, ao clicar na DBEdit responsável pelo cadastro de código, nossa DBGrid se tornará visível, mostrando todos os setores cadastrados.
Para uma melhora visual, posicionaremos a DBGrid acima da DBEdit do código e teremos este resultado: Codificaremos também a DBEdit responsável pelo nome do produto usando a função UpperCase do Delphi, para garantir que qualquer coisa que for digitada seja convertida para maiúsculo, padronizando assim a digitação. O código será colocado no evento OnExit e será: procedure TFrmDados.DBEdit1Exit(Sender: TObject); end; DBEdit1.Text:=UpperCase(DBEdit1.Text); Consideramos aqui que DBEdit1 é a DBEdit do nome do produto. E, como o código está em OnExit, significa que a conversão é feita após a digitação e quando mudamos para a próxima DBEdit. Finalmente codificaremos o DBGrid para fazer a seleção do código desejado. Selecionaremos o DBGrid e em Events vamos codificar o evento OnCellClick (clique na célula) com os comandos a seguir: procedure TFrmDados.DBG_SETORCellClick(Column: TColumn); Var ESCOLHIDO:String; DBG_SETOR.Visible:=False; ESCOLHIDO:=DBG_SETOR.SelectedField.AsString; DBEdit3.Text:=ESCOLHIDO;
end; ETEC DR. EMÍLIO HERNANDEZ AGUILAR Criamos aqui uma variável local ESCOLHIDO para armazenar o conteúdo da célula clicada; Deixamos o DBGrid invisível novamente; Colocamos o valor da célula na variável ESCOLHIDO; Atribuímos à DBEdit3 (responsável pelo código do setor) o valor da variável ESCOLHIDO. O resultado é o mostrado a seguir: Clicamos no botão + (novo registro) Para testar, cadastraremos um produto com letras minúsculas... Perceba a conversão para maiúsculo automaticamente...
Continue o cadastro normalmente e clique na DBEdit do código de setor para perceber a exibição do DBGrid com os dados. Clique no código correspondente... O código foi selecionado da diretamente da tabela setor, o que garante que o código do setor seja o adequado ao produto cadastrado... CONSIDERAÇÕES FINAIS Este foi um exemplo simples, prático e usual. Porém, pode haver um erro aqui, pois será feita a captura do valor clicado, ou seja, caso cliquemos no nome, captura-se o nome. Há uma alteração a ser feita aqui, caso nossa intenção seja capturar sempre o código, não importando a coluna da grid clicada. Para tanto, devemos fazer a seguinte alteração no código do evento oncellclick: procedure TFrmDados.DBG_SETORCellClick(Column: TColumn); Var ESCOLHIDO:String; DBG_SETOR.Visible:=False; ESCOLHIDO:=DBG_SETOR.columns.items[0].field.text; DBEdit3.Text:=ESCOLHIDO; Neste caso, items[0] representa a primeira coluna da grid, que é código, assim sendo, caso mudemos para items[1] pegamos a segunda coluna, que é o nome, e assim por diante. Como nossa intenção é capturar sempre o código, manteremos a coluna 0. Procure agora praticar com exemplos que utilizam mais de uma tabela.