Salvando dados em ClientDataset...
Colega,
Boa noite!!!
Olha só, trabalho com Bd Sql Server e uso componentes de acesso ADO, atualmente fiz umas modificações no meu Datamule, incluindo DataSetProvider e CLientDatasSet, o problema é que quando tô inserindo um novo registro, não consigo salva-lo, agora atualizando um registro que ja existe funciona blz...
Veja o evento abaixo, onde to errando?
procedure TfrmCadProdutoDetalhe.acSalvarExecute(Sender: TObject);
begin dmAdo.cdsProduto.Post;
dmAdo.cdsProduto.ApplyUpdates(0);
if dmAdo.cdsProduto.ApplyUpdates(0) <> 0 then
Showmessage('Não foi possível gravar as informações'); dmAdo.cdsProduto.Close;
dmAdo.cdsProduto.Open; ModalResult := mrOk; end;
aguardo retorno
begin dmAdo.cdsProduto.Post;
dmAdo.cdsProduto.ApplyUpdates(0);
if dmAdo.cdsProduto.ApplyUpdates(0) <> 0 then
Showmessage('Não foi possível gravar as informações'); dmAdo.cdsProduto.Close;
dmAdo.cdsProduto.Open; ModalResult := mrOk; end;
aguardo retorno
Irenildo Carvalho
Curtidas 0
Respostas
Rodrigo Mourão
19/03/2010
Olá Irenildo,
Em primeiro lugar quando trabalhamos com ClientDataSet não precisamos do Post, somente do applyupdates. Isso nada tem haver com seu problema apenas para constar.
Agora o ClientDataSet gera o que eu chamo de erro silencioso. Como ele foi feito para trabalhar em aplicacao multi camadas entao os erros nao saltam na app. Faça o seguinte. Selecione este CDS e va no evento OnReconcilerError e coloque o seguinte:
ShowMessage(E.Message);
Isso vai mostrar na tela o mensagem do erro. Eu acredito que deve ser campo requerido mas faça o teste e coloque aqui a mensagem.
No aguardo.
Att,
Em primeiro lugar quando trabalhamos com ClientDataSet não precisamos do Post, somente do applyupdates. Isso nada tem haver com seu problema apenas para constar.
Agora o ClientDataSet gera o que eu chamo de erro silencioso. Como ele foi feito para trabalhar em aplicacao multi camadas entao os erros nao saltam na app. Faça o seguinte. Selecione este CDS e va no evento OnReconcilerError e coloque o seguinte:
ShowMessage(E.Message);
Isso vai mostrar na tela o mensagem do erro. Eu acredito que deve ser campo requerido mas faça o teste e coloque aqui a mensagem.
No aguardo.
Att,
GOSTEI 0
Irenildo Carvalho
19/03/2010
Rodrigo,
Bom dia!!!
Veja, vc tem razão, o erro informa o não preenchimento do campo Grp_codigo, foreingKey da tabela Grupo de produtos, acredito que configurei os providersFlags de forma equivocda... Poderia me esclarecer melhor como configura-los?
agradecido
Irenildo
GOSTEI 0
Rodrigo Mourão
19/03/2010
Bem o principio basico e o seguinte.
Quando o campo e auto incremento no banco de dados temos que informar que ele nao e requerido pois senao o delphi nao grava pois vc nao vai informar este campo, ele sera gerado pelo banco. Mas ele so vai ser gerado quando vc gravar entao ficamos numa sinuca de bico. Se grava se eu informar e so gera se eu gavar entao todo campo auto incremento no banco de dados temos que informar que ele nao e requerido.
Agora devemos fazer isso so no ClientDataSet ou no SqlDataSet tambem. Se vc adicionou o field no SqlDataSet entao tera que configurar la tb. Eu sempre adiciono no SqlDataSet, configuro e depois adicione no CDS.
Att,
Quando o campo e auto incremento no banco de dados temos que informar que ele nao e requerido pois senao o delphi nao grava pois vc nao vai informar este campo, ele sera gerado pelo banco. Mas ele so vai ser gerado quando vc gravar entao ficamos numa sinuca de bico. Se grava se eu informar e so gera se eu gavar entao todo campo auto incremento no banco de dados temos que informar que ele nao e requerido.
Agora devemos fazer isso so no ClientDataSet ou no SqlDataSet tambem. Se vc adicionou o field no SqlDataSet entao tera que configurar la tb. Eu sempre adiciono no SqlDataSet, configuro e depois adicione no CDS.
Att,
GOSTEI 0
Irenildo Carvalho
19/03/2010
Mas em relação aos ProviderFlags, não tem alguma outra regra?
Desculpa a ignorância é porque não usava clientDataset e DatasetProvider...
aguardo
muito obrigado
GOSTEI 0
Rodrigo Mourão
19/03/2010
Ah, sim desculpe.
Bem existem sim alguma regras, o DataSerProvider serve para poder gerar as instruções sql automaticamente. Você apenas da um apply update no CDS e o Provider sera Insert, Delete, Update ou quando da um open gera um select.
Coom isso e feito de forma automatica vc pode atraves dos flags dizer qula campo entra no where ou vai ser atualizado atras do pfUpdate ou pfWhere, ou qual campo e chava pfKey ou qual e requerido, pfRequired.
Basicamente seria isso.
Att,
Bem existem sim alguma regras, o DataSerProvider serve para poder gerar as instruções sql automaticamente. Você apenas da um apply update no CDS e o Provider sera Insert, Delete, Update ou quando da um open gera um select.
Coom isso e feito de forma automatica vc pode atraves dos flags dizer qula campo entra no where ou vai ser atualizado atras do pfUpdate ou pfWhere, ou qual campo e chava pfKey ou qual e requerido, pfRequired.
Basicamente seria isso.
Att,
GOSTEI 0
Irenildo Carvalho
19/03/2010
Valeu mano... Muito obrigado...
Um abraço
Irenildo
GOSTEI 0