Mostrando postagens com marcador BAT. Mostrar todas as postagens

sexta-feira, 30 de setembro de 2016

Debug #12 - Executar arquivo externo em ADVPL

Fala galera!


Esses dias precisei fazer uma modificação no sistema no qual efetuaria um sinal sonoro para alertar o usuário sobre alguma entrada incorreta de dados. 


O problema principal é: a cada notificação de erro ou dados inválidos o sistema irá emitir um som que alertará o usuário que algo está errado.

Primeiramente vamos criar uma função de usuário simples com o nome alarme() e seu retorno será uma variável - lRet - do tipo booleano. Caso alguma inconsistência seja encontrada o alerta será emitido.

user function alarme

local lRet := .T.
local nQtd := 3
local cDirCli := "C:\\Media\\"

if nQtd = 3
 shellExecute("Open", cDirCli+"sound.bat", "", "", 0) 
 msgInfo("Qtd = 3")
else
 shellExecute("Open", cDirCli+"sound_2.bat", "", "", 0)
 msgInfo("Qtd <> 3")
 lRet := .F.
endIf

return lRet

Além da variável de retorno e outra variável de teste (nQtd), temos uma variável que nos mostra o diretório onde se encontra os arquivos de áudio que usaremos em nossa rotina.

Utilizaremos o método shellExecute() para que possamos chamar nosso arquivo .bat que ficará responsável por abrir e executar o áudio.

Vejamos nosso arquivo .bat:

start wmplayer /play /close c:\Media\sound136.wav 
timeout /t 1
TASKKILL /IM wmplayer.exe


Na primeira linha temos o comando start que inicia o player wmplayer - em nosso caso será o windows media player - então usamos os comandos /play e /close e informamos o diretório do arquivo de áudio a ser executado.

Usei também o comando timeout com o tempo (/t) de 1 segundo. Após esse tempo o comando TASKKILL irá encerrar a tarefa do windows media player.

É isso ai galera! Espero que tenho curtido essa dica.

Até mais!

;)

segunda-feira, 15 de agosto de 2016

[Advpl] Manipulação de Arquivos

Fala galera!

Vamos trocar uma ideia hoje sobre manipulação de arquivos utilizando a linguagem Advpl. Antes de começar a codificar, preciso apresentar o motivo que originou esse post.



Na empresa onde trabalho, havia a necessidade do usuário obter um arquivo que é salvo pelo sistema em sua pasta no servidor.  E para que isso fosse possível, o usuário utilizava de um arquivo .bat - veja mais sobre arquivos bat nesses posts - que automatizava  o processo, ou seja, buscava o arquivo no servidor, renomeava e salvava no desktop do usuário.

Então, utilizando deste cenário, poderemos aprender várias funções de manipulação de arquivo com Advpl.

Primeiramente vamos desenvolver a tela principal do nosso programa, onde teremos um combo-box com as opções de arquivos que iremos recuperar/pegar do servidor e dois botões, um para confirmar e outro para sair.

Nossa tela será exibida da seguinte forma:



Aqui está o código para que a tela seja gerada:

/*
_____________________________________________________________________________
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦Programa  ¦ BUSARQ     ¦ Autor ¦ Renan R. Ramos      ¦ Data ¦ 11.08.16 ¦¦¦
¦¦¦----------+------------------------------------------------------------¦¦¦
¦¦¦Descriçäo ¦ Rotina para recuperar arquivo do servidor para o computador¦¦¦
¦¦¦          ¦ do usuário.                                                ¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/
user function busArq

private oWinMain                               
private oCombo
private cCombo := ""
private aOpcoes := {"1=Arquivo_1","2=Arquivo_2"}

define msDialog oWinMain title "" from 000,000 to 210,250 pixel of oWinMain

 @005,005 to 100,120 LABEL "Busca arquivo" pixel of oWinMain

 oCombo := TComboBox():New(030,014,{|u|if(PCount()>0,cCombo := u,cCombo)},aOpcoes,100,20,oWinMain,,{||},,,,.T.,,,,,,,,,'cCombo') 
 
 @075,020 button "Confirmar" size 040,010 pixel of oWinMain action getArq(val(cCombo)) 
 @075,065 button "Sair" size 040,010 pixel of oWinMain action close(oWinMain)
  
activate msDialog oWinMain centered

return

No botão "Confirmar" possuímos o método getArq(val(cCombo)) que será o principal método da nossa rotina. Ele efetuará toda a transição e manipulação dos arquivos.
A seguir vocês podem visualizar o código completo com explicações em seus comentários.

/*
_____________________________________________________________________________
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦Programa  ¦ GETARQ     ¦ Autor ¦ Renan R. Ramos      ¦ Data ¦ 11.08.16 ¦¦¦
¦¦¦----------+------------------------------------------------------------¦¦¦
¦¦¦Descriçäo ¦ Função responsável por efetuar a cópia dos arquivos.       ¦¦¦
¦¦+-----------------------------------------------------------------------+¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*/
static function getArq(nNumOpc)
  
