Ir para conteúdo
  • Cadastre-se

dev botao

Como Utiliar O Evento "onbeforewriteregistroc481" No Componente "acbspedpiscofins"


Ver Solução Respondido por EMBarbosa,
  • Este tópico foi criado há 3573 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá, estou tendo dificuldades para conseguir usar o evento "OnBeforeWriteRegistroC481" do componente "acbSPEDPisCofins".

 

O que ocorre é que o campo "7-ALIQ_PIS_QUANT" esta sendo gerada com valor "0,0000" no arquivo, mesmo eu não informando valores para o componente.

 

Verificando os fontes observei que existe a variável "NullALIQ_PIS_QUANT" no evento "FOnBeforeWriteRegistroC481" na unit "ACBrEPCBloco_C_Class" que recebe como valor padrão "False". 

 

Gastaria de acessar esse evento e passar "true" para essa variável, assim resolveria meu problema aqui.

 

Como é possível acessar esse evento, ele não aparece no componente (design do delphi), e não consegui atribuí-lo via código.

Postado (editado)

Turbo Drive vi seu post (também recebi mais de 5000 erros pelo mesmo motivo do seu) ..... o problema é que gostaria de usar o evento do componente, sem alterações no código fonte oficial do componente .

 

Como solução provisória fiz uma função onde eu passo o código do registro, o campo, valor antigo e valor novo, assim edito o arquivo já gerado pelo componente. Esta funcionando (troco os 0,000 e 0,0000 por "vazio" nos campos necessários). Mas fica a dúvida de como usar o evento. Talvez quem implementou esse evento no componente possa ajudar.

Editado por Fernando R. Oliveira
  • Moderadores
Postado

Eu acho que vocês não estão atualizando o svn ou estão com arquivos que não se atualizam, façam um revert no código e um update e voltem a olhar o local !

with RegC405.RegistroC481.Items[intFor] do
        begin
          Add( LFill('C481')             +
               LFill(CstPisToStr(CST_PIS)) +
               LFill(VL_ITEM,0,2)        +
               DFill(VL_BC_PIS,      2, NullVL_BC_PIS) +
               DFill(ALIQ_PIS,       4, NullALIQ_PIS) +
               DFill(QUANT_BC_PIS,   3, NullQUANT_BC_PIS) +
               DFill(ALIQ_PIS_QUANT, 4, NullALIQ_PIS_QUANT) +
               LFill(VL_PIS,0,       2, NullVL_PIS)         +
               LFill(COD_ITEM)           +
               LFill(COD_CTA) ) ;
          //
          RegistroC990.QTD_LIN_C := RegistroC990.QTD_LIN_C + 1;
        end;
     end;                  
Consultor SAC ACBr Juliomar Marchetti
 

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Transparent-02.png
 

 

Postado

Favor atualize seus fontes, eu uso esses dois eventos sem problema.

 

post-143-0-48715500-1394552904.png

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Postado

O fonte que tenho aqui é igual ao que o Juliomar Marchetti postou (...  DFill(ALIQ_PIS_QUANT, 4, NullALIQ_PIS_QUANT) ...).

 

Atualizo pelo SVN e a pasta do componente está "verde".

 

Da última vez que reinstalei o componente utilizei o ACBrInstall

  • Consultores
  • Solution
Postado

Se o evento não está aparecendo você deve desinstalar os componentes ACBr e instalá-los novamente. Já foi explicado no fórum que algumas alterações nos componentes (como novas propriedade) podem necessitar de que se reinstale os componentes.

 

A propósito, este tópico está relacionado com o problema relatado apenas são campos diferentes.

  • Curtir 1

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Postado

Eu também já atualizei pelo svn, e estou com problemas  os campos QUANT_BC_PIS e ALIQ_PIS_QUANT no registro C481 e nos campos QUANT_BC_COFINS e ALIQ_COFINS_QUANT do registro C485.

 

Antes de atualizar o componente SVN, ambos campos estava sendo preenchidos em branco, ou seja, ||.

 

A questão é que no inicio de dessas rotinas estão sendo atribuidos valores False, conforme abaixo:

 

