Fórum só edita o primeiro registro #296809

23/09/2005

0

Pessoal esse procedire abaixo está com um problema...
ele só edita o primeiro registro da tabela em questão, se alguem conseguir me ajudar por favor postaem aqui....

estarei informando o trecho do código que ocorre o problema

procedure TMateriais.Btn_SalvarClick(Sender: TObject);

begin
if Materiais.Edit_Nome.Text = ´´ then
ShowMessage(´Campo "Nome" está vazio, por favor verifique´)
else
begin
DM.qry_Materiais.insert;

DM.qry_Materiais.FieldByName(´Codigo´).AsInteger   := StrToInt(Edit_Codigo.Text);
DM.qry_Materiais.FieldByName(´Nome´).AsString      := Edit_Nome.text;
DM.qry_Materiais.FieldByName(´Referencia´).AsString:= Edit_codigoR.text;
DM.qry_Materiais.FieldByName(´Tipo´).AsString      := Combo_Tipo.text;
DM.qry_Materiais.FieldByName(´Quantidade´).AsString:= Edit_Qtdade.text;
DM.qry_Materiais.FieldByName(´Autor´).AsString     := Combo_autor.text;
DM.qry_Materiais.FieldByName(´Editora´).AsString   := Combo_Editora.text;
DM.qry_Materiais.FieldByName(´Sinopse´).AsString   := Memo_Sinopse.Lines.Text;
DM.qry_Materiais.FieldByName(´Area´).AsString      := Combo_Area.text;
DM.qry_Materiais.FieldByName(´Exemplar´).AsString  := Edit_Exemplar.text;
DM.qry_Materiais.FieldByName(´Volume´).AsString    := Edit_Volume.text;
DM.qry_Materiais.FieldByName(´Local´).AsString     := Edit_LocalEdicao.text;
DM.qry_Materiais.FieldByName(´Ano_Edicao´).AsString:= Edit_AnoEdicao.text;
DM.qry_Materiais.FieldByName(´Edicao´).AsString    := Edit_Edicao.text;

DM.qry_Materiais.Post;
DM.qry_Materiais.ApplyUpdates;

{************SÓ TA EDITANDO A PRIMEIRA LINHA DA TABELA************}

 // edita a quantidade de materiais cadastrados dentro de uma area, na tabela areas
DM.qry_ArNovo.Close;
DM.qry_ArNovo.SelectSQL.Clear;
DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´);
DM.qry_ArNovo.Params[0].AsString;
DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´;
Dm.qry_ArNovo.open;

DM.Qry_ArNovo.Edit;
DM.Qry_ArNovoUCOD.AsInteger := StrToint(RetornaDecimal(Edit_CodigoR.Text));
DM.Qry_ArNovo.Post;
DM.Qry_ArNovo.ApplyUpdates;
            
            {**********************************************************************}
end;
end;



Mahdak

Mahdak

Responder

Posts

23/09/2005

Rjun

Do jeito que está, é só para editar a primeira linha mesmo. O que você está querendo fazer?


Responder

Gostei + 0

23/09/2005

Emilio

Juliano;

Vc temque percorrer a tabela. vc pode fazer usando o seguinte codigo:
while not nomeTabela.eof do //enquanto a tabela não chegar ao ultimo registro
begin
//aqui vc edita os valores
nomeTabela.next; //proximo registro
end;

Espero ter ajudado

Emílio


Responder

Gostei + 0

23/09/2005

Mahdak

Juliano; Vc temque percorrer a tabela. vc pode fazer usando o seguinte codigo: while not nomeTabela.eof do //enquanto a tabela não chegar ao ultimo registro begin //aqui vc edita os valores nomeTabela.next; //proximo registro end; Espero ter ajudado Emílio


Emilio o trecho com problema é esse:

{************SÓ TA EDITANDO A PRIMEIRA LINHA DA TABELA************} 

 // edita a quantidade de materiais cadastrados dentro de uma area, na tabela areas 
DM.qry_ArNovo.Close; 
DM.qry_ArNovo.SelectSQL.Clear; 
DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´); 
DM.qry_ArNovo.Params[0].AsString; 
DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´; 
Dm.qry_ArNovo.open; 

DM.Qry_ArNovo.Edit; 
DM.Qry_ArNovoUCOD.AsInteger := StrToint(RetornaDecimal(Edit_CodigoR.Text)); 
DM.Qry_ArNovo.Post; 
DM.Qry_ArNovo.ApplyUpdates; 
            
            {**********************************************************************} 


1. no select acima eu pesso que ele posicione no registro da tabela que tenha o mesmo nome que ´Combo_Area.text´.

2. coloco em seguida a tabela em modo de edição em tal registro e edito ela...

essa seria a minha lógica... mas acho que está errada neh?
então voce me sugere que eu fassa assim: ??

while not DM.Qry_ArNovo.eof do

begin
DM.Qry_ArNovo.Edit; 
DM.Qry_ArNovoUCOD.AsInteger := StrToint(RetornaDecimal(Edit_CodigoR.Text)); 
DM.Qry_ArNovo.Post; 
DM.Qry_ArNovo.ApplyUpdates;

