Alterar registro em tabela detalhe
Como alterar um registro em uma tabela detalhe, estou usando o delphi 7 com o componente Zeos...
e o banco é FireBird
e o banco é FireBird
Antonio Santos
Curtidas 0
Respostas
Jones Granatyr
26/12/2016
Opa! Uma alternativa é somente fazer uma query com um SQL update. Se puder passar mais detalhes sobre a estrutura fica mais fácil para responder...
GOSTEI 0
Antonio Santos
26/12/2016
Rapaz tenho uma tabela master detalhe para fazer um orcamento.
tudo funcionando direitinho, mas se eu precisar altera um item na tabela detalhe, quando vou gravar dá esse erro
"unable to find record. no key specified"
se eu colocar os campos como pfinkey = true ele gravar, mas se eu for inserir un novo registro da erro.
como faço pra corrigir issto, estou usando os componentes ZEOS.
ah outra coisa sou novato e não sei como construir essa query
tudo funcionando direitinho, mas se eu precisar altera um item na tabela detalhe, quando vou gravar dá esse erro
"unable to find record. no key specified"
se eu colocar os campos como pfinkey = true ele gravar, mas se eu for inserir un novo registro da erro.
como faço pra corrigir issto, estou usando os componentes ZEOS.
ah outra coisa sou novato e não sei como construir essa query
GOSTEI 0
Antonio Santos
26/12/2016
códogo do form
var
frCadOrcamento: TfrCadOrcamento;
mensagem: String;
implementation
uses UdnSever;
{$R *.dfm}
procedure TfrCadOrcamento.FormCreate(Sender: TObject);
begin
cdsOrcamento.Open;
cdsOrcamentoItens.Open;
cdsOrcamentoItens.MasterSource := dsOrcamento;
end;
procedure TfrCadOrcamento.btnGravarClick(Sender: TObject);
var
novo: boolean;
begin
btnInserir.Enabled:= True;
BtnEditar.Enabled:= True;
btnGravar.Enabled:= False;
BtnCancelar.Enabled:= False;
btnDeletar.Enabled:= True;
BtnFechar1.Enabled:= True;
//dmClient.RequiredFieldsValidate(DataSource1.DataSet);
//verifica se o registro é novo
novo:= (dsOrcamento.State = dsInsert);
dsOrcamento.DataSet.Post;
{verifica se o DataSource1 está ligado a um ClientDataSet}
if dsOrcamento.DataSet is TClientDataSet then
begin
mensagem:= 'O registro foi incluído ou alterado com sucesso. ';
Application.MessageBox(PChar(mensagem), 'Mensagem',MB_OK+MB_IconInformation);
PanelFicha.Enabled:= False;
{acessa a função ApplyUpdates do ClientDataSet para aplicar
as alterações no banco de dados, passando zero como parâmetro,
para indicar que, se existir mais de uma atualização para
ser efetivada no banco de dados, se alguma der erro,]
não confirma nenhuma. }
{ApplyUpdates é uma função, ela retorna o número
de erros ocorridos nas operações de atualização.
Se ela retornar zero é porque não houve nenhum erro
e o(s) registros(s) foi(foram) atualizado(s) com sucesso.}
if (TClientDataSet(dsOrcamento.DataSet).ApplyUpdates(0) = 0)
and novo then
begin
dsOrcamento.DataSet.Refresh;
if dsOrcamento.DataSet.RecordCount > 1 then
{manda a tabela para o último registro, caso
o registro seja um registro novo e a tabela possuir mais
de um registro. Isto é necessário pois o
Refresh faz com que a tabela volte para o primeiro
registro. Se o registro é novo, como a tabela
está ordenada pela chave primária, por padrão,
então, o registro que acabou de ser inserido
será o último.}
dsOrcamento.DataSet.Last;
end;
end;
end;
procedure TfrCadOrcamento.btnInserirClick(Sender: TObject);
begin
PanelFicha.Enabled:= True;
PanelFicha.Enabled:= True;
dsOrcamento.DataSet.Insert;
btnInserir.Enabled:= False;
BtnEditar.Enabled:= False;
btnGravar.Enabled:= True;
BtnCancelar.Enabled:= True;
btnDeletar.Enabled:= False;
BtnFechar1.Enabled:= False;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_INC').AsDateTime:= date;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_HAB').AsDateTime:= date;
TClientDataSet(dsOrcamento.DataSet).FieldByName('STATUS').AsString:= 'N';
TClientDataSet(dsOrcamento.DataSet).FieldByName('MARCA').AsString:= 'N';
end;
procedure TfrCadOrcamento.cdsOrcamentoItensAfterPost(DataSet: TDataSet);
begin
cdsOrcamentoItens.MasterSource := nil;
cdsOrcamentoItens.ApplyUpdates(0);
cdsOrcamentoItens.MasterSource := dsOrcamento;
end;
procedure TfrCadOrcamento.btnEditarClick(Sender: TObject);
begin
PanelFicha.Enabled:= True;
dsOrcamento.DataSet.Edit;
btnInserir.Enabled:= False;
BtnEditar.Enabled:= False;
btnGravar.Enabled:= True;
BtnCancelar.Enabled:= True;
btnDeletar.Enabled:= False;
BtnFechar1.Enabled:= False;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_ALT').AsDateTime:= date;
end;
procedure TfrCadOrcamento.btnCancelarClick(Sender: TObject);
begin
dsOrcamento.DataSet.Cancel;
if dsOrcamento.DataSet is TClientDataSet then
{cancelas as atualizações que não foram aplicadas ainda,
removendo elas da propriedade Delta do ClientDataSet
(que armazena as atualizações a serem efetivadas) }
TClientDataSet(dsOrcamento.DataSet).CancelUpdates;
mensagem:= 'A inclusão ou alteração foi abortada. ';
Application.MessageBox(PChar(mensagem), 'Atenção',MB_OK+MB_IconError);
PanelFicha.Enabled:= False;
btnInserir.Enabled:= True;
BtnEditar.Enabled:= True;
btnGravar.Enabled:= False;
BtnCancelar.Enabled:= False;
btnDeletar.Enabled:= True;
BtnFechar1.Enabled:= True;
end;
procedure TfrCadOrcamento.btnDeletarClick(Sender: TObject);
begin
If Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
dsOrcamento.DataSet.Delete;
if dsOrcamento.DataSet is TClientDataSet then
TClientDataSet(dsOrcamento.DataSet).ApplyUpdates(0);
dsOrcamento.OnStateChange(dsOrcamento);
mensagem:= 'O registro foi excluído com sucesso. ';
Application.MessageBox(PChar(mensagem), 'Informação',MB_OK+MB_IconInformation);
end;
end;
procedure TfrCadOrcamento.btnFechar1Click(Sender: TObject);
begin
Close;
end;
end.
var
frCadOrcamento: TfrCadOrcamento;
mensagem: String;
implementation
uses UdnSever;
{$R *.dfm}
procedure TfrCadOrcamento.FormCreate(Sender: TObject);
begin
cdsOrcamento.Open;
cdsOrcamentoItens.Open;
cdsOrcamentoItens.MasterSource := dsOrcamento;
end;
procedure TfrCadOrcamento.btnGravarClick(Sender: TObject);
var
novo: boolean;
begin
btnInserir.Enabled:= True;
BtnEditar.Enabled:= True;
btnGravar.Enabled:= False;
BtnCancelar.Enabled:= False;
btnDeletar.Enabled:= True;
BtnFechar1.Enabled:= True;
//dmClient.RequiredFieldsValidate(DataSource1.DataSet);
//verifica se o registro é novo
novo:= (dsOrcamento.State = dsInsert);
dsOrcamento.DataSet.Post;
{verifica se o DataSource1 está ligado a um ClientDataSet}
if dsOrcamento.DataSet is TClientDataSet then
begin
mensagem:= 'O registro foi incluído ou alterado com sucesso. ';
Application.MessageBox(PChar(mensagem), 'Mensagem',MB_OK+MB_IconInformation);
PanelFicha.Enabled:= False;
{acessa a função ApplyUpdates do ClientDataSet para aplicar
as alterações no banco de dados, passando zero como parâmetro,
para indicar que, se existir mais de uma atualização para
ser efetivada no banco de dados, se alguma der erro,]
não confirma nenhuma. }
{ApplyUpdates é uma função, ela retorna o número
de erros ocorridos nas operações de atualização.
Se ela retornar zero é porque não houve nenhum erro
e o(s) registros(s) foi(foram) atualizado(s) com sucesso.}
if (TClientDataSet(dsOrcamento.DataSet).ApplyUpdates(0) = 0)
and novo then
begin
dsOrcamento.DataSet.Refresh;
if dsOrcamento.DataSet.RecordCount > 1 then
{manda a tabela para o último registro, caso
o registro seja um registro novo e a tabela possuir mais
de um registro. Isto é necessário pois o
Refresh faz com que a tabela volte para o primeiro
registro. Se o registro é novo, como a tabela
está ordenada pela chave primária, por padrão,
então, o registro que acabou de ser inserido
será o último.}
dsOrcamento.DataSet.Last;
end;
end;
end;
procedure TfrCadOrcamento.btnInserirClick(Sender: TObject);
begin
PanelFicha.Enabled:= True;
PanelFicha.Enabled:= True;
dsOrcamento.DataSet.Insert;
btnInserir.Enabled:= False;
BtnEditar.Enabled:= False;
btnGravar.Enabled:= True;
BtnCancelar.Enabled:= True;
btnDeletar.Enabled:= False;
BtnFechar1.Enabled:= False;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_INC').AsDateTime:= date;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_HAB').AsDateTime:= date;
TClientDataSet(dsOrcamento.DataSet).FieldByName('STATUS').AsString:= 'N';
TClientDataSet(dsOrcamento.DataSet).FieldByName('MARCA').AsString:= 'N';
end;
procedure TfrCadOrcamento.cdsOrcamentoItensAfterPost(DataSet: TDataSet);
begin
cdsOrcamentoItens.MasterSource := nil;
cdsOrcamentoItens.ApplyUpdates(0);
cdsOrcamentoItens.MasterSource := dsOrcamento;
end;
procedure TfrCadOrcamento.btnEditarClick(Sender: TObject);
begin
PanelFicha.Enabled:= True;
dsOrcamento.DataSet.Edit;
btnInserir.Enabled:= False;
BtnEditar.Enabled:= False;
btnGravar.Enabled:= True;
BtnCancelar.Enabled:= True;
btnDeletar.Enabled:= False;
BtnFechar1.Enabled:= False;
TClientDataSet(dsOrcamento.DataSet).FieldByName('DATA_ALT').AsDateTime:= date;
end;
procedure TfrCadOrcamento.btnCancelarClick(Sender: TObject);
begin
dsOrcamento.DataSet.Cancel;
if dsOrcamento.DataSet is TClientDataSet then
{cancelas as atualizações que não foram aplicadas ainda,
removendo elas da propriedade Delta do ClientDataSet
(que armazena as atualizações a serem efetivadas) }
TClientDataSet(dsOrcamento.DataSet).CancelUpdates;
mensagem:= 'A inclusão ou alteração foi abortada. ';
Application.MessageBox(PChar(mensagem), 'Atenção',MB_OK+MB_IconError);
PanelFicha.Enabled:= False;
btnInserir.Enabled:= True;
BtnEditar.Enabled:= True;
btnGravar.Enabled:= False;
BtnCancelar.Enabled:= False;
btnDeletar.Enabled:= True;
BtnFechar1.Enabled:= True;
end;
procedure TfrCadOrcamento.btnDeletarClick(Sender: TObject);
begin
If Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
dsOrcamento.DataSet.Delete;
if dsOrcamento.DataSet is TClientDataSet then
TClientDataSet(dsOrcamento.DataSet).ApplyUpdates(0);
dsOrcamento.OnStateChange(dsOrcamento);
mensagem:= 'O registro foi excluído com sucesso. ';
Application.MessageBox(PChar(mensagem), 'Informação',MB_OK+MB_IconInformation);
end;
end;
procedure TfrCadOrcamento.btnFechar1Click(Sender: TObject);
begin
Close;
end;
end.
GOSTEI 0