local cArquivo := ""
local cNomeArq := ""
local lCompacta := .T.
local lSuccess := .T.
local nRetorno := 0
local cTemp1 := getTempPath()
local cTemp := substr(cTemp1,1,AT("\AppData",cTemp1))+"desktop\"
    
//obtém as informações do usuário logado no protheus
PswOrder(2)

if PswSeek(cUsername, .T.) 
 //array com todas as informações de configuração do usuário
 aArray := PswRet()
endIf

//verifica se existe configurado um diretório de impressão 
//do sistema para este usuário
if !empty(allTrim(aArray[2][3]))
           
 //se escolha por Arquivo_1
 if nNumOpc = 1 
    cArquivo := "Arquivo_1.txt"
    cNomeArq := "\PRIMEIRO_ARQUIVO.txt"
 else//se escolha por Arquivo_2
    cArquivo := "Arquivo_2.txt"
    cNomeArq := "\SEGUNDO_ARQUIVO.txt"
 endIf                   
 
 //se o arquivo já existe, ele é deletado
 if file(cTemp+cArquivo)
     fErase(cTemp+cArquivo)
 endIf
    
 //se a cópia foi efetuada com sucesso, o método CpyS2t() retorna .T.
 lSuccess := CpyS2T(allTrim(aArray[2][3])+cArquivo,cTemp,lCompacta)

 if lSuccess
  //se o arquivo já existe, ele é deletado
  if file(cTemp+cNomeArq)
      fErase(cTemp+cNomeArq)
  endIf
        
  //se o arquivo foi renomeado, o método fRename() retorna 0
     nRetorno := fRename(cTemp+cArquivo,upper(cTemp+cNomeArq))

  //se renomear o arquivo estiver ok retorna 0   
  if nRetorno = 0
   msgInfo("Arquivo salvo com sucesso!")
  endIf
 else
  msgInfo("Arquivo não copiado!")
 endIf
else
 msgInfo("Verificar configurações de pasta do usuário no servidor")
endIf

return

Para definirmos em qual local do computador será salvo o arquivo, utilizamos o método getTempPath(), mas como desejamos salvar no desktop do usuário, utilizamos o código abaixo para substituir a string do diretório obtido e adicionamos a string "\desktop" e assim teremos o nosso diretório final.

local cTemp1 := getTempPath() //obtém o diretório temporario do usuario logado no sistema
local cTemp := substr(cTemp1,1,AT("\AppData",cTemp1))+"desktop\" //obtemos a posição da pasta "\AppData" e adicionamos a string "\desktop\"

Explicação rápida de algumas funções utilizadas:

  • PswOrder: seleciona a ordem de pesquisa de usuário. Em nosso fonte utilizamos a ordem 2 que é feita por nome de usuário.
  • PswSeek: pesquisa e posiciona o arquivo de senhas de acordo com a ordem definida pela função PswOrder.
  • PswRet: retorna um vetor com as informações do usuário;
  • File: verifica se o arquivo existe no diretório informado;
  • FErase: apaga o arquivo no diretório informado;
  • FRename: renomeia o arquivo original do primeiro parâmetro de acordo com o outro informado no segundo parâmetro.
  • CpyS2t: faz a cópia do diretório do servidor no primeiro parâmetro para o diretório de destino que deve ser colocado no segundo parâmetro.

Para obter mais informações sobre todas essas funções, acesse o TDN Totvs.

É isso ai galera! Um fonte fácil e simples que poderá ser de grande utilidade não só para este contexto que passei, mas para qualquer outra necessidade de manipulação de arquivo.

Deixe seu comentário, crítica ou sugestão!

Até mais!

;)

quarta-feira, 27 de julho de 2016

O que são arquivos batch?

Fala galera que acompanha o blog...


Nesse post estarei explicando o que são arquivos Batch, os famosos arquivos .bat, como criar um rotina simples, como executar seu arquivo e como adicionar seu arquivo nas variáveis de ambiente.
Um arquivo com extensão .bat pode ser definido como um conjunto de comandos executados em lote (sequencialmente). Criado para MS-DOS tem a função de automatizar tarefas rotineiras e muitas vezes trabalhosas. (Wikipédia)
O que são arquivos batch?


Arquivos Batch são famosos pelo ganho de produtividade, quando se converte uma atividade rotineira que era realizada manualmente, para um bloco de códigos com vários passos. Automatizando o processo e gerando o mesmo resultado.


Um exemplo clássico para quem trabalha com Maven, é executar o comando "mvn clean install", ou "mvn clean install -DskipTests".
Não se preocupem caso não conheçam o maven, esse post é sobre arquivos batch, estou apenas usando o maven de exemplo.

Para conhecer mais sobre Maven, acompanhe nossa sequência de posts sobre, clicando aqui.

