DATASNAP + FDConnection + TFDQuery + ClientDataSet

PostgreSQL

Delphi

17/09/2016

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
Amaro Loch

Amaro Loch

Curtidas 0

Melhor post

Amaro Loch

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.
GOSTEI 1

Mais Respostas

Kellson

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

Amaro Loch

17/09/2016

este commit devo dar no cliente ou no servidor, o clientdatset não tem commit.
GOSTEI 0
Amaro Loch

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

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

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

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;
GOSTEI 0
Amaro Loch

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
GOSTEI 0
Kellson

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;
GOSTEI 0
Kellson

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;
GOSTEI 0
Kellson

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;
GOSTEI 0
Amaro Loch

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
GOSTEI 0
Amaro Loch

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
GOSTEI 0
Kellson

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
GOSTEI 0
Kellson

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
GOSTEI 0
André Coimbra

André Coimbra

17/09/2016

No evento AfterApplyUpdates do ClientDataSet, ja tentou inserir o comando:

CommitUpdates;
GOSTEI 0
POSTAR