Alterar registro em tabela detalhe

Delphi

26/12/2016

Como alterar um registro em uma tabela detalhe, estou usando o delphi 7 com o componente Zeos...
e o banco é FireBird
Antonio Santos

Antonio Santos

Curtidas 0

Respostas

Jones Granatyr

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

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
GOSTEI 0
Antonio Santos

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.
GOSTEI 0
POSTAR