Delphi/Firebird: Must apply updates before refreshing data e não salva os dados
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
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:
Toda vez que vou dar o applyupdates aparece a mensagem de erro "Must apply updates before refreshing data e não salva os dados"
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
Curtidas 0
Respostas
Marcos Iwazaki
31/08/2010
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.
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.
GOSTEI 0
Francisco Junior
31/08/2010
olha para vc ver que engraçado, fiz o um outro programinha com a mesma rotina
e mesmo assim o danado não consegue salvar.
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.
GOSTEI 0
Francisco Junior
31/08/2010
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.
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.
GOSTEI 0
Francisco Junior
31/08/2010
Galera para solucionar o problema no comando da query tem que ser assim
Por incrível que pareceça ao fazer isso, o problema solucionou.
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.
GOSTEI 0