<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivos ADVPL – Funções – Arquivos de Disco/IO &#8211; Sem Preju</title>
	<atom:link href="https://sempreju.com.br/category/advpl/advpl-funcoes/advpl-funcoes-arquivos-de-disco-io/feed/" rel="self" type="application/rss+xml" />
	<link>https://sempreju.com.br/category/advpl/advpl-funcoes/advpl-funcoes-arquivos-de-disco-io/</link>
	<description>Conhecimento Gratuito</description>
	<lastBuildDate>Wed, 21 Apr 2021 12:12:10 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>
	<item>
		<title>Como cadastrar feriado e verificar se uma data é valida!</title>
		<link>https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/</link>
					<comments>https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Wed, 21 Apr 2021 12:12:10 +0000</pubDate>
				<category><![CDATA[ADVPL – Funções]]></category>
		<category><![CDATA[ADVPL – Funções – Arquivos de Disco/IO]]></category>
		<category><![CDATA[configurador]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=935</guid>

					<description><![CDATA[<p>Olá pessoal. Hoje vamos aprender como usar cadastrar um feriado e como verificar se uma data é válida. 1- Cadastro de feriados Para que o sistema consiga considerar uma data como feriado é necessário que cadastre esta data na tabela genérica(SX5) &#8211;  63. Acesse: Configurador (SIGACFG) &#62; Base de Dados<a class="moretag" href="https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/">Como cadastrar feriado e verificar se uma data é valida!</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal.</p>
<p>Hoje vamos aprender como usar cadastrar um feriado e como verificar se uma data é válida.</p>
<p>1- Cadastro de feriados</p>
<p>Para que o sistema consiga considerar uma data como feriado é necessário que cadastre esta data na tabela genérica(SX5) &#8211;  63.</p>
<p>Acesse: Configurador (SIGACFG) &gt; Base de Dados &gt; Dicionário &gt; Base de Dados &gt; Selecione a Empresa (Grupo) e clique em &#8220;Tabelas Genéricas&#8221;.</p>
<p><span>Importante: </span><span>A data deve ser cadastrada em Dia/Mês/Ano (01/01/99). </span><span>Caso a data deva ser considerada todo ano, informe três espaços em branco após o mês (01/01 ) e depois insira a descrição.</span></p>
<p>&nbsp;</p>
<p>2-Verificando de uma data é dia útil, para isso vamos usar a função datavalida()</p>
<p>Essa função recebe dois parametros, são eles!</p>
<p>1-<span>Data para iniciar o cálculo da função</span></p>
<p>2-<span>Se .T. posterga a data recebida para o próximo dia útil – Se .F. retrocede a data recebida para o dia útil anterior</span></p>
<p>&nbsp;</p>
<p>Abaixo o código fonte onde exemplificamos o seu uso.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#Include &quot;Protheus.ch&quot;
#Include &quot;TopConn.ch&quot;
  

/*/{Protheus.doc} SPDTVAL
Função SPDTVAL, exemplo de uso de data valida
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Abr|2021
/*/
User Function SPDTVAL()  

    /*
    Parametros
        1-Data para iniciar o cálculo da função
        2-Se .T. posterga a data recebida para o próximo dia útil – Se .F. retrocede a data recebida para o dia útil anterior (default .f.)
    Retorno
    	Data válida do sistema

    Obs.: Para cadastrar um feriado use a tabela genérica 63
    */
    MsgInfo(    'DataValida ou próxima: '  + cValtoChar( DataValida( Date(), .T. ) ) + CRLF + ;
                'DataValida ou anterior: ' + cValtoChar( DataValida( Date(), .F. ) ) ;
 , 'Sempreju =)' )


Return .t.

</pre>
<p>Agor</p>
<p>O código fonte desse e de outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a> oficial.</p>
<p><em>Post interessantes:</em></p>
<p>Aprenda a instalar o Protheus no Windows <a href="https://sempreju.com.br/tag/instalarprotheuswindows/">aqui</a>.</p>
<p>Aprenda a instalar o Protheus no Linux <a href="https://sempreju.com.br/tag/instalarprotheuslinux/">aqui</a>.</p>
<p>configurar serviço rest <a href="https://sempreju.com.br/webservice-rest-no-erp-protheus-part-1/">aqui</a>.</p>
<p>Retornar datas por extenso <a href="https://sempreju.com.br/datas-por-extenso-no-protheus/">aqui</a>.</p>
<p>Barras de progresso <a href="https://sempreju.com.br/como-fazer-barras-de-progresso-no-advpl/">aqui</a>.</p>
<p>Dúvidas e sugestões, entre em contato.</p>
<p>Obrigado e até a próxima!</p>
<p>O post <a href="https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/">Como cadastrar feriado e verificar se uma data é valida!</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-cadastrar-feriado-e-verificar-se-uma-data-e-valida/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como selecionar arquivo através do F3</title>
		<link>https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/</link>
					<comments>https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Mon, 29 Mar 2021 13:08:46 +0000</pubDate>
				<category><![CDATA[ADVPL – Funções]]></category>
		<category><![CDATA[ADVPL – Funções – Arquivos de Disco/IO]]></category>
		<category><![CDATA[configurador]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=926</guid>

					<description><![CDATA[<p>Olá pessoal. Hoje vamos aprender como usar a função cGetFile através do F3 de um campo ou pergunte, isso pode ser util especialmente quando precisarmos selecionar um arquivo e não queremos digitar todo o caminho, mas sim apenas selecionar. &#160; Abaixo o código fonte onde criamos a função que será<a class="moretag" href="https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/">Como selecionar arquivo através do F3</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal.</p>
<p>Hoje vamos aprender como usar a função cGetFile através do F3 de um campo ou pergunte, isso pode ser util especialmente quando precisarmos selecionar um arquivo e não queremos digitar todo o caminho, mas sim apenas selecionar.</p>
<p>&nbsp;</p>
<p>Abaixo o código fonte onde criamos a função que será utilizada no cadastro da consulta padrão (SXB).</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#INCLUDE &quot;TOTVS.CH&quot;
#INCLUDE &quot;RWMAKE.CH&quot;
#INCLUDE &quot;TOPCONN.CH&quot;

#Define ENTER Chr(13)+Chr(10)

/*/{Protheus.doc} SPSF3DIA
Função SPSF3DIA, para exemplificar como selecionar o diretório de um arquivo no SF3.
@param Não recebe parâmetros
@return Patch do arquivo selecionado
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Mar|2021
/*/

User Function SPSF3DIA(cCampo)
Local cRet := &quot;&quot;

cRet := cGetFile(,&quot;Selecione o diretorio&quot;,,&quot;&quot;,.T.,GETF_NETWORKDRIVE+GETF_RETDIRECTORY+128)

//Atualiza o campo com o caminho selecionado
&amp;amp;(cCPO)	:= cRet

Return (!Empty(cRet))

</pre>
<p>Agora que temos a função responsável por tratar e retornar o arquivo, vamos criar uma consulta padrão que utilizará essa função (tipo da consulta padrão será &#8220;especifica&#8221;) ao invés de uma tabela. Para isso no configurador, vamos criar o seguinte SXB.</p>
<p><img fetchpriority="high" decoding="async" src="https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica.jpg" alt="" width="627" height="492" class="aligncenter size-full wp-image-927" srcset="https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica.jpg 627w, https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica-300x235.jpg 300w" sizes="(max-width: 627px) 100vw, 627px" />Avançando vamos configurar  a nossa função, enviando como parametro a função readvar(), e retornando o valor M-&gt;(readvar()).</p>
<p><img decoding="async" src="https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica_2.jpg" alt="" width="620" height="489" class="aligncenter size-full wp-image-928" srcset="https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica_2.jpg 620w, https://sempreju.com.br/wp-content/uploads/2021/03/advpl_consulta_padrao_especifica_2-300x237.jpg 300w" sizes="(max-width: 620px) 100vw, 620px" /></p>
<p>&nbsp;</p>
<p>Agora onde for necessário selecionar um arquivo (campo ou pergunte) através do SF3, vamos usar a nossa nova consulta, para demonstrar adicionei no campo A1_END, e o resultado foi o print abaixo</p>
<p><img decoding="async" src="https://sempreju.com.br/wp-content/uploads/2021/03/f3_com_diretorio.jpg" alt="" width="774" height="454" class="aligncenter size-full wp-image-929" srcset="https://sempreju.com.br/wp-content/uploads/2021/03/f3_com_diretorio.jpg 774w, https://sempreju.com.br/wp-content/uploads/2021/03/f3_com_diretorio-300x176.jpg 300w, https://sempreju.com.br/wp-content/uploads/2021/03/f3_com_diretorio-768x450.jpg 768w" sizes="(max-width: 774px) 100vw, 774px" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>O código fonte desse e de outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a> oficial.</p>
<p><em>Post interessantes:</em></p>
<p>Aprenda a instalar o Protheus no Windows <a href="https://sempreju.com.br/tag/instalarprotheuswindows/">aqui</a>.</p>
<p>Aprenda a instalar o Protheus no Linux <a href="https://sempreju.com.br/tag/instalarprotheuslinux/">aqui</a>.</p>
<p>configurar serviço rest <a href="https://sempreju.com.br/webservice-rest-no-erp-protheus-part-1/">aqui</a>.</p>
<p>Retornar datas por extenso <a href="https://sempreju.com.br/datas-por-extenso-no-protheus/">aqui</a>.</p>
<p>Barras de progresso <a href="https://sempreju.com.br/como-fazer-barras-de-progresso-no-advpl/">aqui</a>.</p>
<p>Dúvidas e sugestões, entre em contato.</p>
<p>Obrigado e até a próxima!</p>
<p>O post <a href="https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/">Como selecionar arquivo através do F3</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-utilizar-a-funcao-cgetfile-atraves-de-uma-consulta-padrao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Integrar Protheus ao Slack</title>
		<link>https://sempreju.com.br/integrar-protheus-ao-slack/</link>
					<comments>https://sempreju.com.br/integrar-protheus-ao-slack/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Sat, 15 Feb 2020 13:30:31 +0000</pubDate>
				<category><![CDATA[ADVPL – Funções – Arquivos de Disco/IO]]></category>
		<category><![CDATA[Ferramentas]]></category>
		<category><![CDATA[slack]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=500</guid>

					<description><![CDATA[<p>Olá pessoal, hoje abordaremos um assunto bem legal, como enviar mensagens para o slack usando o protheus. Mas primeiramente o que é o slack? Saiba mais sobre isso no nosso post sobre a ferramenta clicando aqui. &#160; Primeiros passos Antes de iniciamos a configuração, temos que criar uma conta no<a class="moretag" href="https://sempreju.com.br/integrar-protheus-ao-slack/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/integrar-protheus-ao-slack/">Integrar Protheus ao Slack</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal, hoje abordaremos um assunto bem legal, como enviar mensagens para o slack usando o protheus.</p>
<p><strong>Mas primeiramente o que é o slack?</strong></p>
<p>Saiba mais sobre isso no nosso post sobre a ferramenta clicando <a href="https://sempreju.com.br/o-que-e-slack-e-por-que-as-pessoas-adoram/">aqui</a>.</p>
<p>&nbsp;</p>
<p><strong>Primeiros passos</strong></p>
<p>Antes de iniciamos a configuração, temos que criar uma conta no slack, para isso acesse <a href="https://slack.com/intl/pt-br/">aqui</a>.</p>
<p>Após termos criados a nossa conta, vamos criar um novo token de autorização dentro do slack, com esse token vamos postar as mensagens enviadas do protheus para o nosso canal, para isso <span>siga as etapas abaixo.</span></p>
<ol>
<li><span>Crie um novo aplicativo na </span><a href="https://api.slack.com/apps"><span>app management page</span></a><span>;</span></li>
<li>Clique no botão create a new app, seremos redirecionados a pagina de configuração.
<ol>
<li>Informe um nome para seu aplicativo ex. ERPProtheus</li>
<li>Seleciona o workspace que esse app pertencerá]</li>
</ol>
</li>
<li>
<p class="article_title">Criar Webhooks de entrada para o Slack,</p>
<ol>
<li>Na pagina de seus <a href="https://api.slack.com/apps">aplicativos</a>, selecionar o novo app criado.</li>
<li>Seleciona a opção, adicionar novas funcionalidades.</li>
<li>Seleciona a opção webhook de entrada e a ative.</li>
<li>Clique em adicionar novo webhook ao workspace(onde vamos informar em que canal serão enviadas as informações)</li>
<li>Nesse momento o sistema ira gerar uma URL única, copie e guarde, vamos precisar dela no nosso fonte.</li>
<li>
<p class="article_title">resumindo o <span>webhooks de entrada são um jeito simples de compartilhar informações de fontes externas com seu workspace. Mais informações <a href="https://slack.com/intl/pt-br/help/articles/115005265063-webhooks-de-entrada-para-o-slack">aqui</a>.</span></p>
</li>
</ol>
</li>
</ol>
<p>Após a criação do nosso app no slack, temos que configurar o protheus para enviar informações, abaixo um exemplo para ler o errorl.log e enviar os novos erros para o slack, altere e use da maneira que for sua necessidade.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#Include &quot;Protheus.ch&quot;
#INCLUDE &quot;fileio.ch&quot;
/*/{Protheus.doc} SPSLACK
(long_description)
@type Function
@author user
@since 22/01/2020
@version version
@param param_name, param_type, param_descr
@return return_var, return_type, return_description
@example
(examples)
@see (links_or_references)
/*/
user Function SPSLACK()
Local cUrl := ''//TODO insira aqui a sua url do slack, similar a https://hooks.slack.com/services/TSN3MSKFD/BTG0YNAMQ/M1bSfoBKUEyUX4uc7DezlC
Local nTimeOut := 120
Local aHeadOut := {}
Local cHeadRet := &quot;&quot;
Local sPostRet := &quot;&quot;
Local _ni := 0
Local aMsg := u_FSLERLOG() //get messages
//aadd(aHeadOut,'User-Agent: Mozilla/4.0 (compatible; Protheus '+GetBuild()+')')
aadd(aHeadOut,'Content-type: application/json')
For _ni := 1 to len(aMsg)
sPostRet := HttpPost(cUrl,,'{&quot;text&quot;:&quot;'+aMsg&#x5B;_ni]+'&quot;}',nTimeOut,aHeadOut,@cHeadRet)
next
if !empty(sPostRet)
conout(&quot;HttpPost Ok&quot;)
varinfo(&quot;WebPage&quot;, sPostRet)
else
conout(&quot;HttpPost Failed.&quot;)
varinfo(&quot;Header&quot;, cHeadRet)
Endif
Return .T.
/*/{Protheus.doc} User Function FSLERLOG
(long_description)
@type Function
@author user
@since 22/01/2020
@version version
@param param_name, param_type, param_descr
@return return_var, return_type, return_description
@example
(examples)
@see (links_or_references)
/*/
User Function FSLERLOG(cLogFile)
Local aMensagem as Array
Local cDelimt as Character
default cLogFile := '\system\error.log'
aMensagem := {}
cDelimt := 'SP_JA_ENVIADO'
nHdl := fOpen(cLogFile, FO_READWRITE + FO_SHARED) //fopen('\sigaadv\error.log' , FO_READWRITE + FO_SHARED )
If nHdl == -1
IF FERROR()== 516
ALERT(&quot;Feche a planilha que gerou o arquivo.&quot;)
EndIF
EndIf
//+---------------------------------------------------------------------+
//| Verifica se foi poss�vel abrir o arquivo |
//+---------------------------------------------------------------------+
If nHdl == -1
cMsg := &quot;O arquivo de nome &quot;+cLogFile+&quot; nao pode ser aberto! Verifique os parametros.&quot;
MsgAlert(cMsg,&quot;Atencao!&quot;)
Return
Endif
//+---------------------------------------------------------------------+
//| Posiciona no Inicio do Arquivo |
//+---------------------------------------------------------------------+
FSEEK(nHdl,0,0)
//+---------------------------------------------------------------------+
//| Traz o Tamanho do Arquivo TXT |
//+---------------------------------------------------------------------+
nTamArq:=FSEEK(nHdl,0,2)
//+---------------------------------------------------------------------+
//| Posicona novamemte no Inicio |
//+---------------------------------------------------------------------+
FSEEK(nHdl,0,0)
//+---------------------------------------------------------------------+
//| Fecha o Arquivo |
//+---------------------------------------------------------------------+
fClose(nHdl)
FT_FUse(cLogFile) //abre o arquivo
FT_FGOTOP() //posiciona na primeira linha do arquivo
nTamLinha := Len(FT_FREADLN()) //Ve o tamanho da linha
FT_FGOTOP()
//+---------------------------------------------------------------------+
//| Verifica quantas linhas tem o arquivo |
//+---------------------------------------------------------------------+
nLinhas := nTamArq/nTamLinha
nCont := 0
lAchou := .F.
lAchou2 := .F.
aDados:={}
While !FT_FEOF() //Ler todo o arquivo enquanto n�o for o final dele
//Se achou o delimetador, zera array pq as inform��es ja foram enviadas
If cDelimt $ FT_FREADLN()
aMensagem := {}
lAchou2 := .T.
Endif
//rava o erro para ser postado no Slack
If 'THREAD ERROR' $ FT_FREADLN()
aAdd(aMensagem,&quot; &quot;) //Adcionar uma nova mensagem
lAchou := .T.
Endif
If lAchou .and. nCont &amp;lt;= 8 //gravar 8 linhas
aMensagem&#x5B;len(aMensagem)] += FT_FREADLN() +CHR(13)+CHR(10)+CHR(13)+CHR(10)
nCont ++
else
lAchou := .F.
nCont := 0
Endif
clinha := FT_FREADLN()
conout(clinha)
FT_FSKIP()
EndDo
FT_FUse()
fClose(nHdl)
If !lAchou2
nHdl := fOpen(cLogFile, FO_READWRITE + FO_SHARED) //fopen('\sigaadv\error.log' , FO_READWRITE + FO_SHARED )
//add delimetador
FSeek(nHdl, 0, FS_END) // Posiciona no fim do arquivo
fWrite(nHdl,cDelimt + chr(13)+chr(10) )
fClose(nHdl)
Endif
Return aMensagem
</pre>
<p>Esse e outros exemplos você encontra em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p>Até a próxima</p>
<p>O post <a href="https://sempreju.com.br/integrar-protheus-ao-slack/">Integrar Protheus ao Slack</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/integrar-protheus-ao-slack/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
