Urgentissimo

13/07/2010

Ola wesley , Como voce ve abaixo fiz um rotina para exportar dados de um banco firebird para sql, é aquele negocio do identificador. Estou tentando no momento que o programa do cara la registrar uma nova chamada eu tranporte ela na mesma hora para o sqlserver. Como voce abaixo fiz a rotina , quase tudo certo so que da aquele tal de deadlock , ao meu entender isso acontece quando duas pessoas tentao alter o mesmo registo. Da uma olhada nesse codigo e me diz o que esta errado ai.     Sempre que entra uma nova chamada no banco do kara la , eu busco ele transfiro para o sqlserver e seto o estatus com 'f' , afinal preciso de um criterio para nao copiar coisas repetidas.   Da uma força amigo veja o que estou fazendo de errado.   Ja adiantando eu vou precisar rodar isso futuramente como serviço pois no evento timer pesa demais a aplicaçao , seria possivel futuramente voce me ajudar e criar um serviço ?         procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
begin
  dsTodasLinhasF.DataSet.close;
  dsTodasLinhasF.DataSet.Open;   Dmfirebird.cdsTodasLinhasf.First;
  while not Dmfirebird.cdsTodasLinhasf.Eof do
  begin
    with Dmfirebird do
    begin
      cdsTodasLinhasSQl.Open;
      cdsTodasLinhasSQl.Append;
      cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
      cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
      cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
      cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
      cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
      cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
      cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
      cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
      cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
      cdsTodasLinhasSQlId_Usuario.AsString := '1';
      cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
      cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
      cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
      cdsTodasLinhasf.Next;
      cdsTodasLinhasSQl.Post;
    end;
    Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
    Dmfirebird.cdsTodasLinhasSQl.EmptyDataSet;
  end;   Dmfirebird.cdsTodasLinhasf.First;
  while not Dmfirebird.cdsTodasLinhasf.Eof do
  begin
    Dmfirebird.cdsTodasLinhasf.Edit;
    Dmfirebird.cdsTodasLInhasFESTATUS.AsString := 'f';
    Dmfirebird.cdsTodasLinhasf.Next;
  end;   Dmfirebird.cdsTodasLinhasf.ApplyUpdates(0);
  Dmfirebird.cdsTodasLinhasf.EmptyDataSet;   dsTodasLinhasSQl.DataSet.close;
  dsTodasLinhasSQl.DataSet.Open;   lblsql.Caption := IntToStr(dsTodasLinhasSQl.DataSet.RecordCount); end;
Carlos Faria

Carlos Faria

Curtidas 0

Respostas

Wesley Yamazack

Wesley Yamazack

13/07/2010

Carlos,

  O problema é que deadlock acontece no banco de dados, o componente deste camarada, deve travar o registro e não liberar o mesmo. Pois deadlock é quando o banco de dados bloqueia um registro que esta aberto, por outra pessoa.

  O erro acontece em que linha ?

Att.

Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

13/07/2010

Eu Nao consegui identificar een linha , na da em todas impasse als Linhas verdade als vezes e quando da trava tudo.Dei uma melhorada geen Codigo aqui , tudo que fazer preciso agora e quando o que cdssqlserver der um applyupdate ele o cdsfirebird set para o estatus 'F 'nee Banco firebird.ao meu ver acho que isso Iria resolver.so nao consegui fazer o loop certo     TfrmMigracaoFirebird.tmrTesteTimer procedure (Sender: TObject);
var
T: Ttransactiondesc ;
beginnen proberen
Dmfirebird.dbAcessoFirebird.StartTransaction (T) ;
Dmfirebird.cdsTodasLinhasf.First ;
terwijl niet Dmfirebird.cdsTodasLinhasf.Eof doen
beginnen
met Dmfirebird doen
beginnen
cdsTodasLinhasSQl.Open ;
cdsTodasLinhasSQl.Append ;
cdsTodasLinhasSQlNr_Linha.AsInteger : = cdsTodasLInhasFLinha.AsInteger ;
cdsTodasLinhasSQlDS_DDD.AsString : = cdsTodasLInhasFDDD.AsString ;
cdsTodasLinhasSQlDs_Fone.AsString : = cdsTodasLInhasFFone.AsString ;
cdsTodasLinhasSQlDs_Nome.AsString : = cdsTodasLInhasFNome.AsString ;
cdsTodasLinhasSQlHr_Inicio.AsString : = cdsTodasLInhasFInicio.AsString ;
cdsTodasLinhasSQlHr_Fim.AsString : = cdsTodasLInhasFFim.AsString ;
cdsTodasLinhasSQlTempoTotal.AsString : = cdsTodasLInhasFTempoTotal.AsString ;
cdsTodasLinhasSQlFileRecord.AsString : = cdsTodasLInhasFFileRecord.AsString ;
cdsTodasLinhasSQlTipo.AsInteger : = cdsTodasLInhasFTipo.AsInteger ;
cdsTodasLinhasSQlId_Usuario.AsString : = '1 ' ;
cdsTodasLinhasSQlFiltro.AsString : = cdsTodasLInhasFFiltro.AsString ;
cdsTodasLinhasSQlTipoCH.AsString : = cdsTodasLInhasFTipoCH.AsString ;
cdsTodasLinhasSQlOPR.AsString : = cdsTodasLInhasFOPR.AsString ;
cdsTodasLinhasf.Next ;
cdsTodasLinhasSQl.Post ;
einde te maken;
einde te maken;
Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates (0);
Dmfirebird.dbAcessoFirebird.Commit (T) ;
behalve
Dmfirebird.dbAcessoFirebird.Rollback (T) ;
einde te maken;
GOSTEI 0
Carlos Faria

