DATASNAP + FDConnection + TFDQuery + ClientDataSet
Boa tarde a todos,
Estou migrando minha aplicação delphi para servidor DATASNAP, POSTGRES, estou com um problema no cliente altero a informação e dou um
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
Vejo que a informação alterada chega no lado do servidor só que não grava no banco de dados.
Alguém poderia me ajudar por favor.
Obrigado
Estou migrando minha aplicação delphi para servidor DATASNAP, POSTGRES, estou com um problema no cliente altero a informação e dou um
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
Vejo que a informação alterada chega no lado do servidor só que não grava no banco de dados.
Alguém poderia me ajudar por favor.
Obrigado
Amaro Loch
Curtidas 0
Melhor post
Amaro Loch
17/09/2016
já fiz isso, no evento
procedure TServerMethods1.DSPessoaBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
form2.label1.Text:=DeltaDS.FieldByName('nmpessoa').NewValue;
end;
pesso para ele mostrar o novo valor ele mostrar correto e não retorna erro.
procedure TServerMethods1.DSPessoaBeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
var Applied: Boolean);
begin
form2.label1.Text:=DeltaDS.FieldByName('nmpessoa').NewValue;
end;
pesso para ele mostrar o novo valor ele mostrar correto e não retorna erro.
GOSTEI 1
Mais Respostas
Kellson
17/09/2016
verifique se nas opçoes da sua query nao esta marcado cacheupdates, ou tambem se nao esta faltando apenas um commit. Nao sei no PG, mas no firebird tem que executar uma comando para efetivar a transaçao , commit...
GOSTEI 0
Amaro Loch
17/09/2016
este commit devo dar no cliente ou no servidor, o clientdatset não tem commit.
GOSTEI 0
Amaro Loch
17/09/2016
atualmente estou utilizando ADO com ODBC mais esta dando muito problema e não precisa da commit, basta um Post e ApplyUpdates(0);
GOSTEI 0
Kellson
17/09/2016
nas propriedades do cliente data set faça o seguinte. me passe sua duvida completa, vc esta dando update, insert ou delete?
GOSTEI 0
Kellson
17/09/2016
vc entao esta usando um insert por açoes tipo insert ou append, post, cancel, delete etc certo?
GOSTEI 0
Kellson
17/09/2016
faça isso aqui so para ver se ele esta retornando um exception
with ClientDataSet1 do // inserir novo registro
begin
edit;
append;
end;
with ClientDataSet1 do // gravar os dados
begin
try
Post;
except
ShowMessage('Erro na hora de inserir os dados');
exit;
end;
ApplyUpdates;
Refresh;
end;
with ClientDataSet1 do // inserir novo registro
begin
edit;
append;
end;
with ClientDataSet1 do // gravar os dados
begin
try
Post;
except
ShowMessage('Erro na hora de inserir os dados');
exit;
end;
ApplyUpdates;
Refresh;
end;
GOSTEI 0
Amaro Loch
17/09/2016
ClientDataSet1.Close;
ClientDataSet1.Params.ParamByName('PPESSOA').Value:=5223;
ClientDataSet1.Open;
ClientDataSet1.edit;
ai tenho um dbedit na tela pra alterar o nome do cliente;
depois
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
isso é so um teste que estou fazendo, meu código não é tão ruim assim rsrsrs
ClientDataSet1.Params.ParamByName('PPESSOA').Value:=5223;
ClientDataSet1.Open;
ClientDataSet1.edit;
ai tenho um dbedit na tela pra alterar o nome do cliente;
depois
ClientDataSet1.Post;
ClientDataSet1.ApplyUpdates(0);
isso é so um teste que estou fazendo, meu código não é tão ruim assim rsrsrs
GOSTEI 0
Kellson
17/09/2016
como vc esta fazendo por value e nao por commandtext nao precisa dar um close ou active:=false;
faça assim deixando seu dataset ativo mesmo.
-----------------------------------------------------------------
if (Edt_PPESSOA.text<>'') then
begin
with clientdataset do
begin
edit;
append;
FieldByName('PPESSOA').Value:=EDT_PPESSOA.TEXT;
post;
applyupdates;
refresh; \\\\para atualizar os registros caso seja um update,delete,insert
end;
End else
begin
showmessa('campo obrigatorio'); \\\\ ou usar um messagedlg mterror, mtwarning,mtinformation
end;
faça assim deixando seu dataset ativo mesmo.
-----------------------------------------------------------------
if (Edt_PPESSOA.text<>'') then
begin
with clientdataset do
begin
edit;
append;
FieldByName('PPESSOA').Value:=EDT_PPESSOA.TEXT;
post;
applyupdates;
refresh; \\\\para atualizar os registros caso seja um update,delete,insert
end;
End else
begin
showmessa('campo obrigatorio'); \\\\ ou usar um messagedlg mterror, mtwarning,mtinformation
end;
GOSTEI 0
Kellson
17/09/2016
lembre que tem uma diferença entre insert e append,,
insert abre uma nova linha abaixo do ultimo registro
append abre uma nova linha acima do primeiro registro
caso use commandtext entao ai muda a rotina:
with clientdataset do
begin
active:=false;
CommandText:=''; //mesmo que clear
commandtext:='insert into tabela(colunas) values(valores);
execute;
CommandText:=''; //mesmo que clear
commandtext:='select * from Tabela'; // se nao usar select retornara um exception dizendo que nao houve retorno de dados;
active:=true;
end;
insert abre uma nova linha abaixo do ultimo registro
append abre uma nova linha acima do primeiro registro
caso use commandtext entao ai muda a rotina:
with clientdataset do
begin
active:=false;
CommandText:=''; //mesmo que clear
commandtext:='insert into tabela(colunas) values(valores);
execute;
CommandText:=''; //mesmo que clear
commandtext:='select * from Tabela'; // se nao usar select retornara um exception dizendo que nao houve retorno de dados;
active:=true;
end;
GOSTEI 0
Kellson
17/09/2016
lembre se que tem uma diferença entre insert e append,,
insert abre uma nova linha abaixo do ultimo registro
append abre uma nova linha acima do primeiro registro
caso use commandtext entao ai muda a rotina:
with clientdataset do
begin
active:=false;
CommandText:=''''; //mesmo que clear
commandtext:=''insert into tabela(colunas) values(valores);
execute;
CommandText:=''''; //mesmo que clear
commandtext:=''select * from Tabela''; // se nao usar select retornara um exception dizendo que nao houve retorno de dados;
active:=true;
end;
insert abre uma nova linha abaixo do ultimo registro
append abre uma nova linha acima do primeiro registro
caso use commandtext entao ai muda a rotina:
with clientdataset do
begin
active:=false;
CommandText:=''''; //mesmo que clear
commandtext:=''insert into tabela(colunas) values(valores);
execute;
CommandText:=''''; //mesmo que clear
commandtext:=''select * from Tabela''; // se nao usar select retornara um exception dizendo que nao houve retorno de dados;
active:=true;
end;
GOSTEI 0
Amaro Loch
17/09/2016
Amigo, eu sei bem o que é a diferença entre um edit e um append.
Meu problema esta no lado do servidor a informação chega até o servidor de aplicação o problema que a informação não chega ano banco de dados
Meu problema esta no lado do servidor a informação chega até o servidor de aplicação o problema que a informação não chega ano banco de dados
GOSTEI 0
Amaro Loch
17/09/2016
Bom dia,
Meu problema continua tenho uma aplicação 3 camadas quando dou ApplyUpdates no ClientDataSet ele envia os dados para o servidor só que ele não grava no banco de dados;
Estrutura
Servidor
FDConnection
FDQuery
DataSetProvider
Cliente
DBXConnection
DSProviderConnection
ClientDataSet
Meu problema continua tenho uma aplicação 3 camadas quando dou ApplyUpdates no ClientDataSet ele envia os dados para o servidor só que ele não grava no banco de dados;
Estrutura
Servidor
FDConnection
FDQuery
DataSetProvider
Cliente
DBXConnection
DSProviderConnection
ClientDataSet
GOSTEI 0
Kellson
17/09/2016
certo então, seu problema deve estar no servidor, fiz um teste aqui funcionou normalmente amigo... apenas marquei a opção no
DataSetProvider1| Object inspector>>Options>>PoAllowCommandText , e tambem na query no "SERVIDOR" desmarquei uma opçao ChachedUpdates
amigo se também tiver essas opções marcadas e desmarcadas no seu projeto, então passo, pois aqui funcionou normalmente. UP
DataSetProvider1| Object inspector>>Options>>PoAllowCommandText , e tambem na query no "SERVIDOR" desmarquei uma opçao ChachedUpdates
amigo se também tiver essas opções marcadas e desmarcadas no seu projeto, então passo, pois aqui funcionou normalmente. UP
GOSTEI 0
Kellson
17/09/2016
vc verificou o que citei no primeiro exemplo? que nao precisa dar close, nem active:=no no clientdataset?
somente receber values e dar um apply?
se quiser te mando um exemplo de DS com dbacess mdb..Srv e client , porem em Berlin 10.1, ou Xe6
somente receber values e dar um apply?
se quiser te mando um exemplo de DS com dbacess mdb..Srv e client , porem em Berlin 10.1, ou Xe6
GOSTEI 0
André Coimbra
17/09/2016
No evento AfterApplyUpdates do ClientDataSet, ja tentou inserir o comando:
CommitUpdates;
CommitUpdates;
GOSTEI 0