Fórum Delphi/Firebird: Must apply updates before refreshing data e não salva os dados #385236

31/08/2010

0

Galera é o seguinte, estou quebrando a cabeça aqui.
Estou trabalhando com os componentes:

sqlconnection,
sqldateset - sql: "Select *  from pedidos where nome is not null"
datasetprovider - updatemode: "upWhereKeyOnly"
clientdataset- ligado ao datesetprovider.
No evento onafterpost do clientdateset está assim
  cdsPedidos.ApplyUpdates(-1);
  cdsPedidos.Refresh;


Agora o problema acontece é que estou fazendo um while na tabela pedidos onde tenho que formatar o campo nome do cliente (nome) que está com todas as letras maiusculas.

na rotina para fazer o while deixei assim:

procedure TFormConsistGeral.btn1Click(Sender: TObject);
var
  NomeFormatado,
  NomeOriginal : String;
  ct : Integer;
  Transacao : TTransactionDesc;

begin
  btn1.Enabled := fALSE;
//  Transacao.TransactionID := 1;
//  Transacao.IsolationLevel := xilREPEATABLEREAD;

  ct := 0;
  PainelCG.Height := 152;
  PainelCG.Left := 168;
  PainelCG.Top := 141;
  PainelCG.Width := 465;
  PainelCG.Visible := True;


  DM.sqldsPedidos.Close;
  DM.sqldsPedidos.CommandText := '';
  DM.sqldsPedidos.CommandText := 'Select first 10 * from pedidos order by Estacao,NPedido';
  DM.sqldsPedidos.Open;
  DM.cdsPedidos.Open;



  ShowMessage('qde. de registros:'+Inttostr(DM.cdsPedidos.RecordCount));
  TermCG.MinValue := 0;
  TermCG.Progress := 0;
  TermCG.MaxValue := DM.cdsPedidos.RecordCount;

  DM.cdsPedidos.First;

  while not DM.cdsPedidos.Eof do
  begin
    inc(ct);
    if DM.cdsPedidos.FieldByName('Nome').AsString <> '' then
    begin

      NomeOriginal := DM.cdsPedidos.FieldByName('Nome').AsString;
      NomeFormatado := FormataNome(DM.cdsPedidos.FieldByName('Nome').AsString);

      DM.cdsPedidos.Edit;
      DM.cdsPedidos.FieldByName('Nome').AsString := NomeFormatado;
      NomeConsist.Caption := DM.cdsPedidos.FieldByName('Nome').AsString;

      DM.cdsPedidos.Post;

    end;
    DM.cdsPedidos.Next;

    TermCG.Progress := ct;
    TermCG.Refresh;

  end;
//  DM.cdsPedidos.Refresh;
  ShowMessage('PROCEDIMENTO CONCLUÍDO COM SUCESSO');

  PainelCG.Visible := False;
  DM.cdsPedidos.Close;
  DM.sqldsPedidos.Close;

end;




Toda vez que vou dar o applyupdates aparece a mensagem de erro "Must apply updates before refreshing data e não salva os dados"
Francisco Junior

Francisco Junior

Responder

Posts

31/08/2010

Marcos Iwazaki

um dos seus problemas é o refresh depois do apllyupdates
pois vc chama isso dentro de um while.sempre que vc der um DM.cdsPedidos.Post; vc vai executar o apply e o refresh.Ao fazer o refresh, é quase certeza q o seu ClientDataSet está indo para o primeiro registro novamente. 

Tente tirar o cdsPedidos.ApplyUpdates(-1);
  cdsPedidos.Refresh;do evento e adicionar logo apos o while.
Veja se o erro persiste...
Flw.
Responder

Gostei + 0

31/08/2010

Francisco Junior

olha para vc ver que engraçado, fiz o um outro programinha com a mesma rotina

var
  ct : Integer;
  nomeformatado : string;
begin
  ct := 0;
  cds1.Close;
  sqlds1.Close;
  sqlds1.CommandText := 'Select first 10 * from pedidos where nome is not null';
  sqlds1.Open;
  cds1.Open;
  pb1.Min := 0;
  pb1.Max := cds1.RecordCount;
  cds1.First;
  while not cds1.Eof do
  begin
    Inc(ct);
    cds1.Edit;

    cds1NOME.Text := FormataNome(cds1NOME.Text);
    cds1.Post;

    pb1.Position := ct;
    pb1.Refresh;
    cds1.Next;
  end;
  cds1.ApplyUpdates(-1);
  cds1.Refresh;
  ShowMessage('procedimento concluído com sucesso');



e mesmo assim o danado não consegue salvar.
Responder

Gostei + 0

31/08/2010

Francisco Junior

Consegui resolver aqui.

O problema era que o no sqldataset eu tinha que acrescentar uma opção lá.
Exemplo: os campos chaves da tabela são Estacao,Npedido então no sqldataset tive que acrescentar todos os campos e nos campos chave e marcar as opções pfInUpdate = True, pfInWhere = True, pfInKey = True.

Tem que fazer essa configuração também no clientdataset, nos campos chave e marcar as opções pfInUpdate = True, pfInWhere = True, pfInKey = True.
Responder

Gostei + 0

31/08/2010

Francisco Junior

Galera para solucionar o problema no comando da query tem que ser assim


  sqldsPedidos.Close;
  sqldsPedidos.CommandText := '';
  S1 := 'ESTACAO, NPEDIDO, NOME, ENDER1, ENDER2, FONE, MEDICO, ESTACAOCLIENTE, CODIGOCLIENTE, DATAPEDIDO, HORAPEDIDO, RECEBIDOPOR, ENTREGUEPOR, DATAENTREGA, HORAENTREGA, TIPOPEDIDO, ';
  S2 := 'QDEFORMULAS, PRECOFINAL, PRECOTOTAL, USASUBSTCONTR, CUPOMFISCAL, JANOLIVRO, CRM, OBS1, OBS2, VETF, CONVENIO, DESCPERC, DESCONTO, SINAL, VALORRESTANTE, VENCIMENTO, PAGO, ';
  S3 := 'DATAPAGAMENTO, PRONTO, ENTREGUE, IMPORTADO, REFERENCIA, EMPRESA, MATRICULA, FORMAPAGAMENTO, CODENTREGA, SITENTREGA, CUSTO, VENDEDOR, CAIXA, CAIXAQ, LABORATORIO, ACRESCPERC, ';
  S4 := 'NPED, NCF, DATA_CONF_ENTREGA, TIPODOCUMENTO, NUMDOCUMENTO, ORGAOEXPEDIDOR, UFEMISSAODOCUMENTO, CONSELHOPROFISSIONAL, UFCONSELHO, PACIENTE, FONEPACIENTE';
  sqldsPedidos.CommandText := 'Select first 1000 '+S1+S2+S3+s4+' from PEDIDOS where NOME is not null';
  sqldsPedidos.Open;
  cdsPedidos.Open;




Por incrível que pareceça ao fazer isso, o problema solucionou.

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar