-
Total de ítens
2.545 -
Registro em
-
Última visita
-
Days Won
39
Tipo de Conteúdo
Blocks
Notes ACBrLibNFe
Fóruns
Downloads
Calendário
Tudo que Isaque Pinheiro postou
-
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
-
Erro na validação com a função funChecaIE
Isaque Pinheiro replied to francinaldoac's tópico in ACBrSPEDFiscal
É 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. -
Erro na validação com a função funChecaIE
Isaque Pinheiro replied to francinaldoac's tópico in ACBrSPEDFiscal
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. -
DT_FIN Diferente do informado
Isaque Pinheiro replied to evertonbuenolima's tópico in ACBrSPEDPisCofins
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. -
DT_FIN Diferente do informado
Isaque Pinheiro replied to evertonbuenolima's tópico in ACBrSPEDPisCofins
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| -
DT_FIN Diferente do informado
Isaque Pinheiro replied to evertonbuenolima's tópico in ACBrSPEDPisCofins
Exatamente onde ou qual registro ele não ta gravando essa data informada por vc? -
Preciso de uma Atualização do ACBrSPEDPisCofins
Isaque Pinheiro replied to antoniojr's tópico in ACBrSPEDPisCofins
Nesse caso o ultimo parâmetro deve estar True. -
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.
-
Preciso de uma Atualização do ACBrSPEDPisCofins
Isaque Pinheiro replied to antoniojr's tópico in ACBrSPEDPisCofins
Blz Elton. -
Preciso de uma Atualização do ACBrSPEDPisCofins
Isaque Pinheiro replied to antoniojr's tópico in ACBrSPEDPisCofins
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 -
-
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
-
versão suportada pelo ACBRSped
Isaque Pinheiro replied to Humberto S. Reis Jr's tópico in ACBrSPEDFiscal
pode ir implementando e anexando aqui, assim posso fazer o merge e subir para o svn. -
Muito obrigado Elton, por sua ajuda.
-
versão suportada pelo ACBRSped
Isaque Pinheiro replied to Humberto S. Reis Jr's tópico in ACBrSPEDFiscal
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. -
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.
-
Se o validador reclamou, vc fez a alteração corretamente no componente. Elton, vc pode subir essa alteração para nós? Obrigado.
-
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]
-
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
-
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.
-
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.
-
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.
-
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,
-
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
-
Esse sistema G5, TODOS os contadores usam o mesmo? Esse sistema é livre? É do governo?