Cannot modify a ReadOnly dataset.

Delphi

19/11/2007

Ola a todos,

Probleminha simples, mas nao estou conseguindo resolver:

Quando rodo o codigo abaixo, acontece o erro ´Cannot modify a readonly dataset.´ A propriedade Readonly esta para false.

procedure AbreTabela(var tabela:TpFiBDataset;NomeTabela:string);
begin
    tabela.Close;
    tabela.SQLs.SelectSQL.Clear;
    tabela.SQLs.SelectSQL.add(´SELECT * FROM ´ +  NomeTabela);
    MensagemLOG:=´Nome da tabela: ´+NomeTabela;
    FPrincipal.GeraLOG(MensagemLOG);
    tabela.Open;
end;

procedure TFPrincipal.Migrar();
 var
  i,j:integer;
  TabelaAntiga:string;
  arTabelas:array of string;
  TamArray:integer;
begin
  ClientDataSet.Edit;
 ClientDataSet.Active;
  with FPrincipal.DataBaseBDANTIGO, ConnectParams do begin
    DBName                   := ´localhost:´+CaminhoBDANTIGO;
    UserName                 := ´SYSDBA´;
    ConnectParams.Password   := ´masterkey´;
    SQLDialect               := 3;
    try
      Open;
    except
    on E: Exception do begin
        MessageDlg(´Impossivel conectar com Banco antigo.´#13 + E.Message, mtError, [mbOk], 0);
        MensagemLOG:=´impossivel conectar com banco antigo.´;
        GeraLOG(MensagemLOG);
    end;
  end;
  end;
  with FPrincipal.DataBaseBDNOVO, ConnectParams do begin
  DBName                     := ´localhost:´+CaminhoBDNOVO;
  ConnectParams.UserName     := ´SYSDBA´;
  Password                   := ´masterkey´;
  SQLDialect                 := 3;
    try
      Open;
    except
    on E: Exception do begin
        MessageDlg(´Impossivel conectar com Banco NOVO.´13 + E.Message, mtError, [mbOk], 0);
        MensagemLOG:=´impossivel conectar com banco NOVO.´;
        GeraLOG(MensagemLOG);
    end;
  end;

    FPrincipal.ClientDataSet.First;
     ClientDataSet.Active := True;
     ClientDataSet.Open;

  if ClientDataSet.Active then
    begin
        MensagemLOG:=´ClientDataSet Aberto.´;
        GeraLOG(MensagemLOG);
    end;
  for i := 0 to FPrincipal.ClientDataSet.RecordCount - 1 do
   begin
      //Se for diferente, abro a tabela
      if TabelaAntiga <> FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString then
      begin
          TamArray:=Length(arTabelas) + 1;
          setLength(arTabelas,TamArray); //Aumento o tamanho do array
          arTabelas[TamArray-1]:=FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString;
      end;
      TabelaAntiga:=FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString;
      FPrincipal.ClientDataSet.Next;
   end;

   FPrincipal.ClientDataSet.First;
   TabelaAntiga:=FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString;
   for I := 0 to LengTh(arTabelas) - 1 do
   begin
         AbreTabela(FPrincipal.DataSetBDANTIGO,arTabelas[I]);//Tabela antiga
         FPrincipal.ClientDataSet.Locate(´TB_ANTIGO´,arTabelas[I],[]);//Posiciona o ponteiro na tabela de dicionario
         AbreTabela(FPrincipal.DataSetBDNOVO,FPrincipal.ClientDataSet.FieldByName(´TB_NOVO´).AsString);
         while not FPrincipal.DataSetBDANTIGO.EOF do
         begin
            FPrincipal.DataSetBDNOVO.Insert;
            for j := 0 to FPrincipal.DataSetBDANTIGO.FieldCount - 1 do
            begin
              FPrincipal.ClientDataSet.Locate(´TB_ANTIGO,CA_ANTIGO´,VarArrayOf([FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString,FPrincipal.ClientDataSet.FieldByName(´CA_ANTIGO´).AsString]),[]);
              FPrincipal.DataSetBDNOVO.FieldByName(FPrincipal.ClientDataSet.FieldByName(´TB_NOVO´).AsString).AsString:=FPrincipal.DataSetBDANTIGO.FieldByName(FPrincipal.ClientDataSet.FieldByName(´TB_ANTIGO´).AsString).AsString;
            end;
            DataSetBDNOVO.Insert;
            FPrincipal.DataSetBDNOVO.Post;
            FPrincipal.DataSetBDANTIGO.Next;
         end;
   end;
  end;



Mais precisamente, no primeiro loop. quando vai rodar ele na 19 vez, mais ou menos.

E agora? O que esta errado?

Grato!


Sergiofigueras

Sergiofigueras

Curtidas 0
POSTAR