DM.Qry_ArNovo.next; //proximo registro



mas esse código nao editaria registro por registro???
eu gostaria de editar apenas o registro da tabela que tenha o mesmo nome que ´Combo_Area.text´.

Abraços!


Responder

Gostei + 0

23/09/2005

Rjun

Note que a query vai conter o resultado da instrução SELECT que você utilizou.


Responder

Gostei + 0

23/09/2005

Emilio

é como o Rjun falou....


Responder

Gostei + 0

23/09/2005

Mahdak

Note que a query vai conter o resultado da instrução SELECT que você utilizou.


Isso mesmo Rogério, era ai que eu queria chegar... entao a minha query teria que conter o regitro que eu escolhece no ComboBox, porem nao é isso que está acontecendo, por que ela simplesmente nao edita outro registro a nao ser o primeiro registro da tabela...

alguma possivel solução?

[]´s


Responder

Gostei + 0

23/09/2005

Rjun

Sua cláusula SQL irá selecionar todos os registros em que Area for igual ao resultado do combobox. O loop será feito nesses registros e não nos registros da tabela. Do jeito que você fez ele só faz a alteração no primeiro registro.


Responder

Gostei + 0

23/09/2005

Mahdak

Sua cláusula SQL irá selecionar todos os registros em que Area for igual ao resultado do combobox. O loop será feito nesses registros e não nos registros da tabela. Do jeito que você fez ele só faz a alteração no primeiro registro.


voce poderia me dar um exemplo de como ajeitar isso entao, por que eu achava que:

´select * from AREA where NOME Like:Consulta ´
Consulta = Combobox.text

queria dizer: selecione todos os campos da tabela area quando o campo NOME, for igual a string contida no ComboBox....
fiquei meio perdidão agora....
[]´s


Responder

Gostei + 0

23/09/2005

Rjun

Mas foi isso que eu disse. So que você esta alterando apenas um registro. Para você alterar todos os registros que você selecionou, você precisar fazer o que o [b:fed4a1bb3d]emilio[/b:fed4a1bb3d] disse. Faça um loop com o while.


Responder

Gostei + 0

23/09/2005

Martins

Mas foi isso que eu disse. So que você esta alterando apenas um registro. Para você alterar todos os registros que você selecionou, você precisar fazer o que o emilio disse. Faça um loop com o while.


isso mesmo, vc vai digamos filtrar os registros q satisfaçam a condição desejada e depois basta fazer um loop, então vc vai editar todos os registro.


Responder

Gostei + 0

26/09/2005

Mahdak

[quote:6b145152b6]Mas foi isso que eu disse. So que você esta alterando apenas um registro. Para você alterar todos os registros que você selecionou, você precisar fazer o que o emilio disse. Faça um loop com o while.


isso mesmo, vc vai digamos filtrar os registros q satisfaçam a condição desejada e depois basta fazer um loop, então vc vai editar todos os registro.[/quote:6b145152b6]

Martins, nao sei se estou me expresando mal, ou se estou viajando na maionese mesmo...

eu nao to querendo editar todos os registros da tabela, mas sim aquele registro da tabela ´area´ onde o ´Nome´ seja igual a string contida no ComboBox...
´select * from AREA where NOME Like:Consulta ´
Consulta := Combobox.text;


Por desencargo de consciencia tentei o sugerio pelos amigos de fazer um loop, e tambem nao deu certo... ele nao edita o registro escolhido no Combobox, mas sim somente o primeiro registro da tabela. Vou postar aqui como fiz o loop....

// edita a quantidade de materiais cadastrados dentro de uma area, na tabela areas
DM.qry_ArNovo.Close;
DM.qry_ArNovo.SelectSQL.Clear;
DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´);
DM.qry_ArNovo.Params[0].AsString;
DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´;
Dm.qry_ArNovo.open;

while not DM.Qry_ArNovo.eof do 
begin
DM.Qry_ArNovo.Edit;
DM.Qry_ArNovoUCOD.AsInteger := StrToint(RetornaDecimal(Edit_CodigoR.Text));
DM.Qry_ArNovo.Post;
DM.Qry_ArNovo.ApplyUpdates;
DM.Qry_ArNovo.next;
end;


entao?


Responder

Gostei + 0

26/09/2005

Rjun

Altere a linha onde você passa o parâmetro. Deixe-a assim:

DM.qry_ArNovo.ParamByName(´Consulta´).AsString := QuotedStr(´¬´+combo_area.Text+´¬´);



Responder

Gostei + 0

26/09/2005

Martins

Altere a linha onde você passa o parâmetro. Deixe-a assim:
DM.qry_ArNovo.ParamByName(´Consulta´).AsString := QuotedStr(´¬´+combo_area.Text+´¬´);


Se ainda não funcionar, faz o seguinte, vc manda o banco de dados e nós montamos um exemplo funcional, aí vc só faz as adaptações, pq tá suado esse negócio.
:wink:


Responder

Gostei + 0

26/09/2005

Mahdak

