Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 816 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Membros Pro
Postado

Boa tarde amigos,

Estou implementando uma rotina para baixar automaticamente os NCM's através do ACBrNCM e logo após baixar a tabela IBPT e posteriormente gravar no meu banco de dados.

Para tal rotina eu criei utilizei uma Thread da seguinte forma:

  TThread.CreateAnonymousThread(DM1.AtualizarNCM).Start;

Essa procedure AtualizaNCM possui o seguinte código:

procedure TDM1.AtualizarNCM;
var
  I: Integer;
begin
  ACBrNCMs1.ObterNCMs;
  try
    // Primeiro Baixar Tabela de NCM válidos
    TB05900.Open;

    for I := 0 to ACBrNcms1.NCMs.Count - 1 do
      begin
        if Length(ACBrNCMs1.NCMs[I].CodigoNcm) = 8 then
          begin
            TB05900.Insert;
            TB05900NCM.Value := ACBrNCMs1.NCMs[I].CodigoNcm;
            TB05900DTINICIO.Value := ACBrNCMs1.NCMs[I].DataInicio;
            TB05900DTFIM.Value := ACBrNCMs1.NCMs[I].DataFim;
            TB05900.Post;
          end;
        TB05900.ApplyUpdates(-1);
      end;

    // Agora Baixa Tabela csv do IBPT
    ACBrDownload1.DownloadUrl := 'https://www.tabelas.com/TabelaIBPTMG.csv';
    ACBrDownload1.StartDownload;
  except
  end;
end;

E quando finaliza o download da Tabela do IBPT acontece o seguinte evento:

procedure TDM1.ACBrDownload1AfterDownload(Sender: TObject);
var
  NomeArquivo: string;
  I: integer;
begin
  if ACBrDownload1.DownloadStatus = stDownload then
    begin
      TB05900.Close;
      TB05900.Open;
      NomeArquivo := ExtractFilePath(Application.ExeName) + '\TabelaIBPTMG.csv';
      if ACBrIBPTax1.AbrirTabela(NomeArquivo) then
        try
          for I := 0 to ACBrIBPTax1.Itens.Count - 1 do
            begin
              if TB05900.Locate('NCM', ACBrIBPTax1.Itens[I].NCM, []) then
                begin
                  TB05900.Edit;
                  TB05900ALIQNAC.Value := ACBrIBPTax1.Itens[I].FederalNacional;
                  TB05900ALIQIMP.Value := ACBrIBPTax1.Itens[I].FederalImportado;
                  TB05900ALIQEST.Value := ACBrIBPTax1.Itens[I].Estadual;
                  TB05900.Post;
                  TB05900.ApplyUpdates(-1);
                end;
            end;
        except
        end;
    end;
end;

Testando o botão dá tudo certo.

Porém se tento fazer uma consulta no meu banco de dados enquanto a thread roda retorna o seguinte erro: Missing data provider or datapacket. Só frisando, eu utilizo Datasnap.

Será que tenho que mudar algo na minha Thread?

Agradecido desde já qualquer ajuda.

Rodrigo Cardilo

Card System Info

[email protected]

  • Membros Pro
Postado
Em 04/09/2022 at 08:01, Daniel Simoes disse:

Crie componentes de acesso aos dados dentro da Thread...

Mesmo o ACBrNCM poderia estar dentro da Thread

Oi @Daniel Simoes, você diz criar o clientdataset dentro da Thread? 

Tentei da forma abaixo e não deu certo.

procedure TDM1.AtualizarNCM;
var
  I: Integer;
  Tbl05900: TClientDataSet;
begin
  try
    ACBrNCMs1.ObterNCMs;
    // Primeiro Baixar Tabela de NCM válidos
    TransactionSql := 'DELETE FROM UN05900';
    DMG.ExecutaTransacaoSql;
    Tbl05900 := TClientDataSet.Create(Self);
    Tbl05900.RemoteServer := DMG.DSPVConnection1;
    Tbl05900.ProviderName := 'PV05900';
    Tbl05900.Open;

    for I := 0 to ACBrNCMs1.NCMs.Count - 1 do
      begin
        if Length(ACBrNCMs1.NCMs[I].CodigoNcm) = 8 then
          begin
            TBl05900.Insert;
            TBL05900.FieldByName('NCM').AsString := ACBrNCMs1.NCMs[I].CodigoNcm;
            TBL05900.FieldByName('DTINICIO').AsDateTime := ACBrNCMs1.NCMs[I].DataInicio;
            TBL05900.FieldByName('DTFIM').AsDateTime := ACBrNCMs1.NCMs[I].DataFim;
            TBl05900.Post;
          end;
        TBl05900.ApplyUpdates(-1);
      end;
  
  except
  end;
end;

Estou chamando a procedure acima com a rotina abaixo:

TThread.CreateAnonymousThread(DM1.AtualizarNCM).Start;

Só retorna erro quando tento fazer um acesso à outra tabela ao mesmo tempo.

 

Grato desde já.

Rodrigo Cardilo

Card System Info

[email protected]

  • Membros Pro
Postado
7 minutos atrás, Juliomar Marchetti disse:

Boa tarde

sim . tudo o que for usar declare e instancia dentro da thread

não tente ficar usando por exemplo uma conexão externa passando por parametro

 

Boa tarde @Juliomar Marchetti, eu entendi o que quis dizer porém como faço com o DataSnap?

Já tentei enviar via sql direto porém o erro muda. Se eu aguardar a Thread, o que não é o objetivo, não dá erro algum.

O problema só acontece quando tento fazer outro acesso aos dados ao mesmo tempo que Thread está rodando

 

Rodrigo Cardilo

Card System Info

[email protected]

  • Membros Pro
Postado
2 minutos atrás, Juliomar Marchetti disse:

Sim mas como falamos acima e nota no seu código, ele está aproveitando conexão externa e componentes query externos

Tbl05900.RemoteServer := DMG.DSPVConnection1;

Entendi. então o que vc me sugere é que eu crie o DSPVConnection e consenquentemente o SqlConnection a quem ele está vinculado conforme na imagem abaixo correto?

 

Sem título.png

Rodrigo Cardilo

Card System Info

[email protected]

  • Este tópico foi criado há 816 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.