procedure TBloco_C.WriteRegistroC481(RegC405: TRegistroC405);
var
  intFor: integer;
  NullVL_BC_PIS: Boolean;
  NullALIQ_PIS: Boolean;
  NullQUANT_BC_PIS: Boolean;
  NullALIQ_PIS_QUANT: Boolean;
  NullVL_PIS: Boolean;
begin
   NullVL_BC_PIS := False;
   NullALIQ_PIS  := False;
   NullQUANT_BC_PIS := False;   Essa variável deve ser TRUE, veja as versões anteriores
   NullALIQ_PIS_QUANT := False;   Essa variável deve ser TRUE, veja as versões anteriores
   NullVL_PIS := False;
   //--
   if Assigned(RegC405.RegistroC481) then
   begin
      for intFor := 0 to RegC405.RegistroC481.Count - 1 do
      begin
        if Assigned(FOnBeforeWriteRegistroC481) then
        begin
           FOnBeforeWriteRegistroC481(NullVL_BC_PIS,
                                      NullALIQ_PIS,
                                      NullQUANT_BC_PIS,
                                      NullALIQ_PIS_QUANT,
                                      NullVL_PIS);
        end;
        with RegC405.RegistroC481.Items[intFor] do
        begin
          Add( LFill('C481')             +
               LFill(CstPisToStr(CST_PIS)) +
               LFill(VL_ITEM,0,2)        +
               DFill(VL_BC_PIS,      2, NullVL_BC_PIS) +
               DFill(ALIQ_PIS,       4, NullALIQ_PIS) +
               DFill(QUANT_BC_PIS,   3, NullQUANT_BC_PIS) +   Essa variável deve ser TRUE, veja as versões anteriores
               DFill(ALIQ_PIS_QUANT, 4, NullALIQ_PIS_QUANT) +   Essa variável deve ser TRUE, veja as versões anteriores
               LFill(VL_PIS,0,       2, NullVL_PIS)         +
               LFill(COD_ITEM)           +
               LFill(COD_CTA) ) ;
          //
          RegistroC990.QTD_LIN_C := RegistroC990.QTD_LIN_C + 1;
        end;
     end;
     // Variavél para armazenar a quantidade de registro do tipo.
     FRegistroC481Count := FRegistroC481Count + RegC405.RegistroC481.Count;
   end;
end;
 
procedure TBloco_C.WriteRegistroC485(RegC405: TRegistroC405);
var
  intFor: integer;
  NullVL_BC_COFINS: Boolean;
  NullALIQ_COFINS: Boolean;
  NullQUANT_BC_COFINS: Boolean;
  NullALIQ_COFINS_QUANT: Boolean;
  NullVL_COFINS: Boolean;
begin
   NullVL_BC_COFINS := False;
   NullALIQ_COFINS  := False;
   NullQUANT_BC_COFINS := False;  Essa variável deve ser TRUE, veja as versões anteriores
   NullALIQ_COFINS_QUANT := False; Essa variável deve ser TRUE, veja as versões anteriores
   NullVL_COFINS := False;
   //--
   if Assigned(RegC405.RegistroC485) then
   begin
      for intFor := 0 to RegC405.RegistroC485.Count - 1 do
      begin
        if Assigned(FOnBeforeWriteRegistroC485) then
        begin
           FOnBeforeWriteRegistroC485(NullVL_BC_COFINS,
                                      NullALIQ_COFINS,
                                      NullQUANT_BC_COFINS,
                                      NullALIQ_COFINS_QUANT,
                                      NullVL_COFINS);
        end;
        with RegC405.RegistroC485.Items[intFor] do
        begin
          Add( LFill('C485')                     +
               LFill(CstCofinsToStr(CST_COFINS)) +
               LFill(VL_ITEM,0,2)                +
               DFill(VL_BC_COFINS,      2, NullVL_BC_COFINS) +
               DFill(ALIQ_COFINS,       4, NullALIQ_COFINS) +
               DFill(QUANT_BC_COFINS,   3, NullQUANT_BC_COFINS) +   Essa variável deve ser TRUE, veja as versões anteriores
               DFill(ALIQ_COFINS_QUANT, 4, NullALIQ_COFINS_QUANT) +   Essa variável deve ser TRUE, veja as versões anteriores
               LFill(VL_COFINS,0,       2, NullVL_COFINS) +
               LFill(COD_ITEM)                   +
               LFill(COD_CTA) ) ;
          //
          RegistroC990.QTD_LIN_C := RegistroC990.QTD_LIN_C + 1;
        end;
     end;
     // Variavél para armazenar a quantidade de registro do tipo.
     FRegistroC485Count := FRegistroC485Count + RegC405.RegistroC485.Count;
   end;
