Digite assunto para busca:

PROGRAMACAO: Webservice de CEP (5-000370-09/01/2017)

Webservice de CEP online nos correios.

Fornece também informação se o CEP foi excluído, substituído ou desmembrado.

Em caso de falha nos correios, será usada a base local, atualizada até 01/01/2017

www.jpatecnologia.com.br/cep.asp?cep=03676-080

ou em uppercase sem acento

www.jpatecnologia.com.br/cep.asp?cep=03676-080&clipper=1

Existe limite de abuso.
O IP que cometer abuso será bloqueado por um determinado período de tempo.


Retorno:
CEP, LOGRADOURO, BAIRRO, CIDADE, UF - Informações básicas
IBGE - Código de IBGE atribuído à cidade
CEPLIST - Lista de novos CEPs ou de desmembramentos
INFALT - Data em que a informação foi obtida
STATUS - "E" caso o CEP tenha sido excluído, e não deva ser usado

Doações:
Banco Itaú agência 1553 conta 06904-6 José M. C. Quintas

Nota:
- Não adianta pegar uma base que já existe e consultar os mesmos CEPs no webservice.
Isso não vai fornecer os novos CEPs.
- Os correios tem uma base de CEPs atualizada mensalmente. Ela é vendida por R$50.00 mas não dá direito a atualização. Pode ser  uma opção caso queira atualizar sua base local, sem ficar sobrecarregando webservices e correr o risco de ser bloqueado.

PROGRAMACAO: Tabela IBPT 2017 (5-000369-09/01/2017)

Tabela IBPT
Obtida do IBPT em 09/01/2017



PROGRAMACAO: GERADANFE.EXE (5-000368-09/01/2017)

Programa pra gerar Danfe em PDF e abrir no Windows.
O aplicativo JPA já inclui as rotinas, e este programa não é necessário.
Disponível aqui apenas pra eventuais testes, use por sua conta e risco.

Modo de uso:

geradanfe.exe arquivo.xml arquivo.jpg arquivoauxiliar.xml

onde

arquivo.xml = NFE, CTE, MDFE ou Evento

arquivo.jpg = logotipo existente ou um texto qualquer

arquivoauxiliar.xml = xml de cancelamento no caso de documento, ou xml de emissão no caso de evento

fontes no github:


doações:
Banco Itaú agência 1553 conta 06904-6 José M. C. Quintas



PROGRAMAÇÃO/FISCAL: Cálculo de impostos em uma nota fiscal (7-000137-13/06/2010)

Podem ocorrer variações na forma de cálculo, portanto vamos apresentar aqui a forma mais comum, utilizada na maioria dos casos.

IPI - Imposto sobre produtos industrializados
ICMS - Imposto sobre circulação de mercadorias
ISS - Imposto sobre serviços
PIS
Cofins
ICMS-ST - ICMS Substituição Tributária

Nomenclatura: INT() - retorna apenas a parte inteira do resultado, desprezando decimais.

IPI

O IPI é sobre o valor do produto, e acrescentado ao total da nota.
Para o cálculo do IPI, precisamos saber do percentual do imposto, que varia conforme produto.

nValordoProduto = 10.000,00
nPercentualIpi = 10
nValorIpi = Int( nValordoProduto * nPercentalIpi ) / 100 = 1.000


ICMS

O ICMS é o imposto sobre a circulação da mercadoria. Dependendo do tipo de operação, pode ou não ter ICMS.
Há casos de redução da base de cálculo, onde apenas uma parte do valor sofre cálculo de ICMS.
Para o cálculo do ICMS, percisamos da alíquota de imposto e da alíquota de redução, que pode ser zero.
No cálculo do ICMS, o valor do IPI (Se houver) geralmente é somado ao valor do produto.

nValorProduto = 10.000
nValorIpi = 1.000
nAliqIcms = 12
nAliqReducao = 10

nBaseIcms = ( nValorProduto + nValorIpi )
nReducao = Int( nBaseIcms * nAliqReducao ) / 100
nBaseIcms = nBaseIcms - nReducao
nValorIcms = ( nBaseIcms * nAliqIcms ) / 100


ICMS-ST

