eu dnovo 2

06/10/2009

olá, a minha duvida é a seguinte quando eu executo o seguinte codigo na minha aplicacao       update.Add('update produto set margen=:Pmargem, ');
    update.Add('preco_venda=:Pvenda, ');
    update.Add('quantidade_embalagem=:Pembalagem, ');
    update.Add('peso=:Ppeso, ');
    update.Add('estoque=estoque+:Pquantidade ');
    update.Add('where produtoid=:Pprodutoid');   quando eu dou um execute no clientdataset pra alterar a tabela de produtos funciona normalmente mais nao altera o saldo só altera quando eu fecho a aplicacao se estiver 10 em estoque e eu adicionar 5 fica la os 10 mais quando eu fecho o sistema e volto dnovo tem 15 como se nao tivesse atualizando nao saquei o que acontece!
Paulo Silva

Paulo Silva

Curtidas 0

Melhor post

Paulo Silva

Paulo Silva

09/10/2009

    tclientdataset(ds4.dataset).Close();
      tclientdataset(ds4.dataset).CommandText:=update.Text;
     tclientdataset(ds4.dataset).open; fiz assim mais deu deadlock algo assim usei o applyupdates(-1) no after insert essa onça nao funciona ja ta me deixando de cabelo em pé
GOSTEI 1

Mais Respostas

Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro.
   Este Update que você usa seria uma query ? Certo ? E dai você passa os parametros pelo teu ClientDataSet, Certo ? No momento que você manda executar, você esta dando um applyupdates no teu ClientDataset ?
  Se estiver , faça um pequeno exemplo e me mande para poder analisar melhor o teu problema.

Um abraço
Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

        update:=TStringList.Create;
    update.Add('update produto set margen=:Pmargem, ');
    update.Add('preco_venda=:Pvenda, ');
    update.Add('quantidade_embalagem=:Pembalagem, ');
    update.Add('peso=:Ppeso, ');
    update.Add('estoque=estoque+:Pquantidade ');
    update.Add('where produtoid=:Pprodutoid');       tclientdataset(ds4.dataset).Close;
    tclientdataset(ds4.dataset).CommandText:=update.Text;
    tclientdataset(ds4.dataset).Params.ParamByName('pmargem').AsCurrency:=30;
    tclientdataset(ds4.dataset).Params.ParamByName('pvenda').AsCurrency:=50;
    tclientdataset(ds4.dataset).Params.ParamByName('Pembalagem').AsCurrency:=1;
    tclientdataset(ds4.dataset).Params.ParamByName('Ppeso').AsCurrency:=500;
    tclientdataset(ds4.dataset).Params.ParamByName('Pquantidade').AsCurrency:=10;
    tclientdataset(ds4.dataset).Params.ParamByName('Pprodutoid').asinteger:=2;
    tclientdataset(ds4.dataset).Execute;   Eu fiz da forma que esta acima citado tem alguma coisa errada ae?
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

        update:=TStringList.Create;
    update.Add('update produto set margen=:Pmargem, ');
    update.Add('preco_venda=:Pvenda, ');
    update.Add('quantidade_embalagem=:Pembalagem, ');
    update.Add('peso=:Ppeso, ');
    update.Add('estoque=estoque+:Pquantidade ');
    update.Add('where produtoid=:Pprodutoid');       tclientdataset(ds4.dataset).Close;
    tclientdataset(ds4.dataset).CommandText:=update.Text;
    tclientdataset(ds4.dataset).Params.ParamByName('pmargem').AsCurrency:=30;
    tclientdataset(ds4.dataset).Params.ParamByName('pvenda').AsCurrency:=50;
    tclientdataset(ds4.dataset).Params.ParamByName('Pembalagem').AsCurrency:=1;
    tclientdataset(ds4.dataset).Params.ParamByName('Ppeso').AsCurrency:=500;
    tclientdataset(ds4.dataset).Params.ParamByName('Pquantidade').AsCurrency:=10;
    tclientdataset(ds4.dataset).Params.ParamByName('Pprodutoid').asinteger:=2;
    tclientdataset(ds4.dataset).Execute;   Eu fiz da forma que esta acima citado tem alguma coisa errada ae? estou usando um clientdataset + Sqldataset+datasetprovider
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá,
  Você esta atualizando os dados do produto "2", o que esta fazendo esta correto, porém falta um cds.ApplyUpdates(-1); Para que ele possa confirmar a alteração. Pois quando você trabalha com CDS, ele trabalha todos os regristros em memória, para confirmar as alterações usamos o cds.ApplyUpdates(-1), geralmente no evento afterInsert, e afterDelete, veja o exemplo.

procedure TFrmCliente.cdsClienteAfterInsert(DataSet: TDataSet);
begin
  cdsCliente.ApplyUpdates(-1);
end;

   Veja se isso irá resolver teu problema.


Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu camarada, Dedlock é quando os registros ficam travados no teu banco de dados(Senaõ me engano), pq você ta usando close depois open ? em que evento ?faz o seguinte criar um pequeno exemplo, e me manda para poder dar uma olhada. Pois isso ta muito estranho.


Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro, estou aguardo para resolvermos o chamado, ok ? Estou a disposição.

Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Segui os passos aqui informado e nao consegui quando executo o apply retorna um erro dizendo que essa operacao nao pode ser solicitada com o clientdataset closed tem como vc fazer um exemplo ou um video atualizando os dados pelo um clientdataset? usei o apply no after insert fiz de tudo quando executo o metodo execute ele para o banco nao deixa eu fazer atualização dizendo que tem uma translação em aberto! O.o           Aguardo Retorno!
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro,
   Coloque o apply updates no afterpost, e não no afterinsert, como eu havia lhe falado. E veja se resolve. Eu vou fazer o exemplo para você.

Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Estou aguardando o exemplo!
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Estou aguardando o exemplo!
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Estou aguardando o exemplo!
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Estou aguardando o exemplo!         Att  Paulo Rogerio
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Oxe que isso que aconteceu mandei uma mensagem, apareceu 4 O.o q bug escroto ^^     Att  Paulo Rogerio
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro,


  Você fez o que tinha te falado no post anterior ??
