Erro quot;Cannot create new connection because in manual or

Delphi

18/10/2004

Pessoal,

estou usando Delphi7 + SQL SERVER + DBEXPRESS e fazendo duas importações , a primeira flui normalmente , mas a segunda dá o seguinte erro: ´Cannot create new connection because in manual or distributed transaction mode.´ . Por favor, alguem sabe o que pode ser isso?

OBS: Não estou usando o MSDE do SQLSERVER. Atualizo direto no Servidor.

Obrigado.
Alexandra.


Aleguerra

Aleguerra

Curtidas 0

Respostas

Osocram

Osocram

18/10/2004

qual rotina tah dando erro?
pod postar a rotina aqui?


GOSTEI 0
Aleguerra

Aleguerra

18/10/2004

Procedure Importacao_Credenciados_Cnen(Cliente : integer);
var Arquivo : TextFile;
S : string;
X:integer;
TD : TTransactionDesc;
begin
TD.TransactionID := Dm_Tabelas.CDS_Credenciados.Tag;
TD.IsolationLevel := xilREADCOMMITTED;
Dm_Tabelas.DB_Callcenter.CloseDataSets;
Dm_Tabelas.DB_Callcenter.StartTransaction(TD);

with Dm_Tabelas do
begin
if not Frm_Importacao.Opendialog1.execute then
exit;

AssignFile(Arquivo,Frm_Importacao.OPenDialog1.FileName);
reset(Arquivo);

Frm_Mensagem.show;
Frm_Mensagem.Btn_Mensagem.caption := ´´;
Frm_Mensagem.Btn_Mensagem.caption := ´Aguarde !!! Importando Dados!´;
Frm_Mensagem.Gauge.Progress := 0;
Frm_Mensagem.Gauge.MaxValue := 100;

while not eof(Arquivo) do
begin
readln(Arquivo,S);

if Frm_Mensagem.Gauge.progress >= 100 then
Frm_Mensagem.Gauge.progress := 0;

Frm_Mensagem.Gauge.progress := Frm_Mensagem.Gauge.progress + 1;

//Formatando a máscara do CPF/CNPJ
Credenciado_Sem_Mascara := trim(copy(S,1,14));

if Length(Credenciado_Sem_Mascara) = 11 then
begin
Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,3)+´.´+copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´-´+copy(Credenciado_Sem_Mascara,9,2);
Tipo_Pessoa := ´F´;
end
else
begin
Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,2)+´.´+Copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´/´+copy(Credenciado_Sem_Mascara,9,4)+´-´+copy(Credenciado_Sem_Mascara,13,2);
Tipo_Pessoa := ´J´;
end;

Qy_Credenciados.close;
Qy_Credenciados.SQL.Clear;
Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
Qy_Credenciados.Open;
CDS_Credenciados.Open;
CDS_Credenciados.Refresh;

if CDS_Credenciados.RecordCount > 0 then
CDS_Credenciados.Edit
else
CDS_Credenciados.Append;

CDS_CredenciadosCredenciado.asstring := Credenciado_Com_Mascara;
CDS_CredenciadosNome_Credenciado.asstring := copy(S,21,50);
CDS_CredenciadosTipo.asstring := Tipo_Pessoa;

CDS_CredenciadosExcluido.asstring := ´Não´;
CDS_Credenciados.Post;
CDS_Credenciados.ApplyUpdates(0);

end; // fim while not eof (Arquivo)

DB_Callcenter.CloseDataSets;
DB_Callcenter.Commit(TD);
Frm_Mensagem.close;

end; {With Dm_Tabelas}

application.messagebox(´Importação Realizada com Sucesso !´,´Importação de Dados´,mb_iconinformation+mb_ok);
end;


GOSTEI 0
Vinicius2k

Vinicius2k

18/10/2004

Alexandra,

A liberação do cursor vinculado no servidor (necessário apenas para o SQLServer) através do método CloseDataSets da SQLConnection deve ser realizado antes do método ApplyUpdates do ClientDataSet -- segundo pesquisa que realizei e não do Commit da transação.

Além disso, na minha opinião, sua transação está ficando aberta tempo demais sem necessidade, e, ainda na minha opinião, o método ApplyUpdates deveria ser chamado uma única vez, ao final do processo.