end;

 

Espero ter ajudado!

 

Aguardo uma resposta de atualização para o caso.

 

Grato

 

Att.

Robson Fernandes da Silva

Postado

Deve não, o  evento FOnBeforeWriteRegistroC481() e FOnBeforeWriteRegistroC485(), foram criados justamente para vc mudar manualmente, ative o evento e mude o valor da VAR que lhe for conveniente.

  • Curtir 1

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

  • Membros Pro
Postado

Elas não devem e conter dessa forma

pois pede para passar por parametros true ou false mais coloca fixo como false.

 

teria que ver essa logica, ou coloca fixo ou passagem por parametros.

 

NullVL_BC_COFINS := False;

   NullALIQ_COFINS  := False;
   NullQUANT_BC_COFINS := False;  Campo fixo
   NullALIQ_COFINS_QUANT := False; Campo fixo
   NullVL_COFINS := False;

Dangelo Porto

Postado

Bom dia.

Tem como definir esses eventos, via linha de código, no caso estou utilizando o objeto criado via código.

tSpedEPC:=TACBrSPEDPisCofins.Create(Application);

tSpedEPC.EventsBloco_C.OnBeforeWriteRegistroC481 :=  ???

 

Att.
Dalvan

Postado

Obrigado Juliomar, fiz exatamente como indicou e deu certo.

1. Criando procedures (eventos):

procedure MyBeforeWriteRegistroC481 (var ANullVL_BC_PIS,
                                             ANullALIQ_PIS,
                                             ANullQUANT_BC_PIS,
                                             ANullALIQ_PIS_QUANT,
                                             ANullVL_PIS: Boolean);
    procedure MyBeforeWriteRegistroC485 (var ANullVL_BC_PIS,
                                             ANullALIQ_PIS,
                                             ANullQUANT_BC_PIS,
                                             ANullALIQ_PIS_QUANT,
                                             ANullVL_PIS: Boolean);

procedure TFormXYZ.MyBeforeWriteRegistroC481 (var ANullVL_BC_PIS,
  ANullALIQ_PIS, ANullQUANT_BC_PIS, ANullALIQ_PIS_QUANT, ANullVL_PIS: Boolean);
begin
  ANullVL_BC_PIS:=False;
  ANullALIQ_PIS:=False;
  ANullQUANT_BC_PIS:=True;
  ANullALIQ_PIS_QUANT:=True;
  ANullVL_PIS:=False;
end;

procedure TFormXYZ.MyBeforeWriteRegistroC485 (var ANullVL_BC_PIS,
  ANullALIQ_PIS, ANullQUANT_BC_PIS, ANullALIQ_PIS_QUANT, ANullVL_PIS: Boolean);
begin
  ANullVL_BC_PIS:=False;
  ANullALIQ_PIS:=False;
  ANullQUANT_BC_PIS:=True;
  ANullALIQ_PIS_QUANT:=True;
  ANullVL_PIS:=False;
end;

2. Definindo nos Eventos do Bloco C:

tSpedEPC:=TACBrSPEDPisCofins.Create(Application);
tSpedFis.EventsBloco_C.OnBeforeWriteRegistroC481:=MyBeforeWriteRegistroC481;
tSpedFis.EventsBloco_C.OnBeforeWriteRegistroC485:=MyBeforeWriteRegistroC485;

Att.
Dalvan

  • 3 semanas depois ...
Postado (editado)

Tentei incluir na minha unit da mesma forma que o Dalvan exemplificou, mas estou como seguinte erro:

Incompatible types: 'method pointer and regular procedure'.

O erro é justamente na linha que faz a associação do evento:

tSpedFis.EventsBloco_C.OnBeforeWriteRegistroC481 := MyBeforeWriteRegistroC481;

Alguém sabe o que está errado?

Editado por newstandard
Postado (editado)

Pessoal, deu certo.

Precisei criar uma classe especifica para as procedures, ficou da seguinte forma:

type

TEventos = class

class procedure BeforeWriteRegistroC481 (var ANullVL_BC_PIS,

ANullALIQ_PIS,

ANullQUANT_BC_PIS,

ANullALIQ_PIS_QUANT,

ANullVL_PIS: Boolean);

class procedure BeforeWriteRegistroC485 (var ANullVL_BC_PIS,

ANullALIQ_PIS,

ANullQUANT_BC_PIS,

ANullALIQ_PIS_QUANT,

ANullVL_PIS: Boolean);

end;

Obrigado!

Editado por newstandard
  • 2 semanas depois ...
Postado

Bom dia pessoal, 

Eu iria abrir um novo tópico, mas achei esse do mesmo assunto e ele ainda não foi resolvido..

 

Os eventos OnBeforeWriteRegistroC481 e OnBeforeWriteRegistroC485 foram criados para informar se os campos podem ficar null ou não, 

Mas não temos como saber qual é o registro que está sendo escrito.. 

 

Exemplo.. se o CST_PIS do registro atual do C481 for um desses ( stpisQtdeAliquotaUnidade, stpisIsentaContribuicao, stpisSemIncidenciaContribuicao, stpisSuspensaoContribuicao ), CST isentos, a BC e alíquota deveriam ficar vazios, mas eu n tenho como saber isso no OnBeforeWriteRegistroC481.

 

Um outro Exemplo é quando for stpisQtdeAliquotaUnidade, que a QUANT_BC_PIS e ALIQ_PIS_QUANT não podem ficar vazios quando for usado esse CST.

 

Antes essa parte de escrita do registro C481 era algo assim..

Add( LFill('C481')             +
             LFill(CstPisToStr(CST_PIS))  +
             LFill(VL_ITEM,0,2)        +
             DFill(VL_BC_PIS,      2, ( CST_PIS in [ stpisQtdeAliquotaUnidade,
                                                     stpisIsentaContribuicao,
                                                     stpisSemIncidenciaContribuicao,
                                                     stpisSuspensaoContribuicao  ])) +
             DFill(ALIQ_PIS,       4, ( CST_PIS in [ stpisQtdeAliquotaUnidade,
                                                     stpisIsentaContribuicao,
                                                     stpisSemIncidenciaContribuicao,
                                                     stpisSuspensaoContribuicao  ])) +
             DFill(QUANT_BC_PIS,   3, ( CST_PIS <> stpisQtdeAliquotaUnidade )) +
             DFill(ALIQ_PIS_QUANT, 4, ( CST_PIS <> stpisQtdeAliquotaUnidade )) +
             LFill(VL_PIS,0,2)         +
             LFill(COD_ITEM)           +
             LFill(COD_CTA) ) ;

de acordo com o CST_PIS, passava se podia ficar vazio ou não, mas da forma como está hj, não temos acesso ao CST na função OnBeforeWriteRegistroC481,

para resolver aqui, eu mudei a função para passar o registro C481 atual como parâmetro, assim, no OnBeforeWriteRegistroC481 passei a ter acesso ao registro atual, é uma sugestão para alteração nessa função.

  • Curtir 1
Postado

Anexe o seu fonte alterado para que eu possa fazer uma analise, e dar um retorno.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Postado

Segue em anexo.

 

Com a alteração que estou sugerindo, no Evento do componente, eu posso fazer isso por ex..

procedure TFGeraArquivosFiscais.ACBrSPEDPisCofinsEventsBloco_CBeforeWriteRegistroC481(
  const ARegistroC481: TRegistroC481; var ANullVL_BC_PIS, ANullALIQ_PIS,
  ANullQUANT_BC_PIS, ANullALIQ_PIS_QUANT, ANullVL_PIS: Boolean);