O ICMS Substituição é calculado sobre um valor previsto para venda.
Do resultado do cálculo é abatido o ICMS normal, cujo cálculo já foi apresentado acima.
Para o cálculo do ICMS-ST necessitamos do percentual do IVA, alíquota de ICMS-ST, e percentual de redução da base de cálculo de  ICMS-ST.
Estas alíquotas podem ou não ser iguais à alíquotas do ICMS normal.
O Valor do ICMS-ST é somado ao valor total da nota fiscal.

nBaseSub = (ValorProduto+ValorIpi)
nBaseSub = nBaseSub + ( (nBaseSub * nAliqIVA) / 100)
nReducao = Int( nBaseSub * nAliqRed ) / 100
nBaseSub = nBaseSub - nReducao
nValorSub = Int( nBaseSub * nAliqSub ) / 100
nValorSub = nValorSub - nValorICMS


PIS/COFINS

O PIS é calculado sobre o valor total do produto. (valor + IPI).
Apenas aplica-se a alíquota ao valor do produto.

ISS

O ISS é calculado sobre o valor do serviço.
Aplica-se a alíquota ao valor do serviço.

PROGRAMAÇÃO: Tabelas Sped (CFOP, ICMS, CST, Cidades, etc) (7-000136-12/06/2010)

Temos várias tabelas no Sped.
Temos CFOP, CST, Cidades do IBGE, UFs, países, etc.
Um bom lugar pra encontrar essas tabelas está neste link:

Tabelas Sped

PROGRAMAÇÃO: Gerando XML de Nota Fiscal Eletrônica (7-000025-03/06/2010)

Basicamente o XML é composto de tags.
A tag começa com [tag] e termina com [/tag]
E uma tag pode conter sub-tags.

O cnpj do emitente ficaria assim:

mXml = "[cnpj]" + emitente-]cnpj + "[/cnpj]"


O nome do emitente ficaria assim:

mXml = "[nome]" + emitente-]nome + "[/nome]"


E o conjunto de dados do emitente ficaria assim:

mXml = "[emitente]" + ,
"[cnpj]" + emitente-]cnpj + "[/cnpj]" + ,
"[nome]" + emitente-]nome + "[/nome]" + ,
"[/emitente]"



Nos exemplos acima, vemos que a parte mais chata é ficar abrindo e fechando tags.
Pra isso, criamos uma função, só precisando passar o nome e o conteúdo.

E pode confundir o abrir/fechar, quando o Xml vai ficando extenso.
Então vamos separar em blocos.
Abaixo um fonte mais completo, só pra dar uma idéia.

mXmlNota = XmlTag("nota",notafiscal-]numero) + ,
XmlTag("emissao",Dtos(notafiscal-]emissao)) + ,
XmlTag("natureza",notfiscal-]natureza)

mXmlEmitente = XmlTag("cnpj",emitente-]cnpj) + ,
XmlTag("nome",emitente-]nome) + ,
XmlTag("endereco",emitente-]endereco) + ,
XmlTag("cidade",emitente-]cidade) + ,
XmlTag("UF", emitente-]uf)

mXmlDestinatario = XmlTag("cnpj",cliente-]cnpj) + ,
XmlTag("nome",emitente-]nome) + ,
XmlTag("endereco",emitente-]endereco) + ,
XmlTag("cidade",emitente-]cidade) + ,
XmlTag("UF",emitente-]UF)

mXmlProduto = XmlTag("produto",produto-]nome) + ,
XmlTag("Qtde",Ltrim(Str(produto-]Qtde,16,2))) + ,
XmlTag("Valor",Ltrim(Str(produto-]Valor,16,4)))