À princípio, eu faria desta forma :
Procedure Importacao_Credenciados_Cnen(Cliente : integer);
var Arquivo : TextFile;
    S : string;
    X:integer;
    TD : TTransactionDesc;
begin
  with Dm_Tabelas do
  begin
    if not Frm_Importacao.Opendialog1.execute then
      exit;

    AssignFile(Arquivo,Frm_Importacao.OPenDialog1.FileName);
    reset(Arquivo);

    Frm_Mensagem.show;
    Frm_Mensagem.Btn_Mensagem.caption := ´´;
    Frm_Mensagem.Btn_Mensagem.caption := ´Aguarde !!! Importando Dados!´;
    Frm_Mensagem.Gauge.Progress := 0;
    Frm_Mensagem.Gauge.MaxValue := 100;

    while not eof(Arquivo) do
    begin
      readln(Arquivo,S);

      if Frm_Mensagem.Gauge.progress >= 100 then
        Frm_Mensagem.Gauge.progress := 0;

      Frm_Mensagem.Gauge.progress := Frm_Mensagem.Gauge.progress + 1;

      //Formatando a máscara do CPF/CNPJ
      Credenciado_Sem_Mascara := trim(copy(S,1,14));

      if Length(Credenciado_Sem_Mascara) = 11 then
      begin
        Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,3) +´.´+ copy(Credenciado_Sem_Mascara,3,3 )+ ´.´ + copy(Credenciado_Sem_Mascara,6,3) +´-´+ copy(Credenciado_Sem_Mascara,9,2);
        Tipo_Pessoa := ´F´;
      end
      else
      begin
        Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,2) +´.´+ Copy(Credenciado_Sem_Mascara,3,3) +´.´+ copy(Credenciado_Sem_Mascara,6,3) +´/´+ copy(Credenciado_Sem_Mascara,9,4) +´-´+ copy(Credenciado_Sem_Mascara,13,2);
        Tipo_Pessoa := ´J´;
      end;

      Qy_Credenciados.close;
      Qy_Credenciados.SQL.Clear;
      Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
      Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
      Qy_Credenciados.Open;
      CDS_Credenciados.Open;
      CDS_Credenciados.Refresh;

      if CDS_Credenciados.RecordCount > 0 then
        CDS_Credenciados.Edit
      else
        CDS_Credenciados.Append;

      CDS_CredenciadosCredenciado.asstring := Credenciado_Com_Mascara;
      CDS_CredenciadosNome_Credenciado.asstring := copy(S,21,50);
      CDS_CredenciadosTipo.asstring := Tipo_Pessoa;

      CDS_CredenciadosExcluido.asstring := ´Não´;
      CDS_Credenciados.Post;
    end; // fim while not eof (Arquivo)

    TD.TransactionID := Dm_Tabelas.CDS_Credenciados.Tag;
    TD.IsolationLevel := xilREADCOMMITTED;
    Dm_Tabelas.DB_Callcenter.CloseDataSets;
    Dm_Tabelas.DB_Callcenter.StartTransaction(TD);

    DB_Callcenter.CloseDataSets;
    if CDS_Credenciados.ApplyUpdates(0) = 0 then 
      DB_Callcenter.Commit(TD)
    else DB_Callcenter.Rollback(TD)

    Frm_Mensagem.close;

  end; {With Dm_Tabelas}

  application.messagebox(´Importação Realizada com Sucesso !´,´Importação de Dados´,mb_iconinformation+mb_ok);
end;


Espero ter ajudado.
T+


GOSTEI 0
Aleguerra

Aleguerra

18/10/2004

Caro Vinicius,

realmente coloquei o codigo na ordem que vc me indicou deu certo não ocorre mais o erro : ´´Cannot create new connection...´, só que eu atualizo mais de uma tabela, gostaria que desse uma olhada no fonte abaixo e por favor me ajude a esclarecer o que faço de errado pois não tenho integridade nas atualizações é como se ele se perdesse na chave estrageira. Por favor dê uma olhada:

[color=darkblue:2977b96be8]procedure Iniciar_Transacao( Var Query: TClientDataSet);
begin
with Dm_Tabelas do
begin
TD.TransactionID := Query.Tag;
TD.IsolationLevel := xilREADCOMMITTED;
DB_Callcenter.CloseDataSets;
DB_Callcenter.StartTransaction(TD);
DB_Callcenter.CloseDataSets;
end;
end;



Procedure Importacao_Credenciados_Cnen(Cliente : integer);
var Arquivo : TextFile;
S : string;
X:integer;
begin
with Dm_Tabelas do
begin
if not Frm_Importacao.Opendialog1.execute then
exit;

AssignFile(Arquivo,Frm_Importacao.OPenDialog1.FileName);
reset(Arquivo);

Frm_Mensagem.show;
Frm_Mensagem.Btn_Mensagem.caption := ´´;
Frm_Mensagem.Btn_Mensagem.caption := ´Aguarde !!! Importando Dados!´;
Frm_Mensagem.Gauge.Progress := 0;
Frm_Mensagem.Gauge.MaxValue := 100;

Qy_Geral.close;
Qy_Geral.sql.clear;
Qy_Geral.sql.add(´Delete from Credenciados_Enderecos ´);
Qy_Geral.sql.add(´Where Id_Cliente = ´ + inttostr(cliente));
Qy_Geral.execsql;

Qy_Geral.close;
Qy_Geral.sql.clear;
Qy_Geral.sql.add(´Delete from Credenciados_Clientes ´);
Qy_Geral.sql.add(´Where Id_Cliente = ´ + inttostr(cliente));
Qy_Geral.execsql;


while not eof(Arquivo) do
begin
readln(Arquivo,S);

if Frm_Mensagem.Gauge.progress >= 100 then
Frm_Mensagem.Gauge.progress := 0;

Frm_Mensagem.Gauge.progress := Frm_Mensagem.Gauge.progress + 1;
Frm_Mensagem.Refresh;

//Formatando a máscara do CPF/CNPJ
Credenciado_Sem_Mascara := trim(copy(S,1,14));

if Length(Credenciado_Sem_Mascara) = 11 then
begin
Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,3)+´.´+copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´-´+copy(Credenciado_Sem_Mascara,9,2);
Tipo_Pessoa := ´F´;
end
else
begin
Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,2)+´.´+Copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´/´+copy(Credenciado_Sem_Mascara,9,4)+´-´+copy(Credenciado_Sem_Mascara,13,2);
Tipo_Pessoa := ´J´;
end;

Qy_Credenciados.close;
Qy_Credenciados.SQL.Clear;
Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
Qy_Credenciados.Open;
CDS_Credenciados.Open;
CDS_Credenciados.Refresh;

if CDS_Credenciados.RecordCount > 0 then
CDS_Credenciados.Edit
else
CDS_Credenciados.Append;

CDS_CredenciadosCredenciado.asstring := Credenciado_Com_Mascara;
CDS_CredenciadosNome_Credenciado.asstring := copy(S,21,50);
CDS_CredenciadosTipo.asstring := Tipo_Pessoa;
CDS_CredenciadosExcluido.asstring := ´Não´;

Iniciar_Transacao(CDS_Credenciados);
CDS_Credenciados.Post;
CDS_Credenciados.ApplyUpdates(0);

if CDS_Credenciados.ApplyUpdates(0) = 0 then
DB_Callcenter.Commit(TD)
else DB_Callcenter.Rollback(TD);

Qy_Credenciados.close;
Qy_Credenciados.SQL.Clear;
Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + Credenciado_Com_Mascara + chr(39));
Qy_Credenciados.Open;

CDS_Credenciados.Open;
CDS_Credenciados.Refresh;

Codigo_Credenciado := Qy_CredenciadosId.AsString ;

//Verifica se Endereco ja existe
Qy_Credenciados_Enderecos.Close;
Qy_Credenciados_Enderecos.sql.clear;
Qy_Credenciados_Enderecos.sql.add(´Select * From Credenciados_Enderecos ´);
Qy_Credenciados_Enderecos.sql.add(´Where Id_Credenciado = ´ + chr(39) + Codigo_Credenciado + chr(39));
Qy_Credenciados_Enderecos.sql.add(´ and Endereco = ´ + chr(39) + copy(S,72,50) + chr(39));
Qy_Credenciados_Enderecos.sql.add(´ and Id_Cliente = ´ + inttostr(cliente));
Qy_Credenciados_Enderecos.Open;