"Coloque o apply updates no afterpost, e não no afterinsert, como eu havia lhe falado. E veja se resolve. Eu vou fazer o exemplo para você. "


Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Fiz sim, mas nao obtive sucesso!
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro, peço que me mande seus fontes para poder analisar melhor. Pois o que você esta fazendo não esta errado, você deve estar com algum outro problema. Eu faço os meus updates desta forma também e funciona.

Fico no aguardo.

Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Consegui fazer da seguinte maneira   procedure TForm1.BtnExecuteClick(Sender: TObject);
 var Transacao: TTransactionDesc;
begin
   Transacao.TransactionID:= 10;
   Transacao.IsolationLevel:=  xilReadCommitted;
 // Iniciando a transacao      SqlConexao.StartTransaction(transacao);      try
    cdsup.Execute;
   sqlconexao.commit(transacao);
   except
   sqlconexao.rollback(transacao);
   end;

end;       eu criei uma nova aplicacao somente com os componentes sqldataset, clientdataset, datasetprovider, sqlconnection para fazer um teste nao obtive sucesso colocando o applyupdate no before post uso o driver do thiago borges e firebird 2.1 tem como voce fazer uma mini aplicacao para exemplificar pq realmente usando o applyupdates eu nao consegui, deu os mesmos erros que estavam ocorrendo na minha aplicacao!       Att  Paulo,
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Ola meu camarada, bom se você consegui show de bola.
Com relação ao ClientDataSet, eu uso o seguinte.. quero editar um registro. eu faço cds.edit, e altero o registro, depois eu vou e gravo, com cds.post. no final eu vou e dou um cds.applyupdates(-1), e tudo funciona sem problema nenhum. Eu não monto meus updates na mão como você esta fazendo.

Um abraço

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

tem como vc me enviar um exemplo de como vc faz?
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu caro,
  Vou te mandar um link com um dos projetos que dou em aula, para você dar uma olhada.

Forte abraço

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Estou aguardando o link!    Att   Paulo
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu amigo,

  segue um rádido exemplo, porém funcional.

  www.rwsolution.com.br/Chamado_CDS.rar

Att,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

Boa tarde,  bom eu nao sei se eu nao expressei - me corretamente mais acho q ate agora vc nao conseguiu entender qual é o meu problema a minha duvida e simples porem minha duvida nao e relacionada ao conteudo por vc enviado vou ser direto aki tentar ser preciso         tenho um  sqlconnection + sqldataset + datasetprovider(allow command text = True)+clientdataset      tenho um botao que tem a seguinte instrução no meu formulario     procedure teste var Instrucao:string; begin  Instrucao:='Update produto'+   Set Produto varlor = 10'   cdsTeste.close;     CdsTeste.commandtext:=Instrucao;   Cdsteste.execute;     end so isso quero atualizar um estoque só isso mais nada     quando executo essa instrução para que o estoque seja atualizado conforme a sentença acima eu tenho que fechar a aplicacao para que o estoque seja atualizado no banco, gostaria de saber se tem como fazer sem ter que fechar a aplicacao ou sem ter que fazer na mao conforme post anterior onde eu fiz o mesmo codigo acima (só que abrindo uma transacao e comitando a mesma), ou se tem uma forma mais eficiente de atualizar o estoque pela aplicação lembrando nao quero ter que usar trigger quero fazer pela aplicacao    essa é minha duvida!      Att   Paulo    
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá amigo, desculpe então.

   Faça o seguinte ao inves de usar o teu ClientDataSet, faça da seguinte forma.


procedure TForm1.Button1Click(Sender: TObject);
var
  Instrucao:string;
begin
   Instrucao := 'Update CHEQUE Set idsub_cliente = 3 where idsub_cliente = 1';
   DM.Conexao.ExecuteDirect(Instrucao);
   DM.CDSCheque.Refresh; //Aqui seu clientDataSet é atualizado.
end;


Um abraço

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu camarada, consegui ver o exemplo ? Seria isso ?

Forte abraço,

Wesley Y
GOSTEI 0
Paulo Silva

Paulo Silva

06/10/2009

resolvido resolvi assim criei uma classe e controlo por ela ^^ fikou ate mais style assim!!   procedure TUser.EnableUser(maquina: String);
var
  Comm : TDBXCommand;
begin
  if (maquina = '') then  raise Exception.Create('Máquina é requerida!');
  abrecon;
  FDbxConnection := servercontainer.ConexaoLog.DBXConnection;
  Comm := FDbxConnection.CreateCommand;   Comm.Text := 'Update User_server Set ativo = True Where maquina = ' + QuotedStr(maquina);
  Comm.ExecuteQuery;
  fechacon;
  FreeAndNil(Comm); end;
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

06/10/2009

Olá meu camarada,
  Que bom que resolvemos.

Att,

Wesley Y
GOSTEI 0
POSTAR