mXmlGeral = ,
XmlTag("Nota",mXmlNota) + ,
XmlTag("emitente",mXmlEmitente) + ,
XmlTag("destinatario",mXmlDestinatario") + ,
XmlTag("produto",mXmlProduto)

MemoWrit(ArquivoXml,mXmlGeral)

Function XmlTag(cTag, cConteudo)
Local cTexto = ""
cTexto = "[" + cTag + "]" + cConteudo + "[/" + cTag + "]"
Return cTexto


Há várias formas de fazer tudo isso. Basta escolher a que achar melhor.

Esse fonte é simples e prático.
Tem um componente da Microsoft pra XML, mas é bem mais complexo.

** Substituir [] por menor/maior. É que menor/maior é controle de página de internet, e estavam sendo omitidos do fonte

PROGRAMAÇÃO: VB6 Esperando alguns segundos (7-000021-04/03/2010)

Uma opção para fazer uma pausa dentro do VB6, sem travar o programa, é esta.
O fonte não é de minha autoria, e pode ser encontrado nas páginas da Microsoft.

Referência Microsoft: Q231298

Option Explicit

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Private Const WAIT_ABANDONED& = &H80&
Private Const WAIT_ABANDONED_0& = &H80&
Private Const WAIT_FAILED& = -1&
Private Const WAIT_IO_COMPLETION& = &HC0&
Private Const WAIT_OBJECT_0& = 0
Private Const WAIT_OBJECT_1& = 1
Private Const WAIT_TIMEOUT& = &H102&

Private Const INFINITE = &HFFFF
Private Const ERROR_ALREADY_EXISTS = 183&

Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
Private Const QS_MOUSE& = (QS_MOUSEMOVE _
Or QS_MOUSEBUTTON)
Private Const QS_INPUT& = (QS_MOUSE _
Or QS_KEY)
Private Const QS_ALLEVENTS& = (QS_INPUT _
Or QS_POSTMESSAGE _
Or QS_TIMER _
Or QS_PAINT _
Or QS_HOTKEY)
Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _
Or QS_PAINT _
Or QS_TIMER _
Or QS_POSTMESSAGE _
Or QS_MOUSEBUTTON _
Or QS_MOUSEMOVE _
Or QS_HOTKEY _
Or QS_KEY)

Private Declare Function CreateWaitableTimer Lib "kernel32" _
Alias "CreateWaitableTimerA" ( _
ByVal lpSemaphoreAttributes As Long, _
ByVal bManualReset As Long, _
ByVal lpName As String) As Long

Private Declare Function OpenWaitableTimer Lib "kernel32" _
Alias "OpenWaitableTimerA" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal lpName As String) As Long

Private Declare Function SetWaitableTimer Lib "kernel32" ( _
ByVal hTimer As Long, _
lpDueTime As FILETIME, _
ByVal lPeriod As Long, _
ByVal pfnCompletionRoutine As Long, _
ByVal lpArgToCompletionRoutine As Long, _
ByVal fResume As Long) As Long

Private Declare Function CancelWaitableTimer Lib "kernel32" ( _
ByVal hTimer As Long)

Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" ( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Private Declare Function MsgWaitForMultipleObjects Lib "user32" ( _
ByVal nCount As Long, _
pHandles As Long, _
ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, _
ByVal dwWakeMask As Long) As Long

Public Sub Api_Wait(lNumberOfSeconds As Long)
Dim ft As FILETIME
Dim lBusy As Long
Dim lRet As Long
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
Dim hTimer As Long

hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")

If err.LastDllError = ERROR_ALREADY_EXISTS Then
If the timer already exists, it does not hurt to open it
as long as the person who is trying to open it has the
proper access rights.
Else
ft.dwLowDateTime = -1
ft.dwHighDateTime = -1
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, 0)
End If

Convert the Units to nanoseconds.
dblUnits = CDbl(&H10000) * CDbl(&H10000)
dblDelay = CDbl(lNumberOfSeconds) * 1000 * 10000

By setting the high/low time to a negative number, it tells
the Wait (in SetWaitableTimer) to use an offset time as
opposed to a hardcoded time. If it were positive, it would
try to convert the value to GMT.
ft.dwHighDateTime = -CLng(dblDelay / dblUnits) - 1
dblDelayLow = -dblUnits * (dblDelay / dblUnits - _
Fix(dblDelay / dblUnits))

If dblDelayLow < CDbl(&H80000000) Then
&H80000000 is MAX_LONG, so you are just making sure
that you dont overflow when you try to stick it into
the FILETIME structure.
dblDelayLow = dblUnits + dblDelayLow
ft.dwHighDateTime = ft.dwHighDateTime + 1
End If

ft.dwLowDateTime = CLng(dblDelayLow)
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)

