Ir para conteúdo
  • Cadastre-se

Waldir Paim

Moderadores
  • Total de ítens

    610
  • Registro em

  • Última visita

  • Days Won

    4

Tudo que Waldir Paim postou

  1. Acredito que a correção pode ser essa: De : function TDFeCapicom.GetCertDataVenc: TDateTime; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.ValidToDate else Result := inherited; end; function TDFeCapicom.GetCertNumeroSerie: String; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.SerialNumber else Result := inherited; end; function TDFeCapicom.GetCertSubjectName: String; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.SubjectName else Result := inherited; end; Para: function TDFeCapicom.GetCertDataVenc: TDateTime; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.ValidToDate else Result := inherited GetCertDataVenc; end; function TDFeCapicom.GetCertNumeroSerie: String; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.SerialNumber else Result := inherited GetCertNumeroSerie; end; function TDFeCapicom.GetCertSubjectName: String; begin CarregarCertificadoSeNecessario; if Assigned(FCertificado) then Result := FCertificado.SubjectName else Result := inherited GetCertSubjectName; end; Aqui compilou, mas vamos aguardar a correção definitiva.
  2. Segue anexo ACBrNFeNotasFiscais.pas
  3. Régys, Consegui achar o problema. Voltei essa alteração na unit ACBrNFeNotasFiscais De: function TNotasFiscais.LoadFromFile(CaminhoArquivo: String; AGerarNFe: Boolean = True): Boolean; var XMLStr: String; XMLUTF8: AnsiString; i, l: integer; MS: TMemoryStream; begin Result := False; MS := TMemoryStream.Create; try MS.LoadFromFile(CaminhoArquivo); XMLUTF8 := ReadStrFromStream(MS, MS.Size); finally MS.Free; end; l := Self.Count; // Indice da última nota já existente { Chamando ParseTXT, para converter de UTF8 para a String nativa e Decodificar caracteres HTML Entity } XMLStr := ParseText(XMLUTF8, True); LoadFromString(XMLStr, AGerarNFe); // Atribui Nome do arquivo a novas notas inseridas // for i := l to Self.Count - 1 do Self.Items[i].NomeArq := CaminhoArquivo; Result := True; end; Para: function TNotasFiscais.LoadFromFile(CaminhoArquivo: String; AGerarNFe: Boolean = True): Boolean; var XMLStr: String; XMLUTF8: AnsiString; i, l: integer; MS: TMemoryStream; begin Result := False; MS := TMemoryStream.Create; try MS.LoadFromFile(CaminhoArquivo); XMLUTF8 := ReadStrFromStream(MS, MS.Size); finally MS.Free; end; l := Self.Count; // Indice da última nota já existente // Converte de UTF8 para a String nativa da IDE // XMLStr := DecodeToString(XMLUTF8, True); LoadFromString(XMLStr, AGerarNFe); // Atribui Nome do arquivo a novas notas inseridas // for i := l to Self.Count - 1 do Self.Items[i].NomeArq := CaminhoArquivo; Result := True; end; E voltou a funcionar normalmente. Na verdade a alteração foi aqui: De: Para: Essa alteração foi feita no ultimo commit dessa unit.
  4. Régys, Ainda estou verificando, mas já sei que é aqui: procedure NotaFiscal.Validar; var Erro, AXML: String; NotaEhValida, ok: Boolean; ALayout: TLayOut; VerServ: Real; Modelo: TpcnModeloDF; cUF: Integer; begin AXML := XMLAssinado; with TACBrNFe(TNotasFiscais(Collection).ACBrNFe) do begin VerServ := FNFe.infNFe.Versao; Modelo := StrToModeloDF(ok, IntToStr(FNFe.Ide.modelo)); cUF := FNFe.Ide.cUF; if EhAutorizacao( DblToVersaoDF(ok, VerServ), Modelo, cUF) then ALayout := LayNfeAutorizacao else ALayout := LayNfeRecepcao; // Extraindo apenas os dados da NFe (sem nfeProc) AXML := '<NFe xmlns' + RetornarConteudoEntre(AXML, '<NFe xmlns', '</NFe>') + '</NFe>'; NotaEhValida := SSL.Validar(AXML, GerarNomeArqSchema(ALayout, VerServ), Erro); //aqui ele não valida a nota. if not NotaEhValida then begin FErroValidacao := ACBrStr('Falha na validação dos dados da nota: ') + IntToStr(NFe.Ide.nNF) + sLineBreak + FAlertas ; FErroValidacaoCompleto := FErroValidacao + sLineBreak + Erro; raise EACBrNFeException.CreateDef( IfThen(Configuracoes.Geral.ExibirErroSchema, ErroValidacaoCompleto, ErroValidacao)); end; end; end; Para chegar ai gera um XML com o & no nome e tenta consulta a nota. Apresenta a mensagem de erro. Ainda estou no debug e assim que ter uma resposta mais definitiva posto aqui. Acho que entendi! function TDFeOpenSSL.Validar(const ConteudoXML, ArqSchema: String; out MsgErro: String): Boolean; var doc, schema_doc: xmlDocPtr; parser_ctxt: xmlSchemaParserCtxtPtr; schema: xmlSchemaPtr; valid_ctxt: xmlSchemaValidCtxtPtr; schemError: xmlErrorPtr; AXml: AnsiString; begin InitXmlSec; Result := False; doc := Nil; schema_doc := Nil; parser_ctxt := Nil; schema := Nil; valid_ctxt := Nil; try AXml := NativeStringToUTF8(ConteudoXML); //aqui entra &amp; e sai &. doc := xmlParseDoc(PAnsiChar(AXml)); //aqui ele retorna nil em doc. if ((doc = nil) or (xmlDocGetRootElement(doc) = nil)) then begin MsgErro := 'Erro: unable to parse'; // exit; end;
  5. Concordo contigo, Tenho a mesma situação aqui, meu caso acontece na tag <xNome></xNome>. Vou faz um debug para verificar onde ocorre o problema com mais clareza. Só para constar não estou usando o ACBrMonitorPLU uso o componente diretamente.
  6. Ola, Uma pergunta quanto ao seu ambiente! A impressão ocorre na mesma maquina ou pela rede? Se for pela rede o sistema operacional é o mesmo ou muda? Pergunto isso pois algum tempo passei por isso e a impressão ocorria pela rede do Windows XP para Windows 7 onde esta a impressora. Resolvi mudando tudo para Windows 7 ou imprimindo local.
  7. Entendido, já reverti a alteração. Obrigado pela atenção.
  8. Nas unit onde adicionei esse código : Favor considerar esse outro: para manter compatibilidade com D7.
  9. Antes de retomar esse assunto eu gostaria de me desculpar com os colegas pela grosseria de não detalhar as alterações na unit. Fiz algumas alterações na unit em anexo que possa ser útil os utilizadores da ferramenta. Adicionei a property CodigoReceita : Integer read getCodigoReceita write fCodigoReceita; //usa código da receita se não for informado usa código do item Como descrito no comentário a receita possui um código e pode ser utlizado em outros itens, dessa forma o programador pode utilizar uma receita para vários itens. Na classe TACBrCargaBal mudei algumas funções de private para protected, pois dessa forma o código fica acessível para um aproveitamento das implementações. Na claase TACBrCargaBalNutricional adicionei a procedure Limpar; Estou a disposição se precisar de mais detalhes.
  10. Regis, Veja : TACBrIBPTaxRegistro = class private FTabela: TACBrIBPTaxTabela; FExcecao: String; FNCM: string; FDescricao: string; FEstadual: Double; FFederalNacional: Double; FFederalImportado: Double; FMunicipal: Double; fVigenciaInicio: TDateTime; fVigenciaFim: TDateTime; public property NCM: string read FNCM write FNCM; property Descricao: string read FDescricao write FDescricao; property Excecao: String read FExcecao write FExcecao; property Tabela: TACBrIBPTaxTabela read FTabela write FTabela; property FederalNacional: Double read FFederalNacional write FFederalNacional; property FederalImportado: Double read FFederalImportado write FFederalImportado; property Estadual: Double read FEstadual write FEstadual; property Municipal: Double read FMunicipal write FMunicipal; property VigenciaInicio : TDateTime read fVigenciaInicio write fVigenciaInicio; //essa aqui eu inclui property VigenciaFim : TDateTime read fVigenciaFim write fVigenciaFim; //essa aqui eu inclui end; Eu posso esta com a unit desatualizada, pode confirmar pra mim se tem essas duas propriedades na sua unit? Achei as propriedade que você citou! Elas estão na class TACBrIBPTax mas acredito que o lugar certo delas seria ali onde sugeri.
  11. Oi Regis, Na unit anexada eu inclui a data de vigência, sendo assim a gente consegue testar se o NCM ainda está dentro do prazo de vigência, com o programador pode por um flag para inativar os NCM espirados. Se puder avaliar a melhoria seria bem interessante ter essa funcionalidade.
  12. Gostaria de se possível uma nova avaliação dessas melhorias. Na correria do dia a dia acabei não explicando direito o que foi feito e o código não foi aceito. Mas vou tentar explicar melhor abaixo: Inclui na classe TRegistroM001 a possibilidade de localizar o registro LocalizaRegistroM400 e LocalizaRegistroM800, essa possibilidade pode facilitar muito o dia a dia do desenvolvedor. Na TRegistroM400 inclui a possibilidade de LocalizaRegistroM410 e a justificativa é a mesma da anterior. Na TRegistroM800 adicionei a LocalizaRegistroM810 que tambem tende a facilitar a vida de quem usa. Fiz uma contribuição nesse post : Mas como o mesmo está travado e o assunto é do mesmo contexto vou tentar argumentar aqui a sua aceitação descrevendo as alterações efetuadas. A discórdia na alteração se tratava de outra unit e não nessa em especifico. Veja: na classe TRegistro0450List apenas inclui a sobrecarga da função LocalizaRegistro e na TRegistro0460List fiz o mesmo procedimento, isso não gera erros não compromete a segurança do código apenas agrega valor. ACBrEFDBloco_0.pas
  13. Aqui rodou os três testes. Quando sobrar um tempo vou te propor uma alteração nesses testes. Mas por enquanto acredito que já podemos encerrar esses tópico.
  14. Na unit ACBrNFeWebServices; uma revisão na procedure TNFeRetRecepcao.Clear; a propriedade FNFeRetorno só é destruida se if Assigned(FNFeRetorno) and Assigned(FNotasFiscais) for verdadeiro, eu acredito que deva ser movido para fora do begin end dessse bloco e ser destruida se ela estiver atribuida. ACBrNFeWebServices.pas
  15. Daniel, Segue mais algumas remoções de avisos, vou separar por finalidade para um melhor controle entendimento. Nessas alterações fiz algumas remoções de avisos e uma alteração na unit ACBrTEFD; Dela eu removi a propriedade privada fAutoAtivarGP : Boolean; e adicionei function GetAutoAtivarGP: Boolean; procedure SetAutoAtivarGP(const Value: Boolean); Dessa forma ela usa as classes filhas para essa funcionalidade. Na unit ACBrTEFDClass ; mudei de protected para public a propriedade citada acima e fiz também algumas remoções de avisos e fiz uma outra alteração na procedure TACBrTEFDClass.VerificaAtivo; onde o raise estava no lugar errado. ACBrTEFDTicketCar.pas ACBrTEFDClass.pas ACBrTEFDBanese.pas ACBrTEFDCliSiTef.pas ACBrTEFD.pas Na pasta do ACBrSerial Uma correção e remoção de avisos, Na procedure TACBrECFNaoFiscal.VendeItem a variável fsVendaBruta recebia o valor dessa forma fsVendaBruta := fsGrandeTotal ; mas na verdade deveria receber assim : fsVendaBruta := RoundTo( (Qtd * ValorUnitario) + fsVendaBruta,-2) ; Nas outras unit somente remoção de avisos. ACBrECFClass.pas ACBrECF.pas ACBrECFNaoFiscal.pas ACBrECFBematech.pas ACBrECFEscECF.pas ACBrECFSweda.pas ACBrECFSchalter.pas ACBrCHQElgin.pas ACBrECFEpson.pas ACBrECFFiscNET.pas ACBrECFVirtual.pas ACBrECFVirtualNaoFiscal.pas ACBrDevice.pas ACBrComum Somente remoção de avisos. ACBrPAFClass.pas ACBrAAC.pas
  16. Elton, Ele não roda a menos que eu faça como descrevi aqui:
  17. Daniel, Não vou mexer nesses avisos até que cheguemos a uma definição. Mas segue algumas units com remoção dos avisos. ACBrECFNCR.pas ACBrECFSwedaSTX.pas ACBrECFVirtual.pas
  18. Segue mais duas unit para verificação! Na unit ACBrEFDBloco_C_Events.pas apenas inclui a function GetOnWriteRegistroC460 para ser utilizada em ver da variavel FOnWriteRegistroC460. Já na unit a alteração provavelmente está correta mas demanda uma atenção especial pois não testei. Como disse acredito que esteja certa pois a alteração foi a inclusão da procedure WriteRegistroM225 dentro da WriteRegistroM220 conforme feito na procedure WriteRegistroM625 dentro da WriteRegistroM620 ambos registros são gerados simultaneamente; Segue anexos. ACBrEFDBloco_C_Events.pas ACBrEPCBloco_M_Class.pas
  19. Segue mais unit alterada para remoção dos avisos. Nas units ACBrBase.pas inclui na Uses System.UITypes que a IDE solicitava. Use o código abaixo: uses o DELPHICOMPILER16_UP pois procurei quando o System.UITypes foi adicionado conforme descrito abaixo: Na unit AJBarcode.pas fiz exatamente o mesmo procedimento, sei que trata-se de uma unit de terceiros mas acredito que está sendo mantida pelo ACBr. Na unit do ACBrUtil.pas mudei o tipo de paramentro de entrada da procedure WriteLog(const ArqTXT : String...) de AnsiString para String e com isso evitando o cast, na function TranslateUnprintable fiz um cast nesse trecho : Ch := '['+AnsiString(IntToStr(ASC))+']' e um cast na function ParseTextn nesse treco: AStr := string(Texto); ACBrBase.pas ACBrUtil.pas AJBarcode.pas
  20. Daniel, Minha sugestão inicial seria aplicar as diretivas Desativa o W1057 {$WARN IMPLICIT_STRING_CAST OFF} e Desativa o W1058 {$WARN IMPLICIT_STRING_CAST_LOSS OFF} Como descrito nesse link http://stackoverflow.com/questions/376785/identifiers-for-delphis-warn-compiler-directive Dessa forma já faz uma limpeza rápida, mas não resolve o problema. Veja o que diz a Embarcadero sobre o W1057 http://docwiki.embarcadero.com/RADStudio/Seattle/en/W1057_Implicit_string_cast_from_'%s'_to_'%s'_(Delphi) Me parece que ele não representa muito problema para o código. Sobre o W1058, pelo que percebi ele é mais nocivo e da forma que está a poluição causada pela presença de ambos sem um tratamento adequado pode esconder os verdeiros problemas no código. Tem esse outro link aqui onde essas diretivas podem ser desabilitas na IDE. https://marc.durdin.net/2012/05/delphi-xe2s-hidden-hints-and-warnings-options/
  21. Rode ai no XE7 a alteração que fiz foi apenas a inclusão do parâmetro abaixo nos *.dproj. <DCC_UnitSearchPath>$(BDS)\Source\DUnit\src;$(DCC_UnitSearchPath)</DCC_UnitSearchPath> vjea: $(BDS)\Source\DUnit\src observe que mesmo no Seatle esta usando DUnit.
  22. Daniel, Ta ficando legal. Veja ainda não definimos essa situação: Preciso de uma definição quanto esses dois casos citados acima. Para não perder o costume segue mais algumas units. Apenas a inclusão da unit Contnrs no Uses pois o Seatle reclama da falta dela. ACBrBancoSicredi.pas ACBrBancoSantander.pas ACBrBancoItau.pas ACBrBancoCaixaSICOB.pas ACBrBancoCaixa.pas ACBrBancoBrasil.pas
  23. Rodei os testes no Sealte e ele apresentou uma falha! fui verificar o problema e no debug o resultado estava correto! No teste acima foi onde apresentou o erro nos testes, analisando percebi que ele faz essa checagem : or (abs(expected-actual) > delta) then Então como o teste que apresentou problema foi : procedure RoundABNTTest.DoctoABNTRegra2_1; begin CheckEquals( 1.3, RoundABNT(1.3333, 1) ); end; Como RoundABNT entrega uma resultado que é decorrente de uma série de cálculos o retorno não é exato como o teste exige. Nesse caso foi só acrescentar uma tolerância para que ele rodasse todos os testes. procedure RoundABNTTest.DoctoABNTRegra2_1; begin CheckEquals( 1.3, RoundABNT(1.3333, 1), 0.00001 ); end; Aproveitei e registrei um teste que tinha ficado sem registro. Segue unit alterada. acbrutiltest.pas
  24. Anexei a unit atualizada só com as correções que mencionei mas agora analisando a situação percebi que tempo a unit que trata especificamente do assunto que mencionei unit pcnRetEnvNFe.pas e essa faz o tratamento que estou sugerindo. Mas como podem ver o sefaz retorna numa consulta o conteúdo que deveria retorna em outra. A situação está ai e com essa alteração que apliquei parei ter receber 999 onde deveria receber 105. pcnRetConsReciNFe.pas
  25. Nesse link eu citei um fato que tem haver com seu problema! http://www.projetoacbr.com.br/forum/topic/26479-limpar-o-webservicesretorno/ O problema no tópico acima foi resolvido e só não foi aplicado esse tratamento do lote em processamento. Pelo que vi o erro de lote em processamento só foi tratado em uma das situações abaixo: Apliquei essa correção como citei no tópico anterior faz um tempo e quando o sefaz me retorna 105 ou 103 eu aguardo uns 30 segundos e faço a consulta para verificar o resultado. Segue link da unit anexada no tópico anterior para uma possível analise: http://www.projetoacbr.com.br/forum/applications/core/interface/file/attachment.php?id=19464
×
×
  • 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.