quarta-feira, 13 de dezembro de 2017

Hi there, this is an AXIS service!

O que fazer quando ocorre a esta mensagem "Hi there, this is an AXIS service!" ao tentar conexão com uma Web Service?

Normalmente quando esta mensagem ocorre é devido a falta de um determinado prefixo, comum quando é criada uma URL de WS.

A mensagem em si, retornada no brownser é esta:

<h1>NFeAutorizacao4</h1>
<p>Hi there, this is an AXIS service!</p>
<i>Perhaps there will be a form for invoking the service here...</i>

um exemplo de endereço que ocasiona esta mensagem:

https://nfehomolog.sefaz.pe.gov.br/nfe-service/services/NFeAutorizacao4

para resolver é necessário incluir no final do endereço ws o seguinte prefixo: ?wsdl

ou seja, o endereço citado acima, após ser corrigido, ficará da seguinte forma:

https://nfehomolog.sefaz.pe.gov.br/nfe-service/services/NFeAutorizacao4?wsdl

Até +

domingo, 19 de novembro de 2017

Transformando um "Enter" em "Tab"

Para que o efeito do evento "Enter" seja transformado no efeito da tecla "Tab", muitas vezes necessário, utilize o seguinte código:

  if key = #13 then
   begin
    key := #0;
    PostMessage ( handle, WM_KEYDOWN, VK_TAB, 1 );
  end

Até a próxima!!!!

terça-feira, 23 de maio de 2017

Como é constituída a chave de acesso de um CF-e-Sat

Como é constituída a chave de acesso de um CF-e-Sat

Olá amigos, neste post venho trazer pra vocês uma informação que pra mim foi muito útil, e acredito que poderá ser útil para outras pessoas.
Para quem atua no setor de automação comercial, já deve ter ouvido falar do S@t que é um meio fiscal para controlar as vendas ao consumidor final.

Após emitir um CF-e (Cupom Fiscal Eletrônico), será gerado um arquivo '.xml', e este será enviado para a SEFAZ. Posteriormente para que o cliente (que obteve o Extrato do CF-e) possa consultar a venda realizada, é necessário ter em mãos o QR-Code ou a Chave de acesso, que também é impressa no Extrato.

A chave de acesso é constituída por 44 dígitos, onde:

2 = Código da UF do emitente do CF-e-Sat ;
4 (AAMM) = Ano e Mês de emissão do CF-e-Sat ;
14 = CNPJ do emitente do CF-e-Sat ;
2 = Modelo do documento fiscal ;
9 = Nº de série do SAT ;
6 = Número do CF-e-SAT ;
6 = Código Número Aleatório ;
1 = Dígito verificador ;

para maiores informações da construção do CF-e-SAT, acesse este link:

https://portal.fazenda.sp.gov.br/servicos/sat/Downloads/Especificacao_SAT_v_ER_2_21_08.pdf

até a próxima.

quinta-feira, 6 de abril de 2017

Nova tabela de NCM

Olá,

 Visto que atuo no desenvolvimento de soluções no ambiente de automação comercial, ou seja, automatizando processos dentro de empresa, através de software, implementamos também aplicações voltadas para emissão de documentos fiscais eletrônicos (famosos "-e").

 Recentemente nossos clientes passaram a reclamar que ao tentar emitir notas fiscais, era exibida a seguinte mensagem de rejeição:

Rejeição 778: Informado NCM inexistente


e os argumentos são, em grande parte, os mesmos:

"Sempre utilizei este NCM, nunca teve problema", ou "Este é NCM que estava na NF-e que o fornecedor me mandou" e etc.

Bom, venho hoje fazer um alerta: Na Nota Técnica 2016/003, que entrou em vigência a partir de 01/01/2017, o assunto é exatamente este "Nova Tabela de NCM – Vigência 01-01-2017".

Para resumir este post, venho esclarecer que uma quantidade significante de NCM's foi eliminada, e o período de adequação por parte das empresas findou em 31/03/2017, conforme está descrito no documento mencionado acima:

"
Divulgar que está disponível a nova tabela de NCM publicada na Resolução Camex nº 125/16 no Portal da NF-e, endereço , no menu “Documentos”, opção “Diversos”, “NCM 8 Dígitos - vigência a partir de 01/01/2017 – Ref. Nota Técnica 2016.003”. 

Os novos códigos incluídos na tabela de NCM estão realçados em verde com a informação de início de vigência em 01/01/2017. 

Os códigos NCM extintos pela Resolução Camex estão realçados em vermelho com informação fim de vigência 31/03/2017. 
"

Concluindo este post, esclareço que a rejeição mencionada acima realmente ocorrerá por algum tempo, para os casos em que as soluções em software não automatizam a sincronia de NCM's. Também observo que nem tudo que é dito por nossos "clientes" poderá ser considerado verdade, porém no mínimo duvidoso.

grato!

segunda-feira, 3 de abril de 2017

Função StringReplace

Olá,

