Fórum como faco para incluir, excluir alterar registro usando ADO #307851
04/01/2006
0
gente estou com dificuldades de fazer essas procedimentos basicos.
precisava inicialmente de fazer uma inclusao no banco com 3 tabelas, de preferencia sem usar o dbnavigator. Gostaria se possivel de um passo-a-passo, porque tenho pego alguns tutoriais, mas mesmo assim cada um faz de um jeito diferente.
agradeco a todos
carlao
Cjs6331
Curtir tópico
+ 0Posts
06/01/2006
Spiritwwwalker
Sou ´programador Delphi´ há cerca de 3 semanas, portanto não me recrimine se eu mencionar alguma tolice.
Presumindo-se que você já conseguiu estabelecer uma conexão ADO à sua base de dados, basta utilizar consultas SQL para executar as operações pretendidas. Para uma melhor compreensão, siga o roteiro abaixo, o qual é válido para uma conexão a uma tabela de um banco de dados do MS Access 97 denominada tblMunicipios, a qual é composta de 3 campos: ID, Municipio e UF (Unidade da Federação ou Estado). Sendo assim, a partir do Access, crie uma tabela com uma estrutura similar e acrescente alguns registros, por exemplo:
ID Municipio UF
1 São Paulo SP
2 Campo Grande MS
3 Bernardino de Campos SP
De volta ao Delphi, crie um Form e insira nele os seguintes componentes:
- um ADOConnection (que chamaremos de ADOConnection1);
- um ADOQuery (que chamaremos de ADOQuery1);
- um DataSource (que chamaremos de DataSource1).
Para desencadear as ações de manipulação de registros e acompanhar os resultados, também insira no Form os componentes abaixo:
- um DBGrid (que chamaremos de DBGrid1);
- dois Edits (um denominado txtMunicipio e o outro txtUF);
- três Buttons (denominados cmdNovo, cmdEditar e cmdExcluir).
Em seguida, construa as strings de conexão dos componentes ADOConnection1 e ADOQuery1 (o Delphi fará isso para você com facilidade). Na propriedade SQL do ADOQuery1, digite a seguinte instrução: SELECT * FROM tblMunicipios ORDER BY Municipio
Defina a propriedade Active do ADOQuery1 para True. Em seguida, na propriedade DataSet do DataSource1, especifique o componente ADOQuery1. Na propriedade DataSource do DBGrid1 selecione DataSource1. Se tudo correr bem, o DBGrid passará a exibir os registros da tabela tblMunicipios.
Falta, agora, os códigos dos botões de comando para manipulação dos registros. Antes disso, declare uma variável do tipo LongInt (que chamaremos de lngID) e, no evento OnCellClick do DBGrid1, faça com que a variável recém criada receba o valor do ID do registro selecionado, bem como os Edits sejam preenchidos automaticamente de acordo a linha selecionada:
lngID := DBGrid1.Fields[0].AsInteger;
txtMunicipio.Text := DBGrid1.Fields[1].Text;
txtUF.Text := DBGrid1.Fields[2].Text;
Com isso, saberemos exatamente qual registro manipular em operações de Edição e Exclusão (lembre-se que os campos do tipo Autonumeração são exclusivos).
Prosseguindo, no evento OnClick do botão de comando cmdNovo, acrescente os seguintes códigos:
// a consulta é fechada momentaneamente
ADOQuery1.Close;
// a declaração SQL da consulta é alterada de acordo com o pretendido (no caso, o acréscimo de um novo registro)
ADOQuery1.SQL.Text := ´INSERT INTO tblMunicipios (Municipio, UF) VALUES (:Municipio, :UF)´;
// os parâmetros são definidos de acordo com o conteúdo dos componentes Edit
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtMunicipio.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
// a consulta é executada
ADOQuery1.ExecSQL;
// a declaração SQL da consulta é novamente alterada para o sua sintaxe original
ADOQuery1.SQL.Text := ´SELECT * FROM tblMunicipios ORDER BY Municipio´;
// o DBGrid é atualizado
ADOQuery1.Active := False;
ADOQuery1.Active := True;
No evento OnClick do botão de comando cmdEditar, acrescente os seguintes códigos (não vou comentar dessa vez porque a codificação é muito similar a anterior):
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´UPDATE tblMunicipios SET Municipio = :Municipio, UF = :UF WHERE ID = :ID´;
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtNome.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
ADOQuery1.Parameters.ParamValues[´ID´] := lngID;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := ´SELECT * FROM tblMunicipios ORDER BY Municipio´;
ADOQuery1.Active := False;
ADOQuery1.Active := True;
No evento OnClick do botão de comando cmdExcluir, acrescente os seguintes códigos:
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´DELETE FROM tblMunicipios WHERE ID = :ID´;
ADOQuery1.Parameters.ParamValues[´ID´] := lngID;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := ´SELECT * FROM tblMunicipios ORDER BY Municipio´;
ADOQuery1.Active := False;
ADOQuery1.Active := True;
Acho que é isso.
É claro que outros recursos devem ser implementados, como checar, antes da inclusão de um novo registro, se ele já não existe; ou indagar ao usuário se ele deseja realmente excluir o dado selecionado; ou, ainda, verificar se o registro escolhido para edição efetivamente sofreu alguma modificação, sem contar que não é nada saudável manter todos os componentes ativos ao mesmo tempo (aliás, um botão de comando Cancelar também seria bem vindo). Mas, naturalmente, isso vai depender das necessidades de cada desenvolvedor.
Espero ter ajudado. Qualquer dúvida, é culpa da Borland (risos).
Gostei + 0
06/01/2006
Cjs6331
antes de tudo agradeco a atencao que vc deu ok.
eu imprimi a sua resposta para poder ler com calma mas pelo jeito era esse, o ponto inicial que precisava para terminar o meu projeto que ja tem uma parte feita (banco).
por favor me envie um e-mail para que eu possa lhe enviar um projeto e esta bem simples e talvez possa te ajudar tambem ( uma amigo que fez).
Como eu programava em vb, eu tenho algumas barreiras com relacao ao delphi, mas estou super empenhando em aprender. No vb eu usava muito o debug e ai facilitava a compreensao dos codigos de terceiros. No delphi ainda nao consegui usar o debug com eficiencia.
fico a disposicao
carlao - cjs6331@hotmail.com
Gostei + 0
07/01/2006
Cjs6331
ja estou pegandu o jeito do negocio, mas ta dando um erro que não consegui identificar.
na parte editar ta dando um erro de parameter id not found.
gostaria de saber onde estou errando. Eu acho que não estou sabendo declarar a variavel no lugar certo
muito grato
carlao
Gostei + 0
08/01/2006
Spiritwwwalker
Para resolver o problema, declare a variável ´lngID´ logo acima da seção ´implementation´, conforme se segue:
var
lngID : LongInt;
implementation
{$R *.dfm}
Desse modo, ela (a variável) será reconhecida em todo o módulo (creio que é equivalente a uma declaração entre as linhas Option Compare Database e Option Explicit do VBA).
Aguarde contato meu em breve, via e-mail.
Boa sorte.
Gostei + 0
14/01/2006
Cjs6331
mais uma vez obrigado.
mas agora queria mexer no código e fazer o insert em 2 ou mais tabelas. Vc teria algum exemplo?
agradeço a atenção
carlao
cjs6331@hotmail.com (entre em contato por favor)
Gostei + 0
15/01/2006
Spiritwwwalker
Para incluir registros em mais de uma tabela experimente, após a execução da primeira consulta SQL, alterar sua sintaxe definindo uma nova tabela de destino; execute a consulta e, se for necessário, altere a sintaxe novamente para incluir os dados em uma terceira tabela. E assim por diante. Não testei, mas não vejo porque não iria funcionar. Boa sorte.
Gostei + 0
16/01/2006
Cjs6331
vc mais uma vez teria um exemplo?
tipo vamos:
TB_CLIENTE TB_UF TB_OS
id_unico id_unico id_unico
nom_cli desc_uf nr_os
end_cli uf_uf data_os
seria correto essa maneira?
TB_CLIENTE TB_UF TB_OS
nom_cli desc_uf nr_os
end_cli uf_uf data_os
uf_uf
nr_os
e como seria a sql?
muito grato
carlão
Gostei + 0
17/01/2006
Spiritwwwalker
Para fazer o que pretende, reveja o procedimento associado ao evento OnClick do botão de comando cmdNovo:
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´INSERT INTO tblMunicipios (Municipio, UF) VALUES (:Municipio, :UF)´;
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtMunicipio.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := ´SELECT * FROM tblMunicipios ORDER BY Municipio´;
ADOQuery1.Active := False;
ADOQuery1.Active := True;
Observe que a string da consulta SQL é alterada dinamicamente pelo menos 2 vezes. Para incluir um novo registro em mais de uma tabela (no seu caso, em três), creio que basta:
1) criar a string definindo-se o nome da PRIMEIRA tabela de destino;
2) executar a consulta;
3) alterar a sintaxe definindo-se o nome da SEGUNDA tabela de destino;
4) executar a consulta novamente;
5) alterar mais uma vez a string definindo-se como destino a TERCEIRA e última tabela;
6) executar a consulta.
Ficaria algo assim:
// definindo como destino a primeira tabela
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´INSERT INTO NomeDaTabela1 (Municipio, UF) VALUES (:Municipio, :UF)´;
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtMunicipio.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
ADOQuery1.ExecSQL;
// definindo como destino a segunda tabela
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´INSERT INTO NomeDaTabela2 (Municipio, UF) VALUES (:Municipio, :UF)´;
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtMunicipio.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
ADOQuery1.ExecSQL;
// definindo como destino a terceira tabela
ADOQuery1.Close;
ADOQuery1.SQL.Text := ´INSERT INTO NomeDaTabela3 (Municipio, UF) VALUES (:Municipio, :UF)´;
ADOQuery1.Parameters.ParamValues[´Municipio´] := txtMunicipio.Text;
ADOQuery1.Parameters.ParamValues[´UF´] := txtUF.Text;
ADOQuery1.ExecSQL;
ADOQuery1.SQL.Text := ´SELECT * FROM tblMunicipios ORDER BY Municipio´;
ADOQuery1.Active := False;
ADOQuery1.Active := True;
Como eu disse, não testei, mas parece lógico. Naturalmente, estou considerando que todas as tabelas tem a mesma estrutura e as consultas utilizam os mesmos parâmetros mas, de qualquer modo, não seria muito difícil promover pequenas alterações para atender às suas necessidades. Boa sorte.
OBS: meu e-mail é vicexport@bol.com.br
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)