begin
  ANullVL_BC_PIS       := ( ARegistroC481.CST_PIS in [ stpisQtdeAliquotaUnidade,
                                                       stpisIsentaContribuicao,
                                                       stpisSemIncidenciaContribuicao,
                                                       stpisSuspensaoContribuicao  ]);
  ANullALIQ_PIS        := ANullVL_BC_PIS;

  ANullQUANT_BC_PIS    := ( ARegistroC481.CST_PIS <> stpisQtdeAliquotaUnidade );
  ANullALIQ_PIS_QUANT  := ANullQUANT_BC_PIS;
end;

ACBrEPCBloco_C_Class.pas

Postado

Certo, vamos acatar essa sua mudança devido a necessidade, se puder ir fazendo nos outros registros e anexando aqui vou subindo.

 

Só uma ressalva, vou retirar  o tratamento do ELSE, e deixar para que seja feito somente dentro do Evento.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Postado

Certo, vamos acatar essa sua mudança devido a necessidade, se puder ir fazendo nos outros registros e anexando aqui vou subindo.

 

Só uma ressalva, vou retirar  o tratamento do ELSE, e deixar para que seja feito somente dentro do Evento.

 

Show Isaque.

 

Fiz o else para ficar igual era antes.. se o programador não configurar um evento, funcionar como funcionava antes de adicionar o evento OnBeforeWriteRegistroC481.

 

Quais os outros registros q vc falou? eu fiz no C481 e C485, os eventos que tem parecido é no SPED Fiscal, mas ainda n tive problemas nos registro do SPED Fiscal, algum deles precisa fazer a mesma coisa? se precisar só falar que altero aqui e envio.

Postado

Deve não, o  evento FOnBeforeWriteRegistroC481() e FOnBeforeWriteRegistroC485(), foram criados justamente para vc mudar manualmente, ative o evento e mude o valor da VAR que lhe for conveniente.

Boa tarde Isaque!

 

Entendi perfeitamente a ideia, e muito interessante.

 

Porem essa implementação de eventos feitos para os registro C481 e C485, devem ser aplicados também para os registros C491 e C495.

 

Seria possível criar esses eventos para os registro C491 e C495? Pois já identifiquei outros post relatando problemas ao escrever esses registro, e que para solucionar está tendo que alterar o fonte.

 

Grato.

 

Att.

Robson F. da Silva

Postado

Boa Noite a todos acho que a solução seria ate mais simples, se colocasse um if tipo:

if ALIQ_PIS <> 0 then

begin

 QUANT_BC_PIS,   3, true) +

 ALIQ_PIS_QUANT, 4, NullALIQ_PIS_QUANT) +

end;

 

Porque pelo que entendi no Manual se preencher o ALIQ_PIS e ALIQ_PIS_QUANT também for preenchido vai causar erros no PVA.

Isso é apenas uma sugestão, porque afinal em nenhum momento vai ser preenchido os 2 campos no arquivo porque ate mesmo o pva vai acusar como erro.

 

eu não mexi no código fonte porque não gosto de mexer, mais fiz conforme o Isaque informou o trabalho é minimo.

Valeu a todos e bom trabalho.

Postado

Robson pode atualizar implementações disponíveis.

 

washigton, não é tão simples assim como você reportou, pois da forma que estava mais simples ainda que a sua, pois o parâmetro True que você ta vendo, o componente já trata e coloca null, mas acontece situações da qual é preciso que o campo seja sim alimentado com o valor ZERO.

  • Curtir 1

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

  • 2 semanas depois ...
Postado

Alguém esta com erro na geração do arquivo depois da atualização?? Pelo que estou vendo aqui ele passa o WriteRegistroC481( RegC400.RegistroC405.Items[intFor] )  e da erro ao entrar no  WriteRegistroC485( RegC400.RegistroC405.Items[intFor] ) ;

 

'access violation at 0xfed400de: read of address 0xfed400de'. Process Stopped. Use Step or Run to continue.
  • Este tópico foi criado há 3573 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

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