Ajuda - Busca - Membros - Calendário
Versão Completa: [resolvido] Botão Editar
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
Iniciante Programador
Pessoal peguei um exemplo de botões de salvar, excluir, novo e pesquisar na net, mas não consiguo Localizar um de editar como eu faço para fazer um botão de Editar?, gostaria muito que o meu projeto tenho um botão de editar e não ficar editando direto quando os dados estão espostas na janela, tenho um unit de funções onde eu faço as funções do meu projeto e vou ligando nos formularios esse é o exemplo da função alterarregistro que ele me passou com essa eu acho que dá para fazer a ligação com o botão:

QUOTE


procedure alterarregistro (ptabela:string;pcampos, pvalores:tstringlist;pcondicao:string);
var a:integer;instrucaosql:string;
begin
instrucaosql:='update ' + ptabela + ' set ';
for a :=0 to (pcampos.Count-1) do
begin
instrucaoSQL := instrucaosql+pcampos [a]+ '='+ pvalores [a] + ', ' ;
end;
instrucaosql:= copy (instrucaosql,1,length (instrucaosql)-2);

if (pcondicao<>'') then
begin
instrucaosql := instrucaosql + ' where ' + pcondicao;
end;
// showmessage (instrucaosql);
with dtmiza.qryiza do
begin
close;
sql.Clear;
sql.add (instrucaosql);
execsql;
end;


Como eu faço um botão de editar mais ou menos desse tipo.
Micheus
Bom, este já parece ser um exemplo de função para alterar os valores dos campos na tabela - eu diria que é um salvar alterações.

a ideía de clicar me um botão Editar deve ser mais ou menos essa:
- clica no botão editar;
- no evento OnClick do botão, você localiza na tabela o registro a ser editado;
- uma vez localizado, move os valores dos campos para seus edit's no form;
- mostra o form para que seja feita a edição/altração;
- ao final, cancela ou grava as alterações.
Iniciante Programador
Micheus Tem como me dar um exemplo por favor:
Micheus
Do post de onde você tirou essa "encrenca" (link), tem o procedimento LeRegistro que aparentemente faz isto.
É bem verdade que ele ainda chama uma procedure Consultaregistros que vai realmente efetivar a consulta, mas é bem óbvio o que tem lá dentro - dê uma olhada no post que fiz em resposta ao questionamento dele - é praticamente o código que lhe falta.
Iniciante Programador
QUOTE
Micheus Postado Hoje, 14:30
Do post de onde você tirou essa "encrenca" (link), tem o procedimento LeRegistro que aparentemente faz isto.
É bem verdade que ele ainda chama uma procedure Consultaregistros que vai realmente efetivar a consulta, mas é bem óbvio o que tem lá dentro - dê uma olhada no post que fiz em resposta ao questionamento dele - é praticamente o código que lhe falta.
Postado Hoje, 14:18


Foi dele que eu peguei esses exemplos mas eu me falou que não fez o botão editar, por isso que eu estou lhe perguntando.

Do jeito que você sabe fazer como eu posso fazer como o botão editar?
Micheus
QUOTE(Iniciante Programador @ 05/07/2007 - 15:50) *
Foi dele que eu peguei esses exemplos mas eu me falou que não fez o botão editar, por isso que eu estou lhe perguntando.

Do jeito que você sabe fazer como eu posso fazer como o botão editar?

Se você pegou com ele, você deve ter algo parecido com isto em seu código:
CODE
procedure Tfrmalunos.leregistro;
begin
    if consultaregistros('alunos', 'codigo, nome, cpf, processos', 'codigo =' + retorno) then
    begin
      txtmat.text := ledados ('codigo');
      txtnom.text := ledados ('nome');
      txtcpf.text := ledados ('cpf');
      txtpro.text := ledados ('processos');
    end;
    if consultaregistros('usuarios', 'codigo, nome', 'codigo =' + retorno) then
    begin
      txtcodi.text := ledados ('codigo');
      txtusu.text := ledados ('nome');
    end;
end;
O que este procedimento faz é, após encontrar a informação (via função consultaregistros), utilizar o dataset por ela aberto (e que está posicionado no registro desejado) para retornar as informações utilizando uma função chamada ledados, onde ele move o valor do campo lido para o respectivo edit.

O que a função consultaregistros faz é montar uma consulta SQL para procurar na tabela "alunos", os campos "codigo, nome, cpf, processos" com a cláusula where "codigo = <valor em retorno>".

Se você pegou com ele, você deve ter este procedimento em seu código.