Do
QS_ALLINPUT means that MsgWaitForMultipleObjects will
return every time the thread in which it is running gets
a message. If you wanted to handle messages in here you could,
but by calling Doevents you are letting DefWindowProc
do its normal windows message handling---Like DDE, etc.
lBusy = MsgWaitForMultipleObjects(1, hTimer, False, _
INFINITE, QS_ALLINPUT&)
DoEvents
Loop Until lBusy = WAIT_OBJECT_0

Close the handles when you are done with them.
CloseHandle hTimer

End Sub

PROGRAMAÇÃO: NFE, CTE e CCE (9-000176-10/07/2012)

Vamos tentar ensinar como trabalhar com NFE, CTE e CCE.
De início não se atente aos detalhes, porque é importante entender como funcionam os XMLs e webservices, antes de partir para a prática.

XML do documento.

Um documento pode ser NFE, CTE, CCE, cancelamento de NFE, cancelamento de CTE, inutilização, consulta protocolo, etc.

XML do lote.

No caso de NFE, CTE e CCE, o XML do documento é uma parte (um bloco) do XML do lote.
Um lote pode conter um ou mais documentos do mesmo tipo (várias NFEs, por exemplo).

XML da comunicação SOAP

A comunicação com o Webservice é feita por um XML, onde os XMLs acima são uma parte (um bloco) do XML do SOAP.

XML de retorno.

Ao enviar um XML por SOAP, é recebido outro XML de resposta.

Assinatura Digital

A assinatura digital é sobre o documento.
No caso de um lote de documentos, cada documento do lote é assinado.
Para assinatura pode ser usada a CAPICOM, que é uma biblioteca fornecida pela Microsoft.

Validação do XML

Para validar um XML, é necessário ter os schemmas.
E pra validar, pode ser usado o MSXML, que é uma biblioteca fornecida pela Microsoft

WebService

A comunicação SOAP é basicamente simples: é enviado o XML SOAP para um determinado endereço, e é recebido um XML de resposta.
O webservice pode ou não exigir um certificado.
Também pode ser necessário informar a SOAP Action, que é a ação a ser tomada pelo webservice.
Para comunicação SOAP pode ser usado o MSXML, que é uma biblioteca fornecida pela Microsoft.

Informações sobre o XML do documento, e o XML do lote podem ser obtidas no manual do contribuinte.
Os schemmas fornecidos pela Fazenda também ajudam, caso tenha um interpretador de schemas.

Informações sobre o XML do SOAP
Ao acessar uma página de webservice, pelo navegador, o próprio webservice fornece exemplos de XML SOAP.
Por esse meio também pode ser obtido o nome da Soap Action

Relação de WebServices
A lista de webservices pode ser obtida no portal nacional do SPED, ou diretamente nos sites de NFE de cada UF.

O processo todo é simples.
Simples no sentido de entender, mas não é simples no modo de fazer, visto que há diversos tipos de problema que podem ocorrer durante todo o processo.
Pode ter erros de internet, erros no webservice falhando, erros nos xmls, erros de preenchimento de dados, etc.

Então o que precisa pra fazer tudo do SPED:
- Aprender a mexer com XML (é simples, basta querer aprender)
- Aprender a assinar
- Aprender a fazer uma comunicação SOAP (é igual pra TUDO, funcionou uma, funcionam todas)
- Ter a lista dos webservices
- Ter os manuais da Fazenda
- Ter tempo e paciência

A parte que achei mais difícil de descobrir foi a da assinatura. Sem ela o resto não vale nada.
A parte que pode servir de começo é a consulta de protocolo, que dispensa o uso de certificado, por não precisar assinatura. A parte de comunicação SOAP é sempre a mesma. Se precisar certificado, o uso é automático.

Espero sobrar tempo pra acrescentar detalhes a este pequeno tutorial

PROGRAMAÇÃO: Resetar auto increment no MySql (9-000157-17/01/2011)

Como resetar auto increment no mysql:

Uma forma de fazer isso é zerar o arquivo

TRUNCATE TABLE nomedatabela

Outra forma é executar o seguinte comando:

ALTER TABLE nomedatabela AUTO_INCREMENT = 1

PROGRAMAÇÃO: Uso de DLL (9-000154-09/11/2010)