Hoje venho trazer mais uma função que utilizo muito no dia a dia aqui no trabalho. O método que apresento neste dia é a StringReplace:

Ela é útil quando se faz necessário a edição de uma grande string, algo que tomaria muito tempo em meio a loop's demorados.

Este é o cabeçalho da função:

StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;

onde:

const = string a ser verificada ;
OldPattern = caracteres que se deseja substituir ;
NewPattern = caracteres substitutos (em relação aos antigos) ;
Flags:

Este é um tipo, que aguarda como parâmetros as seguintes opções: (rfReplaceAll, rfIgnoreCase) ;

Exemplo de uso:

palavra = '10.50' ;

showmessage( palavra, '.', ',', [rfReplaceAll, rfIgnoreCase] );

resultado


conclusão: Veja que a função substituiu a string '.' (ponto) por ',' (vírgula). Nesta situação existia apenas uma ocorrência, mas é importante salientar que não existe "limite" desde que a opção "rfReplaceAll" esteja especificada, caso contrário apenas a primeira ocorrência atenderá a substituição.

obs:

rfReplaceAll indica que TODAS as ocorrências deverão atender a substituição solicitada ;
rfIgnoreCase indica que não existe diferenciação entre minusculas e maiúsculas.

até a próxima.

quinta-feira, 23 de março de 2017

Função posEx

Olá,

Recentemente passei a utilizar com certa frequência a função 'posEx' então decidi fazer uma postagem sobre esta função que é muito útil.

a estrutura desta função é :

PosEx(const SubStr, S: string; Offset: Integer = 1): Integer;

exemplo:

var
   nomeCompleto: string ;
   nomeParte   : string ;
begin
     nomeCompleto  :=  'Ordem e progresso' ;

     nomeParte     :=  'Ordem' ; //trim( edtVl2.Text ) ;

     showmessage( nomeCompleto + #13 + nomeParte + #13 + intToStr( posEx( lowercase( nomeParte ), lowercase( nomeCompleto ), 0 ) ) ) ;

end ;

execução


Veja que esta função retorna a posição de onde o trecho da cadeia é similar à totalidade da cadeia, ou seja, visto que que em 'Ordem e progresso', 'Ordem' inicia a partir da primeira posição.

se alterarmos 'nomeParte' para 'Orden':


desta vez o valor retornado foi '0', pois o trecho de cadeia 'Orden' não existe na cadeia completa 'Ordem e progresso'.

Desta vez, vou referenciar nomeParte como 'progresso':


desta vez o valor retornado foi '9', pois o trecho de cadeia 'progresso' se encontra a partir da posição 9 da cadeia (completa) 'Ordem e progresso'.

se você já está a algum tempo no ramo da programação, é natural que você se pergunte "Por que você não usa a função 'pos'?", isso é natural, então eu te respondo:

diferente da função 'pos', na função 'posEx' eu consigo controlar a partir de onde a cadeia será analisada, por exemplo.

vamos manter os princípios do exemplo anterior, porém desta vez vou enviar mais um parâmetro para a função posEx:

em vez de enviar:

 posEx( lowercase( nomeParte ), lowercase( nomeCompleto ), 0 )
ou
 posEx( lowercase( nomeParte ), lowercase( nomeCompleto ) )

vou enviar

 posEx( lowercase( nomeParte ), lowercase( nomeCompleto ), 10 )

desta forma, ao executar o programa e enviar para nomeParte como 'progresso', será apresentado:


perceba que o valor retornado desta vez foi '0', pois eu ordenei a função 'posEx' que realize a análise a partir da posição 10, ou seja, tudo antes desta posição será ignorado.

outro exemplo, vou enviar para nomeParte a cadeia 'rogresso':



ai está, o retorno foi 10, pois o trecho de cadeia 'rogresso' é iniciado na posição 10.

agradeço pela atenção, até a próxima.

Função copy

Olá,

Nesta postagem trago uma função que uso muito no meu dia a dia, é a função 'copy'.

esta é a estrutura de declaração da função 'copy':

copy( s : ShortString; index, count : Integer ), sendo que é retornado um informação do tipo ShortString ;

exemplo de uso

var
   nomeAntes: string ;
   nomeDepois: string ;
begin
     nomeAntes  :=  'Apenas um teste de funcionamento.' ;

     showmessage( nomeAntes ) ;

     nomeDepois  :=  Copy( nomeAntes, 1, 9 ) ;

     showmessage( nomeDepois ) ;
end;

execução

     showmessage( nomeAntes ) ;



     showmessage( nomeDepois ) ;


a função copy retorna o valor (cadeia) que estiver entre a posição index e o tamanho requisitado em count, ou seja, no nosso exemplo, temos a cadeia "Apenas um teste de funcionamento.", desta forma fica disposto assim:

'Apenas um teste de funcionamento.' = 33 char

copy( 'Apenas um teste de funcionamento.', 1, 9 )

1 = 'A'

9 = 'm'

retorno = ''Apenas um' 

agradeço pela atenção, até a próxima.


PHP para iniciantes - Vídeo #1