Ir para conteúdo
  • Cadastre-se

Painel de líderes

Conteúdo popular

Showing content with the highest reputation on 25-05-2023 em Posts

  1. Boa tarde! O que ocorre é que no schema é solicitado a QUANTIDADE DE VOLUMES (qVol) e não a quantidade de metros ou a quantidade de itens. Exemplo vendi 30 itens (isto já está na definição da quantidade dos itens, não é isto que é solicitado e sim quantos volumes estão no veículo de transporte. Se 30 itens enviei em 2 volumes (volumes serão 2) se coloquei os dois itens em 1 volume a informação será 1 volume. O mesmo ocorre para todos os itens. Se for metros quadrados, metros cúbicos ou itens não importa o que está sendo solicitado é como foi embalado ou disponibilizado para transporte em volumes. No teu exemplo se a venda foi de 82,33M2 e você embalar isto em 5 embalagens mesmo que vá 4 embalagens grandonas e 1 pequena serão 5 volumes. Se foi tudo 82,33m2 embalado apenas de uma forma, será 1 volume. E na espécie você diz o que é. Exemplo: rolos, caixa, pallet, pacotes, sacos, etc. Neste caso imagine que você tem: 1) Quantidade de volumes transportados - 2) Espécie dos volumes transportados - 3) a quantidade de produtos vendido, 4) o peso liquido e 5) o peso bruto. E você fosse informar agora no grupo de transportes 1) qVol (Quantidade de volumes transportados) 2) esp (Espécie de volumes transportados) 3) NÃO FOI SOLICITADO POIS ESTÃO NO QUADRO DE ITENS DE CADA PRODUTO VENDIDO, nas tags uCom (Unidade Comercial) e qCom (Quantidade Comercial) 4) PesoL (Peso Líquido) 5) PesoB (Peso Bruto) Imagine a seguinte situação: Se esta mesma empresa estivesse vendendo digamos 82,33m2 de piso. 3 latas de tintas de 1 litro cada (3 litros), 10 pinceis e 50 metros de fio 10mm, 2 rolos de fitas isolantes 5metros e 1 rolo de fita isolante 30metros alta fusão. Ao transportar alojasse para transporte 82,33m2 de piso em uma caixa e as 3 latas de tinta de 1litro mais os 10 pinceis e os 50 metros de fio e as fitas isolantes em outra caixa. Pergunto: Como você definiria a quantidade de volume transportado? Concorda que seria 2 volumes? e espécie: caixas. O campo qVol seria para esta informação.
    2 pontos
  2. Boa tarde, A mudança da orientação no drive não fez diferença, porem após mudanças no que enviou para o ACbrEtqLib, entendi melhor como poderia trabalhar com as opções enviadas e conseguir contornar um pouco esse problema. Obrigado.
    2 pontos
  3. no primeiro caso o provedor em questão pode não ter essa funcionalidade então não terá como usar o segundo se notar na documentação é o arquivo ini com o mesmo para cancelar. https://acbr.sourceforge.io/ACBrLib/NFSE_Cancelar.html
    2 pontos
  4. O Curso é Gratuito... Basta fazer um cadastro Gratuito na plataforma Eduzz
    2 pontos
  5. Isso em qual tamanho de fonte? Porque no modo condensado ela imprime em 56 colunas, como mostra a homologação do ACBr.
    2 pontos
  6. Citando o problema occorido no post sobre Out of Memory no Bloco I, estava pensando em um forma de modificar o componente com o menor impacto possível. Achei uma solução que me parece ser adequada e gostaria de saber se é aceitavel esse tipo de modificação. Hoje, o componente trabalha com alguns dados sendo alimentados em um TObjectList, o qual são percorridos quando chama a função SaveFileTXT. A minha ideia foi, ao inves de ficar segurando esses itens até o fim, porque não ir alimentado o arquivo conforme os registros de cada bloco iriam sendo finalizados? Com isso em mente, eu precisava informar pro componente que iria querer trabalhar de uma forma diferenciada quanto a alimentação do arquivo, o qual nos leva a primera modificação no ACBrSpedContabil.pas: procedure IniciaGeracao(const pWriteManual: Boolean = False); Esse parametro será salvo em uma variavel (privada) que será usada ao longo dos WriteBlocos presentes no componente. Como o nome indica, os Writes (tanto WriteBloco_? quanto WriteRegistro????, com exceção dos ?990 que são totalizadores) serão feitos manualmente, ou seja, o aplicativo precisa chamar esses comandos, o que nos leva a segunda modificação no ACBrSpedContabil.pas: public procedure WriteRegistro0000; procedure WriteRegistro0001; ... procedure WriteRegistroI001; ... procedure WriteRegistroJ001; ... Com esses comandos em public, a sua aplicação ja consegue acessa-los. Apartir daqui, precisei informar aos WriteBloco_? que quando for em modo WriteManual, ele não deve chamar as rotinas que não sejam de totalizadores. Segue (alguma das, são basicamente iguais em todos os blocos, menos no 9) a terceira modificação no ACBrSpedContabil.pas: procedure TACBrSPEDContabil.WriteBloco_0; begin if Bloco_0.Gravado then exit ; if not FInicializado then raise Exception.Create( 'Métodos "IniciaGeracao" não foi executado' ); if not(FWriteManual) then begin WriteRegistro0000; WriteRegistro0001; WriteRegistro0007; WriteRegistro0035; WriteRegistro0020; WriteRegistro0150; //WriteRegistro0180; end; WriteRegistro0990; Bloco_0.WriteBuffer; Bloco_0.Conteudo.Clear; Bloco_0.Gravado := true; end; Os outros blocos seguem o mesmo padrão, apenas o WriteRegistro?990 esta fora da validação do WriteManual, exceto o WriteBloco_9. Segue o mesmo: procedure TACBrSPEDContabil.WriteBloco_9; begin if Bloco_9.Gravado then Exit; if not Bloco_9.Gravado then WriteBloco_K; if not(FWriteManual) then WriteRegistro9001; WriteRegistro9900; WriteRegistro9990; WriteRegistro9999; Bloco_9.WriteBuffer; Bloco_9.Conteudo.Clear; Bloco_9.Gravado := true; end; Como o proprio bloco ja é um totalizador em si, e só é necessário informar o registro 9001, ele contem outras rotinas fora da validação do WriteManual. Falando no Bloco 9, ele me apresentou casos que me fizeram modificar o ACBrECDBloco_9.pas. Segue ela: function TRegistro9900List.FindByREG_BLC(const pValue: String; out pReg: TRegistro9900): Boolean; var i: Integer; begin Result := False; for i := 0 to (Count - 1) do if (TRegistro9900(Items[i]).REG_BLC = pValue) then begin pReg := TRegistro9900(Items[i]); Result := True; Break; end; end; Em registros como o do I200, K030, existe a relação de mestre-detalhe entre os itens, e como os WriteRegistro???? sempre chamam a rotina que cria o seu respectivo totalizador no bloco 9, foi preciso fazer um jeito de que quando existisse mais de um registro mestre, ele não ficasse criando registros subsequentes no bloco 9, e apartir disso, surgiu a rotina acima. Voltando ao ACBrSpedContabil.pas, como precisava usar a FindByREG_BLC, ja aproveitei e dei ao luxo de centralizar a rotina que gera os totalizadores do bloco 9. Segue ela: procedure TACBrSPEDContabil.AddRegistro9900(const pREG_BLC: String; const pQTD_REG_BLC: Integer); var Reg: TRegistro9900; begin if (pQTD_REG_BLC > 0) then begin if not(Bloco_9.Registro9900.FindByREG_BLC(pREG_BLC, Reg)) then begin Reg := Bloco_9.Registro9900.New; Reg.REG_BLC := pREG_BLC; end; Reg.QTD_REG_BLC := Reg.QTD_REG_BLC + pQTD_REG_BLC; end; end; Com essa rotina, os WriteRegistro???? passaram a utilizar elas ao inves de cada um chamar o bloco 9 individualmente. Segue alguns exemplos: // NOVO procedure TACBrSPEDContabil.WriteRegistro0000; begin Bloco_0.WriteRegistro0000; AddRegistro9900('0000', 1); end; // ANTIGO procedure TACBrSPEDContabil.WriteRegistro0000; begin with Bloco_9.Registro9900.New do begin REG_BLC := '0000'; QTD_REG_BLC := 1; end; Bloco_0.WriteRegistro0000; end; // NOVO procedure TACBrSPEDContabil.WriteRegistro0007; begin Bloco_0.WriteRegistro0007; AddRegistro9900('0007', Bloco_0.Registro0007.Count); if FWriteManual then Bloco_0.Registro0007.Clear; end; // ANTIGO procedure TACBrSPEDContabil.WriteRegistro0007; begin if Bloco_0.Registro0007.Count > 0 then begin with Bloco_9.Registro9900.New do begin REG_BLC := '0007'; QTD_REG_BLC := Bloco_0.Registro0007.Count; end; end; Bloco_0.WriteRegistro0007; end; // NOVO procedure TACBrSPEDContabil.WriteRegistro0150; begin Bloco_0.WriteRegistro0150; AddRegistro9900('0150', Bloco_0.Registro0150.Count); AddRegistro9900('0180', Bloco_0.Registro0180Count); if FWriteManual then begin Bloco_0.Registro0150.Clear; Bloco_0.Registro0180Count := 0; end; end; // ANTIGO procedure TACBrSPEDContabil.WriteRegistro0150; begin Bloco_0.WriteRegistro0150; if Bloco_0.Registro0150.Count > 0 then begin with Bloco_9.Registro9900.New do begin REG_BLC := '0150'; QTD_REG_BLC := Bloco_0.Registro0150.Count; end; end; if Bloco_0.Registro0180Count > 0 then begin with Bloco_9.Registro9900.New do begin REG_BLC := '0180'; QTD_REG_BLC := Bloco_0.Registro0180Count; end; end; end; Como você pode perceber, algumas dessas rotinas começarão a dar Clear no TObjectList, e, zerar as variaveis de Count dos detalhes, quando presente. Isso acontece pois cada Bloco_?.WriteRegistro???? percorre sempre todo o TObjectList, então cada vez que chamarmos manualmente essa rotina, ele não pode mais alimentar o que ja havia sido alimentado antes. O mesmo serve para a variavel de Count, como a rotina AddRegistro9900 é incremental, precisa zera-la, para que na proxima leva, incremente apenas o que foi informado ali. Feito isso, o componente já esta preparado para funcionar dessa nova forma de alimentação. Como implementar isso na minha aplicação? Usando apenas os blocos acimas para exemplificar, segue como é feito hoje: SPED.IniciaGeracao; with SPED.Bloco_0 do begin with Registro0000 do ... with Registro0007.New do ... for i := 0 to 2 do with Registro0150.New do begin ... with Registro0180.New do ... end; end; SPED.SaveFileTXT; E como deverá ser feito, caso queira utilizar o WriteManual: SPED.IniciaGeracao(True); // NOVO with SPED.Bloco_0 do begin with Registro0000 do ... WriteRegistro0000; // NOVO with Registro0007.New do ... WriteRegistro0007; // NOVO for i := 0 to 2 do begin with Registro0150.New do begin ... with Registro0180.New do ... end; WriteRegistro0150; // NOVO end; end; SPED.WriteBloco_0; // NOVO SPED.SaveFileTXT; Seguindo essa lógica para os outros blocos/registros, seus dados finais deverão ser identicos ao mesmo metodo de hoje, e também identicos quando for usado WriteManual False. Também modifiquei a rotina TotalizarTermos usando um método que achei na internet (não consigo mais achar) pois a base de dados que estava usando para fazer os testes resulta em arquivos consideravelmente grandes (4gb+, 40mi+ linhas) e a rotina antiga simplismente não finalizava. ACBrECDBloco_9.pas ACBrSpedContabil.pas
    1 ponto
  7. Obrigado pela contribuição, em breve será validada para possível inclusão ao svn #TK-3990
    1 ponto
  8. Boa tarde. Adicionei duas novas funções no arquivo ACBrEFDBlocos.pas. Desde já agradeço a atenção!ACBrEFDBlocos.pas
    1 ponto
  9. Foi enviado ao SVN na Rev-29651 alteração visando resolver esta questã do NFSe_ConsultarNFSePorRPS. Por favor, atualize seus fontes do programa exemplo e faça um novo teste.
    1 ponto
  10. Pessoal, obrigado pela atenção. Atualizei o ACBr e foi. Se possível atualizar o arquivo ACBrNFSeXServicos.ini Foi implementado o ambiente de homologação. [3167202] ; Atualizado em 27/01/2023 Nome=Sete Lagoas UF=MG Provedor=Libre Versao=2.04 ProRecepcionar=https://nfse.setelagoas.mg.gov.br/webservice/index/producao ProNameSpace=https://nfse.setelagoas.mg.gov.br/webservice/index/producao HomRecepcionar=http://homolog.libresolucoes.com.br:8010/webservice/index/producao HomNameSpace=http://homolog.libresolucoes.com.br:8010/webservice/index/producao
    1 ponto
  11. 1 ponto
  12. A descrição da TAG é "Quantidade de volumes transportados", portanto entende-se que seriam quantos volumes e não uma unidade de volume (litros ou m³). Ainda na coluna de tamanho o manual orienta 1-15 caracteres. Veja por exemplo quando existem casas decimais no caso dos dados de peso que a indicação é 12v3 onde 12 é o tamanho e 3 as casas decimais.
    1 ponto
  13. Se tiver uma documentação do PSP também facilita bastante o nosso processo de integração. Caso consiga pode anexar aqui no forum.
    1 ponto
  14. Nós do ACBr, oficialmente, apenas temos o Fast Report VCL Embarcadero... a FastReports não nos enviou seus produtos para testes e compatibilidade com nossos fontes... Alguns de nossos moderadores possuem o Fast Standard VCL.. então nossa capacidade de testar essa compatibilidade, é extremamente limitada a contribuição de nossos usuários...
    1 ponto
  15. tanto fortes quanto acbr tu tem fontes antigos dos dois. no micro. mantenha uma pasta só do ACBr e uma do fortes report
    1 ponto
  16. Segue uma correção. Faltou limpar alguns objetos que estavam presentes em uns List ACBrSpedContabil.pas
    1 ponto
  17. Bom dia, nome da API do Boleto PIX Itaú.....Recebimentos Pix - API exclusiva Itaú, depois vc vai na opção bolecode (Clientes), mais para isso você tem ativar e assinar o certificado digital, mesmo processo feito na API de Cobrança v2.
    1 ponto
  18. Boa noite só para atualizar o topico...eu consegui a emissão do boleto híbrido Itaú....100% em produção. Uma dica que dou é se vc vai desenvolver a emissão de boleto via API do Itaú...é melhor vc escolher logo o boleto PIX. Eu tive 2 trabalho. Primeiro desenvolvi a emissão usando API de Cobrança v2, depois tive que fazer tudo de novo com boleto híbrido PIX.
    1 ponto
  19. isso tudo usando o ACBrBoleto ? se sim sobe os arquivos para que possamos validar e ajudar a todos igual o ACBr faz
    1 ponto
  20. Será que já tem o boleto híbrido do PIX do itaú? eu não achei nada sobre isso....apenas o PIX normal.
    1 ponto
  21. flexmobile Eu vou tentar fazer o boleto híbrido do itaú agora...já fizemos o boleto tradicional na v2 do itaú...vou conversar com meu gerente de conta para abrir um protocolo para homologação do boleto híbrido PIX itáu. Eu já tem os boletos híbrido sicredi, sicoob e BB.
    1 ponto
×
×
  • 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.