É apenas uma explicação genérica, os detalhes podem não estar corretos.

Parte 1: somente pra DLL NET
Caso vá usar uma DLL NET num programa não-NET, é necessário um procedimento a mais.
O manual da DLL deve constar os detalhes do procedimento.
Após esse procedimento, a DLL NET pode ser usada como uma DLL comum

Parte 2: Registro da DLL
Caso seja uma DLL que precise registro, basta registrar.
regsvr32.exe NomeDaDll.dll
Vai ter que distribuir a DLL junto ao seu programa
Se precisar registrar, vai ter que fazer isso em TODAS as máquinas que rodam seu programa.

Parte 3: Somente para xHarbour e similares
Algumas linguagens, como o xHarbour, necessitam de uma LIB específica da DLL, pra poder usá-la.
Isto é obtido pelo utilitário IMPLIB.
Uma vez gerada a LIB, basta linqueditar e pronto.
Não precisa distribuir a LIB junto com o programa.
No caso do VB6, basta declarar as funções no fonte, sem precisar de LIB.

Parte 4:
Usando nos fontes.
Só colocar as chamadas de função, de acordo com o manual da dll.
As funções da DLL passam a ser parte da linguagem, desde que linqueditando a LIB acima.

Os detalhes de cada etapa geralmente constam do manual da DLL.
Então, basta consultar o manual.

PROGRAMAÇÃO: Validar XML de NFE (9-000149-31/08/2010)

Pra validar um XML de nota fiscal eletrônica, há uma rotina no site da Secretaria da Fazenda do Rio Grande do Sul.
Basta acessar o site e validar o XML.

http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx

PROGRAMAÇÃO HTML: Template para style de table (9-000143-05/07/2010)

Um bom lugar pra testar estilos a serem utilizados em table.
Conforme vai testando, é gerado o código fonte, e também apresentado o modelo.

somacon

PROGRAMAÇÃO: Clipper DOS ERROR 4 (9-000016-01/11/2009)

O Windows tem um limite padrão de arquivos abertos para programas DOS.
O limite padrão pode ser 20 ou 40, dependendo da versão do Windows.
Basta alterar este limite, aumentando para pelo menos 200 arquivos.
Esta configuração é definida pelo arquivo CONFIG.NT, na linhas FILES=200
No caso do JPA, no momento 200 é um limite mais que suficiente.

Caso utilize outro programa Clipper, que não seja o JPA, será necessário fazer outra alteração.
Em propriedades de meu computador, variáveis de ambiente, acrescente

SET CLIPPER=F200

PROGRAMAÇÃO: Clipper lento no Windows - 100% CPU - OSLIB (9-000010-01/01/2000)

Isso NÃO atinge o JPA.
Muitos programadores Clipper não atualizaram seus programas, e no modo original o programa Clipper sobrecarrega o Windows.
Isso se deve ao fato de um programa DOS ficar sempre testando o teclado, pra ver se algo está sendo digitado.
Para a versão DOS/Clipper nos utilizamos da OSLIB, que contém funções para não sobrecarregar o Windows.
Com o programa Clipper carregado, olhe no gerenciador de tarefas, e verifique o consumo de CPU.
No JPA esse consumo é mínimo.
Em programas DOS não atualizados, o consumo fica em 100%, sobrecarregando o Windows, e causando superaquecimento da CPU.
Em programas Windows isso também pode acontecer, mas é mais difícil, já que as linguagens se encarregam de incluir recursos para contornar esse problema.

Caso seja programador e esteja procurando a OSLIB, ela pode ser encontrada aqui:

http://www.davep.org/clipper/OSLib/

PROGRAMAÇÃO: Clipper demora para liberar relatório (9-000009-01/01/2000)

Isto NÃO atinge o sistema JPA.
Se estiver usando um programa DOS, e a impressão demorar para ser liberada, faça o seguinte:
Iniciar, executar, SYSEDIT
No arquivo SYSTEM.INI você encontra a seçao [386Enh]
Acrescente abaixo dela, caso não exista, as seguintes linhas

[Network]
PrintBufTime=1
[IFSMGR]
PrintBufTime=1


Isso vai fazer com que a impressão seja liberada em no máximo um segundo.