Jump to content

Assista click.png tectoy.png

C6 chamada_c6.png botao.png

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


Go to solution Solved by EMBarbosa,
  • Este tópico foi criado há 2640 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

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.

Link to comment
Share on other sites

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.

Edited by Fernando R. Oliveira
Link to comment
Share on other sites

  • Consultores

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
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

  • Consultores
  • Solution

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.

  • Like 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.
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

  • Like 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

 

Link to comment
Share on other sites

  • Membros Pro

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • Consultores

Sim tem 

Você terá que criar a procedure igualmente ao evento e atribuir em tempo de execução 

bem simples

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • 3 weeks later...

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?

Edited by newstandard
Link to comment
Share on other sites

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!

Edited by newstandard
Link to comment
Share on other sites

  • 2 weeks later...

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.

  • Like 1
Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

  • Like 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

 

Link to comment
Share on other sites

  • 2 weeks later...

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.
Link to comment
Share on other sites

  • Este tópico foi criado há 2640 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.