Selecao DevMedia QUERO SER PRIME

Fórum Problemas com DataSet #349275

20/11/2007

0

Opa pessoal,

Toda vez que rodo o seguinte codigo, ele diz ´DataSet is not in edit or insert mode.´

Aonde que to errando?

procedure AbreTabela(var tabela:TpFiBDataset;NomeTabela:string);
var
  SQL                      : String;
  Campos                   : TStrings;      //Armazena o nome dos campos a serem copiados.
  ListaCampos              : TStringList;   //Armazena temporariamente a lista dos campos a serem copiados.
  NomeCampos,ValoresCampos : String;        //Armazena o nome ORIGEM dos campos, e o DESTINO dos campos.
  I                        : Integer;       //Contador.
begin
    tabela.Close;
    ListaCampos := TStringList.Create();
    Campos.Create;
    tabela.SQLs.SelectSQL.Clear;
    tabela.SQLs.SelectSQL.add(´SELECT * FROM ´ +  NomeTabela);
    tabela.GetFieldNames(ListaCampos);
    Campos := ListaCampos;
    Tabela.SQLs.InsertSQL.Add(´INSERT INTO ´ + NomeTabela + ´(´);
    for I := 0 to Campos.Count - 1 do
    begin

          NomeCampos      := NomeCampos + Campos[I];
          ValoresCampos   := ValoresCampos + ´ :´ + Campos[i];
          if I < Campos.Count -1 then
           begin
            NomeCampos    := NomeCampos + ´, ´;
            ValoresCampos := ValoresCampos + ´, ´;

           end;
      SQL := Tabela.SQLs.InsertSQL.Text;
      MensagemLOG:=´SQL: ´+SQL;
      FPrincipal.GeraLOG(MensagemLOG);
    end;

    Tabela.SQLs.InsertSQL.Add(NomeCampos + ´) VALUES (´ + ValoresCampos +´);´);
//    MensagemLOG:=´SQL: ´+NomeTabela+´  CampoOrigem: ´+NomeCampos+´ CampoDestino: ´+ValoresCampos;


    tabela.Open;
end;

procedure TFPrincipal.Migrar();
var
  i,j:integer;
  TabelaAntiga:string;
  arTabelas:array of string;
  TamArray:integer;
begin
  ClientDataSet.Edit;
  ClientDataSet.Active;
  with 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 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;

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

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

   ClientDataSet.First;
   TabelaAntiga:=ClientDataSet.FieldByName(´TabelaANTIGO´).AsString;

   for I := 0 to Length(arTabelas) - 1 do
   begin
         AbreTabela(DataSetBDANTIGO,arTabelas[I]);//Tabela antiga
         ClientDataSet.Locate(´TabelaANTIGO´,arTabelas[I],[]);//Posiciona o ponteiro na tabela de dicionario
         AbreTabela(DataSetBDNOVO,ClientDataSet.FieldByName(´TabelaANTIGO´).AsString);

         while not FPrincipal.DataSetBDANTIGO.EOF do
         begin
     //       FPrincipal.DataSetBDNOVO.Insert;
            for j := 0 to FPrincipal.DataSetBDANTIGO.FieldCount - 1 do
            begin
              ClientDataSet.Locate(´TabelaANTIGO; CampoANTIGO´,VarArrayOf([ClientDataSet.FieldByName(´TabelaANTIGO´).AsString,ClientDataSet.FieldByName(´CampoANTIGO´).AsString]),[]);
              DataSetBDNOVO.FieldByName(ClientDataSet.FieldByName(´CampoANTIGO´).AsString).AsString:=DataSetBDANTIGO.FieldByName(ClientDataSet.FieldByName(´CampoANTIGO´).AsString).AsString;
            end;
       DataSetBDNOVO.Insert;
       DataSetBDNOVO.Post;
       DataSetBDNOVO.Next;
         end;
   end;
  end;
end;


Aonde que to errando? :S

Valeu!


Sergiofigueras

Sergiofigueras

Responder

Posts

21/11/2007

Vitor Alcantara

Olha eu acho que o erro está nessas linhas.
       while not FPrincipal.DataSetBDANTIGO.EOF do
         begin
            //Alteração 1            
            FPrincipal.DataSetBDNOVO.Insert;
            for j := 0 to FPrincipal.DataSetBDANTIGO.FieldCount - 1 do
            begin
              ClientDataSet.Locate(´TabelaANTIGO; CampoANTIGO´,VarArrayOf([ClientDataSet.FieldByName(´TabelaANTIGO´).AsString,ClientDataSet.FieldByName(´CampoANTIGO´).AsString]),[]);
              DataSetBDNOVO.FieldByName(ClientDataSet.FieldByName(´CampoANTIGO´).AsString).AsString:=DataSetBDANTIGO.FieldByName(ClientDataSet.FieldByName(´CampoANTIGO´).AsString).AsString;
            end;
       //Alteração 2 DataSetBDNOVO.Insert;
       DataSetBDNOVO.Post;
       //Alteração 3 DataSetBDNOVO.Next;
       //Nesse Ponto não seria o DataSetBDAntigo pois caso contrario o laço iria ficar infinito.
      DataSetBDAntigo.Next;
         end; 


Não analisei o código com calma mais acho que essas linhas estão erradas.

PS. Caso não de certo insira BrackPoints (Tecla f5 sobre a linha selecionada) para fazer com que o compilador pare na hora de executar tal linha desse modo fica mais fácil de você detectar o erro.


Responder

Gostei + 0

21/11/2007

Fabiano Góes

acho que poderia dar uma olhada em dois trechos:
Tabela.SQLs.InsertSQL.Add(NomeCampos + ´) VALUES (´ + ValoresCampos +´);´); // MensagemLOG:=´SQL: ´+NomeTabela+´ CampoOrigem: ´+NomeCampos+´ CampoDestino: ´+ValoresCampos; tabela.Open;


aqui você criou uma instrução de insert e executou um método ´OPEN´

não conheço esse dataset que está usando(TpFiBDataset), mais geralmente se executa ´EXECUTE´ ou ´EXECSQL´ alguma coisa desse tipo, pelo que eu estendo OPEN se executa com select quando retorna ponteiros.

outro trecho é só porque achei estranho não por causa do erro:
ClientDataSet.First; ClientDataSet.Active := True; ClientDataSet.Open;


deve usar ´ClientDataSet.Active := True;´ ou ´ClientDataSet.Open;´
ou seja OPEN é o mesmo que Active := True, e outra coisa é First deve ser executado após a tabela estar aberta então acho que neste trecho o correto seria:
     ClientDataSet.Open;
     ClientDataSet.First;



espero ter ajudado, qualquer coisa só postar.


Responder

Gostei + 0

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

Aceitar