CDS_Credenciados_Enderecos.Open;
CDS_Credenciados_Enderecos.Refresh;

if CDS_Credenciados_Enderecos.RecordCount > 0 then
CDS_Credenciados_Enderecos.edit
else
CDS_Credenciados_Enderecos.Append;

CDS_Credenciados_EnderecosId_Credenciado.asstring := Codigo_Credenciado;
CDS_Credenciados_EnderecosEndereco.asstring := copy(S,72,50);
CDS_Credenciados_EnderecosBairro.asstring := copy(S,147,25);
CDS_Credenciados_EnderecosCidade.asstring := copy(S,122,25);
CDS_Credenciados_EnderecosEstado.asstring := copy(S,172,2);
CDS_Credenciados_EnderecosTelefone1.asstring := copy(S,206,4) + copy(S,174,9);

if copy(S,186,9) ´ ´ then
CDS_Credenciados_EnderecosTelefone2.asstring := copy(S,206,4) + copy(S,186,9);

CDS_Credenciados_EnderecosId_Cliente.asinteger := Cliente;
CDS_Credenciados_EnderecosExcluido.asstring := ´Não´;

Iniciar_Transacao(CDS_Credenciados);
CDS_Credenciados_Enderecos.post;
CDS_Credenciados_Enderecos.ApplyUpdates(0);

if CDS_Credenciados_Enderecos.ApplyUpdates(0) = 0 then
DB_Callcenter.Commit(TD)
else DB_Callcenter.Rollback(TD);

Qy_Credenciados_Clientes.Close;
Qy_Credenciados_Clientes.sql.clear;
Qy_Credenciados_Clientes.sql.add(´Select * From Credenciados_Clientes ´);
Qy_Credenciados_Clientes.sql.add(´Where Id_Cliente = ´ + inttostr(Cliente));
Qy_Credenciados_Clientes.sql.add(´ and Id_Credenciado = ´ + chr(39) + Codigo_Credenciado + chr(39));
Qy_Credenciados_Clientes.Open;

CDS_Credenciados_Clientes.Open;
CDS_Credenciados_Clientes.Refresh;

if CDS_Credenciados_Clientes.RecordCount > 0 then
CDS_Credenciados_Clientes.edit
else
CDS_Credenciados_Clientes.append;

// Verifica se o Credenciado já foi importado
CDS_Credenciados_ClientesId_Cliente.asinteger := Cliente;
CDS_Credenciados_ClientesId_Credenciado.asstring := Codigo_Credenciado;
CDS_Credenciados_ClientesData_Importacao.asdatetime := date;
CDS_Credenciados_ClientesId_Gerencia.AsInteger := Frm_Importacao.Codigo_Gerencia;
CDS_Credenciados_ClientesEmergencia.asstring := ´ ´;
CDS_Credenciados_ClientesExcluido.asstring := ´Não´;

Iniciar_Transacao(CDS_Credenciados);
CDS_Credenciados_Clientes.post;
CDS_Credenciados_Clientes.ApplyUpdates(0);

if CDS_Credenciados_Clientes.ApplyUpdates(0) = 0 then
DB_Callcenter.Commit(TD)
else DB_Callcenter.Rollback(TD);

end; // fim while not eof (Arquivo)
Frm_Mensagem.close;
end; {With Dm_Tabelas}
application.messagebox(´Importação Realizada com Sucesso !´,´Importação de Dados´,mb_iconinformation+mb_ok);
end;[/color:2977b96be8]


Obrigado,
Alexandra.


GOSTEI 0
Vinicius2k

Vinicius2k

18/10/2004

Alexandra,

Não observei no seu primeiro código updates em mais de uma tabela, perdõe-me, por isso eu sugeri a colocação de um único ApplyUpdates envolvido numa única transação...
Neste caso que vc apresenta agora, realmente, vc deve abrir a transação um pouco antes, mas deve ser uma única transação para todo o contexto da importação, senão, não faria sentido controlá-la...

