Problemas com DataSet
Opa pessoal,
Toda vez que rodo o seguinte codigo, ele diz ´DataSet is not in edit or insert mode.´
Aonde que to errando?
Aonde que to errando? :S
Valeu!
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
Curtidas 0
Respostas
Vitor Alcantara
20/11/2007
Olha eu acho que o erro está nessas linhas.
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.
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.
GOSTEI 0
Fabiano Góes
20/11/2007
acho que poderia dar uma olhada em dois trechos:
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:
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:
espero ter ajudado, qualquer coisa só postar.
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.
GOSTEI 0