Ir para conteúdo
  • Cadastre-se

Isaque Pinheiro

Membros
  • Total de ítens

    2.545
  • Registro em

  • Última visita

  • Days Won

    39

Tudo que Isaque Pinheiro postou

  1. Vou disponibilizar aqui o que comecei, se alguém se propor a ajudar, agradeço. Observem a unit "ACBrEPCBlocos.pas", como foi feito. Uma observação, estou mudando o nome dos tipo para o mesmo nome da propriedade, assim não temos que ficar invetando nome e nem colocando nomes enormes, fiquem atentos nesse detalhe. Se alguém se propor a ajudar a terminar os que restam depois anexe aqui que vou pegar e fazer um merge geral, com a versão da pasta trunk. ACBr_SPEDPisCofins.zip
  2. É porque vc pegou uma IE nova, a qual mudou o cálculo, pois as IEs antigas tinha o tipo como passado o link pelo Elton, e no link que vc passou foi retirado os tipos, já subi pro SVN.
  3. O algorítimo de validação do site do sintegra deve estar errado para Alagoas, pois lá não existe o campo tipo de empresa, segue abaixo um link do site da fazenda de Alagoas, com a validação de sua inscrição estadual. http://www.sefaz.al.gov.br/sintegra/cad_AL.asp Mude "24BNNNNNX.14.00" para "24NNNNNNX.14.00" e faça o teste, o "B" quer dizer que o terceiro carácter só poderá ser "03578" se mudar para "N" o terceiro carácter poderá ser "0123456789", isso deve resolver, confirme se funcionou, caso não funcione me informe o IE, que irei testar.
  4. Descobri esse erro, é que ao clicar no botão Bloco_1 ele internamente dispara antes o Bloco A que por sua vez dispara antes o Bloco C e assim por diante, por que a ordem correta o Bloco 1 tem que ser gerado depois do Bloco M e antes o Bloco 9. Para que fique certo ao clicar no botão Gravar Bloco 9, ai sim irá gerar o Bloco 1 corretamente. Ou Seja por estar fora da ordem, quando gerar concomitantemente o bloco 1, não será gerado até ser clicado no botão do Bloco 9. Elton, pode mudar isso no demo ? Mude a ordem do botão Bloco 1 para depois do botão Bloco M, e no código do botão Todos os Blocos mude para que o click do botão Bloco 1 seja disparado depois do click do botão Bloco M. Abs.
  5. Reveja seu código, em algum lugar essa data deve esta sendo informada, pois gerei pelo demo e a data informada é a que foi gravada. veja: |0000|002|0|0|00000000000000000000000000000000000000000|01022012|29022012|NOME DA EMPRESA|11111111000191|ES|3200607|000000000|00|0|
  6. Exatamente onde ou qual registro ele não ta gravando essa data informada por vc?
  7. Já fiz uma pesquisa sobre isso a algum tempo atras, mas pelo que parece essa atualização é feita manual pelo PVA, olhe na pasta Programas_SPED\PisCofins1\Recursos\Tebelas ou Programas_SPED\Fiscal2\Recursos\TebelasExternas, é como se ele baixasse (download) as tabelas exatamente como elas são colocadas no portal e dai o sistema faz a leitura desse TXT, e joga para o banco de dados, isso foi que deu a atender.
  8. Faça a alteração do CurMask para '#0.00##' Olhe no manual quantas casas decimais é pedido para esses campos e mude, no componente, se pede três mude para 3, se pede 4 muda para quatro, as casas decimais tem que estar conforme é pedido no manual. Abraço
  9. Amigo, Try Except não é, e nunca foi amador, estude sobre ele, e verá que poderá fazer coisas bem bacana para mostrar para seus clientes a mensagem que quiser, mas veja só quem tem que dizer qual a mensagem deve aparecer é VOCÊ, não o delphi e nem o try except, por isso tem o nome "tratamento de exceção" Abraço
  10. pode ir implementando e anexando aqui, assim posso fazer o merge e subir para o svn.
  11. vou dar uma olhada, add a versão na lista de versão é fácil, mas tem vários campos que podem ter tido alteração ou foram adicionados, essa irá aos poucos com a colaboração de todos.
  12. Infelizmente não tem como, o equipamento não nos permite esse recurso, nesse caso terá que emitir uma NF de devolução das mercadorias.
  13. Se o validador reclamou, vc fez a alteração corretamente no componente. Elton, vc pode subir essa alteração para nós? Obrigado.
  14. Crie eventos para atender Blocos e Registros tipo: OnBeforeWriteRegistro0600 OnAfterWriteRegistro0600 No evento OnAfterWriteRegistro0600, você pode criar todo o bloco A, e Before ou After de cada registro, você pode escrever outros registros que não existe no SPED. Assim que tiver sucesso me avise que farei o Merge e subirei os eventos para o componente. Exemplo: type TBeforeWriteRegistro0600Event = procedure(Object: TObject) of object; TAfterWriteRegistro0600Event = procedure(Object: TObject) of object; ... procedure TBloco_0.WriteRegistro0600(Reg0001: TRegistro0001) ; var intFor: integer; strLinha : AnsiString; begin // Before // if Assigned( FOnBeforeWriteRegistro0600 ) then FOnBeforeWriteRegistro0600(Self); if Assigned( Reg0001.Registro0600 ) then begin for intFor := 0 to Reg0001.Registro0600.Count - 1 do begin with Reg0001.Registro0600.Items[intFor] do begin strLinha := LFill( '0600' ) + LFill( DT_ALT ) + LFill( COD_CCUS ) + LFill( CCUS ); if Assigned( FOnWriteRegistro0600 ) then FOnWriteRegistro0600( strLinha ); Add( strLinha ); end; Registro0990.QTD_LIN_0 := Registro0990.QTD_LIN_0 + 1; end; /// Variavél para armazenar a quantidade de registro do tipo. FRegistro0600Count := FRegistro0600Count + Reg0001.Registro0600.Count; end; // After // if Assigned( FOnAfterWriteRegistro0600 ) then FOnAfterWriteRegistro0600(Self); end; [/code]
  15. Segue a implementação do Evnto no registro 0200, para vc saber como foi feito, agora é implementar no demais registros que precisam. ACBrSpedFiscal.pas TACBrSPEDFiscal = class(TComponent) private ... FOnRegistro0200: TEvent0200; // ... function GetOnRegistro0200: TEvent0200; // procedure SetOnRegistro0200(const Value: TEvent0200); // protected ... public ... property OnRegistro0200: TEvent0200 read GetOnRegistro0200 write SetOnRegistro0200; // end; ... function TACBrSPEDFiscal.GetOnRegistro0200: TEvent0200; begin Result := FOnRegistro0200; end; procedure TACBrSPEDFiscal.SetOnRegistro0200(const Value: TEvent0200); begin FOnRegistro0200 := Value; FBloco_0.OnRegistro0200 := Value; end; [/code] ACBrEFDBloco_0_CLass.pas [code] type TEvent0200 = procedure(var ALinha: AnsiString) of object; // /// TBLOCO_0 - Abertura, Identificação e Referências { TBloco_0 } TBloco_0 = class(TACBrSPED) private FOnRegistro0200: TEvent0200; // ... function GetOnRegistro0200: TEvent0200; // procedure SetOnRegistro0200(const Value: TEvent0200); // public ... property OnRegistro0200: TEvent0200 read GetOnRegistro0200 write SetOnRegistro0200; // ... function TBloco_0.GetOnRegistro0200: TEvent0200; begin Result := FOnRegistro0200; end; procedure TBloco_0.SetOnRegistro0200(const Value: TEvent0200); begin FOnRegistro0200 := Value; end; ... procedure TBloco_0.WriteRegistro0200(Reg0001: TRegistro0001) ; var intFor: integer; strTIPO_ITEM: AnsiString; strLinha: AnsiString; // begin if Assigned( Reg0001.Registro0200 ) then begin strLinha := ''; // for intFor := 0 to Reg0001.Registro0200.Count - 1 do begin with Reg0001.Registro0200.Items[intFor] do begin case TIPO_ITEM of tiMercadoriaRevenda : strTIPO_ITEM := '00'; tiMateriaPrima : strTIPO_ITEM := '01'; tiEmbalagem : strTIPO_ITEM := '02'; tiProdutoProcesso : strTIPO_ITEM := '03'; tiProdutoAcabado : strTIPO_ITEM := '04'; tiSubproduto : strTIPO_ITEM := '05'; tiProdutoIntermediario : strTIPO_ITEM := '06'; tiMaterialConsumo : strTIPO_ITEM := '07'; tiAtivoImobilizado : strTIPO_ITEM := '08'; tiServicos : strTIPO_ITEM := '09'; tiOutrosInsumos : strTIPO_ITEM := '10'; tiOutras : strTIPO_ITEM := '99'; end; if COD_GEN EmptyStr then begin COD_GEN := funStrZero(COD_GEN, 2); Check(funChecaGENERO(COD_GEN), '(0-0200) O código do gênero "%s" digitado é inválido! ' + 'Produto %s %s', [COD_GEN, COD_BARRA, DESCR_ITEM]); end; // strLinha := strLinha + // LFill('0200') + LFill( COD_ITEM ) + LFill( DESCR_ITEM ) + LFill( COD_BARRA ) + LFill( COD_ANT_ITEM ) + LFill( UNID_INV ) + LFill( strTIPO_ITEM ) + LFill( COD_NCM ) + LFill( EX_IPI ) + LFill( COD_GEN, 2 ) + LFill( COD_LST ) + LFill( ALIQ_ICMS,0,2 ) ; if Assigned(FOnRegistro0200) then // FOnRegistro0200(strLinha); // Add( strLinha ); // end; /// Registros FILHOS WriteRegistro0205( Reg0001.Registro0200.Items[intFor] ) ; WriteRegistro0206( Reg0001.Registro0200.Items[intFor] ) ; WriteRegistro0220( Reg0001.Registro0200.Items[intFor] ); Registro0990.QTD_LIN_0 := Registro0990.QTD_LIN_0 + 1; end; /// Variavél para armazenar a quantidade de registro do tipo. FRegistro0200Count := FRegistro0200Count + Reg0001.Registro0200.Count; end; end; Agora aqui, dentro desse evento você faz o que quiser com essa variável antes dela ser escrita no arquivo TXT. if Assigned(FOnRegistro0200) then FOnRegistro0200(strLinha); [/code] Obs: Você precisará do código do produto para encontrar o produto no seu DB e implementar o restante das informações, então ao receber o parâmetro no evento, veja a posição que se encontra o código e todas as informações que você precisar para localizar o registro no seu DB e implementar a VAR como as informações dele. Faça uns testes, veja se funciona e nos depois nos relate. Abs ACBrSPEDFiscal.zip
  16. Com os eventos, tb da para gerar os dois, para isso basta fazer a checagem que vc fez dentro do componente, fazer dentro do evento. Exemplo: procedure onRegistro0200(var strLinhaArquivo) begin if LayoutContmatic then // LayoutContmatic, deve ser uma VAR, definida por vc dentro do seu código, ai quando chega no evento ele verifica o status dessa var, para saber qual leiaute, ve escolheu. begin strLinhaArquivo := strLinhaArquivo + LFill( COD_GRUPO ) + LFill( DESC_GRUPO ) + LFill( COD_SEFAZ ) + LFill( CSOSN ) + LFill( CST_ICMS ) + LFill( PER_RED_BC_ICMS , 6 , 2 ) + LFill( BC_ICMS_ST , 6 , 2 ) + LFill( CST_IPI_ENTRADA ) + LFill( CST_IPI_SAIDA ) + LFill( ALIQ_IPI , 6 , 2 ) + LFill( CST_PIS_ENTRADA ) + LFill( CST_PIS_SAIDA ) + LFill( NAT_REC_PIS ) + LFill( ALIQ_PIS , 6 , 2 ) + LFill( CST_COFINS_ENTRADA ) + LFill( CST_COFINS_SAIDA) + LFill( NAT_REC_COFINS ) + LFill( ALIQ_COFINS , 6 , 2 ) + LFill( ALIQ_ISS , 6 , 2 ) + LFill( CC ) + LFill( OBSERVACAO ); end; end; [/code] Caso dentro do seu código não atenda a essa var "LayoutContmatic", a var strLinhaArquivo retorna do jeito que ela veio de dentro do ACBrSPED, com isso atende aos dois leiautes.
  17. Ai nesse caso complica, pois se tiver que somar os registros desse Bloco A no Bloco 9 ? Ai tem que analisar melhor esse caso como deve ser feito: Se deve somar no Bloco 9 Se deve sair na ordem de blocos São várias situações, a serem analisadas, e a solução seria eventos.
  18. wrgoncalves2008 Não consegui visualizar esta propriedade neste componente ! *** teria como me passar , como vc faz para localizar esta propriedade ? Obrigado pelas informações. Essa propriedade só exite no fonte que ele anexou aqui nos post, não exite no fonte do SVN.
  19. Desculpe, mas discordo de você, se tiver os eventos, você pode substituir o que o ACBrSPED gera, valendo assim o leiaute que você escreveu, e isso não te daria manutenção alguma, pois o código seria seu, e estaria dentro do evento e o ACBrSPED só iria la se você usasse o evento, esses eventos sim poderiam fazer parte interna do ACBrSPED, assim eles estariam la para quem quisesse usar sempre. Dai seria 1o O ACBrSPED iria vê se você esta usando o evento do registro assim: if Assigned(FOnRegistro???) then FOnRegistro???(strLinhaArquivo); 2o No evento, você poderá implementar essa VAR recebida como parâmetro, ou até mesmo limpa-la e recria-la assim: strLinhaArquivo := strLinhaArquivo + "Implementação"; strLinhaArquivo := "Novo conteúdo"; Implemente os evento nos registros que você precisa, depois anexe aqui que eu subo as implementações somente desses eventos para o SVN,
  20. Esse sistema G5, TODOS os contadores usam o mesmo? Esse sistema é livre? É do governo? Olhei o site do G5, ele não é livre é um sistema particular, então o componente ACBr não poderá ter embutido nativamente nele, esse tipo de implementação, pois existem no mercado vários sistemas concorrentes do G5, e não tem como o ACBr, atender a todos o leiautes, nesse caso vocês terão que fazer essas implementações só na versões de vocês, como já estão fazendo. Uma solução que vejo, é criar um evento para cada registro, passando como parâmetro "var strLinhaArquivo", e no evento fazer o restante da implementação. Dessa forma atendemos o leiaute padrão do SPED, e no evento cada um implementa as informações necessárias para o leiaute do sistema fiscal utilizado. Abs
×
×
  • 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.