Seguinte amigos, consegui fazer ele percorrer a tabela, achar o registro que quero e tal...

Coloco a tabela em modo de edição, o sistema passa por todas as linhas até editar a tabela e cadastrar o material... PORÉMMMM, nao está acontecendo a ediçãon do material agora. ja troquei os componentes, ja refiz os códigos dos componentes, emfim, aquele problema de achar o registro ja passou, agora nao to conseguindo editar...

A ideia é a seguinte: O usuario aperta no botao ´novo´, que vai gerar um código de referencia pro material (que está linkado com a tabela areas e a tabela livros) e depois de cadastrar o material ele clica no botao salvar... vou postar o procedure dos dois botoes aqui pra voces darem uma analizada. Se precisarem do banco de dados e da UNIT em questao disponibilizo sim... jpxst@hotmail.com;´msn´...

procedure TMateriais.Btn_NovoClick(Sender: TObject);
var
Cod1,cod2,cod3  : integer;

begin
if combo_area.Text = ´´ then
begin
ShowMessage(´O campo "Área" está vazio, por favor escolha uma Área.´);
end
else
begin
// Gera o Código do material
DM.qry_MatCod.Open;
DM.qry_MatCod.SelectSQL.Clear;
DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS´);
dm.qry_MatCod.open;
cod1 := dm.qry_MatCod.Fields[0].AsInteger;
if cod1 = null then
begin
cod1:=0;
end
else
cod1:=cod1;
Edit_Codigo.Text := FloatToStr(cod1);


 // esse select seleciona o numero que vai antes o ponto (o código da area escolhida)
DM.qry_ArNovo.Close;
DM.qry_ArNovo.SelectSQL.Clear;
DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´);
DM.qry_ArNovo.Params[0].AsString;
DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´¬´+combo_area.Text+´¬´;
Dm.qry_ArNovo.open;
cod2 := DM.Qry_ArNovoCODIGO.AsInteger;
Cod3 := DM.Qry_ArNovoUCOD.AsInteger + 1;

if cod3 = null then
begin
cod3:=0;
end
else
cod3:=cod3;
edit_CodigoR.Text := IntToStr(Cod2) + ´.´ + IntToStr(cod3);
end;
end;


Esse procedure está ok, o problema vem no começo do código do procedure seguinte(nao está editando de fato na tabela):

procedure TMateriais.Btn_SalvarClick(Sender: TObject);
Var
Cod: Integer;
Nome: String;
begin
{*********o problema está aqui*****}    
                                          
while not DM.Qry_ArNovo.eof do
begin
Cod  := DM.Qry_ArNovoCODIGO.AsInteger;
Nome := DM.Qry_ArNovoNOME.AsString;
DM.Qry_ArNovo.Edit;
DM.Qry_ArNovoCODIGO.AsInteger := Cod;
DM.Qry_ArNovoNOME.AsString    := Nome;
DM.Qry_ArNovoUCOD.AsInteger   := StrToint(RetornaDecimal(Edit_CodigoR.Text));
DM.Qry_ArNovo.Post;
DM.Qry_ArNovo.ApplyUpdates;
DM.Qry_ArNovo.next;
end;

{****************Fim do pobrema**************************}


// aqui ta tudo tranquilo
if Materiais.Edit_Nome.Text = ´´ then
ShowMessage(´Campo "Nome" está vazio, por favor verifique´)
else
begin
DM.qry_Materiais.insert;

DM.qry_Materiais.FieldByName(´Codigo´).AsInteger   := StrToInt(Edit_Codigo.Text);
DM.qry_Materiais.FieldByName(´Nome´).AsString      := Edit_Nome.text;
DM.qry_Materiais.FieldByName(´Referencia´).AsString:= Edit_codigoR.text;
DM.qry_Materiais.FieldByName(´Tipo´).AsString      := Combo_Tipo.text;
DM.qry_Materiais.FieldByName(´Quantidade´).AsString:= Edit_Qtdade.text;
DM.qry_Materiais.FieldByName(´Autor´).AsString     := Combo_autor.text;
DM.qry_Materiais.FieldByName(´Editora´).AsString   := Combo_Editora.text;
DM.qry_Materiais.FieldByName(´Sinopse´).AsString   := Memo_Sinopse.Lines.Text;
DM.qry_Materiais.FieldByName(´Area´).AsString      := Combo_Area.text;
DM.qry_Materiais.FieldByName(´Exemplar´).AsString  := Edit_Exemplar.text;
DM.qry_Materiais.FieldByName(´Volume´).AsString    := Edit_Volume.text;
DM.qry_Materiais.FieldByName(´Local´).AsString     := Edit_LocalEdicao.text;
DM.qry_Materiais.FieldByName(´Ano_Edicao´).AsString:= Edit_AnoEdicao.text;
DM.qry_Materiais.FieldByName(´Edicao´).AsString    := Edit_Edicao.text;

DM.qry_Materiais.Post;
DM.qry_Materiais.ApplyUpdates;

ShowMessage(´Material Cadastrado Com Sucesso.´);
end;
end;



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar