Refresh no ClientDataSet

2,125 views
Skip to first unread message

Evandro Choma

unread,
Nov 29, 2011, 11:32:13 AM11/29/11
to dug...@googlegroups.com

Boa Tarde

 

Tenho uma movimentação no meu sistema que chama um processo de conferência, onde tem basicamente uma grid, e ao fechar volta a tela da movimentação.

Acontece que nesta conferência possui dados vindos de várias tabelas e com muitos valores zerados. Daí crie uma tabela temporária que é povoada no FormActivate do formulário, daí neste formulário tenho uma Query que faz o select desta temporária, ligada do DataSetProvider, que está ligado ao ClientDataSet e este ligado ao DataSource. A grid está ligada ao Data Source.

Ao entrar no formulário ele povoa normalmente a tabela temporária e apresenta da Grid, no formulário possui filtros que apresenta os dados conforme a opção do usuário. Para o Filtro é feito da Seguinte forma.

  cds.Filtered := FALSE;

  cds.Filter := Filtro_Desejado;

  cds.Filtered := TRUE;

Acontece que ao voltar para a movimentação e escolher outra movimentação para a conferência, ele limpa a tabela e povoa a mesma corretamente, porém os dados apresentados na tela são os da primeira movimentação, mas verificando diretamente no banco de dados está gravando corretamente. Ele só modifica o valor apresentado em tela ao fechar e abrir novamente o programa. Fiz o refresh do ClientDataSet da seguinte forma:

cds.Refresh;

Contudo ele dá o seguinte erro: “Project PJSIE.exe raised exception class EDatabaseError with message ‘queryRelTemporariaConferencia: Cursor not returned from Query’. Process stopped. Use Step or Rum to continue.” o mesmo erro é dado caso eu dê um close e open no ClientDataSet.

Fiz a tentativa de deixar apenas a query e o Data Source, daí ele dava o seguinte erro: “Project PJSIE.exe raised exception class EDatabaseError with message. ‘Operation not allowed on a unidirection dataset’. Process stopped. Use Step or Run to continue”.

Fiz a tentativa de não trabalhar com filtros e sim fechar a query e refazer o select a cada escolha de um novo filtro e logo ao entrar Tb, contudo ele está dando erro ao abrir a query e não apresenta dados em momento algum. Os filtros estão funcionando normalmente o problema está na forma de que cada vez que eu entro no sistema na primeira vez que acesso a tela está correto e em todas as outras ele apresenta os dados da primeira visualização.

 

Obrigado

Evandro Choma

Gustavo Luis Hinterholz

unread,
Nov 29, 2011, 11:46:21 AM11/29/11
to dug...@googlegroups.com
Revisou o Sql e as ligacoes dos componentes?

Evandro Choma

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs

Evandro Choma

unread,
Nov 29, 2011, 11:54:25 AM11/29/11
to dug...@googlegroups.com
Sim

Esqueci de citar que utilizo o MySQL.

Obrigado
Evandro Choma
--
[]´s
Evandro Choma
Engenheiro da Computação

--

PS:  ME PROTEJA COMO EU PROTEGI VOCE!
Se você pretende redirecionar este e-mail, por favor, apague todos os  endereços que aparecem nele. Contribua para a preservação da intimidade e sigilo individual. Outra dica de segurança é endereçá-lo no Cco ou Bcc. Desta forma, você estará protegendo a mim, seus amigos e a você mesmo. Eu, juntamente com a campanha contra a propagação de vírus, agradeço sinceramente.

Gustavo Luis Hinterholz

unread,
Nov 29, 2011, 12:01:41 PM11/29/11
to dug...@googlegroups.com
Pelo debug o erro acontece na linha do cds.Refresh ???

Secaio

unread,
Nov 29, 2011, 12:03:55 PM11/29/11
to dug...@googlegroups.com
Os filtros estão funcionando normalmente o problema está na forma de que cada vez que eu entro no sistema na primeira vez que acesso a tela está correto e em todas as outras ele apresenta os dados da primeira visualização.

como tu faz o primeiro acesso?  e os demais?

2011/11/29 Gustavo Luis Hinterholz <gustavolui...@gmail.com>



--
Secaio

Maurício Lauxen

unread,
Nov 29, 2011, 12:05:24 PM11/29/11
to dug...@googlegroups.com
Como vc faz a atualização dos dados? Diretamente no ClientDataSet?

Se sim, está usando ClientDataSet.ApplyUpdates?
Att,

Maurício Lauxen
twitter.com/#!/lauxen

Evandro Choma

unread,
Nov 29, 2011, 12:06:44 PM11/29/11
to dug...@googlegroups.com
isto no refresh, se colocar o close e open no cds ele dá o erro no open.

Evandro Choma

unread,
Nov 29, 2011, 12:08:30 PM11/29/11
to dug...@googlegroups.com
são todos realizados da mesma forma na tela de manutenção tem o botão que chama este outro formulário, dai a programação onde limpa a tabela temporária e povoa ela novamente está na ativação do formulário.

Evandro Choma

unread,
Nov 29, 2011, 12:11:23 PM11/29/11
to dug...@googlegroups.com
tenho uma procedure que no activate no formulário é chamada, para o relatório é chamada a masma procedure, nela os dados são salvos na tabela através do:

  cds.CommandText := 'Comando SQL de insert, delete e update' ;
  cds.Execute;

debugando após passar pela linha o execute se eu vou no banco e visualizo a tabela o comando foi realizado com sucesso.

Secaio

unread,
Nov 29, 2011, 12:11:30 PM11/29/11
to dug...@googlegroups.com
posta o código da programação onde limpa a tabela temporária e povoa ela novamente que está na ativação do formulário. pra ajudar entender

2011/11/29 Evandro Choma <evandr...@gmail.com>



--
Secaio

Evandro Choma

unread,
Nov 29, 2011, 12:25:32 PM11/29/11
to dug...@googlegroups.com
ativação do formulário

procedure TFMANALISARCONFERENCIAS.FormActivate(Sender: TObject);
begin
  POVOATEMPORARIA(ID_USUARIO_LOGADO, iServicoID);


//  cdsRelTemporariaConferencia.RefreshRecord;

  cdsRelTemporariaConferencia.Filtered := FALSE;
  cdsRelTemporariaConferencia.Filter := 'Usuarios_ID = ' + IntToStr(ID_USUARIO_LOGADO);
  cdsRelTemporariaConferencia.Filtered := TRUE;
end;

Procedure POVOATEMPORARIA

procedure TFMANALISARCONFERENCIAS.POVOATEMPORARIA(USUARIO, SERVICO: INTEGER);
var nCont1, nCont2, nCont3, nCont4, nCont5, nCont6, nValor: real;
begin
  ThousandSeparator := ',';
  DecimalSeparator := '.';

// limpando a temporária
  cdsRelTemporariaConferencia.CommandText := 'delete from reltemporariaconferencia where Usuarios_ID = ' + IntToStr(USUARIO) ;
  cdsRelTemporariaConferencia.Execute;

// povoando a temporária
  cdsRelTemporariaConferencia.CommandText := 'INSERT INTO reltemporariaconferencia( Usuarios_ID, ProdutoSKUServico_Servicos_ID, ProdutoSKUServico_ProdutoSKU_ID, CODIGOCLIENTE, DESCRICAO, UNIDADE, CODIGODEBARRAS, SKU, POSICAOESTOQUE, POSICAOCONTAGEM ) SELECT ' + IntToStr(USUARIO) + ' , ps.Servicos_ID, sk.ID, CODIGOCLIENTE, DESCRICAO, UNIDADE, CODIGOBARRAS, QUANTIDADE, POSICAOESTOQUE, POSICAOCONTAGEM FROM produtoskuservico ps, produtosku sk, produtos p WHERE sk.Produtos_ID = p.ID AND ps.ProdutoSKU_ID = sk.ID AND ps.Servicos_ID = ' + IntToStr(SERVICO) ;
  cdsRelTemporariaConferencia.Execute;