Carlos Faria

13/07/2010

procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
var
  T: Ttransactiondesc;
begin   try
    Dmfirebird.dbAcessoFirebird.StartTransaction(T);
    Dmfirebird.cdsTodasLinhasf.First;
    while not Dmfirebird.cdsTodasLinhasf.Eof do
    begin
      with Dmfirebird do
      begin
        cdsTodasLinhasSQl.Open;
        cdsTodasLinhasSQl.Append;
        cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
        cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
        cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
        cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
        cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
        cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
        cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
        cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
        cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
        cdsTodasLinhasSQlId_Usuario.AsString := '1';
        cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
        cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
        cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
        cdsTodasLinhasf.Next;
        cdsTodasLinhasSQl.Post;
      end;
    end;
    Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
    Dmfirebird.dbAcessoFirebird.Commit(T);
  except
    Dmfirebird.dbAcessoFirebird.Rollback(T);
  end;
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

13/07/2010

Carlos, por que você esta abrindo todo momento no loop o cdstotdaslinhasSQL? Que erro acontece ?

procedure TfrmMigracaoFirebird.tmrTesteTimer(Sender: TObject);
var
  T: Ttransactiondesc;
begin   try
    Dmfirebird.dbAcessoFirebird.StartTransaction(T);
    Dmfirebird.cdsTodasLinhasf.First;   cdsTodasLinhasSQl.Open;    while not Dmfirebird.cdsTodasLinhasf.Eof do
    begin
      with Dmfirebird do
      begin

        cdsTodasLinhasSQl.Append;
        cdsTodasLinhasSQlNr_Linha.AsInteger := cdsTodasLInhasFLinha.AsInteger;
        cdsTodasLinhasSQlDS_DDD.AsString := cdsTodasLInhasFDDD.AsString;
        cdsTodasLinhasSQlDs_Fone.AsString := cdsTodasLInhasFFone.AsString;
        cdsTodasLinhasSQlDs_Nome.AsString := cdsTodasLInhasFNome.AsString;
        cdsTodasLinhasSQlHr_Inicio.AsString := cdsTodasLInhasFInicio.AsString;
        cdsTodasLinhasSQlHr_Fim.AsString := cdsTodasLInhasFFim.AsString;
        cdsTodasLinhasSQlTempoTotal.AsString := cdsTodasLInhasFTempoTotal.AsString;
        cdsTodasLinhasSQlFileRecord.AsString := cdsTodasLInhasFFileRecord.AsString;
        cdsTodasLinhasSQlTipo.AsInteger := cdsTodasLInhasFTipo.AsInteger;
        cdsTodasLinhasSQlId_Usuario.AsString := '1';
        cdsTodasLinhasSQlFiltro.AsString := cdsTodasLInhasFFiltro.AsString;
        cdsTodasLinhasSQlTipoCH.AsString := cdsTodasLInhasFTipoCH.AsString;
        cdsTodasLinhasSQlOPR.AsString := cdsTodasLInhasFOPR.AsString;
        cdsTodasLinhasf.Next;
        cdsTodasLinhasSQl.Post;
      end;
    end;
    Dmfirebird.cdsTodasLinhasSQl.ApplyUpdates(0);
    Dmfirebird.dbAcessoFirebird.Commit(T);
  except
    Dmfirebird.dbAcessoFirebird.Rollback(T);
  end;
Aparentemente esta tudo ok.
Att,
Wesley Y
GOSTEI 0
Carlos Faria

Carlos Faria

13/07/2010

Eu abro o loop, pq estou buscando dados de 6 tabelas diferentes, pode ter so um registro ou podem ter varios entao a necessidade do loop
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

13/07/2010

Carlos,

  Você ta usando um timer é isso ?

O timer vai disparar este evento a todo momento, e se tiverem 100 regisotrs na tabela, toda hora que ele passar no loop ele vai abrir a tabela novamente, isso não esta me parecendo correto, entendeu ?

Att,

Wesley Y
GOSTEI 0
Wesley Yamazack

Wesley Yamazack

13/07/2010

Carlos, só para lembrar, como estamos com este chamado aqui ?

Att,

Wesley Y
GOSTEI 0
POSTAR