Ir para conteúdo
  • Cadastre-se

wrgoncalves2008

Membros
  • Total de ítens

    121
  • Registro em

  • Última visita

  • Days Won

    1

Tudo que wrgoncalves2008 postou

  1. Bom Dia pessoal EMBarbosa, o principal problema seria componentes, um desses componentes que tenho problema é o SQLCLientDataSet, ele é nativo no Delphi 6, porém já no Delphi 7 ele nem vem mais instalado, já tentamos instalar ele mas ai começa a aparecer erros no sistema. Se não fosse por esse componente a gente já teria saído do Delphi 6 faz tempo, mas ele foi utilizado em grande quantidade no sistema, e devido a falta de conhecimento de quem estava utilizando ele, fizeram várias "gambiarras" para corrigir alguns problemas que apresentava no sistema. Agora pra gente remover esses componentes vá levar um tempo considerável e teremos que retestar praticamente o sistema todo. Por isso não fizemos a migração ainda, e agora estamos aqui com esse probleminha...rs Agora EMBarbosa / Daniel / Anizair / Juliomar, sobre o nosso problema para gente tentar finalizar esse post , vamos colocar algo no ACBr oficial para resolvermos o problema ou teremos que manter o fonte separado aqui para trocarmos quando fizermos a atualização? Como citei anteriormente a última opção funciona, porém pode gerar erros, lógicamente que para nós que ainda estamos no delphi 6, e digo isso por experiência própria... ...
  2. Bom pessoal, entendo que todos aqui estamos procurando a melhor de forma resolver esse nosso dilema, já tivemos várias sugestões e idéias aqui mas infelizmente nenhuma, na minha opinião é uma solução, vamos dizer assim, 100%. No início sugeri colocar uma diretiva de compilação, para caso fosse versão acima do Delphi 6, trabalhasse de uma forma como está caso contrario seria colocado um ajustes para delphi 6, resolveria porém como o EMBarbosa disse nos posts anteriores não estariamos identificando ao certo o problema, e a sugestão também foi descartada. Com o FastMM até conseguimos alguma coisa porém não resolveu o problema também. Utilizar as funções de conversão (ACBrSTr,...)? Resolveu o problema, porém entendo a preocupação de você em manter a estabilidade do ACBr, e não culpo ninguém por isso, eu também não colocaria nada em meu sistema sabendo que corro o risco de ter problemas mais pra frente. Remover os casts? Sim resolveu o problema, porém o ACBr é uma suíte componentes em desenvolvimento e com constantes atualizações, assim se mantivermos dessa forma ou paramos de atualizar o ACBr ou toda vez que atualizarmos teremos que ajustar a unit ACBrUtil. Se a gente só utilizasse o ACBrECF seria mais fácil não atualizar, mas também utilizamos outros componentes, como por ex. SPED e NFe. Acredito que apesar de "defasado" ainda tem muita gente que utilize o Delphi 6. Para nos migrarmos de versão do Delphi, infelizmente de momento está totalmente fora de questão, devido a componentes que foram utilizados que eram do delphi 6 e foram descontinuados a partir da versão 7 entre outras coisas. Até hoje temos módulos feitos em Delphi 7 ou XE para solucionar alguns problemas incompatibilidade. EMBarbosa, agradeço a ajuda que está dando para tentarmos resolver o problema, como já foi feito antes podemos tentar simular por aqui, continue nos dando idéias e sugestões. O meu problema não é utilizar as soluções sugeridas aqui, apenas gostaria que chegássemos a um ponto que conseguíssemos eliminar esse problema, sem ter que ficar alterando arquivos todas vez que atualizar, pois pode ocorrer erros, ou então para de atualizar o componente, que acredito ser pior ainda. Mesmo com essas soluções ainda não respondemos a pergunta feita lá no inicio da discussão: Porque um cast de AnsiString para AnsiString gera um AV ? Então eu ainda volto a sugerir a opção da diretiva, pois assim podemos utilizar/criar uma função que faça o cast como já existe hoje ou não faça, e não geramos o empecilho que citei acima, porém se realmente não der pra feito, a gente vai levar nas coxas até sair do Delphi 6. Para o AV, minha hipótese para isso seria alguma coisa mais ou menos assim: Durante o cast o delphi percorre a string caracter a caracter mais ou menos como está abaixo, porém o "i" deveria ir somente até o 255, e quando ele passa disso ele da o A.V. function AnsiString( aTexto ): ... begin for i := 1 to length(aTexto) do begin aResult := aResult + aTexto[i]; end; Result := aResult; end; Só lembrando que como já disse anteriormente, ainda não sei ao certo como o Delphi trata isso internamente, isso apenas é algo que me veio na cabeça, num momento inspiração...rs. Agradeço a todos pelo colaboração.
  3. O Out of Memory acontece quando mando ativar a ECF, ai já aparece na barra de status do ECFTeste, agora está meio corrido aqui não vai dar pra fazer o teste e depurar. Sobre o memoryleaks, esses eu realmente nem esquentei com eles de momento. Desculpe na correria aqui acabei digitando errado, quando removi os ACBrStr que a gente tinha colocado no lugar dos casts funcionou corretamente, assim como estava funcionando com o ACBrStr. Assim que tiver um tempo aqui, faço os outros testes e a depuração e te falo o resultado.
  4. Não deu o Access Violation, mas apareceu uma mensagem de Out of Memory no ECFTeste. Estou anexando o log do FastMM. Ainda usando o FastMM no ECFTeste, se ao invés de usar a função ACBrStr você usar o cast com AnsiString há alguma diferença? O erro persiste? Troquei todos os ACBrStr por cast pra AnsiString, o erro persiste. E se você remover o cast e não usar o ACBrStr? Alterei a unit que tinhamos mexidos, e removi todos os ACBrStr que colocamos e não funcionou, não apresentou mensagem de erro. ECFTeste_MemoryManager_EventLog.txt
  5. EMBarbosa, meu intuito aqui é tentar entender o que está acontecendo e acharmos uma solução que seja a melhor possível, admito que não sou nenhum expert em Delphi e estou estudando para aprender cada dia mais e entender como o delphi trabalha "por baixo dos panos", já trabalho há um bom tempo com Delphi, mas nunca havia me atentado a entender como o delphi trabalha, de uns tempos pra cá estou correndo atrás e tentando entender essa parte, mas como você bem sabe é muita coisa pra ser aprender e entender e pouco tempo. Sobre o FastMM, eu só conhecia ele para identificar vazamentos de memória, essa parte do gerenciamento de memória e do que ele faz eu realmente não sabia. Coloquei ele aqui no meu sistema para testar e com a unit ACBrUtil.pas original do ACBr e mesmo assim meu sistema não rodou. O FastMM gerou um log que estou anexando aqui, gostaria que desse uma olhada se for possível. Fiz o mesmo teste com a unit que fizemos a alteração, substituindo os casts pelo uso da função ACBrStr, meu sistema funcionou perfeitamente e o FastMM não me apresentou nenhum erro, nem gerou log. wSac_MemoryManager_EventosLog.txt
  6. Cara, esta é um boa pergunta, que também gostaria de saber a resposta! E se eles corrigem o erro, vou tentar entender o que eles fazem, porque é somente remover FastMM/EurekaLog do meu projeto, que ele não roda mais. Acredito que seja toda essa alteração que foi realizada no Delphi referente ao mapeamento de String/Unicode que possa ser a causa do problema, e como as alterações no ACBr, podem estar sendo feitas em versões bem mais recentes do Delphi, isso pode estar afetando as versões anteriores como no nosso caso. Procurando encontrei dois post do blog do Andreano Lanusse que podem ajudar a explicar o quero dizer: http://www.andreanolanusse.com/pt/entendendo-unicode-para-migrar-sua-aplicacao-delphi/ http://www.andreanolanusse.com/pt/delphi-unicode-entendo-os-avisos-warning-do-compilar-sua-aplicacao/ Sobre os cast, os que vi na unit seriam casts de String para AnsiString ou AnsiString para String, e seguindo esse trecho do primeiro link, acredito que o problema possa estar relacionado a isso: Estamos pensando no que fazer para entender e resolver, de momento a única idéia que temos para resolver o nosso problema seria a que postei acima.
  7. Já tentamos com o fastMM, e com o EurekaLog, porém quando colocamos ele no projeto parece que eles ocultam os erros, e não apresenta os access violation, é só tirar eles do projeto que voltar a dar os Access violation. Os Access violation só aparecem quando rodamos a aplicação pelo Delphi, quando rodamos por fora o sistema já trava.
  8. Régys, poderíamos manter a forma como o jGuto fez, porém dentro da function ACBrStr que ele colocou no lugar dos cast para string, coloríamos uma diretiva para identificar a versão do delphi, assim manteríamos a compatibilidade com a as versões mais novas e com o Delphi 6. Acredito que dessa forma seria mais pratico, ou então poderíamos colocar as diretivas em todos os lugares onde tivessem os casts. Prefiro a primeira opção...rs!!!
  9. Além de da rotina do ACBr ter ficado mais curta e simples, está melhor do que a minha, como sempre aconteceu no cliente de aparecer um valor que ela não arredondou corretamente e a rotina RoundABNT fez certinho, o jeito foi substituir a minha...rsrs.
  10. Bom saber, vou dar uma olhada nessa Unit. Obrigado, Daniel.
  11. Olá Pessoal, Não sei se já resolveram o problema, porém gostaria de compartilhar com vocês a solução que utilizei para este problema. Tive o mesmo problema com uma ECF Elgin que está arredondando e também tenho problemas quando utilizo balanças e ECF que truncam valores. Pelo que sei a maioria das ECFs truncam, apenas uma ou outra fica com a função de arredondamento ativada, a aqui trabalhamos mais com Bematech e segundo o suporte apenas a MP-4000 tem um função (Bematech_FI_VendeItemArredondamentoMFD) que permite arredondar o valor do item mesmo ela estando para truncar valores. Mas voltando a solução do meu problema, depois de algumas pesquisas descobri que a forma de arredondamento que a Elgin e a Bematech utilizam é a forma definida pela ABNT, a primeira vez que vi a norma achei meio estranha, porém resolvi implementar no meu sistema, assim pelo menos e tenho uma base legal para explicar a forma de arredondamento que utilizo. Segue abaixo o código que faz o trabalho pra mim, pode não estar escrito da melhor forma, porém funciona e resolveu meu problema com as ECFs.: Só pra constar meu sistema tem uma configuração para definir se ele arredonda ou trunca os valores, ainda não fiz o teste com balanças, mas com ECFs acabou meus problemas. function ArredondarTruncarValor(ArredondarValor: Boolean ; AValor: Double; AQtdeCasas: Integer = 2 ): Double; var ATemp : string; begin //Esta regra de arredondamento segue a norma "ABNT NBR 5891:1977" da Associação Brasileira de Normas Técnicas - ABNT ATemp := Copy( FloatToStr( Frac(AValor) ), 3, AQtdeCasas + 2) ; //Começa a Copiar a partir da Terceira casa para ignorar o 0. que fica no inicio da string if Length(ATemp) < (AQtdeCasas + 2) then ATemp := ATemp + stringOfChar('0', (AQtdeCasas + 2) - Length(ATemp) ); //Força a string a ter dois digitos a mais do que a qtde de casas decimais desejada if ArredondarValor then begin if StrToInt( ATemp[AQtdeCasas + 1] ) = 5 then //Se o primeiro digito apos a ultima casa a se manter for 5 begin //Se o algarismo a ser conservado for ímpar, soma-se uma unidade ao algarismo a ser conservado e retira-se os posteriores. // OU //Se o algarismo a ser conservado for par e o primeiro algarismo após o 5 for diferente de zero, // soma-se uma unidade ao algarismo a ser conservado e retira-se os posteriores. if ( (Odd(StrToInt(ATemp[AQtdeCasas]))) or (StrToInt(ATemp[AQtdeCasas + 2]) > 0)) then begin //Verificação para caso o algarismo a ser conservado seja igual a 9. if StrToInt(ATemp[ AQtdeCasas ]) < 9 then ATemp[AQtdeCasas] := IntToStr(StrToInt(ATemp[AQtdeCasas]) + 1)[1] else ATemp := IntToStr( StrToInt(Copy(ATemp, 1, AQtdeCasas)) + 1 ); end; end else if StrToInt( ATemp[AQtdeCasas + 1] ) > 5 then begin //Verificação para caso o algarismo a ser conservado seja igual a 9. if StrToInt(ATemp[ AQtdeCasas ]) < 9 then ATemp[AQtdeCasas] := IntToStr(StrToInt(ATemp[AQtdeCasas]) + 1)[1] else ATemp := IntToStr( StrToInt(Copy(ATemp,1,AQtdeCasas)) + 1 ); end; Result := StrToFloat(IntToStr(Trunc(AValor)) + ',' + Copy(ATemp,1,AQtdeCasas)); end else Result := StrToFloat(IntToStr(Trunc(AValor)) + ',' + Copy(ATemp,1,AQtdeCasas)); //Truncamento de Valores end; Era isso o que tinha para compartilhar, espero que minha solução possa ajudar mais alguém. Att.
  12. Olá Pessoal, já que estamos falando de NFP, achei uma alteração para ser realizado na unit ACBrRFD.pas na rotina procedure TACBrRFD.CriarArqRFDID( NomeArq : String ) ; referente aos modelos de ECF bematech quando gera o arquivo ini. Esta gerando o arquivo da nfp com o modelo errado da ECF para o modelo MP-4000 e também adicionei o modelo MP-7000, conforme informação do suporte da Bematech. Estou anexando abaixo o arquivo com a correção. Obrigado.
  13. regys.silveira fiz alguns testes aqui utilizando Sweda (Emulador ) , Bematech( Emulador e ECF ) e Elgin ( Emulador ) es está funcionando certinho, ele me trouxe a informação que precisava. Mais uma vez obrigado pela a atenção e rapidez com que disponibilizou as alterações!! Obrigado.
  14. Bom Dia! regys.silveira você tem um previsão de quando deve sair essa funcionalidade para a Sweda? Testei o que você liberou ontem e ficou show de bola, o chato é que estou utilizando o Delphi 6 e a versão atual do ACBr já não está totalmente compatível com esta versão, ai tem que pegar os fontes atualizados e alterar na minha versão que funciona...rsrs...mas ta bom o importante é que está funcionando. regys.silveira obrigado pela a atenção e rapidez com que disponibilizou as alterações!! Obrigado.
  15. Na realidade é pra ajudar os clientes, porque tivemos alguns que deixaram a bloquear a ECF, e depois vieram reclamar do programa que ele não avisava, que estava acabando as reduções, ai o chefe quer porque quer essa informação no sistema, quando faltar 30 reduções, o sistema começa a avisar o cliente.
  16. Ok regys.silveira, já vou baixar e verificar aqui. Vou ficar no aguardo da alteração para a Sweda também. Muito Obrigado, resolveu um baita problema aqui pra mim....rsrs.
  17. Na ECF bematech: Bematech_FI_ReducoesRestantesMFD Na ECF sweda: ECF_ReducoesRestantesMFD
  18. Nas dlls da bematech( Bematech_FI_ReducoesRestantesMFD ) e da sweda( ECF_ReducoesRestantesMFD) encontrei o comando para retornar as reduções restantes, não sei se funciona com as mais antigas acredito que não, pois só tenho ECF com mfds para testar. Pelo que estive olhando no ACBr não existe nenhum comando que retorne somente está informação, ou tem algum forma de conseguir essa informação? Obrigado.
  19. Não utilizo, mas vou dar uma olhada e ver se descubro alguma coisa, nas verdade desconheço o FastMM, estou dando uma procurada no google. Vou tentar aqui, mas se não der certo, eu já estava com vontade de dar um upgrade na versão do Delphi mesmo assim pelo menos já passo pro delphi 7...rsrs...
  20. Pessoal achei mais uma coisa, quando implementado o evento OnBobinaAdicionaLinhas o componente chama uma rotina chamada MemoLeParams na unit ACBrECF.pas, aqui no meu caso sempre da erro de AV nessa rotina e também na rotina LerINI da unit ACBrRFD.pas, as duas utilizam o TMemIniFile para fazer a leitura das informações dos arquivos de .INI. Estive verificando aqui como uma versão mais antiga que está funcionando e infelizmente não constatei nenhum diferença entre o código anterior e o atual, apenas os erros que ocorrem dentro das rotinas citadas na versão atual, mas nem sempre na mesma linha, sempre muda a linha do erro, o que me deixa meio confuso sobre a causa do problema, Acredito que possa ser também problema referente a versão do delphi em que os componentes estão sendo alterados, exemplo a classe TMemIniFile está na unit Inifiles e a unit Inifiles do Delphi XE não é igual a do delphi 6 , 7 , .... Me corrijam se estiver errado, mas acho que esse pode ser o problema, nas versões mais novas pode haver tratamentos que não existiam nas anteriores, essa é minha opinião.
  21. Erro do WriteToTXT: Codigo Atual: Procedure WriteToTXT( const ArqTXT, AString : AnsiString; const AppendIfExists : Boolean = True; AddLineBreak : Boolean = True ); var FS : TFileStream ; LineBreak : AnsiString ; begin FS := TFileStream.Create( String( ArqTXT ), IfThen( AppendIfExists and FileExists(String(ArqTXT)), fmOpenReadWrite, fmCreate) or fmShareDenyWrite ); try if AddLineBreak then LineBreak := AString + sLineBreak; FS.Seek(0, soFromEnd); // vai para EOF FS.Write(Pointer(LineBreak)^,Length(LineBreak)); if AddLineBreak then begin LineBreak := sLineBreak; FS.Write(Pointer(LineBreak)^,Length(LineBreak)); end ; finally FS.Free ; end; end; Código anterior que funciona aqui pra mim: Procedure WriteToTXT( const ArqTXT, AString : AnsiString; const AppendIfExists : Boolean = True; AddLineBreak : Boolean = True ); var FS : TFileStream ; Buffer : AnsiString ; begin FS := TFileStream.Create( ArqTXT, IfThen( AppendIfExists and FileExists(ArqTXT), fmOpenReadWrite, fmCreate) or fmShareDenyWrite ); try Buffer := AString ; if AddLineBreak then Buffer := Buffer + sLineBreak ; FS.Seek(0, soFromEnd); // vai para EOF FS.Write(Pointer(Buffer)^,Length(Buffer)); finally FS.Free ; end; end; Diferença: na atual o comando FS.Write é chamado duas vezes uma para escrever o texto da constante AString e depois é chamado novamente para escrever o Linebreak, na anterior era chamado somente uma vez. Pergunta: Existe mesmo a necessidade do código atual ser desta forma ou pode voltar a ser o que era antes? estou pensando em adicionar um diretiva de compilação para verificar a versão do delphi, mas vai gerar uma duplicidade de código, com diferenças minimas.
  22. Pessoal não sei se já conseguiram, acredito que não pois atualizei meu componente e ainda continua com o mesmo problema. Vou listar aqui algumas coisas que percebi, dei uma mexida, mas ainda não procurei uma solução 1 - Comentei toda a rotina da procedure WriteToTXT da unit ACBrUtil, assim já consegui ativar o componente. 2 - No demo foi implementado o evento OnBobinaAdicionaLinhas, removi a rotina e já estou conseguindo imprimir alguma coisa, mas ainda apresenta erro em determinadas rotinas, mas ainda apresenta os AV em algumas pontos. De momento foi o que percebi, mas como disse ainda não fiz nada para resolver, apenas estou identificando a causa problema.
  23. Ok, muito obrigado, vou acompanhar pelo outro tópico.
  24. Ola pessoal, estou com um problemas com o componente ACBrECF, toda vez que mando ativar o componente ele da mensagem de Access violation, engraçado é que algumas vezes muda o lugar onde da o erro. Um detalhe sobre isso que é estou utilizando o Delphi 6, nas versões acima está funcionando. Até um tempo atras funcionava perfeitamente e agora não vai mais, até acabei de formatar meu pc para ver se tinha alguma coisa relacionada, mas continua do mesmo jeito. Alguém já passou por isso? Obrigado.
  25. Então netstart, no arquivo que meu sistema gera eu informo somente Saídas (NF / Cupom) e Entradas e mais registros de apuração, mas como você já deve ter percebido existem outras informações que podem ser enviadas no arquivo, como por exemplo conta de agua, luz, ......... e essas informações eu não tenho, mas o contador tem. Então nesse caso o contador pega meu arquivo importa no programa dele e depois gera novamente o arquivo ai já vai entrar as informações que ele tem la no sistema da contabilidade. Por um lado isso é bom, tira um pouco da responsabilidade das nossas costas, pois o arquivo final gerado é do contador, mas deixo aberto também para o cliente gerar e enviar o arquivo direto pra receita ai fica a critério dele. Eu também iria ficar feliz se a contmatic importasse o arquivo do PIS/COFINS, ai isso já estaria resolvido a bastante tempo atrás. Até
×
×
  • 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.