Eu não tenho como adivinhar todo o malabarismo que há nos códigos de vocês, mas o conceito é este (denovo):
- em algum momento o usuário seleciona um item para editar (é o que você irá utilizar na cláusula where, ou seja, na procedure é o valor em retorno);
- após selecionado, ao pressionar um botão edit, você chamará o seu LeRegitro, que irá obter todos os dados na tabela e mover para os respectivos Edit;
- ao final da edição, deve haver um botão gravar. É sabendo que você está editando e não inserindo, que você chamará o procedimento que move os valores dos edit's para a lista de campos e valores e chama o procedimento AlteraRegistro.

posso perguntar por que você começou a aprender (já que se diz iniciante) delphi com banco de dados utilizando justo esta abordagem - não utilização de componentes data-aware (os TDB...)?


Abraços
Iniciante Programador
Sei entendi, mas o problema meu que eu quero contornar é assim:

QUOTE

Tenho o programa e quando ele retorna os dados para o meu form ele já retorna podendo editar os campos, mas por exemplo se os dados estão disponiveis na tela e o usuario mudar algo sem perceber vai ficar ruim, o que eu quero é colocar para retornar os dados e que não possa editar e que sim se eu clicar no botão de editar eu possa fazer isso e salvar.



Obrigado Micheus
--felipe --
QUOTE
Do jeito que você sabe fazer como eu posso fazer como o botão editar?


Iniciante Programador você está fazendo de uma simples execução de editar uma coisa muito complicada sacou??
vou te mostrar um jeito mais simples ...

supondo que:
- utilize um DataModule(nomeado dm)
- utilize uma Query(nomeada ClientesQuery), dentro do Datamodule(dm), como Dataset.
- você utilize um DBGrid e nele selecione a linha que deseja editar.
- após encontrada a linha, é clicado em um botão "Editar".
- a tabela a ser editada é "CLIENTES" com os campos "idcliente, nome, idade".




crie um novo form e nomeie como EditarCliForm, e insira nele estes componentes:
- paleta DataControls, 3 DBEdits
- paleta DataAccess, 1 DataSource
- 1 button "Confirma", 1 button "Cancela"

primeiramente, aperte Alt+F11 e de 2 cliques no form que se encontram seus componentes de relação com banco de dados (Datasets, Database etc...), então relacione no componente Datasource a propriedade Dataset com ClientesQuery
relacione todos os 3 DBEdits com o Datasource na propriedade Datasource, e na propriedade DataField:
-DBEdit1=IDCLIENTE
-DBEdit2=NOME
-DBEdit3=IDADE

no button Confirma insira este código:
dm.ClientesQuery.applyupdates; //executa applyupdates (aplicar alterações)
close;

no button Cancela insira apenas close //ao fechar o software automaticamente cancela as alterações no evento OnClose (Ao Fechar);
no evento OnClose:
dm.ClientesQuery.cancel; //cancela as alterações ao fechar, obs: só vai cancelar o que não tiver sido aplicado em (applyupdates)

agora vá ao seu form que lista os clientes (apenas suposição), e no seu botão Editar insira o seguinte código:
CODE
dm.Clientesquery.Edit;
  EditarCliForm := TEditarCliForm.Create(nil);
  EditarCliForm.DBEdit1.enabled:=false; //supondo que o campo IDCLIENTE não possa ser mudado.
  EditarCliForm.ShowModal;
  EditarCliForm.Free;

e tá feito!!

você também pode usar o EditarCliForm para Cadastrar, é so tirar a linha que desativa o DBEdit1 e trocar Edit por Append
assim (logicamente no botão Cadastrar):
CODE
dm.Clientesquery.Append;
  EditarCliForm := TEditarCliForm.Create(nil);
  EditarCliForm.ShowModal;
  EditarCliForm.Free;


fechou!

abraços
Iniciante Programador
Entendi, agora sim, vou mudar algumas coisas aqui, mas obrigado.

Resolvido
Micheus
Aqui estamos nós denovo com problemas de comunicação. huh.gif

Se o Iniciante Programador partiu do exemplo do robinho, que NÃO utilizou componentes data-aware (os tal TDB...), então o exemplo bem detalhado do felipe não vai ajudar muito.

Já se ele utilizou apenas partes do exemplo do robinho, mas trabalhou com componentes data-aware, então seria bom ter informado, por que utilizando eles todo o processo é simples, e a questão de evitar edição acidental fica fácil controlar apenas definindo a propriedade AutoEdit=false do datasouce ligado aos componentes.
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.