// incluindo as contagens
  queryAUX.Close;
  queryAUX.SQL.Clear;
  queryAUX.SQL.Add('SELECT ProdutoSKUServico_ProdutoSKU_ID ');
  queryAUX.SQL.Add('FROM reltemporariaconferencia ');
  queryAUX.SQL.Add('WHERE Usuarios_ID = :pUsuarioLogado and ');
  queryAUX.SQL.Add('      ProdutoSKUServico_Servicos_ID = :pServico ');
  queryAUX.SQL.Add('ORDER BY ProdutoSKUServico_ProdutoSKU_ID ');
  queryAUX.ParamByName('pUsuarioLogado').AsInteger := USUARIO;
  queryAUX.ParamByName('pServico').AsInteger := SERVICO;
  queryAUX.Open;
  queryAUX.First;
  while not queryAUX.Eof do
  begin
    nCont1 := 0;
    nCont2 := 0;
    nCont3 := 0;
    nCont4 := 0;
    nCont5 := 0;
    nCont6 := 0;

    queryAUX2.Close;
    queryAUX2.SQL.Clear;
    queryAUX2.SQL.Add('SELECT ORDEM, Contagens_ID, sum(QUANTIDADE) QTDE ');
    queryAUX2.SQL.Add('FROM conferencias conf, contagens cont ');
    queryAUX2.SQL.Add('WHERE conf.Contagens_ID = cont.ID and ');
    queryAUX2.SQL.Add('      conf.ProdutoSKUServico_ProdutoSKU_ID = :pProdutoSKU and ');
    queryAUX2.SQL.Add('      conf.ProdutoSKUServico_Servicos_ID = :pServico ');
    queryAUX2.SQL.Add('GROUP BY ORDEM, Contagens_ID ');
    queryAUX2.SQL.Add('ORDER BY ORDEM, Contagens_ID ');
    queryAUX2.ParamByName('pProdutoSKU').AsInteger := queryAUX.FieldByName('ProdutoSKUServico_ProdutoSKU_ID').AsInteger;
    queryAUX2.ParamByName('pServico').AsInteger := SERVICO;
    queryAUX2.Open;
    queryAUX2.First;
    while not queryAUX2.Eof do
    begin
      try
        nValor := queryAUX2.FieldByName('QTDE').AsFloat;
      except
        nValor := 0;
      end;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 1 then
        nCont1 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 2 then
        nCont2 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 3 then
        nCont3 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 4 then
        nCont4 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 5 then
        nCont5 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 6 then
        nCont6 := nValor;
      queryAUX2.Next;
    end;

    cdsRelTemporariaConferencia.CommandText := 'update reltemporariaconferencia set CONTAGEM1 = ''' + formatFloat('0.00000',nCont1) + ''', CONTAGEM2 = ''' + formatFloat('0.00000',nCont2) + ''', CONTAGEM3 = ''' + formatFloat('0.00000',nCont3) + ''', CONTAGEM4 = ''' + formatFloat('0.00000',nCont4) + ''', CONTAGEM5 = ''' + formatFloat('0.00000',nCont5) + ''', CONTAGEM6 = ''' + formatFloat('0.00000',nCont6) + ''' where Usuarios_ID = ' + IntToStr(USUARIO) + ' and ProdutoSKUServico_Servicos_ID = ' + IntToStr(SERVICO) + ' and ProdutoSKUServico_ProdutoSKU_ID = ' + queryAUX.FieldByName('ProdutoSKUServico_ProdutoSKU_ID').AsString;
    cdsRelTemporariaConferencia.Execute;

    queryAUX.Next;
  end;

  ThousandSeparator := '.';
  DecimalSeparator := ',';
end;

esta procedure simplesmente povoa a temporária para apresentar em tela e/ou relatório, dai na temporária eu tenho o usuário na chave, pois posso ter vários usuários utilizando a mesma aplicação e povoando e limpando a temporária sem influenciar na aplicação do outro, apesar que de início a tendência é que tenha apenas um usuário sempre.

Secaio

unread,
Nov 29, 2011, 3:28:24 PM11/29/11
to dug...@googlegroups.com
essa tabela reltemporariaconferencia existe na tua base de dados apenas para gerar um relatorio/consulta é isso?

se for, pq tu não usa o ClientDataSet apenas em memoria então, e joga os dados nele no braço mesmo, depois de ter feitos todas tuas consultas, sem usar o SGDB para escrever no disco esses dados? pelo que vi tu deleta os dados q estão lá mesmo antes do usuário utilizá-la, com o client em memoria apenas provavelmente teu erro aí irá desaparecer, e tu nao vai ficar dando soco em ponta de faca para descobrir o que tem de errado..



2011/11/29 Evandro Choma <evandr...@gmail.com>



--
Secaio

Felipe Dal Pizzol

unread,
Nov 29, 2011, 9:50:57 PM11/29/11
to dug...@googlegroups.com
Cara, pelo que eu entendi, tu cria a temporaria, inclui os registros, consulta o que tu quer consultar e depois exclui da temporaria.

Primeiro: se tu usa "query" (QRY) + provider (DSP) + clientdataset (CDS), por que usar um comando sql de inserção?
          - acredito que CDS.insert +
CDS.post + CDS.applyupdates mataria.
          - minha opinião (até por um pouco de desconhecimento do commandtext do CDS), é
            de não usar. Se estou ligando meu CDS com meu DSP e ele com a QRY, não necessita
            usar o commandText... Como diria o "véio ditado": "uma coisa é uma coisa e outra coisa... ah, outra coisa...."
Segundo:  é realmente necessário criar no banco uma temporaria? são muitos dados?
          - avalie, pois às vezes, somente o CDS resolve a questão (como no email do Secaio).
Terceiro: Considerando que tu vá utilizar filtros, acredito que o teu sql retorne todos os dados que tu quer.
          - se quiser visualizar somente partes, execute novamente o sql com o possível filtro na clausula where,
          populando novamente o CDS.
Quarto:   Pra limpar a tabela temporaria não é mais rápido destruí-la e recriá-la, em vez de deletar seus dados?
Quinto:   se tu usa QRY + DSP + CDS, esquece a tua QRY depois de aberto o CDS. Ela estará fechada!
Sexto
(e nao menos importante): O erro unidirecional é devido a componentes que só tem um sentido, ou seja,
          tu só consegue ler um registro por vez e nunca retornar o cursor. Acredito que o TSQLDataSet seja
          unidirecional, enquanto que o TSQLQuery, seja bidirecional - não lembro agora...

Buenas... agora é isso.... vou dormir!

Boa a noite a todos malucos que dormem tarde e acordam de madrugada!



e
ler um
Cordialmente,
Felipe Dornelles Dal'Pizzol

Evandro Choma

unread,
Nov 30, 2011, 6:12:32 AM11/30/11
to dug...@googlegroups.com
isto nesmo a temporária é apenas para relatório e consulta. Mas carregar no ClientDataSet? que vc viu não é apenas um select e insert, depois do select eu modifico os dados.

Algumas coisas estou meio desatualizado no Delphi. trabalhei com ele desde as primeiras versões, mas em 2004 fui trabalhar com programação em PHP para web e apenas agora no início de outubro que voltei a trabalhar com Delphi. Muita coisa mudou da Versão 4 que eu utilizava para a Versão 7 que a empresa aqui tem.

Obrigado
Evandro Choma

Secaio

unread,
Nov 30, 2011, 6:31:10 AM11/30/11
to dug...@googlegroups.com
isso brother, apenas em memoria... tu podes fazer os inserts e updates nele normalmente, sem problemas... desde q tu saiba qual registro quer alterar... eu sujiro fazer todas as consultas antes e inserir tudo junto de uma vez só com as informações exatas já, mas se tu preferir pode alterar depois sim, sem problemas...

CDS.insert  ou CDS.append  pra inserir
cds.edit para alterar - modifica dos dados, por exemplo  CDScodigo.asinteger := queryCodigo.asinteger;

cds.post  para salvar os dados na memoria... note q tu sempre terá q utilizar esse post, tanto para inserção como para a edição depois se for o cado



2011/11/30 Evandro Choma <evandr...@gmail.com>



--
Secaio

Felipe Dal Pizzol

unread,
Nov 30, 2011, 6:39:57 AM11/30/11
to dug...@googlegroups.com
Evandro.... eu e o Secaio esquecemos de dizer que o CDS em memória, tu nao deve usar o provider, e deve criar manualmente os campos n fields editor.

Secaio

unread,
Nov 30, 2011, 6:47:53 AM11/30/11
to dug...@googlegroups.com
verdade... bem lembrado

2011/11/30 Felipe Dal Pizzol <fdalp...@gmail.com>



--
Secaio

Evandro Choma

unread,
Nov 30, 2011, 8:39:26 AM11/30/11
to dug...@googlegroups.com
Felipe

Eu faço sempre o cds.insert, post, etc, acontece que descobri que com o Delphi 7 com o MySQL em Win 7 de 64 bits ao salvar um campo de ponto flutuante ele salva apenas o valor inteiro ignorando o decimal, algum do forum me ajudou a descobrir isto, havia quebrado muito a cabeça, dai esta foi a solução sempre que possui valores de ponto flutuante faço assim. Estas versões estão na máquina do desenvolvedor.

Felipe Dal Pizzol

unread,
Nov 30, 2011, 9:38:25 AM11/30/11
to dug...@googlegroups.com
Hmm... interessante... bom pra fazer vários testes.

Hoje eu to com o Delphi 5, ou versão trial mais nova e ainda não usei o mysql
, mas acredito que isso seja a questão do formato do número.

lembro de ter usado em uma situação, um
ansireplacestr(ansireplacestr(valor, ','), '.') ou algo assim, junto com DecimalSeparator ou algo semelhante... parece que o banco espera 1,123.00 e vai 1.123,00, e é aí que o bicho pega! Mas isso é outra história.. temos que matar o original


 


Em 30 de novembro de 2011 11:39, Evandro Choma <evandr...@gmail.com> escreveu:
Felipe

Eu faço sempre o cds.insert, post, etc, acontece que descobri que com o Delphi 7 com o MySQL em Win 7 de 64 bits ao salvar um campo de ponto flutuante ele salva apenas o valor inteiro ignorando o decimal, algum do forum me ajudou a descobrir isto, havia quebrado muito a cabeça, dai esta foi a solução sempre que possui valores de ponto flutuante faço assim. Estas versões estão na máquina do desenvolvedor.





Evandro Choma

unread,
Nov 30, 2011, 11:53:30 AM11/30/11
to dug...@googlegroups.com
Boa Tarde Felipe e Secaio.

Deixa eu ver se entendi, vou fazer as mudanças agora, fiz o backup do projeto inteiro para que se precisar voltar. hehe

para gravar em memória e não no banco de dados eu tenho apenas a query, o CDS e DataSource (DS). O DS eu ligo no CDS, blz, mas e a query? pois não terei o provider.

Faço os inserts no CDS tipo assim
cds.Insert
cdsUsuario.asstring := '';
cdsServico.AsInteger := 1;
cdsValor.AsFloat := 9.99;
etc
cds.post

Assim salvo na memória. Não uso o filtro apenas limpo o CDS e salvo novamente os dados quando precisar modificar a visão dele.
Para colocar em ordem de um campo ou outro é a ordem do insert?

Obrigado
Evandro Choma

Secaio

unread,
Nov 30, 2011, 1:32:23 PM11/30/11
to dug...@googlegroups.com
para arrumar na ordem que tu queira os registros no Client tu pode criar indíces nele...  olha as propriedades IndexDefs, e indexName dele....  no indexDefts tu cria os indices que precisa, na outra tu escolhe qual q tá valendo...

A query (não sei de qual aba tu usa) eu utlizo normalmente firebir, mas ela deve ter uma propriedade  DatabaseName, ou algo semelhante, q te conecte a um SGDB, da uma olhadinha...


2011/11/30 Evandro Choma <evandr...@gmail.com>


Obrigado
Evandro Choma

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs



--
Secaio

Felipe Dal Pizzol

unread,
Nov 30, 2011, 7:35:33 PM11/30/11
to dug...@googlegroups.com
Evandro.... tem um detalhe: em vez de usar o open, tu tem que usar o createdatabase (ou algo assim.... to meio esquecido)

Anderson Dapper

unread,
Nov 30, 2011, 7:52:06 PM11/30/11
to dug...@googlegroups.com
Só uma correção...

CDS.createDataSet;


Att,
Anderson Dapper Rocha

Felipe Dal Pizzol

unread,
Nov 30, 2011, 8:17:18 PM11/30/11
to dug...@googlegroups.com
Valeu Anderson

Evandro Choma

unread,
Dec 6, 2011, 1:03:45 PM12/6/11
to dug...@googlegroups.com
Desculpe a demora da resposta, mas apenas hj voltei a ativa, estava em outra unidade da empresa.

Coloquei em tela um ClientDataSet e um DataSource, ligados, utilizei os passos deste link para criar os mesmos http://www.clubedainformatica.com.br/site/2003/11/08/tabelas-temporarias-no-delphi-atraves-do-clientdataset/ .
Acontece que dá erro logo após o Post no CDS.


Veja a mensagem de erro:
Project PJSIE.exe raised exception class EDatabaseError with message ‘cdsConferencias: Missing data provider or data packet’. Process stopped. Use Step or Run to Continue.



Código utilizado para salvar os dados no CDS.

    cdsCONFERENCIAS.CreateDataSet;

    cdsCONFERENCIAS.Insert;
    cdsCONFERENCIASCODIGO.AsString := queryAUX.FieldByName('CODIGOCLIENTE').AsString;
    cdsCONFERENCIASDESCRICAO.AsString := queryAUX.FieldByName('DESCRICAO').AsString;
    cdsCONFERENCIASUNIDADE.AsString := queryAUX.FieldByName('UNIDADE').AsString;
    cdsCONFERENCIASCODIGOBARRAS.AsString := queryAUX.FieldByName('CODIGOBARRAS').AsString;
    cdsCONFERENCIASSKU.AsInteger := queryAUX.FieldByName('QUANTIDADE').AsInteger;
    cdsCONFERENCIASPOSICAOESTOQUE.AsFloat := queryAUX.FieldByName('POSICAOESTOQUE').AsFloat;
    cdsCONFERENCIASPOSICAOCONTAGEM.AsFloat := queryAUX.FieldByName('POSICAOCONTAGEM').AsFloat;
    cdsCONFERENCIASCONTAGEM1.AsFloat := nCont1;
    cdsCONFERENCIASCONTAGEM2.AsFloat := nCont2;
    cdsCONFERENCIASCONTAGEM3.AsFloat := nCont3;
    cdsCONFERENCIASCONTAGEM4.AsFloat := nCont4;
    cdsCONFERENCIASCONTAGEM5.AsFloat := nCont5;
    cdsCONFERENCIASCONTAGEM6.AsFloat := nCont6;
    cdsCONFERENCIAS.Post;
    if cdsCONFERENCIAS.ApplyUpdates(-1) <> 0 then
         cdsCONFERENCIAS.CancelUpdates;

Obrigado
Evandro Choma

Felipe Dal Pizzol

unread,
Dec 6, 2011, 1:35:54 PM12/6/11
to dug...@googlegroups.com
Cara, digamos que tu precise desse CDS somente em tempo  de execução de uma tela.

No onCreate da tela, tu joga la :

    cdsCONFERENCIAS.CreateDataSet;

Depois, tu consegue fazer, por exemplo, um método CarregarCDS, onde tu faz só essa parte do codigo:

    cdsCONFERENCIASCODIGO.AsString := queryAUX.FieldByName('CODIGOCLIENTE').AsString;
    cdsCONFERENCIASDESCRICAO.AsString := queryAUX.FieldByName('DESCRICAO').AsString;
    cdsCONFERENCIASUNIDADE.AsString := queryAUX.FieldByName('UNIDADE').AsString;
    cdsCONFERENCIASCODIGOBARRAS.AsString := queryAUX.FieldByName('CODIGOBARRAS').AsString;
    cdsCONFERENCIASSKU.AsInteger := queryAUX.FieldByName('QUANTIDADE').AsInteger;
    cdsCONFERENCIASPOSICAOESTOQUE.AsFloat := queryAUX.FieldByName('POSICAOESTOQUE').AsFloat;
    cdsCONFERENCIASPOSICAOCONTAGEM.AsFloat := queryAUX.FieldByName('POSICAOCONTAGEM').AsFloat;
    cdsCONFERENCIASCONTAGEM1.AsFloat := nCont1;
    cdsCONFERENCIASCONTAGEM2.AsFloat := nCont2;
    cdsCONFERENCIASCONTAGEM3.AsFloat := nCont3;
    cdsCONFERENCIASCONTAGEM4.AsFloat := nCont4;
    cdsCONFERENCIASCONTAGEM5.AsFloat := nCont5;
    cdsCONFERENCIASCONTAGEM6.AsFloat := nCont6;
    cdsCONFERENCIAS.Post;


O resto,
    if cdsCONFERENCIAS.ApplyUpdates(-1) <> 0 then
         cdsCONFERENCIAS.CancelUpdates;

esquece.... isso funciona quando tu tem provider (DSP).




Obrigado
Evandro Choma

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs

Evandro Choma

unread,
Dec 6, 2011, 1:55:46 PM12/6/11
to dug...@googlegroups.com
Inclui o seguinte código na criação do formulário

procedure TFMRELCONFERENCIAS.FormCreate(Sender: TObject);
begin
  cdsCONFERENCIAS.CreateDataSet;
end;


Dai organizei o código conforme falou, contudo ao tentar compilar o projeto ele lá o seguinte erro:

Project PJSIE.exe raised exception class EDatabaseError with message ‘cdsConferencias: Cannot perform this operation on an dataset’. Process stopped. Use Step or Run to Continue.


Obrigado
Evandro Choma

Gustavo Luis Hinterholz

unread,
Dec 6, 2011, 1:56:47 PM12/6/11
to dug...@googlegroups.com
O dataset esta aberto?



Obrigado
Evandro Choma

--

Evandro Choma

unread,
Dec 6, 2011, 2:05:33 PM12/6/11
to dug...@googlegroups.com
Olha como ficou o Object Inspector do ClientDataSet


E do DataSource


Obrigado
Evandro Choma

Evandro Choma

unread,
Dec 6, 2011, 2:08:32 PM12/6/11
to dug...@googlegroups.com
As imagens não foram

o CDS está com o Active True

o DataSource está AutoEdit = True
DataSet com o nome do CDS
Enabled = True
Name, dsCONFERENCIAS
Tag = 0


Obrigado

Evandro Choma

unread,
Dec 6, 2011, 2:15:42 PM12/6/11
to dug...@googlegroups.com
Coloquei na criação do formulário o seguinte código:


procedure TFMRELCONFERENCIAS.FormCreate(Sender: TObject);
begin
  cdsCONFERENCIAS.CreateDataSet;
end;

Dai passou a não compilar o programa, dando o seguinte erro:

Project PJSIE.exe raised exception class EDatabaseError with message ‘cdsConferencias: Cannot perform this operation on an dataset’. Process stopped. Use Step or Run to Continue.


Ao Clicar no botão imprimir retirei as procedures deixando tudo dentro do mesmo código e ficouassim:




procedure TFMRELCONFERENCIAS.BTNIMPRIMIRClick(Sender: TObject);

var nCont1, nCont2, nCont3, nCont4, nCont5, nCont6, nValor: real;
begin
  if TXTCLIENTE.Text = '' then
  begin
    Application.MessageBox('O Cliente deve ser informado!','Informação!',MB_ICONINFORMATION);
    TXTCLIENTE_ID.SetFocus;
    Exit;
  end;

  if DMCADSERVICOS.cdsServicosID.AsInteger = 0 then
  begin
    Application.MessageBox('O Serviço deve ser selecionado!','Informação!',MB_ICONINFORMATION);
    DBGSERVICO.SetFocus;
    Exit;
  end;


  ThousandSeparator := ',';
  DecimalSeparator := '.';

// limpando o clientDataSet
  cdsCONFERENCIAS.Active := true;
  cdsCONFERENCIAS.EmptyDataSet;
  cdsCONFERENCIAS.Close;

  queryAUX.Close;
  queryAUX.SQL.Clear;
  queryAUX.SQL.Add('SELECT CODIGOCLIENTE, DESCRICAO, UNIDADE, CODIGOBARRAS, QUANTIDADE, ');
  queryAUX.SQL.Add('       POSICAOESTOQUE, POSICAOCONTAGEM, sk.ID PRODSKU ');
  queryAUX.SQL.Add('FROM produtoskuservico ps, produtosku sk, produtos p ');
  queryAUX.SQL.Add('WHERE sk.Produtos_ID = p.ID AND ');
  queryAUX.SQL.Add('      ps.ProdutoSKU_ID = sk.ID AND ');
  queryAUX.SQL.Add('      ps.Servicos_ID = :pSERVICO ');

  if RGSITUACAO.ItemIndex = 1 then
  begin
    queryAUX.SQL.Add('      and POSICAOESTOQUE <> POSICAOCONTAGEM ');
    if RGDIVERGENCIA.ItemIndex = 1 then
      queryAUX.SQL.Add('      and POSICAOESTOQUE > POSICAOCONTAGEM ');
    if RGDIVERGENCIA.ItemIndex = 2 then
      queryAUX.SQL.Add('      and POSICAOESTOQUE < POSICAOCONTAGEM ');
  end;

  if RGORDEM.ItemIndex = 0 then
    queryAUX.SQL.Add('ORDER BY CODIGOCLIENTE, DESCRICAO ')
  else
    queryAUX.SQL.Add('ORDER BY DESCRICAO, CODIGOCLIENTE ');

  queryAUX.ParamByName('pSERVICO').AsInteger := DMCADSERVICOS.cdsServicosID.AsInteger;


  queryAUX.Open;
  queryAUX.First;
  while not queryAUX.Eof do
  begin
    nCont1 := 0;
    nCont2 := 0;
    nCont3 := 0;
    nCont4 := 0;
    nCont5 := 0;
    nCont6 := 0;

    queryAUX2.Close;
    queryAUX2.SQL.Clear;
    queryAUX2.SQL.Add('SELECT ORDEM, Contagens_ID, sum(QUANTIDADE) QTDE ');
    queryAUX2.SQL.Add('FROM conferencias conf, contagens cont ');
    queryAUX2.SQL.Add('WHERE conf.Contagens_ID = cont.ID and ');
    queryAUX2.SQL.Add('      conf.ProdutoSKUServico_ProdutoSKU_ID = :pProdutoSKU and ');
    queryAUX2.SQL.Add('      conf.ProdutoSKUServico_Servicos_ID = :pServico ');
    queryAUX2.SQL.Add('GROUP BY ORDEM, Contagens_ID ');
    queryAUX2.SQL.Add('ORDER BY ORDEM, Contagens_ID ');
    queryAUX2.ParamByName('pProdutoSKU').AsInteger := queryAUX.FieldByName('PRODSKU').AsInteger;
    queryAUX2.ParamByName('pServico').AsInteger := DMCADSERVICOS.cdsServicosID.AsInteger;

    queryAUX2.Open;
    queryAUX2.First;
    while not queryAUX2.Eof do
    begin
      try
        nValor := queryAUX2.FieldByName('QTDE').AsFloat;
      except
        nValor := 0;
      end;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 1 then
        nCont1 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 2 then
        nCont2 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 3 then
        nCont3 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 4 then
        nCont4 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 5 then
        nCont5 := nValor;
      if queryAUX2.FieldByName('ORDEM').AsInteger = 6 then
        nCont6 := nValor;
      queryAUX2.Next;
    end;

    cdsCONFERENCIAS.Insert;
    cdsCONFERENCIASCODIGO.AsString := queryAUX.FieldByName('CODIGOCLIENTE').AsString;
    cdsCONFERENCIASDESCRICAO.AsString := queryAUX.FieldByName('DESCRICAO').AsString;
    cdsCONFERENCIASUNIDADE.AsString := queryAUX.FieldByName('UNIDADE').AsString;
    cdsCONFERENCIASCODIGOBARRAS.AsString := queryAUX.FieldByName('CODIGOBARRAS').AsString;
    cdsCONFERENCIASSKU.AsInteger := queryAUX.FieldByName('QUANTIDADE').AsInteger;
    cdsCONFERENCIASPOSICAOESTOQUE.AsFloat := queryAUX.FieldByName('POSICAOESTOQUE').AsFloat;
    cdsCONFERENCIASPOSICAOCONTAGEM.AsFloat := queryAUX.FieldByName('POSICAOCONTAGEM').AsFloat;
    cdsCONFERENCIASCONTAGEM1.AsFloat := nCont1;
    cdsCONFERENCIASCONTAGEM2.AsFloat := nCont2;
    cdsCONFERENCIASCONTAGEM3.AsFloat := nCont3;
    cdsCONFERENCIASCONTAGEM4.AsFloat := nCont4;
    cdsCONFERENCIASCONTAGEM5.AsFloat := nCont5;
    cdsCONFERENCIASCONTAGEM6.AsFloat := nCont6;
    cdsCONFERENCIAS.Post;

    queryAUX.Next;
  end;

  ThousandSeparator := '.';
  DecimalSeparator := ',';

  cdsCONFERENCIAS.Open;

  ppMemoFiltro.Text := 'Cliente: ' + TXTCLIENTE.Text;
  ppLabelUsuario.Caption := 'Usuário: ' + NOME_USUARIO_LOGADO;
  ppReportRELCONFERENCIAS.Print;
end;

Ricardo Gavira

unread,
Dec 6, 2011, 2:19:51 PM12/6/11
to dug...@googlegroups.com
vc fechou o cdsCONFERENCIAS. Antes do insert vc não deveria abrir ele. vc esta abrindo depois do insert.


2011/12/6 Evandro Choma <evandr...@gmail.com>

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs



--
------------------------------------------------------------------
Ricardo Alexandre de O. Gavira
Desenvolvedor Java, PHP, Delphi
Campo Grande / MS
Tw: ricardogavira
Email: ricg...@gmail.com
Blog: ricardogavira.wordpress.com

"O melhor dos mestres é o estudo. E a melhor das disciplinas é o trabalho."
Machado de Assis
------------------------------------------------------------------

Secaio

unread,
Dec 6, 2011, 2:30:17 PM12/6/11
to dug...@googlegroups.com
tenta criar o DataSet, clicando com direito do mouse nele no projeto mesmo, sem executar.... se tivé algum erro nele tu vai notar na hora, pq ele não via deixar tu instanciar ele na memoria...  dai depois tu até usa no projeto, para se por acaso algum dia tu vier a fechar ele sem querer, durante a execução nao de erro... tipo assim

if not CDS.active then
       CDS.createDataSet;

veja bem, criando o dataset em ambiente de projeto, nao será necessário cria-lo novamente em run time, a nao ser q ele seja fechado em algum momento dentro do projeto... por isso o teste acima, mas com isso tu vais notar se tem erro ou nao nele...

outra coisa, o componente q tu tem aí no formulário é o mesmo que tu estava utilizando linkado ao SGDB antes?  se for, remove ele do projeto, e cria um novo... já me aconteceu isso algumas vezes, dava uns erros muito estranhos que não tinham nada a ver.... e era "sujeira" q ficava de algum componente q esta trabalhando de uma outra forma, tipo o ClientDataSet no teu caso...



2011/12/6 Evandro Choma <evandr...@gmail.com>

--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs



--
Secaio

Evandro Choma

unread,
Dec 6, 2011, 2:52:32 PM12/6/11
to dug...@googlegroups.com
Obrigado a Todos pelas dicas, no final deu certo com um pouco da dica de cada um.

Deu certo fazendo como o Secaio falou criando o DataSet no projeto.


Abraços e Bom trabalho a todos

Evandro Choma

Felipe Dal Pizzol

unread,
Dec 6, 2011, 8:51:32 PM12/6/11
to dug...@googlegroups.com
Legal que resolveu, Evandro.

Só uma coisa.... caso tu tenhas que incluir um novo campo futuramente,
pode ter complicação.  Daí da uma olhada no fieldseditor e no fieldsdefs
do CDS.  Eu não uso o createDataSet em design, porque sempre tive problemas
referentes a isso.

Os passos que defino quando implemento situação semelhante são:
1. incluir CDS
2. definir campos no fieldsEditor (duplo clique no CDS)
3. incluir o codigo cds.createdataset ([OU] se carregar de um arquivo, CDS.loadFromFile(nomearquivo)
4. implementar as edições, consultas e operações de campos e registros
5. fechar o CDS ([OU] CDS.SaveToFile(nomearquivo) e depois fechar o cds).

Presta atenção no
[OU]:
  * [OU]
cds.open, [OU] cds.createdataset, [OU] cds.LoadFromFile - dependendo da situação
    - cds.open: quando tem DSP associado
    - cds.loadfromfile: quando carregar os dados salvos em um arquivo
    - cds.createdataset: quando tu vai usar como tabela temporaria.

Buenas... é isso....

Abraço!



--
Você recebeu esta mensagem porque está inscrito no "DUG-RS -
Delphi Users Group Rio Grande do Sul" em Grupos do Google.
Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para
dug-rs-un...@googlegroups.com
Para ver mais opções, visite este grupo em
http://groups.google.com.br/group/dug-rs?hl=pt-BR
Twitter: @dugrs



--

Evandro Choma

unread,
Dec 7, 2011, 5:01:19 AM12/7/11
to dug...@googlegroups.com
Obrigado pela dica

Estou criando temporária novamente em outra parte do sistema vou seguir os seus passos, dando certo deleto esta parte que ficou pronta e crio novamente.

Obrigado
Evandro Choma

Secaio

unread,
Dec 7, 2011, 5:56:57 AM12/7/11
to dug...@googlegroups.com
Incluir novos fields não será um problema, problema mesmo será alterar algum tipo de field já existende nele... tipo passar um campo que era Integer para Float, isso pode dar dor de cabeça, mas nesse caso, clique direito do mouse, clearData, o CDS irá fechar... remover o field no Fieldsdefs, criar o novo, clique direito do mouse no CDS e createDataSet again... e incluir o field denovo no CDS, vai funcionar sem problemas...

Bem na verdade, isso é bom para resolver problemas do tipo que tu estava tendo, erro na criação do dataSet em run time, pq se ele criar o dataSet em ambiente de projeto, irá funcionar em run time, eu particularmente sempre crio em ambiente de projeto, acho melhor para trabalhar, mas sempre cuido que no código haja um teste antes de ele ser utilizado, para que se por acaso e mesmo seja "fechado" no projeto, não gere problemas durante a execução do aplicativo.


2011/12/7 Evandro Choma <evandr...@gmail.com>



--
Secaio

Reply all
Reply to author
Forward
0 new messages