Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Srs., boa tarde.
Estou fazendo uma varredura numa tabela de saldos e mediante alguns dados, preciso alterar o saldo do registro que estiver sendo lido, porém, ao colocar em Edit, me aparece a mensagem de " ... 'qrverif1: cannot modify read-only dataset' ...
Segue abaixo trecho do código.
xMes:=strtoint(copy(datetostr(dtLancto.Date),4,2));
xAno:=strtoint(copy(datetostr(dtLancto.Date),7,4));
with dataModule1.qrVerif1 do
begin
close;
sql.Clear; // Pegarei todos os Lancamentos do mes e ano para a conta
sql.Text:='select * from SCCAXXXX where MMMCORR=:iCta and extract(year from MMMDATA)=:iAno and extract(month from MMMDATA)=:iMes order by MMMDATA';
params.ParamByName('iCta').AsString:=dbcCtaCorr.KeyValue;
params.ParamByName('iMes').AsInteger:=xMes;
params.ParamByName('iAno').AsInteger:=xAno;
open;
end;
dataModule1.qrVerif1.First;
dataModule1.qrVerif1.Edit;
...
Exatamente na última linha, onde faço o edit do registro, ocorre este erro.
Alguém pode ajudar..
Abcs
>
Verifique as permisões do arquivo/usuario/servidor ou se a tabela está presa em outro processo ficando assim como somente leitura enquanto o processo não libera a tabela.
Vinicius, obrigado por ajudar!.
Vou te fazer uma pergunta que corresponde à minha inexperiência em delphi.
De acordo com o trecho do código que te passei, dentro do with com a tabela, inicio com um close. Pergunto: Isto não fecharia qualquer abertura anterior à tabela?
aguardo sua ajuda.
Obrigado
Srs., ainda não resolvi isso! To mesmo precisando de Ajuda. Vou expandir um pouco mais o código, inclusive com alterações que fiz, MAS AINDA O MESMO ERRO.:(
xSldfin:=0;
xSldini:=0;
if (btnregsimp.Tag=1) then
begin
//***********************************
// Neste trecho, Leio a tabela de saldo e verifico se num determinado dia já houve abertura de saldos da conta ******************************
//***********************************
with dataModule1.qrSldCtaCorr do // Verifica se há registro no dia deste lançamento
begin
close;
sql.Clear; // Pegarei o Lancamento desta data para a conta
sql.Text:='select * from SCCAXXXX where MMMCORR=:iCta and MMMDATA=:iData';
params.ParamByName('iCta').AsString:=dbcCtaCorr.KeyValue;
params.ParamByName('iData').AsDate:=dtLancto.Date;
open;
end;
if dataModule1.qrSldCtaCorr.RecordCount = 0 then // Não existe, então registrar o saldo final
begin
if xDebcred='C' then // No caso de LANCAMENTO a Credito
xSLDfin:=CurrValor.Value
else // No caso de LANCAMENTO a Debito
xSLDfin:=CurrValor.Value * (-1);
dataModule1.qrSldCtaCorr.Edit;
dataModule1.qrSldCtaCorr.fieldValues['MMMCORR']:=dbcCtaCorr.KeyValue;
dataModule1.qrSldCtaCorr.fieldValues['MMMDATA']:=dtLancto.date;
dataModule1.qrSldCtaCorr.fieldValues['MMMSLDI']:=0;
dataModule1.qrSldCtaCorr.fieldValues['MMMSLDF']:=xSLDfin;
dataModule1.qrSldCtaCorr.Post;
xExiste:=0;
end;
dataModule1.qrSldCtaCorr.Close;
xMes:=strtoint(copy(datetostr(dtLancto.Date),4,2));
xAno:=strtoint(copy(datetostr(dtLancto.Date),7,4));
//***********************************
// Com uma outra query, leio a mesma tabela, desde o inicio, para atualizar o saldo dia a dia dentro do mes e ano
//***********************************
with qrBuscaSaldo do
begin
close;
sql.Clear; // Pegarei todos os Lancamentos do mes e ano para a conta
sql.Text:='select * from SCCAXXXX where MMMCORR=:iCta and extract(year from MMMDATA)=:iAno and extract(month from MMMDATA)=:iMes order by MMMDATA';
params.ParamByName('iCta').AsString:=dbcCtaCorr.KeyValue;
params.ParamByName('iMes').AsInteger:=xMes;
params.ParamByName('iAno').AsInteger:=xAno;
open;
end;
if qrBuscaSaldo.RecordCount <> 0 then
begin
//***********************************
// Me posiciono no primeiro registro e irei ler um a um e corrigindo os saldos iniciais e finais, MAS.......
//***********************************
qrBuscaSaldo.First;
while not qrBuscaSaldo.Eof do
begin
if qrBuscaSaldo.FieldByName('MMMDATA').AsDateTime < dtLancto.Date then
begin
xSLDfin:=qrBuscaSaldo.FieldValues['MMMSLDF'];
xSLDini:=qrBuscaSaldo.FieldValues['MMMSLDI'];
end else
begin
if qrBuscaSaldo.FieldValues['MMMDATA'] = dtLancto.Date then // Se a data do arquivo é = data lancamento
begin
if xExiste = 0 then
xSLDini:=xSLDfin;
if xDebcred='C' then // No caso de LANCAMENTO a Credito
xSLDfin:=xSLDfin + CurrValor.Value
else // No caso de LANCAMENTO a Debito
xSLDfin:=xSLDfin - CurrValor.Value;
//***********************************
// Quando vou por o registro em modo de edição, ocorre a mensagem "qrBuscasaldo Cannot modify read-only dataset.."
//***********************************
qrBuscaSaldo.Edit;
qrBuscaSaldo.fieldValues['MMMSLDI']:=xSLDini;
qrBuscaSaldo.fieldValues['MMMSLDF']:=xSLDfin;
qrBuscaSaldo.Post;
xAtualizou:=1;
end else
begin
if qrBuscaSaldo.FieldValues['MMMDATA'] > dtLancto.Date then
begin
xSLDini:=xSLDfin;
xSLDfin:=(qrBuscaSaldo.FieldValues['MMMSLDF']-qrBuscaSaldo.FieldValues['MMMSLDI']) + xSldfin;
qrBuscaSaldo.Edit;
qrBuscaSaldo.fieldValues['MMMSLDI']:=xSLDini;
qrBuscaSaldo.fieldValues['MMMSLDF']:=xSLDfin;
qrBuscaSaldo.Post;
end;
end;
end;
qrBuscaSaldo.Next;
end;
end;
qrBuscaSaldo.Close;
...
Já tenho u a rotina parecida em outro programa que funciona perfeitamente.
To trabalhando com tabelas DBF, pois farei a conversão dos sistemas.
Me falaram sobre propriedade Read-only da tabela, mas não troco nenhuma dessas propriedades, nem nunca troquei.
O que pode estar havendo?
Preciso mto de ajuda.
Abcs
amigo, de uma olhada na propriedade Read-only do grid e dos campos.
seu problema deve estar nela.
Wiglan,
Não irei despejar informações em nenhum grid.
A rotina cujo código foi postado, pretende fazer atualização de saldos de contas, na seguinte forma:
Verifico se houve inicialização de uma determinada conta, Guardo o saldo final deste dia caso não tenha sido iniciada.
Depois Volto a ler todos os registros de saldo inicial e final da conta durante o mes e corrijo os saldos.
O problema é quando coloco o registro em edit.
Conseguiu entender?
Caso haja necessidade de melhores informações me solicite, ok.
Atte
Renato
Vinicius,
Desculpe, mas não sei ao que quis se referir.
To trabalhando com tabelas DBF, usando um componente que me permite atualizar seus indices enquanto faço a conversão do sistema e não mudo de vez o DB.
Tenho estas tabelas na mesma condição, pra todas. Estão em um datamodule, onde tenho Queries, DataConnection e DataSource.
Tenho por acaso uma mesma situação onde não ocorre erro nenhum.
Já me falaram sobre propriedade read-only da tabela, do dataset, requestlive, mas não vi problema nenhum.
Copiei uma query utilizada no exemplo que coloco a seguir, mas ocorre a mesma coisa.
Fui claro?
To sem saber o que fazer cara!
Atte
Segue exemplo de uma rotina que está funcionando...
// Quitando contratos anteriores--------------------------
qrEmprest.SQL.Text:='select empsitu, empquita, empcoop, empprop, emptpdoc from SCCAEMP where EMPCOOP=:coop and EMPSITU=:xSitu and EMPTPDOC=1';
qrEmprest.Params.ParamByName('coop').value:= edtcoop.text;
qrEmprest.Params.ParamByName('xSitu').text:= 'L';
qrEmprest.Open;
if qrEmprest.RecordCount <> 0 then
begin
qrEmprest.First;
while not qrEmprest.Eof do
begin
qrEmprest.Edit;
qrEmprest.FieldValues['EMPSITU']:='Q';
qrEmprest.FieldValues['EMPQUITA']:=dtEmp.Date;
qrEmprest.Post;
qrEmprest.Next;
end;
end;
qrEmprest.close;Testou seu codigo com um outro banco de dados, por exemplo criando com a mesma estrutura com outro nome ?
Vinicius
Não testei em outro código. Na verdade estou fazendo conversão de vários sistemas e só poderei mudar o Banco, depois que todos forem convertidos. Daí continuo e preciso usar as tabelas DBF.
Criei uma nova tabela, zerada, coloquei os mesmos campos, só é utilizada neste programa, e ocorreu o mesmo problema. Fiz isso sem muita certeza, pois como relatei, tenho uma rotina com uso de outra tabela que faço o mesmo e está ok. leio sequencialmente os registros selecionados, ponho em modo de edição e gravo alterações.
Preciso de uma saída urgente.
Abc
Uma pergunta, qual engine de acesso você está usando ?
Rotina solucionada!!
Function SaldoContaCorrente(vData:TDateTime; vConta: String; vValor: Currency; vDebcred: string): string;
var xMes, xAno, xExiste: integer;
xSLDini, xSLDfin: currency;
xData: string;
begin
with dataModule1.qrSldCtaCorr do // Verifica se há registro no dia deste lançamento
begin
close;
sql.Clear; // Pegarei o Lancamento desta data para a conta
sql.Text:='select MMMSLDF, MMMSLDI, MMMDATA, MMMCORR from SCCAXXXX where MMMCORR=:iCta and MMMDATA=:iData';
params.ParamByName('iCta').AsString:=vConta;
params.ParamByName('iData').AsDate:=vData;
open;
end;
if dataModule1.qrSldCtaCorr.RecordCount = 0 then // Não existe, então registrar o saldo final
begin
dataModule1.qrSldCtaCorr.Append;
dataModule1.qrSldCtaCorr.fieldValues['MMMCORR']:=vConta;
dataModule1.qrSldCtaCorr.fieldValues['MMMDATA']:=vData;
dataModule1.qrSldCtaCorr.Post;
xExiste:=0;
end;
dataModule1.qrSldCtaCorr.Close;
xMes:=strtoint(copy(datetostr(vData),4,2));
xAno:=strtoint(copy(datetostr(vData),7,4));
with dataModule1.qrSldCtaCorr do
begin
close;
sql.Clear; // Pegarei todos os Lancamentos do mes e ano para a conta
sql.Text:='select MMMDATA, MMMCORR, MMMSLDF, MMMSLDI from SCCAXXXX where MMMCORR=:iCta and extract(year from MMMDATA)=:iAno and extract(month from MMMDATA)=:iMes order by MMMDATA';
params.ParamByName('iCta').AsString:=vConta;
params.ParamByName('iMes').AsInteger:=xMes;
params.ParamByName('iAno').AsInteger:=xAno;
Open;
end;
if dataModule1.qrSldCtaCorr.RecordCount <> 0 then
begin
dataModule1.qrSldCtaCorr.First;
while not dataModule1.qrSldCtaCorr.Eof do
begin
// Se a data da tabela que estiver sendo lida for < data do lancamento, pega apenas os saldos inicial e final
if dataModule1.qrSldCtaCorr.FieldByName('MMMDATA').AsDateTime < vData then
begin
xSLDfin:=dataModule1.qrSldCtaCorr.FieldValues['MMMSLDF'];
xSLDini:=dataModule1.qrSldCtaCorr.FieldValues['MMMSLDI'];
end;
// Se a data da tabela que estiver sendo lida for = data do lancamento
if dataModule1.qrSldCtaCorr.FieldValues['MMMDATA'] = vData then
begin
if xExiste = 0 then // se for o primeiro nesta data
begin
xExiste:=1;
xSLDini:=xSLDfin; // fazer inicial = final da anterior
end;
if vDebcred='C' then // Se ja havia inicial e final nesta data e No caso de LANCAMENTO a Credito
xSLDfin:=xSLDfin + vValor
else // No caso de LANCAMENTO a Debito
xSLDfin:=xSLDfin - vValor;
//-------------AQUI!!! Eu estava lendo um registro e queria fazer alterações nele. Quando o colocava em modo de edição, ocorria a mensagem *
// ---------- de read-only. Então, por sugestão de um amigo, fiz nova query localizando este mesmo registro e colocando-o em modo de edição *
// ---------- e finalmente foi resolvido o problema.
with dataModule1.qrEmprest do
begin
close;
sql.Clear;
sql.Text:='select MMMSLDF, MMMSLDI, MMMDATA, MMMCORR from SCCAXXXX where MMMCORR=:iCta and MMMDATA=:iData';
params.ParamByName('iCta').AsString:=vConta;
params.ParamByName('iData').AsDate:=vData;
open;
end;
dataModule1.qrEmprest.Edit;
dataModule1.qrEmprest.fieldValues['MMMSLDI']:=xSLDini;
dataModule1.qrEmprest.fieldValues['MMMSLDF']:=xSLDfin;
dataModule1.qrEmprest.Post;
dataModule1.qrEmprest.Close;
end;
//--------------------------------------------------------------------------------------------------------
if dataModule1.qrSldCtaCorr.FieldValues['MMMDATA'] > vData then
begin
xSLDini:=xSLDfin;
xSLDfin:=(dataModule1.qrSldCtaCorr.FieldValues['MMMSLDF']-dataModule1.qrSldCtaCorr.FieldValues['MMMSLDI']) + xSldfin;
xData:=dataModule1.qrSldCtaCorr.FieldValues['MMMDATA'];
with dataModule1.qrEmprest do
begin
close;
sql.Clear;
sql.Text:='select MMMSLDF, MMMSLDI, MMMDATA, MMMCORR from SCCAXXXX where MMMCORR=:iCta and MMMDATA=:iData';
params.ParamByName('iCta').AsString:=vConta;
params.ParamByName('iData').AsDate:=strtodate(xData);
open;
end;
dataModule1.qrEmprest.Edit;
dataModule1.qrEmprest.fieldValues['MMMSLDI']:=xSLDini;
dataModule1.qrEmprest.fieldValues['MMMSLDF']:=xSLDfin;
dataModule1.qrEmprest.Post;
dataModule1.qrEmprest.Close;
end;
dataModule1.qrSldCtaCorr.Next;
end;
end;
dataModule1.qrSldCtaCorr.Close;
end;
Claro que pode ser otimizada!!! Na verdade deixei assim para fazer referencia à rotina postada como problema.
Obrigado a todos.
Atte
Verifique as permisões do arquivo/usuario/servidor ou se a tabela está presa em outro processo ficando assim como somente leitura enquanto o processo não libera a tabela.