Para fazer a validação de CPF utilize a FM CONVERSION_EXIT_CPFBR_INPUT e para fazer a validação de CNPJ utilize a FM CONVERSION_EXIT_CGCBR_INPUT.
Basta passar somente os números no parâmetro input e veriifcar o sy-subrc.
segunda-feira, 13 de agosto de 2012
domingo, 27 de maio de 2012
Usando SAP OLE para validar inscrição estadual
A validação de inscrição estadual é um problema, ja que a formula varia de estado para estado, mas felizmente o Sintegra disponibiliza uma dll para fazer essa validação.
Dessa forma você pode criar um executável que utiliza essa dll e chamá-lo a partir do ABAP ou utilizar o ABAP OLE Automation Controller.
Nesse post vou mostrar como registrar uma dll, configurá-la no SAP e chamá-la a partir do código ABAP.
A dll do Sintegra não tem uma camada OLE, então não pode ser chamada diretamente pelo ABAP.
Para solucionar isso eu criei uma segunda dll com OLE em VB6 que chamava a dll do Sintegra. No link abaixo você pode obter essa dll e o código fonte da mesma em vb6.
http://www.4shared.com/rar/k71qc_ZA/Sintegra-VB6.html
Com a dll do Sintegra e a dll OLE criada no VB em mãos, basta fazer o seguinte:
Copiar as dlls para a pasta C:\Windows\System32 (SysWOW64 em sistemas 64 bits) do servidor SAP.
Registrar a dll criada no VB6 utilizando o comando regsvr32 SapIntegra.dll (substituir pelo nome da sua dll). Atenção para sistemas como o windows 7 e server 2008 é necessário executar o console com privilégios de Administrador.
Apos o registro é necessário obter as informações da dll, para isso você pode utilizar o programa RegDllVew.
Com as informações da dll em mãos basta acessar a transação SOLE no SAP e criar um nova entrada conforme abaixo.
Agora que está tudo configurado basta utilizar as classes OLE para fazer a validação. Abaixo você pode ver um exemplo de utilizaçao da dll.
Dessa forma você pode criar um executável que utiliza essa dll e chamá-lo a partir do ABAP ou utilizar o ABAP OLE Automation Controller.
Nesse post vou mostrar como registrar uma dll, configurá-la no SAP e chamá-la a partir do código ABAP.
A dll do Sintegra não tem uma camada OLE, então não pode ser chamada diretamente pelo ABAP.
Para solucionar isso eu criei uma segunda dll com OLE em VB6 que chamava a dll do Sintegra. No link abaixo você pode obter essa dll e o código fonte da mesma em vb6.
http://www.4shared.com/rar/k71qc_ZA/Sintegra-VB6.html
Com a dll do Sintegra e a dll OLE criada no VB em mãos, basta fazer o seguinte:
Copiar as dlls para a pasta C:\Windows\System32 (SysWOW64 em sistemas 64 bits) do servidor SAP.
Registrar a dll criada no VB6 utilizando o comando regsvr32 SapIntegra.dll (substituir pelo nome da sua dll). Atenção para sistemas como o windows 7 e server 2008 é necessário executar o console com privilégios de Administrador.
Apos o registro é necessário obter as informações da dll, para isso você pode utilizar o programa RegDllVew.
Com as informações da dll em mãos basta acessar a transação SOLE no SAP e criar um nova entrada conforme abaixo.
Agora que está tudo configurado basta utilizar as classes OLE para fazer a validação. Abaixo você pode ver um exemplo de utilizaçao da dll.
terça-feira, 27 de março de 2012
Substituindo Sun Base64Encoder com Apache Commons Codec
Nesse post eu ensinei assinar o RPS da prefeitura de São Paulo, na época eu utilizei a API Sun Base64Encoder para codificar a assinatura em Base64, mas como ela é uma API proprietária da Sun pode ser que não esteja disponível em futuras versões do Java, então você pode substituí-la pelo Apache Base64, basta fazer o seguinte:
Primeiro baixe o Apache Commons Codec.
Coloque o jar do commons codec no classpath da sua aplicação, ou se você utiliza o Netbeans, crie uma nova biblioteca e inclua no seu projeto.
Importe o Apache Commons Codec:
Altere o método signASCII:
A biblioteca Apache Commons Codec implementa outros encoders e decoders, vale a pena utilizá-la para outras situações.
Primeiro baixe o Apache Commons Codec.
Coloque o jar do commons codec no classpath da sua aplicação, ou se você utiliza o Netbeans, crie uma nova biblioteca e inclua no seu projeto.
Importe o Apache Commons Codec:
Altere o método signASCII:
A biblioteca Apache Commons Codec implementa outros encoders e decoders, vale a pena utilizá-la para outras situações.
sábado, 25 de fevereiro de 2012
Lendo tabelas de outros programas da sessão
Algumas vezes quando estamos implementando alguma exit, nos deparamos com uma situação em que precisamos de dados que estão declarados globalmente no programa principal mas que não estão disponíveis na interface da exit.
Para acessar basta você fazer uma referencia no formato (AAA)BBB onde AAA é o nome do programa e BBB o nome da tabela, estrutura ou campo a ser acessado, utilize field-symbols para fazer as referências.
Teste simples
Acesse a transação VA03 e ative o debug.
Na tela de debug insira o campo (SAPMV45A)XVBPA[] e você conseguirá visualizar os dados da tabela.
Acesse esse post para informações mais detalhadas a respeito.
Esse outro post também pode te ajudar bastante.
Para acessar basta você fazer uma referencia no formato (AAA)BBB onde AAA é o nome do programa e BBB o nome da tabela, estrutura ou campo a ser acessado, utilize field-symbols para fazer as referências.
Teste simples
Acesse a transação VA03 e ative o debug.
Na tela de debug insira o campo (SAPMV45A)XVBPA[] e você conseguirá visualizar os dados da tabela.
Acesse esse post para informações mais detalhadas a respeito.
Esse outro post também pode te ajudar bastante.
Cuidados com a formatação de emails HTML
No post anterior eu ensinei como enviar emails em formato HTML, mas há alguns cuidados que você deve tomar com relação a formatação da mensagem, pois o suporte a css não é o mesmo entre os diferentes clientes de email e pode ser que o belo design da sua mensagem não fique tão belo assim quando chegar ao destinatário.
Nesse post há um guia completo de suporte CSS em vários clientes de email.
Nesse post há um guia completo de suporte CSS em vários clientes de email.
Importando self-certificate para o servidor
Nesse post eu ensinei como configurar um certificado SSL no PSE, mas quando estamos trabalhando no ambiente de testes os servidores podem utilizar certificados selfssl, para economizar grana é claro. Como o certificado não foi emitido por AC autorizada, são necessários alguns passos adicionais para importá-lo para o PSE.
Volte ao post anterior e após clicar em confirmar na tela de importação do certificado e antes de clicar no botão incluir faça o seguinte.
Certifique se que os dados do certificado estão visíveis no quadro certificados.
Clique no botão exportar ao lado do botão importar.
Na tela de exportação clique na guia BD, informe um nome breve começando com Z, selecione CA usuário, informe uma descrição e confirme.
Agora você pode clicar em incluir e continuar com as demais etapas do post anterior.
Volte ao post anterior e após clicar em confirmar na tela de importação do certificado e antes de clicar no botão incluir faça o seguinte.
Certifique se que os dados do certificado estão visíveis no quadro certificados.
Clique no botão exportar ao lado do botão importar.
Na tela de exportação clique na guia BD, informe um nome breve começando com Z, selecione CA usuário, informe uma descrição e confirme.
Agora você pode clicar em incluir e continuar com as demais etapas do post anterior.
Resolvendo o problema de histórico do SAP GUI
Por uma ou duas vezes eu tive um problema com relação ao histórico do meu SAP Gui, e nada do que digitava era gravado no histórico, assim o SAP Gui não fazia nenhum sugestão para preenchimento de campos.
Parece ser um problema relacionado ao MDAC, já que o SAP Gui utiliza uma base access para gravar o histórico local. Eu consegui resolver o problema através desse post.
Parece ser um problema relacionado ao MDAC, já que o SAP Gui utiliza uma base access para gravar o histórico local. Eu consegui resolver o problema através desse post.
Importando um certificado SSL para o servidor
Nesse post eu ensinei como consumir um webservices através de http_client, na ocasião o endpoint estava acessível através de http, mas e se fosse https?
Nesse post vou mostrar como importar um certificado SSL para que você possa fazer uma conexão através de HTTPS.
Antes de mais nada é preciso que a biblioteca SAP Cryptographic Library esteja instalada no servidor, converse com o BASIS a respeito.
Exportando o certificado do servidor
Primeiro precisamos exportar o certificado ssl do servidor para X509 codificado em Base64, se você estiver utilizando windows faça o seguinte:
Configurando o PSE e o ICM
Acesse a transação STRUST e clique em Cliente SSL (standard)
No quadro certificado clique no botão importar certificado
Na tela de importação de certificado, clique em Base64 e informe o caminho para o arquivo exportado na primeira etapa e confirme.
Será exibido os dados do certificado, verifique se está tudo ok e clique no botão incluir
Acesse o menu PSE, em seguida distribuir todos ou pressione F6
Agora o certificado foi importado para o PSE, precisamos reiniciar o ICM antes de poder utilizar o certificado. Para isso acesse a transação SMICM, clique no menu Administração, ICM e encerrar soft.
Aguarde o ICM ser reiniciado e a configuração SSL estará ok.
Nesse post vou mostrar como importar um certificado SSL para que você possa fazer uma conexão através de HTTPS.
Antes de mais nada é preciso que a biblioteca SAP Cryptographic Library esteja instalada no servidor, converse com o BASIS a respeito.
Exportando o certificado do servidor
Primeiro precisamos exportar o certificado ssl do servidor para X509 codificado em Base64, se você estiver utilizando windows faça o seguinte:
- Execute o internet explorer como adimistrador
- Acesse o endereço do servidor que você você pretende acessar pelo SAP
- Clique no cadeado da barra de endereços, em seguida em exibir certificados
- Clique na guia detalhes e em seguida copiar para arquivo
- Clique em avançar e na proxima tela selecione X509 codificado na base 64 e clique em avançar novamente.
- Indique onde deseja salvar o arquivo.
Configurando o PSE e o ICM
Acesse a transação STRUST e clique em Cliente SSL (standard)
No quadro certificado clique no botão importar certificado
Na tela de importação de certificado, clique em Base64 e informe o caminho para o arquivo exportado na primeira etapa e confirme.
Será exibido os dados do certificado, verifique se está tudo ok e clique no botão incluir
Acesse o menu PSE, em seguida distribuir todos ou pressione F6
Agora o certificado foi importado para o PSE, precisamos reiniciar o ICM antes de poder utilizar o certificado. Para isso acesse a transação SMICM, clique no menu Administração, ICM e encerrar soft.
Aguarde o ICM ser reiniciado e a configuração SSL estará ok.
Marcadores:
abap,
base64,
certificado,
https,
icm,
pse,
smicm,
ssl,
strust,
trustmanager,
webservcies,
x509
Usando eventos para iniciar um job
Uma das formas de iniciar o processamento de um job é através de eventos. Você define esses eventos e toda vez que um programa dispará-los os jobs associados a eles serão executados.
Primeiro acesse a transação SM62, selecione atualizar em definições evento usuário e pressione enter. Em sguida clique em criar ou pressione F5.
Agora é só chamar a função BP_EVENT_RAISE para disparar os eventos.
Acesse a SM36 para criar um novo job.
Clique em condição de execução, em seguida após eventos e informe o nome do evento criado no primeiro passo.
Conclua as demais configurações comuns e libere seu job.
Agora toda vez que o evento for disparado o job será executado.Nesse link ensina como disparar eventos a partir de programas externos.
Primeiro acesse a transação SM62, selecione atualizar em definições evento usuário e pressione enter. Em sguida clique em criar ou pressione F5.
Agora é só chamar a função BP_EVENT_RAISE para disparar os eventos.
Acesse a SM36 para criar um novo job.
Clique em condição de execução, em seguida após eventos e informe o nome do evento criado no primeiro passo.
Conclua as demais configurações comuns e libere seu job.
Agora toda vez que o evento for disparado o job será executado.Nesse link ensina como disparar eventos a partir de programas externos.
Conectando um http_client através de um destino http externo
Nesse post eu mostrei como consumir um webservice usando http_client, no exemplo eu instanciei o http_client a partir do endpoint do webservice, mas é possível fazer isso a partir de um destino http, dessa forma você não precisa se preocupar com atualização do endpoint, ssl e proxy.
A primeira coisa a fazer é acessar a transação SM59 e definir um novo destino http externo.
As configurações SSL estão inativas porque o endpoint não utiliza https.
Agora precisamos substituir o método create pelo método create_by_destination para instanciar o http_client.
A primeira coisa a fazer é acessar a transação SM59 e definir um novo destino http externo.
As configurações SSL estão inativas porque o endpoint não utiliza https.
Agora precisamos substituir o método create pelo método create_by_destination para instanciar o http_client.
Importando um arquivo CSV
Uma das formas de fazer upload de um arquivo CSV no ABAP, é fazendo a leitura através das funções de upload, percorrer a tabela e fazer a separação dos campos utilizando o comando SPLIT AT.
Mas é possível fazer isso de uma forma mais simples utilizando a função TEXT_CONVERT_TEX_TO_SAP.Nesse post vou mostrar como usar essa FM, no exemplo abaixo abaixo é feito a leitura de uma arquivo de contatos em formato CSV separado por ";" com dois campos nome e email, em seguida os dados carregados são escritos na tela.
Primeiro fazemos a leitura do arquivo CSV:
Em seguida convertemos o conteudo lido para a nossa tabela com os campos do CSV
Exemplo completo:
Mas é possível fazer isso de uma forma mais simples utilizando a função TEXT_CONVERT_TEX_TO_SAP.Nesse post vou mostrar como usar essa FM, no exemplo abaixo abaixo é feito a leitura de uma arquivo de contatos em formato CSV separado por ";" com dois campos nome e email, em seguida os dados carregados são escritos na tela.
Primeiro fazemos a leitura do arquivo CSV:
Em seguida convertemos o conteudo lido para a nossa tabela com os campos do CSV
Exemplo completo:
Enviando email em formato HTML com PDF em anexo utilizando a classe CL_BCS
No post anterior eu ensinei como enviar mensagens html com anexo usando a FM SO_SEND_DOCUMENT_API, agora vou mostrar como fazer a mesma coisa utlizando a classe cl_bcs.
Esse é o meio preferido de enviar emails, pois é muito mais fácil anexar arquivos, o código fica bem limpo e o melhor de tudo está dentro do meu modo preferido de programar, orientado a objetos.
Para enviar as mensagem precisaremos de objetos das seguintes classes e interface :
cl_bcs: responsável pelo envio da mensagem
cl_document_bcs: que é a mensagem a ser enviada
cl_cam_address_bcs: que será o remetente
if_recipient_bcs: será o destinatário da mensagem
Agora instanciamos a request, o sender e recipient
Montamos a mensagem em formato HTML e criamos o documento a ser enviado
Agora fazemos o upload do arquivo e anexamos ao documento
Finalmente passamos o document e o destinátio para a request, confguramos a mensagem para ser enviada imediatamente e o email de status para ser enviado em caso de erros e enviamos a mensagem.
Exemplo completo:
Esse é o meio preferido de enviar emails, pois é muito mais fácil anexar arquivos, o código fica bem limpo e o melhor de tudo está dentro do meu modo preferido de programar, orientado a objetos.
Para enviar as mensagem precisaremos de objetos das seguintes classes e interface :
cl_bcs: responsável pelo envio da mensagem
cl_document_bcs: que é a mensagem a ser enviada
cl_cam_address_bcs: que será o remetente
if_recipient_bcs: será o destinatário da mensagem
Agora instanciamos a request, o sender e recipient
Montamos a mensagem em formato HTML e criamos o documento a ser enviado
Agora fazemos o upload do arquivo e anexamos ao documento
Finalmente passamos o document e o destinátio para a request, confguramos a mensagem para ser enviada imediatamente e o email de status para ser enviado em caso de erros e enviamos a mensagem.
Exemplo completo:
Enviando email HTML com PDF em anexo através da função SO_SEND_DOCUMENT_API
No post de hoje vou mostrar como enviar mensagems de email no formato HTML e com um arquivo PDF em anexo, obviamente vocês poderão adaptar para outros tipos de anexo.
Nesse exemplo eu estou utilizando a função SO_SEND_DOCUMENT_API, essa a forma mais antiga de enviar mensagens de email através de ABAP, atualmente você pode fazer isso através da classe BCS.
Antes de enviar qualquer mensagem cetifique-se junto ao BASIS se o sistema está configurado para enviar emails (ver SCON).
Exemplo completo:
Entendendo o exemplo:
Rotina de envio
Nessa rotina eu defini duas macros, new_line e
add_receiver, para adicionar o conteudo da mensagem em formato html e para adicionar destinatários respectivamente.
Na linha 50 é adicionado o email do destinatário.
Na linha 51 é adicionado o email ou lista da equipe de suporte em cópia oculta.
Da linha 53 a 55 é adicionado o conteudo da mensagem.
Da 59 a 66 o corpo da mensagem é adicionado ao packing list.
Da linha 68 a 72 é configurado o assunto e o tamanho da mensagem
Na linha 74 é chamada a rotina para anexar o PDF, passando o packing list, a tabela onde conteudo binário do PDF deve ser colocado e o nome do arquivo a ser lido.
Na linha 78 é chamada a função para envio da mensagem, atenção especial aos seguintes parâmetros:
put_in_outbox: Coloque X se você deseja visualizar a mensagem pela SOST
sender_address: Aqui você informa um email ou nome do usuário SAP, dependendo do que for configurado em sender_address_type.
sender_address_type: Informe SMTP se deseja que o remetente seja um email ou deixe o valor padrão B quando o remetente for um usuário SAP.
sender_address: Aqui você informa um email ou nome do usuário SAP, dependendo do que for configurado em sender_address_type.
sender_address_type: Informe SMTP se deseja que o remetente seja um email ou deixe o valor padrão B quando o remetente for um usuário SAP.
Se você omitir esses dois parâmetros, será utilizado o email do usuário que está executando o programa (ver SU01)
Rotina para anexar PDF
Na linha 122 o arquivo PDF é lido em formato binário através do método GUI_UPLOAD da classe cl_gui_frontend_services.
Na linha 131 o conteudo binário é ajustado para 255 caracteres. Sem esse trecho talvez você enfrente o erro MESSAGE TYPE X.
Na linha 144 o conteúdo binário é adicionado a tabela de conteúdo binário que será passada para a função.
Da linha 146 a 156 o conteúdo binário é configurado no packing list.
sexta-feira, 27 de janeiro de 2012
Consulta utilizando SQL dinâmico
Nesse post vou mostar como fazer para criar um tabela interna, selecionar dados e escrevê-los na tela dinamicamente a partir de uma string com o nome da tabela, outra com os campos a serem selecionados e outra com as condições de seleção. O programa exemplo abaixo foi criado a partir desse post.
A primeira coisa a fazer é montar um fieldcat com a estrutura da tabela dinámica, nesse exemplo eu utilizei a função LVC_FIELDCATALOG_MERGE para obter o fieldcat a partir do nome da tabela, em seguida a tabela interna é criada a partir desse fieldcat.
O próximo passo é selecionar os dados preenchendo a tabela interna. Primeiro as linhas com os campos a serem selecionados são montadas e armazenada na tabela lt_fields, em seguida as condições são montadas e armazenada na tabela lt_where em seguida é feita a seleção com todas as informações dinâmicas, inclusive o nome da tabela.
O último passo é escrever as informações na tela. A tabela é dinâmica, então a workarea também é dinâmica, assim como seus campos, então o loop é feito usando assigning e para os valores do campos é utilizada a intrução ASSIGN COMPONENT. Nesse outro post você pode ver um exemplo interessante em que é utilizado DO e SY-INDEX para obter e escrever os campos da workarea.
Exemplo Completo:
A primeira coisa a fazer é montar um fieldcat com a estrutura da tabela dinámica, nesse exemplo eu utilizei a função LVC_FIELDCATALOG_MERGE para obter o fieldcat a partir do nome da tabela, em seguida a tabela interna é criada a partir desse fieldcat.
O próximo passo é selecionar os dados preenchendo a tabela interna. Primeiro as linhas com os campos a serem selecionados são montadas e armazenada na tabela lt_fields, em seguida as condições são montadas e armazenada na tabela lt_where em seguida é feita a seleção com todas as informações dinâmicas, inclusive o nome da tabela.
O último passo é escrever as informações na tela. A tabela é dinâmica, então a workarea também é dinâmica, assim como seus campos, então o loop é feito usando assigning e para os valores do campos é utilizada a intrução ASSIGN COMPONENT. Nesse outro post você pode ver um exemplo interessante em que é utilizado DO e SY-INDEX para obter e escrever os campos da workarea.
Exemplo Completo:
quarta-feira, 25 de janeiro de 2012
Executando comandos externos no servidor
Nesse post vou mostrar como executar um comando dos no servidor SAP utilizando a função RFC_REMOTE_PIPE e ler o resultado. Atenção não execute comandos externos no servidor se não tiver certeza do que está fazendo.
Primeiro declare as seguintes variáveis:
Agora monte a string de comando e execute a função RFC_REMOTE_PIPE:
Pronto, em lt_result vai estar o resultado do comando, nesse caso DIR.
Agora é só substituir "dir c:" pelo comando que deseja executar e seus respectivos parâmetros.
Primeiro declare as seguintes variáveis:
Agora monte a string de comando e execute a função RFC_REMOTE_PIPE:
Pronto, em lt_result vai estar o resultado do comando, nesse caso DIR.
Agora é só substituir "dir c:" pelo comando que deseja executar e seus respectivos parâmetros.
Criando uma field-exit
A criação de uma field-exit é uma tarefa básica para um desenvolvedor ABAP, mas se você não ainda não sabe fazer isso não se preocupe, nesse post vou ensinar como criar e ativar uma field-exit para verificação do CEP na transação XD02, o procedimento é o mesmo para outras telas.
Primeiro visualize a tela onde está o campo para o qual a field-exit será criada, nesse exemplo XD02, dados de endereço:
Transação XD02
Visualize as informações técnicas do campo, basta clicar no campo, pressionar F1 e clicar em Informação Técnica. Anote o nome do programa, número da tela e nome do elemento de dados.
Informações técnicas
Execute o report RSMODPRF e informe o elemento de dados do passo anterior. Na próxima tela clique em criar, informe o grupo de funções, uma descrição e confirme.
Report RSMODPRF
Módulo de função da field-exit
O parâmetro input traz o que está sendo informado no campo da tela e output permite passar um valor para o campo.
Volte a tela do report RSMODPRF, não informe nenhum parâmetro, então você irá visualizar todas as exits criadas no sistema.
Field-exit criada
Localize o elemento de dados da sua exit, marque-o e clique em atribuir programa ou tela, informe o programa e o número da tela do passo 1 e confirme.
Atribuir programa e tela
Agora clique no menu exit de campo em seguida ativar, informe a uma request e confirme.
Ativar field-exit
Pronto agora ao entrar novamente na XD02 você verá que sua validação está ativa.
XD02 com field-exit ativa
segunda-feira, 23 de janeiro de 2012
Assinando o RPS da NFS-e de São Paulo
Há algum tempo atrás eu tive de implementar uma interface para emissão de NFS-e na prefeitura de São Paulo, e na época pesquisando em alguns forums vi que bastante gente tinha problema para gerar a assinatura do RPS que vai dentro da tag assinatura.
Após algumas pesquisas na internet e no manual da prefeitura eu consegui gerar essa assinatura, abaixo vou mostrar como fazer isso em java utilizando um certificado A1. O que veremos nesse post é como gerar o hash de assinatura de RPS (conteúdo da tag assinatura) e não como assinar o XML para envio.
Antes de mais nada você precisa ter a sequencia de caracateres ASCII a ser assinada, se não sabe como gerá-la consulte o manual NFe-Web-Service-v2-2 da prefeitura da página 23 a 25, pois lá explica detalhadamente como montar essa sequencia.
Primeiro importe as classes Signature e BASE64Encoder
Agora inclua o método que faz a assinatura da sequencia ASCII
Primeiro é obtida uma instância do algorítimo RSA-SHA1, em seguida é informada a chave privada do certificado, a sequencia é convertida para bytes e finalmente o HASH é gerado.
O método getPrivateKey pode ser substituido pelo seu próprio método que obtem a chave privada do certificado, ou se preferir pode utilizar o exemplo abaixo:
Espero que isso ajude vocês em seus projetos de NFS-e para São Paulo. Valeu!!!
Após algumas pesquisas na internet e no manual da prefeitura eu consegui gerar essa assinatura, abaixo vou mostrar como fazer isso em java utilizando um certificado A1. O que veremos nesse post é como gerar o hash de assinatura de RPS (conteúdo da tag assinatura) e não como assinar o XML para envio.
Antes de mais nada você precisa ter a sequencia de caracateres ASCII a ser assinada, se não sabe como gerá-la consulte o manual NFe-Web-Service-v2-2 da prefeitura da página 23 a 25, pois lá explica detalhadamente como montar essa sequencia.
Primeiro importe as classes Signature e BASE64Encoder
Agora inclua o método que faz a assinatura da sequencia ASCII
Primeiro é obtida uma instância do algorítimo RSA-SHA1, em seguida é informada a chave privada do certificado, a sequencia é convertida para bytes e finalmente o HASH é gerado.
O método getPrivateKey pode ser substituido pelo seu próprio método que obtem a chave privada do certificado, ou se preferir pode utilizar o exemplo abaixo:
Espero que isso ajude vocês em seus projetos de NFS-e para São Paulo. Valeu!!!
Marcadores:
assinatura,
hash,
java,
nfe,
nfes,
nfse,
pkcs12,
rps,
RSA-SHA1,
webservcies
domingo, 22 de janeiro de 2012
Obtendo dados de uma base Oracle externa com Native SQL
Algumas vezes precisamos obter dados de bases de dados externas, principalmente se você trabalha com interfaces entre o SAP e outros sistemas. É possível fazer isso utilizando Native SQL
O Native SQL permite que você utilize comandos SQL do próprio banco de dados ao invés do OPEN SQL, mas você deve usá-lo somente para acessar tabelas que não estão declaradas no dicionário.
Nesse post vou ensinar como se conectar a uma base de dados Oracle. Vamos Lá.
A primeira coisa a fazer é configurar a conexão com o banco de dados. Solicite ao Basis para incluir os dados de conexão da base Oracle externa no tnsnames do do servidor SAP.
MY_DATABASE é um ID que vamos atribuir a base que vamos conectar, DOMAIN é o domínio configurado no servidor, 0.0.0.0 e 1111 devem ser substituidos pelo IP e porta do servidor Oracle e DBSID deve ser substituido pelo SID do banco de dados.
Acesse a transação DBCO e inclua uma nova entrada conforme abaixo:
Conexão BD: o ID que será passado para o comando CONNECT.
SABD: O tipo de bando de dados, nesse caso Oracle.
Nome usuário: O usuário registrado no Oracle.
Senha-BD: A senha do usuário Oracle.
Info lig: O ID atribuido a conexão no tnsnames do servidor SAP.
Agora que a conexão está configurada, vamos ao código ABAP. O programa abaixo é bastante simples, ele se conecta a base externa, obtem o conteudo do campo xml_field a partir do documento da NF e escreve o conteudo XML na tela.
Exemplo completo
O Native SQL permite que você utilize comandos SQL do próprio banco de dados ao invés do OPEN SQL, mas você deve usá-lo somente para acessar tabelas que não estão declaradas no dicionário.
Nesse post vou ensinar como se conectar a uma base de dados Oracle. Vamos Lá.
A primeira coisa a fazer é configurar a conexão com o banco de dados. Solicite ao Basis para incluir os dados de conexão da base Oracle externa no tnsnames do do servidor SAP.
MY_DATABASE é um ID que vamos atribuir a base que vamos conectar, DOMAIN é o domínio configurado no servidor, 0.0.0.0 e 1111 devem ser substituidos pelo IP e porta do servidor Oracle e DBSID deve ser substituido pelo SID do banco de dados.
Acesse a transação DBCO e inclua uma nova entrada conforme abaixo:
Conexão BD: o ID que será passado para o comando CONNECT.
SABD: O tipo de bando de dados, nesse caso Oracle.
Nome usuário: O usuário registrado no Oracle.
Senha-BD: A senha do usuário Oracle.
Info lig: O ID atribuido a conexão no tnsnames do servidor SAP.
Agora que a conexão está configurada, vamos ao código ABAP. O programa abaixo é bastante simples, ele se conecta a base externa, obtem o conteudo do campo xml_field a partir do documento da NF e escreve o conteudo XML na tela.
Exemplo completo
Instanciando uma classe pelo nome
Se você tiver várias classes implementando uma mesma interface e deseja instancia-las a partir de uma string com o nome da classe, então você pode utilizar o trecho de código abaixo.
Validando expressões regulares em ABAP com javascript
As expressões regulares são a melhor forma de validar strings, aos invés de substrings e instruções IF. Infelizmente as versões anteriores ao Netweaver não dispoem de rotinas validação de expressões regulares, mas podemos contornar isso utilizando javascript.
O SAP contém uma classe chamada cl_java_script que permite executar códigos javascript dentro ABAP, mais do que isso, permite trocar dados entre o ABAP e o javascript.
Dentre os métodos dessa classe podemos destacar dois principais, o BIND que permite associar variavés ABAP a variáveis JS e o EVALUATE que permite executar o código JS.
Nesse post vou mostrar como utilizar o processador javascript do SAP para validar um CEP através de expressão regular.
Primeiro inclua a chamada da rotina que faz a validação do CEP dentro do local apropriado do seu programa:
Onde P_CEP deve ser substituido pelo campo que contém o CEP a ser validado.
Após a execução da rotina lv_match vai estar com o valor true se o CEP for válido ou false se for inválido.
Agora inclua o form para validação de CEP.
O código javascript utiliza o método match da classe RegExp para fazer a validação, se ocorrer algum erro durante a execução do código javascript, a mensagem de erro vai estar em l_return.
Agora você pode adaptar o código para outros tipos de vlidações como CPF, CNPJ, etc.
O SAP contém uma classe chamada cl_java_script que permite executar códigos javascript dentro ABAP, mais do que isso, permite trocar dados entre o ABAP e o javascript.
Dentre os métodos dessa classe podemos destacar dois principais, o BIND que permite associar variavés ABAP a variáveis JS e o EVALUATE que permite executar o código JS.
Nesse post vou mostrar como utilizar o processador javascript do SAP para validar um CEP através de expressão regular.
Primeiro inclua a chamada da rotina que faz a validação do CEP dentro do local apropriado do seu programa:
Onde P_CEP deve ser substituido pelo campo que contém o CEP a ser validado.
Após a execução da rotina lv_match vai estar com o valor true se o CEP for válido ou false se for inválido.
Agora inclua o form para validação de CEP.
O código javascript utiliza o método match da classe RegExp para fazer a validação, se ocorrer algum erro durante a execução do código javascript, a mensagem de erro vai estar em l_return.
Agora você pode adaptar o código para outros tipos de vlidações como CPF, CNPJ, etc.
Abrindo uma URL no navegador padrão
Para abrir uma url no navegador padrão do usuário, basta utilizar o método execute da classe cl_gui_frontend_services passando a url no parâmetro document. Veja um exemplo prático abaixo.
Imagine que seu relatório tem um campo com o número de um objeto dos Correios (Sedex, PAC, etc) e você gostaria que quando o usuário desse um duplo clique sobre esse objeto fosse a aberto a página de rastreamento de objetos dos Correios.
Dentro do sua rotina de duplo clique inclua a seguinte chamada:
Obviamente lv_num_objeto pode ser substituida pelo campo do seu relatório que contém o número do objeto dos Correios.
Agora inclua o seguinte form no seu programa.
Pronto, agora quanto o usuário der um duplo clique no campo com o número do objeto dos Correios abrir uma janela do navegador com a tela de rastreamento do objeto no site dos correios.
Imagine que seu relatório tem um campo com o número de um objeto dos Correios (Sedex, PAC, etc) e você gostaria que quando o usuário desse um duplo clique sobre esse objeto fosse a aberto a página de rastreamento de objetos dos Correios.
Dentro do sua rotina de duplo clique inclua a seguinte chamada:
Obviamente lv_num_objeto pode ser substituida pelo campo do seu relatório que contém o número do objeto dos Correios.
Agora inclua o seguinte form no seu programa.
Pronto, agora quanto o usuário der um duplo clique no campo com o número do objeto dos Correios abrir uma janela do navegador com a tela de rastreamento do objeto no site dos correios.
Criando um ALV OO Fullscreen
Um problema que já deparei desenvolvendo um ALV OO, foi o tamanho da tela, ora ficava muito grande e usuário tinha que rolar a tela, ora ficava muito pequeno ocupando apenas metade da tela, eu até usei o docking_container, mas o problema dele é que o usuário consegue redimensioná-lo.
Eu encontrei esse post que ensina como fazer isso utilizando o custom_container mesmo. Basicamente para fazer um ALV OO Fullscreen basta você deixar o seu container bem grande e marcá-lo como redimensionável.
Abra a tela do seu relatório no screen painter, então redimensione a tela e o custom control. De um duplo clique no custom control e marque as opções redimensionamento vertical e horizontal, informe o número linhas e colunas mínimas que seu ALV deve ter e ative sua tela. Pronto, agora na próxima vez que seu relatório for executado o ALV vai se ajustar ao tamanho da tela do usuário.
Eu encontrei esse post que ensina como fazer isso utilizando o custom_container mesmo. Basicamente para fazer um ALV OO Fullscreen basta você deixar o seu container bem grande e marcá-lo como redimensionável.
Abra a tela do seu relatório no screen painter, então redimensione a tela e o custom control. De um duplo clique no custom control e marque as opções redimensionamento vertical e horizontal, informe o número linhas e colunas mínimas que seu ALV deve ter e ative sua tela. Pronto, agora na próxima vez que seu relatório for executado o ALV vai se ajustar ao tamanho da tela do usuário.
Lendo um arquivo Excel
Nesse post vou mostrar como fazer a leitura de um arquivo excel (*.xls ou *.xlsx) diretamente, sem a necessidade de convertê-lo para CSV ou qualquer outro formato de arquivo texto. É possível fazer isso através da função ALSM_EXCEL_TO_INTERNAL_TABLE.
Nosso programa exemplo faz a leitura de um arquivo excel com três colunas, material, unidade de medida e quantidade, em seguida imprime os dados na tela.
A primeira coisa a fazer é ler o arquivo excel para a tabela t_excel_tmp, cada linha corresponde a uma célula da planilha excel.
No parâmetro i_begin_row deve ser informada a linha onde começam os dados.
Agora é preciso ordenar a tabela por linha e coluna, em seguida percorrê-la dando um append a cada mudança de linha.
O loop está ciurcandado com try catch para evitar um dump devido a possíveis incompatibilidades entre o formato dos dados no excel e as colunas da tabela interna.
Exemplo completo:
Nosso programa exemplo faz a leitura de um arquivo excel com três colunas, material, unidade de medida e quantidade, em seguida imprime os dados na tela.
A primeira coisa a fazer é ler o arquivo excel para a tabela t_excel_tmp, cada linha corresponde a uma célula da planilha excel.
No parâmetro i_begin_row deve ser informada a linha onde começam os dados.
Agora é preciso ordenar a tabela por linha e coluna, em seguida percorrê-la dando um append a cada mudança de linha.
O loop está ciurcandado com try catch para evitar um dump devido a possíveis incompatibilidades entre o formato dos dados no excel e as colunas da tabela interna.
Exemplo completo:
Assinar:
Postagens (Atom)