Identificar qual o campo de uma table q está sendo alterado
Preciso saber qual o campo que está sendo alterado e no momento e abortar a alteração, exemplo:
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
begin
if {aqui a forma de indentificar o campo q não pode ser alterado}Then
begin
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
SysUtils.Abort;
end;
end;
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
begin
if {aqui a forma de indentificar o campo q não pode ser alterado}Then
begin
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
SysUtils.Abort;
end;
end;
Janete
Curtidas 0
Respostas
Steve_narancic
21/06/2006
Não é mais facil colocar os campos que você não quer alterar como ReadOnly
GOSTEI 0
Janete
21/06/2006
Não é mais facil colocar os campos que você não quer alterar como ReadOnly
É q esse campo as vezes nem sempre pode ser alterado, tenho um outro if antes pra verificar uma tabela q é vinculada com essa q está editando, e se ela estiver fazia pode alterar esse campo se não não pode, e é somente esse campo.
GOSTEI 0
Marco Salles
21/06/2006
É q esse campo as vezes nem sempre pode ser alterado, tenho um outro if antes pra verificar uma tabela q é vinculada com essa q está editando, e se ela estiver fazia pode alterar esse campo se não não pode, e é somente esse campo.
Acho que ao inves de usar o SysUtils.Abort voce deve gerar uma execeção.. Pode ate colocar um bloco try Finally
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
var
negado;Boolean;
begin
negado:=False;
try
if {aqui a forma de indentificar o campo q não pode ser alterado}Then
begin
negado:=True;
raise exception.Create();
end;
finally
if negado Then
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
end;
end;GOSTEI 0
Janete
21/06/2006
[quote:bcf54ef4f0=´Marco Salles´]
Acho que ao inves de usar o SysUtils.Abort voce deve gerar uma execeção.. Pode ate colocar um bloco try Finally
[/quote:bcf54ef4f0]
Tudo bem, mas continuo com o mesmo problema de como indentificar o campo que eu não quero q seja alterado em algum momentos:
if {aqui a forma de indentificar o campo q não pode ser alterado}Then // eu preciso saber nesse if o que colocar pra saber se é o campo q eu quero q fique ou não desabilidado.
É q esse campo as vezes nem sempre pode ser alterado, tenho um outro if antes pra verificar uma tabela q é vinculada com essa q está editando, e se ela estiver fazia pode alterar esse campo se não não pode, e é somente esse campo.
Acho que ao inves de usar o SysUtils.Abort voce deve gerar uma execeção.. Pode ate colocar um bloco try Finally
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
var
negado;Boolean;
begin
negado:=False;
try
if {aqui a forma de indentificar o campo q não pode ser alterado}Then
begin
negado:=True;
raise exception.Create();
end;
finally
if negado Then
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
end;
end;Tudo bem, mas continuo com o mesmo problema de como indentificar o campo que eu não quero q seja alterado em algum momentos:
if {aqui a forma de indentificar o campo q não pode ser alterado}Then // eu preciso saber nesse if o que colocar pra saber se é o campo q eu quero q fique ou não desabilidado.
GOSTEI 0
Weber
21/06/2006
Crie uma variavel privada
cProduto: String
quando o edit receber o texto faça a variavel receber também
na hora de salvar
if Edit.Text <> cProduto then
ShowMessage(´Você não pode alterar´);
cProduto: String
quando o edit receber o texto faça a variavel receber também
na hora de salvar
if Edit.Text <> cProduto then
ShowMessage(´Você não pode alterar´);
GOSTEI 0
Marco Salles
21/06/2006
Tudo bem, mas continuo com o mesmo problema de como indentificar o campo que eu não quero q seja alterado em algum momentos:
if {aqui a forma de indentificar o campo q não pode ser alterado}Then // eu preciso saber nesse if o que colocar pra saber se é o campo q eu quero q fique ou não desabilidado.
Ora , eu pensei que a condição para permitir ou não a edição , voce a priori ja tinha colocado em citaçoes anteriores as condiçoes para que a edição seje ou não permitida
verificar uma tabela q é vinculada com essa q está editando, e se [b:9e3ebd20ae]ela estiver fazia pode alterar esse campo se não não pode[/b:9e3ebd20ae], e é somente esse campo.
eu pensei que não se trata de saber identificar ou não o campo , mas sim
gerar uma exceção na hora da edição , caso a condição citada por voce não seje atendida....
Porem caso voce queira saber se o campo esta sendo alterado , pode usar o evento OnChange do Tfield
procedure TForm1.Table1NomeDoCampoChange(Sender: TField); begin //Aqui voce fica sabendo quando este campo esta sendo alterado //aqui voce testa se esta no modo de edição ou Inderção //aqui voce gera uma exceção quando for conveniente end;
GOSTEI 0
Cpd_arim
21/06/2006
veja se resolve seu problema:
query1.close;
query1.sql.clear;
query1.sql.add(´select * from produto´);
query1.sql.add(´where codigo =´ #39+edit1.text+39);
query.open;
if query1.recordcount > 0 then
begin
showmessage(´Voce nao pode alterar este produto´);
qq dúvida cpd_arim@hotmail.com
query1.close;
query1.sql.clear;
query1.sql.add(´select * from produto´);
query1.sql.add(´where codigo =´ #39+edit1.text+39);
query.open;
if query1.recordcount > 0 then
begin
showmessage(´Voce nao pode alterar este produto´);
qq dúvida cpd_arim@hotmail.com
GOSTEI 0
Janete
21/06/2006
veja se resolve seu problema:
query1.close;
query1.sql.clear;
query1.sql.add(´select * from produto´);
query1.sql.add(´where codigo =´ #39+edit1.text+39);
query.open;
if query1.recordcount > 0 then
begin
showmessage(´Voce nao pode alterar este produto´);
qq dúvida cpd_arim@hotmail.com
Estou usando banco Paradox e Table.
GOSTEI 0
Cpd_arim
21/06/2006
vc não precisa mudar, use uma query apenas para fazer este tratamento.
GOSTEI 0
Janete
21/06/2006
Não resolveu meu caso totalmente, mas provisóriamente estou fazendo o seguinte, estou colocando no evento DrawColumnCell do dbgrid a verificação q desejo e fico habilidando a coluna toda sempre q o usuario passar ou clicar nela, é que mudo de cor o dbgrid qdo o readonly de alguma coluna está true para diferenciar das outras, e assim fica mudando a cor da coluna inteira conforme vai passando pelo dbgrid.
if (TbItens.RecordCount <> 0)Then //essa table é vinculada com a
//tabela em uso
DBGrid1.Columns[1].ReadOnly:=true
else
DBGrid1.Columns[1].ReadOnly:=False;
Mas se alguem descobrir como fazer uma verificação de um campo exato de uma tabela, me avisa. Obrigado. :)
if (TbItens.RecordCount <> 0)Then //essa table é vinculada com a
//tabela em uso
DBGrid1.Columns[1].ReadOnly:=true
else
DBGrid1.Columns[1].ReadOnly:=False;
Mas se alguem descobrir como fazer uma verificação de um campo exato de uma tabela, me avisa. Obrigado. :)
GOSTEI 0
Marco Salles
21/06/2006
Mas se alguem descobrir como fazer uma verificação de um campo exato de uma tabela, me avisa. Obrigado.
Ja disse , evento onchange do tfield
Porem caso voce queira saber se o campo esta sendo alterado , pode usar o evento OnChange do Tfield
GOSTEI 0
Janete
21/06/2006
[quote:fea20e0d6f=´Marco Salles´]
Ja disse , evento onchange do tfield
Já tentei isso tb, mas não deu certo pois ele só passa no evento depois q já digitou e mesmo eu abortando a edição ele não volta como estava antes.
Mas se alguem descobrir como fazer uma verificação de um campo exato de uma tabela, me avisa. Obrigado.
Ja disse , evento onchange do tfield
Porem caso voce queira saber se o campo esta sendo alterado , pode usar o evento OnChange do Tfield
[/quote:fea20e0d6f]Já tentei isso tb, mas não deu certo pois ele só passa no evento depois q já digitou e mesmo eu abortando a edição ele não volta como estava antes.
GOSTEI 0
Marco Salles
21/06/2006
acho que o que voce quer é muito fácil. nos é que estamos desviando o foco
voce disse que :
então voce deve colocar o campo como readOnly como true
mas voce também disse ;
tem muitas maneiras de se fazer isto , pode ser no evento BeforeEdit da deu DataSet , pode ser no OnEnter do seu DataControl...
Veja um exemplo usando o DataSet
voce disse que :
só passa no evento depois q já digitou
então voce deve colocar o campo como readOnly como true
mas voce também disse ;
e se ela estiver fazia pode alterar esse campo se não não pode, e é somente esse campo.
Logo no meu entendimento voce deve criar uma logica que coloque este campo como [b:12a41832db]ReadOnly:=True [/b:12a41832db]quando for conveniente e coloca-lo com o [b:12a41832db]ReadOnly como false [/b:12a41832db]na sua necessidade
tem muitas maneiras de se fazer isto , pode ser no evento BeforeEdit da deu DataSet , pode ser no OnEnter do seu DataControl...
Veja um exemplo usando o DataSet
procedure TForm1.Table1BeforeEdit(DataSet: TDataSet); begin if suaLogiga Then begin table1data.ReadOnly:=true ;//não permite a edição //mensagem...e bla bla end else table1data.ReadOnly:=False; //permite a edição end;
GOSTEI 0
Ajnet
21/06/2006
foi citado:
fim teste
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
begin
if Then
begin
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
SysUtils.Abort;
end;
end;
fim teste
GOSTEI 0
Marco Salles
21/06/2006
foi citado:
Janete escreveu:
procedure TFrmCaddastro.Table1BeforeEdit(DataSet: TDataSet);
begin
if Then
begin
messagedlg(´Esse produto não pode ser alterado. ´,mterror,[mbok],0);
SysUtils.Abort;
end;
end;
fim teste
[b:77bf22820c]é eu não dei conta do inicio [/b:77bf22820c] :oops: :oops: ... logicamente que não serve
então vamos passar uma [b:77bf22820c]borracha[/b:77bf22820c] ...
a janete não disse , mas ´supando´ que se trata de um [b:77bf22820c]dbgrid [/b:77bf22820c], ela também pode fazer assim que dá:
procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if condição de não permitir a edição then begin if (dbgrid1.SelectedField = table1data)and(key <> 37) then begin key:=0; //mensagem end end end;
P:S Nesse exemplo usai um TFiel TableData para fazer o teste e o resultado parece ser o que ele quer...
P:S [b:77bf22820c]no caso de um DbEdit fica ainda mais fácil[/b:77bf22820c]
GOSTEI 0