Ambos são utilizados para limpar todas as dependências (.jars) e gerar o pacote de deploy do projeto. A diferença entre os dois comandos é que enquanto um roda os testes implementados o outro não (-DskipTests).

Para evitar de digitar esses comandos cria-se um arquivo Batch, que vou chamar de bld.bat (nome qualquer, sigla de build), com a seguinte instrução:
O nome dos arquivos devem ser nomes fáceis e intuitivos.

mvn clean install

e um outro arquivo .bat, que vou chamar de bldst.bat,(sigla de build skip test), para não executar os testes implementados:

mvn clean install -DskipTests

O "texto" mvn clean install será escrito no seu console pressione enter e o comando será executado sobre o seu projeto maven que deve estar na mesma pasta do arquivo .bat, ou é claro salve o arquivo.bat dentro do seu projeto maven.


Nossa mas eu preciso fazer isso tudo só para escrever uma simples linha?
Sim, no primeiro momento! No entanto, seu arquivo batch poderá ser executado diversas vezes. O trabalho é só no momento de criar o arquivo, depois fica tudo mais fácil e o ganho de produtividade aumenta. Esse exemplo foi apenas para exemplificar e ensinar como podemos utilizar arquivos batch no nosso dia a dia e como ele facilita tarefas rotineiras.

Continuando...

Um site que eu uso bastante é o WikiBooks. E nesse link aqui você encontra uma boa quantidade de comandos que podem ser utilizados.

De exemplo, vamos utilizar o seguinte trecho de código:
@echo off
echo Computador: %computername%   Usuario: %username%
pause
start www.deviscoming.com

Esse trecho, oculta o comando no prompt de comando exibindo apenas resultados, escreve o nome da nossa máquina seguido do usuário logado, demos uma pausa, nesse momento o console aguarda que alguma tecla seja pressionada e posteriormente o site configurado é exibido no seu navegador padrão. Siga os passos abaixo para criar o seu arquivo:
  1. Abra um editor de texto de sua preferência. Aqui estou usando o Notepad++;
  2. Escreva as suas instruções dentro do arquivo (utilize o código de exemplo);
  3. Clique em salvar e selecione um local onde serão armazenados todos os seus arquivos .bat. Adiante explico o motivo de manter todos em um mesmo diretório;
  4. De um nome para seu arquivo.
PASSO 4 - Normalmente os arquivos são salvos com extensão .txt. Para não ser necessário procurar pela extensão .bat, escreva o nome do seu arquivo circundado por apóstrofos "". No meu exemplo utilizarei "info.bat".
O arquivo que criamos não tem muita utilidade. Como explicado no inicio do post, arquivos de lote servem para automatizar atividades rotineiras e muitas vezes trabalhosas. Aqui apenas aprendemos como criar um arquivo de lote.

Nosso arquivo esta pronto para ser executado.Temos 2 formas de faze-lo:
  • Double click sobre os arquivos;
  • Ou via prompt de comando:
    • Clique em "Iniciar" pesquise por cmd, abra o arquivo cmd.exe
      • Windows + r e pesquise por cmd e pressione a tecla enter;
    • Navegue até a pasta onde você salvou seu arquivo:
      • copie o caminho onde seu arquivo foi salvo, digite cd, cole o caminho do arquivo no console e pressione enter;
      • ou via comando utilize cd para abrir pastas e cd.. para voltar pastas;
    • Escreva o nome do seu arquivo, no meu caso info, pressione enter.
No entanto é muito trabalhoso navegar pelos diretório para executar o nosso arquivo. Uma forma de resolver isso, é adicionando nosso arquivo na variável de ambiente, dessa forma em qualquer diretório que estiver será possível chamar o seu arquivo Batch.

Sugiro que caso não saiba o que são as variáveis de ambiente, leia este post onde ensinamos a criar uma variável de ambiente.

Criado a sua variável de ambiente para o arquivo info, abra o prompt de comando navegue para um diretório qualquer, digite o nome da sua variável (que não precisa ser o mesmo nome do arquivo) e pressione enter. Pronto, seu arquivo batch foi executado sem a necessidade de navegar para o diretório onde o arquivo está salvo. Fica mais fácil não?

O mesmo poderia estar sendo feito com o primeiro exemplo sobre maven utilizando o arquivo bld e bldst. Ao invés de salvar o arquivo dentro do meu projeto, salvaria na pasta onde estão todos os arquivos do tipo batch e a executaria sempre que necessário de qualquer diretório e projeto que estiver trabalhando.

Bom, agora que conhecem os arquivos batch e sabem como cria-los e executa-los, explore as possibilidades, pense nas atividades que realiza diariamente no seu trabalho, desenvolva um fluxo e automatize essas tarefas e quem sabe compartilhar os arquivos para seus amigos na empresa para que todos possam se beneficiar do seu arquivo.

É isso ai pessoal, até a próxima.