Outro detalhe é que vc está executando o ApplyUpdates duas vezes: a primeira diretamente e a segunda dentro da condição de que se falhar dê Rollback.

Bem, entenda que o método ApplyUpdates retorna um número de erros quando alguma coisa não foi bem sucedida, por isso o teste ´if CDS.ApplyUpdates(0) = 0 then commit else rollback´, mas se vc está aplicando mais de um update, o commit ou rollback da transação só deve ser no final do processo
E um post do CDS não precisa, necessáriamente, estar atrelado à aplicação dos updates no Banco, vc pode (dependendo do volume de dados) aplicar o update uma única vez... vc só não vai poder usar uma transação curta só para o ApplyUpdates, pq agora vc está fazendo deleções antes de ´rodar´ a importação, propriamente dita...

Abaixo é a idéia do que seria o meu código. Logicamente, não tenho como testá-lo totalmente, mas creio que seria este. Como disse, a única coisa que eu faria diferente, seria aplicar os updates de todos os CDS apenas no final da rotina, mas isso fica a seu critério :

Só uma dica, ao postar um código no fórum para analise, utilize as tags BBCode:
(code)seu código aqui dentro (/code)
* substitua os parentesis, por colchetes ( = [ ...
Para poder analisar seu código eu tive que identá-lo todo antes...

procedure Iniciar_Transacao (Var Query: TClientDataSet);
begin
  with Dm_Tabelas do
  begin
    TD.TransactionID := Query.Tag;
    TD.IsolationLevel := xilREADCOMMITTED;
    DB_Callcenter.CloseDataSets;
    DB_Callcenter.StartTransaction(TD);
    DB_Callcenter.CloseDataSets;
  end;
end;



Procedure Importacao_Credenciados_Cnen(Cliente : integer);
var Arquivo : TextFile;
    S : string; 
    X: integer;
    TudoOK: Boolean;
begin
  with Dm_Tabelas do
  begin
    if not Frm_Importacao.Opendialog1.execute then
      exit;

    AssignFile(Arquivo,Frm_Importacao.OPenDialog1.FileName);
    reset(Arquivo);

    Frm_Mensagem.show;
    Frm_Mensagem.Btn_Mensagem.caption := ´´;
    Frm_Mensagem.Btn_Mensagem.caption := ´Aguarde !!! Importando Dados!´;
    Frm_Mensagem.Gauge.Progress := 0;
    Frm_Mensagem.Gauge.MaxValue := 100;

    Iniciar_Transacao(CDS_Credenciados);

    try
      Qy_Geral.close;
      Qy_Geral.sql.clear;
      Qy_Geral.sql.add(´Delete from Credenciados_Enderecos ´);
      Qy_Geral.sql.add(´Where Id_Cliente = ´ + inttostr(cliente));
      Qy_Geral.execsql;
      TudoOK:= True;
    except
      TudoOK:= False;
    end;

    try
      Qy_Geral.close;
      Qy_Geral.sql.clear;
      Qy_Geral.sql.add(´Delete from Credenciados_Clientes ´);
      Qy_Geral.sql.add(´Where Id_Cliente = ´ + inttostr(cliente));
      Qy_Geral.execsql;
      TudoOK:= True;
    except
      TudoOK:= False;
    end;


    while not eof(Arquivo) do
    begin
      readln(Arquivo,S);

      if Frm_Mensagem.Gauge.progress >= 100 then
        Frm_Mensagem.Gauge.progress := 0;

      Frm_Mensagem.Gauge.progress := Frm_Mensagem.Gauge.progress + 1;
      Frm_Mensagem.Refresh;

      //Formatando a máscara do CPF/CNPJ
      Credenciado_Sem_Mascara := trim(copy(S,1,14));

      if Length(Credenciado_Sem_Mascara) = 11 then
      begin
        Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,3)+´.´+copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´-´+copy(Credenciado_Sem_Mascara,9,2);
        Tipo_Pessoa := ´F´;
      end
      else
      begin
        Credenciado_Com_Mascara := copy(Credenciado_Sem_Mascara,1,2)+´.´+Copy(Credenciado_Sem_Mascara,3,3)+´.´+copy(Credenciado_Sem_Mascara,6,3)+´/´+copy(Credenciado_Sem_Mascara,9,4)+´-´+copy(Credenciado_Sem_Mascara,13,2);
        Tipo_Pessoa := ´J´;
      end;

      Qy_Credenciados.close;
      Qy_Credenciados.SQL.Clear;
      Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
      Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
      Qy_Credenciados.Open;
      CDS_Credenciados.Open;
      CDS_Credenciados.Refresh;

      if CDS_Credenciados.RecordCount > 0 then
        CDS_Credenciados.Edit
      else
        CDS_Credenciados.Append;

      CDS_CredenciadosCredenciado.asstring := Credenciado_Com_Mascara;
      CDS_CredenciadosNome_Credenciado.asstring := copy(S,21,50);
      CDS_CredenciadosTipo.asstring := Tipo_Pessoa;
      CDS_CredenciadosExcluido.asstring := ´Não´;

      CDS_Credenciados.Post;

      if CDS_Credenciados.ApplyUpdates(0) = 0 then 
        TudoOK:= True
      else
        TudoOK:= False;
       
      Qy_Credenciados.close;
      Qy_Credenciados.SQL.Clear;
      Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
      Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + Credenciado_Com_Mascara + chr(39));
      Qy_Credenciados.Open;

      CDS_Credenciados.Open;
      CDS_Credenciados.Refresh;

      Codigo_Credenciado := Qy_CredenciadosId.AsString ;

      //Verifica se Endereco ja existe
      Qy_Credenciados_Enderecos.Close;
      Qy_Credenciados_Enderecos.sql.clear;
      Qy_Credenciados_Enderecos.sql.add(´Select * From Credenciados_Enderecos ´);
      Qy_Credenciados_Enderecos.sql.add(´Where Id_Credenciado = ´ + chr(39) + Codigo_Credenciado + chr(39));
      Qy_Credenciados_Enderecos.sql.add(´ and Endereco = ´ + chr(39) + copy(S,72,50) + chr(39));
      Qy_Credenciados_Enderecos.sql.add(´ and Id_Cliente = ´ + inttostr(cliente));
      Qy_Credenciados_Enderecos.Open;

      CDS_Credenciados_Enderecos.Open;
      CDS_Credenciados_Enderecos.Refresh;

      if CDS_Credenciados_Enderecos.RecordCount > 0 then
        CDS_Credenciados_Enderecos.edit
      else
        CDS_Credenciados_Enderecos.Append;

      CDS_Credenciados_EnderecosId_Credenciado.asstring := Codigo_Credenciado;
      CDS_Credenciados_EnderecosEndereco.asstring := copy(S,72,50);
      CDS_Credenciados_EnderecosBairro.asstring := copy(S,147,25);
      CDS_Credenciados_EnderecosCidade.asstring := copy(S,122,25);
      CDS_Credenciados_EnderecosEstado.asstring := copy(S,172,2);
      CDS_Credenciados_EnderecosTelefone1.asstring := copy(S,206,4) + copy(S,174,9);

      if copy(S,186,9) <> ´ ´ then
        CDS_Credenciados_EnderecosTelefone2.asstring := copy(S,206,4) + copy(S,186,9);

      CDS_Credenciados_EnderecosId_Cliente.asinteger := Cliente;
      CDS_Credenciados_EnderecosExcluido.asstring := ´Não´;

      CDS_Credenciados_Enderecos.post;

      if CDS_Credenciados_Enderecos.ApplyUpdates(0) = 0 then
        TudoOK:= True
      else
        TudoOK:= False;

      Qy_Credenciados_Clientes.Close;
      Qy_Credenciados_Clientes.sql.clear;
      Qy_Credenciados_Clientes.sql.add(´Select * From Credenciados_Clientes ´);
      Qy_Credenciados_Clientes.sql.add(´Where Id_Cliente = ´ + inttostr(Cliente));
      Qy_Credenciados_Clientes.sql.add(´ and Id_Credenciado = ´ + chr(39) + Codigo_Credenciado + chr(39));
      Qy_Credenciados_Clientes.Open;

      CDS_Credenciados_Clientes.Open;
      CDS_Credenciados_Clientes.Refresh;

      if CDS_Credenciados_Clientes.RecordCount > 0 then
        CDS_Credenciados_Clientes.edit
      else
        CDS_Credenciados_Clientes.append;

      // Verifica se o Credenciado já foi importado
      CDS_Credenciados_ClientesId_Cliente.asinteger := Cliente;
      CDS_Credenciados_ClientesId_Credenciado.asstring := Codigo_Credenciado;
      CDS_Credenciados_ClientesData_Importacao.asdatetime := date;
      CDS_Credenciados_ClientesId_Gerencia.AsInteger := Frm_Importacao.Codigo_Gerencia;
      CDS_Credenciados_ClientesEmergencia.asstring := ´ ´;
      CDS_Credenciados_ClientesExcluido.asstring := ´Não´;

      CDS_Credenciados_Clientes.post;

      if CDS_Credenciados_Clientes.ApplyUpdates(0) = 0 then
        TudoOK:= True
      else
        TudoOK:= False;

    end; // fim while not eof (Arquivo)
    Frm_Mensagem.close;
  end; {With Dm_Tabelas}
  
  if TudoOK then
  begin
    DB_Callcenter.Commit(TD);    
    application.messagebox(´Importação Realizada com Sucesso !´,´Importação de Dados´,mb_iconinformation+mb_ok);
  end
  else
    DB_Callcenter.Rollback(TD);    
    Showmessage(´Ocorreram erros, todas as operações desfeitas.´);    
  end;
