Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RenatoReis

[Resolvido] Não permite modificar dados do Registro

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

amigo, de uma olhada na propriedade Read-only do grid e dos campos.

seu problema deve estar nela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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;

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.