Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde gente ,

 

Hoje consigo gerar o Sped Fiscal e Contribuições normalmente através de Select's ao Banco de Dados com alguns erros são gerados pelos Select's que estão nos demais blocos C , etc .

O Bloco-0 em sua maioria de registros representa os detalhes daquilo que vai ser add no Bloco-C etc... , ou seja , por exemplo o Registro 0200 (Produtos) 0190 (Unid Med) , etc etc... eles tem que existir pelo menos um registro nos blocos a frente para poder ser declarado no arquivo .

 

A Pergunta :

Gostaria de saber se a uma forma de Add os Registros do Bloco-0 por ultimo de todos , ou seja , ao ir Add os registros do Bloco-C , Bloco... que vão ser os detalhes para o Bloco-0 ir sendo ja buferizados para se gerar o Bloco-0 , fiz um teste aqui em se gerar o bloco-0 por ultimo "sem buferizar ainda , somente com Select ao banco" mas o Componente não escreve o Bloco-0 com os dados que passei .

 

Consegui ser Clara ?

 

Obrigada .

Postado

Bom dia, no componente já existe uma forma de buferizar tudo antes de escrever algo, mas não aconselho pois dependendo da quantidade de movimento dará estouro de memória, existem outras formas de resolver seu problema.

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

 

  • Consultores
Postado

Não testei essa possibilidade, mas acho que se você só adicionar os registros do bloco 0 no final não vai ter problemas.

Só que é necessário adicioná-los antes de gerar/salvar o arquivo. Caso contrário, o componente não vai conseguir fazer as validações corretamente.

[]'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 (editado)

Elton , estou efetuando testes assim e minha experiencia com isso esta sendo assim :

 

Primeiro que não posso escrever no arquivo antes de armazenar toda coleção de registros A , C , D , F , porque a sequencia Bloco-0 será escrita antes do armazenamento completo .

 

Um exemplo do trecho de código abaixo ilustra um laço para o registros 0150 , 0190 e 0200 .

          for i := 0 to ACBrSpedFiscal1.Bloco_C.RegistroC001.RegistroC100.Count -1 do

              begin
              QryClientesFornecedores.Close ;
              QryClientesFornecedores.SQL.Clear ;
              QryClientesFornecedores.SQL.Text := 'Select '+
                                                  'CODIGO ,' +
                                                  'RAZAO_SOCIAL , ' +
                                                  'ENDERECO , ' +
                                                  'NUMERO , ' +
                                                  'BAIRRO , ' +
                                                  'CIDADE , ' +
                                                  'UF  , ' +
                                                  'CNPJ_CPF , ' +
                                                  'COMPLEMENTO  ' +
                                                  'From CADASTRO_PARTICIPANTES ' +
                                                  'where CODIGO=' + ACBrSpedFiscal1.Bloco_C.RegistroC001.RegistroC100.Items[i].COD_PART ; // Esta pesquisa é inevitável aqui no laço , ja que o Componente não tem detalhes do item e isto esta um problema na demora no rodar a rotina
              QryClientesFornecedores.Open ;


              Add_0150 (
                         QryClientesFornecedores.fieldbyname('CODIGO').AsString ,
                         QryClientesFornecedores.fieldbyname('RAZAO_SOCIAL').AsString ,
                         QryClientesFornecedores.fieldbyname('CNPJ_CPF').AsString ,
                         QryClientesFornecedores.fieldbyname('CNPJ_CPF').AsString ,
                         QryClientesFornecedores.fieldbyname('INSCRICAO_ESTADUAL').AsString ,
                         QryClientesFornecedores.fieldbyname('CODIGO_MUNICIPIO').AsString ,
                         QryClientesFornecedores.fieldbyname('ENDERECO').AsString ,
                         QryClientesFornecedores.fieldbyname('NUMERO').AsString ,
                         QryClientesFornecedores.fieldbyname('COMPLEMENTO').AsString ,
                         QryClientesFornecedores.fieldbyname('BAIRRO').AsString
                        ) ;


              for a := 0 to ACBrSpedFiscal1.Bloco_C.RegistroC001.RegistroC100.Items[i].RegistroC170.Count -1 do
                  begin
                  QryUnidadeDeMedidas.Close ;
                  QryUnidadeDeMedidas.SQL.Clear ;
                  QryUnidadeDeMedidas.SQL.Text := 'Select '                         +
                                                  'CODIGO , '                       +
                                                  'DESCRICAO , '                    +
                                                  'CODIGO_BARRAS , '                +
                                                  'NCM , '                          +
                                                  'UNIDADE_CODIGO ,'                +
                                                  'UNIDADE_DESCRICAO '              +
                                                  'From CADASTRO_PRODUTOS '         +
                                                  'where CODIGO=' + ACBrSpedFiscal1.Bloco_C.RegistroC001.RegistroC100.Items[i].RegistroC170.Items[a].COD_ITEM  +


                                                   'Union  '                        +


                                                  'Select   '                       +
                                                  'CODIGO , '                       +
                                                  'DESCRICAO , '                    +
                                                  'CODIGO_BARRAS , '                +
                                                  'NCM , '                          +
                                                  'UNIDADE ,'                       +
                                                  'UNIDADE_DESCRICAO '              +
                                                  'From CADASTRO_INV_ESTOQUE  '     +
                                                  'where CODIGO=' + ACBrSpedFiscal1.Bloco_C.RegistroC001.RegistroC100.Items[i].RegistroC170.Items[a].COD_ITEM  ; // Esta pesquisa é inevitável aqui no laço , ja que o Componente não tem detalhes do item e isto esta um problema na demora no rodar a rotina , lembrando que isto tbm é necessário para os registros C470 ECF ... será muito pesado nesta linha de raciocínio que estou fazendo.
                  QryUnidadeDeMedidas.Open ;
                  while not QryUnidadeDeMedidas.Eof do
                        begin
                        Add_0190 (
                                   QryUnidadeDeMedidas.fieldbyname('UNIDADE_CODIGO').asstring ,
                                   QryUnidadeDeMedidas.fieldbyname('UNIDADE_DESCRICAO').asstring
                                  ) ;


                        Add_0200 (
                                   QryUnidadeDeMedidas.fieldbyname('CODIGO').AsString ,
                                   QryUnidadeDeMedidas.fieldbyname('DESCRICAO').asstring ,
                                   QryUnidadeDeMedidas.fieldbyname('CODIGO_BARRAS').asstring ,
                                   '' ,
                                   QryUnidadeDeMedidas.fieldbyname('UNIDADE_CODIGO').asstring ,
                                   QryUnidadeDeMedidas.fieldbyname('NCM').asstring  ,
                                   '' ,
                                   '' ,
                                   ''
                                  ) ;


                        QryUnidadeDeMedidas.Next ;
                        end;
                  end;
              end;


///////////////////////////////////////////////////////////////

// Procedures acima dos Add's .

   procedure Add_0150 ( aCOD_PART : String ;
                        aNOME     : String ;
                        aCNPJ     : String ;
                        aCPF      : String ;
                        aIE       : String ;
                        aCOD_MUN  : String ;
                        aENDERECO : String ;
                        aNUM      : String ;
                        aCOMPL    : String ;
                        aBAIRRO   : String ) ;
     begin
     with ACBrSpedFiscal1.Bloco_0.Registro0001.Registro0150 do
          begin
          if not LocalizaRegistro( QryClientesFornecedores.fieldbyname('CODIGO').asstring ) then
             begin
             with ACBrSpedFiscal1.Bloco_0 do
                  with Registro0001 do
                       with Registro0150New do
                            begin
                            COD_PART := aCOD_PART ;
                            NOME     := aNOME ;
                            COD_PAIS := '1058' ;
                            CNPJ     := if_Then( Testa_Documento( 1 , Trim(aCNPJ) , '') , trim(aCNPJ) , '' ) ;
                            CPF      := if_Then( Testa_Documento( 0 , Trim(aCPF) , '') , trim(aCPF) , '' ) ;
                            IE       := if_Then( pos('ISENTO',UpperCase(aIE)) = 0 , aIE , '' ) ;
                            COD_MUN  := DM.Testa_Campo ( 'Registro 0150 - Participantes' , 'CODIGO MUNICIPIO' , aCOD_MUN , 'Participante : ' + aNOME );
                            SUFRAMA  := '' ;
                            ENDERECO := aENDERECO ;
                            NUM      := Trim(Format('%-10.10s',[aNUM])) ;
                            COMPL    := aCOMPL ;
                            BAIRRO   := aBAIRRO ;
                            end ;
             end;
          end;
     end;




   procedure Add_0190 ( aUNID  : String ;
                        aDESCR : String ) ;
     begin
     with ACBrSpedFiscal1.Bloco_0.Registro0001.Registro0190 do
          begin
          if not LocalizaRegistro( aUNID ) then
             begin
             with ACBrSpedFiscal1.Bloco_0 do
                  with Registro0001 do
                        with Registro0190New do
                             begin
                             UNID  := aUNID ;
                             DESCR := aDESCR ;
                             end;
             end;
          end;
     end;




   procedure Add_0200 ( aCOD_ITEM     : String ;
                        aDESCR_ITEM   : String ;
                        aCOD_BARRA    : String ;
                        aCOD_ANT_ITEM : String ;
                        aUNID_INV     : String ;
                        aCOD_NCM      : String ;
                        aEX_IPI       : String ;
                        aCOD_GEN      : String ;
                        aCOD_LST      : String ) ;
     begin
     with ACBrSpedFiscal1.Bloco_0.Registro0001.Registro0200 do
          begin
          if not LocalizaRegistro( aCOD_ITEM ) then
             begin
             with ACBrSpedFiscal1.Bloco_0 do
                  with Registro0001 do
                        with Registro0200New do
                             begin
                             COD_ITEM     := aCOD_ITEM ;
                             DESCR_ITEM   := aDESCR_ITEM ;
                             COD_BARRA    := aCOD_BARRA ;
                             COD_ANT_ITEM := aCOD_ANT_ITEM ;
                             UNID_INV     := aUNID_INV ;
                             TIPO_ITEM    := tiMercadoriaRevenda ;
                             COD_NCM      := aCOD_NCM ;
                             EX_IPI       := aEX_IPI ;
                             COD_GEN      := aCOD_GEN ;
                             COD_LST      := aCOD_LST ;
                             ALIQ_ICMS    := NULL  ;
                             end;
             end;
          end;
     end;
 
 
 