end;


T+


GOSTEI 0
Aleguerra

Aleguerra

18/10/2004

Vinicius,

Ocorreu o mesmo erro anterior ´cannot create new connection because in manual or distributed transaction mode´. O que eu estou fazendo de errado?

Por favor, me indique um caminho, pois estou com problemas com esses updates.


Obrigado,

Alexandra.


GOSTEI 0
Vinicius2k

Vinicius2k

18/10/2004

Alexandra,

Observei mais uma coisa... e acho que este pode ser o problema...
Acho que vc deve manter o último código q lhe passei, mas nos trechos aonde vc tem este código (ou semelhante) :
Qy_Credenciados.close;
Qy_Credenciados.SQL.Clear;
Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
Qy_Credenciados.Open;
CDS_Credenciados.Open;
CDS_Credenciados.Refresh;

Substitua por :
CDS_Credenciados.Close;
Qy_Credenciados.close;
Qy_Credenciados.SQL.Clear;
Qy_Credenciados.SQL.Add(´Select * from Credenciados ´);
Qy_Credenciados.SQL.Add(´Where Credenciado = ´ + chr(39) + copy(s,1,14) + chr(39));
CDS_Credenciados.Open;


Só para vc entender como funciona a midas (Provider + CDS)... quando vc chama o método Open do CDS, o provider interage com o SQLDataSet ou SQLQuery fazendo isso:
1. abre uma transação se ela não existir (no seu caso existe)
2. executa a instrução e abre o SQLDataSet ou SQLQuery
3. traz os registros para o buffer do CDS
4. fecha o SQLDataSet ou SQLQuery
5. fecha a transação (se tiver sido ele quem abriu, no seu caso não).

Vc está abrindo a SQLQuery, e isso, além de desnecessário, pois o próprio provider vai se encarregar disso, causa um conflito pois a transação está sendo controlada por vc... acho que este pode ser o problema desde o início...

Espero ter ajudado agora...

T+


GOSTEI 0
Murilo-jau

Murilo-jau

18/10/2004

Pessoal estou com o mesmo problema :
´Cannot create new connection because in manual or distributed transaction mode´

Uso Delphi 7 , SQL SERVER 2000 e DBExpress.
O mesmo aplicativo roda em ORACLE e nele não ocorre erro algum !

Diferente de tudo que já achei é que da este erro quando dou um Open em um SQLQuery e em 100 ¬ dos casos que eu vi este erro dá quando vc está em uma transação.

Alguem pode me ajudar ?
Se sim ai eu passo mais informações


GOSTEI 0
POSTAR