Ir para conteúdo
  • Cadastre-se

Rodrigo Cardilo

Membros Pro
  • Total de ítens

    251
  • Registro em

  • Última visita

Posts postados por Rodrigo Cardilo

  1. Boa tarde amigos,

    Estou com um problema que nunca vi e gostaria de compartilhar caso alguém já tenha visto algo parecido.

    Meu sistema utiliza datasnap com Firedac no Servidor de Aplicação.

    Quando vou fazer uma consulta e logo em seguida gravar no banco está aparecendo a mensagem Falha Catastrófica. Como não é uma mensagem que ajuda muito andei forçando e logo após aparece uma mensagem que eu nunca me deparei antes conforme figura abaixo: 

     

    image.png.d1028cd5291113eecc9aabbf4383150e.png

     

    A única coisa que identifiquei familiar nessa mensagem é o meu provider PV08480.

     

    Caso alguém saiba "decifrar" essa mensagem e puder me ajudo fico agradecido.

     

  2. Boa tarde amigos,

    Conforme conversa no discord e ajuda do amigo @Daniel InfoCotidiano e @Victor H. Gonzales - Panda segue unit alterada para cobrança registrada do C6.

    A principal mudança foi a utilização da modalidade onde Modalidade = '' ou = '1' é do modo que já funcionava (cobrança direta) e Modalidade = '2' é cobrança registrada segundo manual anexo.

    Uma sugestão minha seria apagar os comentários existentes na unit sobre remessa cnab240 pois o banco não utiliza isso.

    Grato desde já e obrigado pela ajuda.

     

    ACBrBancoC6.pas

    • Curtir 2
  3. Boa tarde amigos do ACBR,

    Conversando com o @Daniel InfoCotidiano no discord e estudando a unit ACBRBancoC6 eu percebi que temos um problema com o tipo de cobrança. O C6 trabalha com cobrança direta e cobrança com registro (que é meu caso) e não é contemplado pelo arquivo. Minha dúvida é, para melhor colaborar, existe alguma propriedade no componente ACBrBoleto onde posso classificar o tipo de cobrança?

    Segue algumas telas do manual explicando esse detalheimage1.thumb.png.c12d7d3d4665e41e00e903fee237f1a8.png

  4. Em 21/07/2023 at 16:21, Victor H. Gonzales - Panda disse:

    Boa tarde,

    obrigado pela contribuição.

    por favor faça as modificações na ultima versão que consta no SVN, a unit está 100% sinalizada com alteração.

    *obs, não altere a formatação do arquivo original.

    Boa tarde,

     

    Não entendi. A minha alteração não foi na última versão?

     

     

  5. Bom dia amigos,

    Aconteceu esse caso com um cliente meu semana passada. Ele emitiu um ct-e de MG para SP com o valor errado. O tomador, que é contribuinte de ICMS,  realizou o evento Prestação do Serviço em Desacordo e solicitou um outro Ct-e. Agora não consigo gerar um Ct-e substituto sem colocar uma chave, seja do Ct-e de Anulação, seja de NF-e de Anulação. Alguém sabe como deve ser feito a partir de agora, ainda na versão 3.0?

     

    Grato desde já

  6. Olá amigos,

    Tenho um sistema para controle de ocupação de um determinado condomínio que a partir de agora me solicitaram uma espécie de mapa de ocupação conforme imagens anexo.

    Já tenho esse controle de ocupação por data em banco de dados e fiz um mapa usando dbgrid porém é muito lento para ser montado.

    Estou procurando uma alternativa e não sei qual componente eu poderia utilizar ou uma maneira de ser preenchido dinamicamente pegando os dados do Banco de Dados.

    Se alguém tiver alguma dica e puder me ajudar eu agradeço.

    Grato

    Imagem-1-campanha-engajamento-5.png

    MapaNovoFinal.png

  7. Em 14/02/2023 at 07:50, Aggille Sistemas de Gestão disse:

    eu faço desta forma.. e vêm retorno em todos os fitros...

     

    // em aberto por vencimento
      aFiltros[0] := TACBrBoletoWSFiltroConsulta.Create;
      aFiltros[0].Clear;
      aFiltros[0].indicadorSituacao   := TACBrIndicadorSituacaoBoleto.isbAberto;
      aFiltros[0].boletoVencido := ibvSim;
      aFiltros[0].dataVencimento.DataInicio := AInicio;
      aFiltros[0].dataVencimento.DataFinal  := AFinal;

      // em aberto por emissao
      aFiltros[1] := TACBrBoletoWSFiltroConsulta.Create;
      aFiltros[1].Clear;
      aFiltros[1].indicadorSituacao   := TACBrIndicadorSituacaoBoleto.isbAberto;
      aFiltros[1].dataRegistro.DataInicio := AInicio;
      aFiltros[1].dataRegistro.DataFinal  := aFinal;
      aFiltros[1].boletoVencido := ibvSim;

      // liquidados
      aFiltros[2] := TACBrBoletoWSFiltroConsulta.Create;
      aFiltros[2].Clear;
      aFiltros[2].indicadorSituacao   := TACBrIndicadorSituacaoBoleto.isbBaixado;
      aFiltros[2].dataMovimento.DataInicio := AInicio;
      aFiltros[2].dataMovimento.DataFinal  := AFinal;

    Também fiz dessa forma e funcionou muito bem.

    @Luiz Carlos Panoni Junior o exemplo é somente para dar um norteio. O componente é bem flexível seguindo o padrão do Banco.

     

    • Curtir 1
    • Obrigado 1
  8. 26 minutos atrás, Aggille Sistemas de Gestão disse:

    tinha um erro na unit ACBrBoletoW_Inter_API;, nas linhas 265 e 266.. ali ele estava fazendo o filtro por Vencimento mas usando as datas de Movimento.. segue unit alterada..

    ACBrBoletoW_Inter_API.pas 24.67 kB · 0 downloads

    Passei pelo mesmo problema do amigo acima e resolvi fazendo as modificações na unit conforme o amigo @Aggille Sistemas de Gestão.

    Agora funcionou perfeitamente.

  9. Boa tarde amigos,

    Após uma troca de mensagens com o usuário Daniel no discord, o mesmo me pediu pra abrir esse tópico.

    Estou tentando utilizar o ACBBoletoWs no Banco inter.

    Fiz toda a configuração e coloquei o código abaixo:

     

      ACBrBoleto1.Configuracoes.WebService.ArquivoCRT := 'D:\AdmCardilo\Boleto\InterAPI_Certificado.crt';
      ACBrBoleto1.Configuracoes.WebService.ArquivoKEY := 'D:\AdmCardilo\Boleto\InterAPI_Chave.key';
    
      ACBrBoleto1.Configuracoes.WebService.SSLHttpLib := httpOpenSSL;
      ACBrBoleto1.Configuracoes.WebService.SSLCryptLib := cryOpenSSL;
      ACBrBoleto1.Configuracoes.WebService.SSLXmlSignLib := xsLibXml2;
      ACBrBoleto1.Configuracoes.WebService.SSLType := LT_TLSv1_2;
      ACBrBoleto1.Configuracoes.WebService.UseCertificateHTTP := True;
      ACBrBoleto1.Configuracoes.WebService.TimeOut := 10000;
    
      ACBrBoleto1.Cedente.CedenteWS.ClientID := 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
      ACBrBoleto1.Cedente.CedenteWS.ClientSecret := 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
      ACBrBoleto1.Cedente.CedenteWS.Scope := 'extrato.read boleto-cobranca.read boleto-cobranca.write';

    Depois tentei fazer a consulta dos boletos em aberto com o seguinte código:

    procedure TForm1.Button2Click(Sender: TObject);
    var
      FiltrosAPI: TACBrBoletoWSFiltroConsulta;
      boleto: TACBrBoleto;
      SLRetorno: TStringList;
      Retorno: TListaACBrBoletoRetornoWS;
      I: Integer;
    begin
      boleto := ACBrBoleto1;
      FiltrosAPI := boleto.Configuracoes.WebService.Filtro;
    
      FiltrosAPI.Clear;
      FiltrosAPI.indicadorSituacao := isbAberto;
      FiltrosAPI.dataVencimento.DataInicio := StrToDate('01/01/2023') ;
      FiltrosAPI.dataVencimento.DataFinal := Date + 30;
    
      boleto.Configuracoes.WebService.Operacao := tpConsulta;
    
      boleto.Enviar;
      Retorno := boleto.ListaConsultaRetornoWeb;
      if Retorno.Count > 0 then
        begin
          SLRetorno := TStringList.Create;
          try
            SLRetorno.Add('Cod_Retorno=' + Retorno[I].CodRetorno + sLineBreak + 'Msg_Retorno=' + Retorno[I].MsgRetorno +
              sLineBreak + 'Ori_Retorno=' + Retorno[I].OriRetorno + sLineBreak + 'HTTP_Result=' +
              IntToStr(Retorno[I].HTTPResultCode) + sLineBreak + 'JSON=' + Retorno[I].JSON);
            SLRetorno.Add('indicadorContinuidade=' + BoolToStr(Retorno[0].indicadorContinuidade));
            SLRetorno.Add('proximoIndice=' + IntToStr(Retorno[0].proximoIndice));
            SLRetorno.Add(' ');
            SLRetorno.Add(' ');
            for I := 0 to Pred(Retorno.Count) do
              begin
                SLRetorno.Add('[Boletos Index = ' + FormatFloat('000', I) + ']');
                SLRetorno.Add('numeroBoletoBB = ' + Retorno[I].DadosRet.TituloRet.NossoNumero);
                SLRetorno.Add('dataRegistro = ' + DateToStr(Retorno[I].DadosRet.TituloRet.DataRegistro));
                SLRetorno.Add('dataVencimento = ' + DateToStr(Retorno[I].DadosRet.TituloRet.Vencimento));
                SLRetorno.Add('valorOriginal = ' + DateToStr(Retorno[I].DadosRet.TituloRet.ValorDocumento));
                SLRetorno.Add('carteiraConvenio = ' + Retorno[I].DadosRet.TituloRet.Carteira);
                SLRetorno.Add('variacaoCarteiraConvenio = ' + IntToStr(Retorno[I].DadosRet.TituloRet.Modalidade));
                SLRetorno.Add('codigoEstadoTituloCobranca = ' + Retorno[I].DadosRet.TituloRet.codigoEstadoTituloCobranca);
                SLRetorno.Add('estadoTituloCobranca = ' + Retorno[I].DadosRet.TituloRet.estadoTituloCobranca);
                SLRetorno.Add('contrato = ' + Retorno[I].DadosRet.TituloRet.Contrato);
                SLRetorno.Add('dataMovimento = ' + DateToStr(Retorno[I].DadosRet.TituloRet.dataMovimento));
                SLRetorno.Add('dataCredito = ' + DateToStr(Retorno[I].DadosRet.TituloRet.dataCredito));
                SLRetorno.Add('valorAtual = ' + CurrToStr(Retorno[I].DadosRet.TituloRet.valorAtual));
                SLRetorno.Add('valorPago = ' + CurrToStr(Retorno[I].DadosRet.TituloRet.ValorPago));
                SLRetorno.Add('  ---  ');
              end;
            SLRetorno.SaveToFile(PathWithDelim(ExtractFilePath(Application.ExeName)) +
              formatDateTime('yyyy.mm.dd.hh.nn.ss.zzz', now) + '-RetornoConsulta.txt');
          finally
            SLRetorno.Free;
          end;
        end;
      showMessage('Fim');
    
    end;

    Retornou o log e retorno em anexo.

    Fiz os mesmos testes pelo postman e funcionou.

    Se alguém puder me ajudar fico grato.

    Enviei os logs para [email protected]

     

    Grato desde já

     

    ArqBoletoWS.log 2023.02.08.18.27.27.868-RetornoConsulta.txt

  10. Em 12/01/2023 at 13:24, Renato Rubinho disse:

    Certo, 

    Se colocar meu outro select como subselect totalizando o valor e agrupando por data não resolve?

    SELECT
      SUM(VALORTOTAL),
      DATA
    FROM(
    SELECT 
      (SUM(
        CASE WHEN M.TIPOMOV < 2000 THEN M.QUANT ELSE 0 END -
        CASE WHEN M.TIPOMOV > 1999 THEN M.QUANT ELSE 0 END ) *
        F.CUSTO ) AS VALORTOTAL,
      M.DATA,
      F.CODPRODUTO
      FROM UN05100 F
      LEFT JOIN UN05300 M ON M.CODPRODUTO = F.CODPRODUTO
      WHERE M.DATA BETWEEN :DTESTOQUEINI AND :DTESTOQUEFIM
    GROUP BY
      M.DATA, F.CODPRODUTO, F.CUSTO
    )
    GROUP BY DATA

     

    Oi @Renato Rubinho. Na verdade o valor do estoque do dia eu já tenho o sql pronto, conforme mostrei no primeiro post. Eu precisa juntar aquele select que já funciona a outro com um periodo de datas. Suas dicas não deram certo, mas fiz de outra forma, dentro do próprio delphi pegando o valor de cada data que eu precisava. Agradeço a disponiblidade

     

    • Curtir 2
  11. 13 horas atrás, Renato Rubinho disse:

    Boa noite,

    Acredito que este código ou algo próximo a isso lhe atenda.

    SELECT 
      (SUM(
        CASE WHEN M.TIPOMOV < 2000 THEN M.QUANT ELSE 0 END -
        CASE WHEN M.TIPOMOV > 1999 THEN M.QUANT ELSE 0 END ) *
        F.CUSTO ) AS VALORTOTAL,
      M.DATA,
      F.CODPRODUTO
      FROM UN05100 F
      LEFT JOIN UN05300 M ON M.CODPRODUTO = F.CODPRODUTO
      WHERE M.DATA BETWEEN :DTESTOQUEINI AND :DTESTOQUEFIM
    GROUP BY
      M.DATA, F.CODPRODUTO, F.CUSTO

     

    Amigo @Renato Rubinho, na verdade eu preciso de um select que junte o meu select acima mencionado (que é o total de venda por dia) ao outro pra pegar o valor por um periodo como o exemplo abaixo:

    DATA                  VALOR

    01/01/2023        100,00

    02/01/2023        2000,00

    03/01/2023        800,00

    O valor por dia eu já consigo pelo meu select porém quero um select unico que me retorne da forma menciona.

    O Group by seria o campo DATA

    Mesmo assim grato pela ajuda.

  12. Bom dia amigos,

    Estou tentando montar uma consulta com as seguintes condições:

    Tenho uma tabela com os campos : CODPRODUTO, DATA, TIPOMOV, DATA, QUANT e outra com os campos CODPRODUTO, CUSTO

    A principio eu precisava do saldo do estoque e o valor total de custo em uma determinada data. Consegui usando o código abaixo:

     SELECT SUM(
         (COALESCE((SELECT SUM(M.QUANT) from UN05300 M where M.CODPRODUTO = F.CODPRODUTO
         AND M.TIPOMOV < 2000 AND M.DATA <= :DTESTOQUE),0) -
         COALESCE((SELECT SUM(M.QUANT) from UN05300 M where M.CODPRODUTO = F.CODPRODUTO
         AND M.TIPOMOV > 1999 AND M.DATA <= :DTESTOQUE),0)) * F.CUSTO)
         FROM UN05100 F

    Porém eu precisava agora de um select que me retornasse o valor de um periodo de datas agrupado por dia com as colunas DATA E VALORTOTAL usando o código acima.

    Alguém já passou por isso? Já tentei JOIN's de todos os tipos mas não obtive sucesso.

     

    Grato desde jáo em uma determinada data. Consegui usando o código abaixo:

  13. Boa tarde amigos,

    Eu tenho uma aplicação que OBRIGATORIAMENTE precisa acessar uma rotina utilizando a tecla F1.

    Em algumas situações, geralmente depois de utilizar outras teclas de atalho, aparece o erro "no context-sensitive help installed"

    A rotina funciona perfeitamente mas esse erro fica incomodando meu usuário.

    Alguém já passou por isso e saberia como desativar essa mensagem de erro?

     

    Grato desde já.

  14. 4 minutos atrás, Daniel Simoes disse:

    Ele apenas verifica, se já atingiu o prazo de espera em OffLine...

        //Verifica tempo de espera para voltar Emitir On-Line
        if CheckTimer(LStartTimerAtivarOnLine, FConfigContigencia.TempoAtivarOnLine) then
        begin
          LigarOnLine(Self);
          LStartTimerAtivarOnLine:= Now;
        end;

    Feito isso.. na próxima transmissão, se houver novamente erro.. ele sinaliza que deve voltar para OffLine, novamente...

     

    Não há uma maneira segura, de testar se um Site/Servidor está OnLine.. pois você pode ter sucesso em um teste, e ele ficar Offline instantes depois...

    Então o melhor teste é tentar transmitir algo, e capturar o erro de transmissão, se ele ocorrer...

    Entendi @Daniel Simoes, então a lógica é. Eu entrei em contingência. Depois de X segundos eu volto pra Online. Na tentativa de enviar o próximo ou algum pendente eu verifico novamente e caso não tiver sucesso volto pra Offiline correto?

  15. 55 minutos atrás, Juliomar Marchetti disse:

    No caso está correto . seu A.V. é por não criar objetos e tentar acessar o mesmo.

    Thread tu tem que isolar tudo dentro dela. conexão, componentes não deve ficar acessando externamente, pois por exemplo um form ou dm não estar criado

    Consegui criar corretamente @Juliomar Marchetti. E já está dando certo.

    Agora tenho uma outra dúvida.. Analisando os fontes procurei a rotina para voltar a emissão de NFC-e para online porém não achei nada que verifique o status da receita antes. Simplesmente existe uma procedure LigarOnLine que tem um código somente para mudar  de True para False.

    procedure TContingenciaNFCe.LigarOnLine;
    begin
      if (FConfigContigencia.FOffLine) then
      begin
         FConfigContigencia.FOffLine := False;
         FConfigContigencia.SalvarArquivo;
      end;
    
    end;

    Tem alguma outra forma no exemplo de verificar se a receita está online antes de mudar?

    Gratos desde já

  16. 20 horas atrás, Juliomar Marchetti disse:

    tu assistiu o curso? se sim lá tu tem elas disponíveis para baixar

    Sim, assisti o curso, baixei os fontes e estou testando.

    Porém, como não vou utilizar todas as rotinas do thread utilizada no curso resolvi montar minha própria Thread copiando o que eu realmente preciso na minha aplicação.

    O primeiro problema que eu estou esbarrando é configurar a classe. Fiz uma procedure identica ao do curso:

    procedure TDM1.GravarConfiguracaoContingencia;
    var
      Config: TConfigContigencia;
    begin
      Config := TConfigContigencia.Create;
      try
        Config.TempoTransmissaoOffLine := DM1.TB10910TEMPOTRANSMISSAOOFFLINE.Value;
        Config.TempoAtivarOnLine := DM1.TB10910TEMPOATIVARONLINE.Value;
        ContingenciaNFCe.SetConfigContingencia(Config);
      finally
        Config.Free;
      end;
    
    end;

    Porém dá erro de Access violation exatamente nesse ponto:

    procedure TConfigContigencia.Assign(DeConfigContigencia: TConfigContigencia);
    begin
      TempoTransmissaoOffLine := DeConfigContigencia.TempoTransmissaoOffLine;
      TempoAtivarOnLine := DeConfigContigencia.TempoAtivarOnLine;
    end;

    Como disse, sou novo na criação de Threads mas acredito que o erro não está diretamente à Thread e sim algo que eu não criei pra tentar gravar.

    Deixei anexo minha unit da classe que ainda está em construção caso alguém possa me ajudar.

    Desde já agradeço

    uContingenciaNFCe.pas

  17. Boa tarde,

    Estou fazendo alterações no meu sistema para enviar a contingência NFC-e corretamente.

    Estou criando uma thread nova adaptando para minha realidade. 

    Nesse primeiro momento preciso criar apenas 2 rotinas nessa Thread.

    A primeira é para verificar se a receita está online e sair do modo contingência.

    A segunda é, caso a receita estiver ok, enviar os cupons emitidos offline.

    Essas 2 rotinas eu preciso fazer conforme o exemplo do curso, ou seja, depois de x minutos o sistema verificar e executar.

    Alguém poderia me dar uma luz de onde eu posso encontrar na unit uContingenciaNFCe essas rotinas pra tirar como exemplo?

    Grato desde já

     

  18. 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

  19. 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

     

  20. 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á.

×
×
  • 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.

The popup will be closed in 10 segundos...