...A minha ideia e não mais necessitar pesquisas no banco de dados para se rodar os registro do bloco 0 , entende ? Com isso evita-se muitos erros gerados nestes registros do bloco-0 !
Editado por EMBarbosa
Adicionada tag CODE
  • Consultores
Postado

Seu código é bastante confuso para quem não está acostumado.

Enfim, eu tinha compreendido que você queria adicionar os registros do bloco 0 depois dos outros registros. Mas me parece que é justamente isso que seu código faz. Então não tenho mais certeza do que você quer...

 

Você parece querer que o componente preencha os registros e campos do bloco 0 com base nos outros blocos, automaticamente. Mas como está escrito nos seus próprios comentários, isso é impossível já que esses outros registros não possuem os dados necessários para o bloco 0.

 

Se não for nada disso, queira por favor dar mais detalhes ou explicar em outras palavras. Tente responder as seguintes perguntas:

O que você está fazendo? O que gostaria que acontecesse? O que está acontecendo na verdade?

[]'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

Elton ,

 

1º - É um Código meu inicial de teste viu , com certeza pode ser muito melhorado .

 

2º - Não quero que o componente faça isso , alias se fizesse seria simplesmente sensacional ! , é justamente a minha questão se alguém utiliza algo parecido .

 

3º - Veja que o Sql utilizado para preenchimento dos blocos C... etc... da escrituração são o "espelho" de itens utilizados ( Unid Med , Produtos , Participantes , etc etc ) para se preencher os registros do bloco-0 , e eu não queria mais utilizar Sql para se achar estes Registros e sim uma tentativa de se preencher utilizando os registros da própria Tree preenchida do componente mas vi que o peso dessa rotina parece incomodar bastante o hardware .

 

Resumo da sequencia do que quero :

 

1 - Add o bloco A

2 - Add o bloco C 

3 - Add o bloco D

4 - Add o bloco NNNNN

5 - Add o bloco-0 com os detalhes retirados dos blocos acima do próprio Componente ( Uma forma leve de se fazer isso , sendo que esse meu exemplo acima ja faz oque quero , entende ? )

 

Com certeza existem outras pessoas que já pensaram ou tentaram algo mas não foi a frente com isso .

 

Muito obrigada pela atenção dispensada .

  • Consultores
Postado

Então, como disse no comentário anterior, nesse seu resumo do que quer, o passo 5 é impossível de se conseguir completamente.

Por exemplo, para preencher o registro 0100 você precisa do campo 'ENDERECO', mas ele não está presente em nenhum outro lugar.

 

O resto é exatamente o que você está fazendo. Na verdade, não vi nenhum grande problema no seu código.

Se estiver achando ele lento, então eu sugiro rodar um profiler para descobrir exatamente onde está lento e tentar otimizar a partir daí.

[]'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

O componente não existe retardo algum no processamento, o grande motivo de demora em processamento está justamente no sua forma de fazer, dando loop em milhões de registros como no C100 e no C170 para verificação de cada registro no seu banco, sem contar que se repetição de itens no C170 fará quantos selects de produtos repetidos, segundo erro na lógica é usar a função LocalizaRegistro(), ela existem mas não são aconselhadas para grandes movimentos.

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

Faça o seguinte, quando for alimentar os Participantes e Itens use um select individual para cada um, crie no seu banco uma VIEW buscando os produtos da sua tabela de movimentação ex

 

select DISTINCT

dataentrada

codigoproduto

from tabelaNF

 

junto use um inner para buscar os demais dados no cadastro de produtos, use tb um union all como usou no seu código acima para unir códigos de outras tabelas de movimento que tenha

 

Nota: mesmo usando DISTINCT vc terá registros repetidos, pois pode ser que a data seja diferente, ai vem o 2o passo dentro do seu sistema faça outro select distinct da view criada

 

select distinct codigoproduto, etc from VIEW where DATA BETWEEN DataI AND DataF, aqui só use a data para filtrar o período, dessa forma não virá código repetido se tiver.

 

Faça a mesma coisa para a tabela de participante, o para o que mais precisar, verá que irá mudar a velocidade drasticamente, pelo seu código que é hj.

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

 

  • Este tópico foi criado há 3576 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...