<?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 - Dicas &#8211; Sem Preju</title>
	<atom:link href="https://sempreju.com.br/category/advpl/advpl-dicas/feed/" rel="self" type="application/rss+xml" />
	<link>https://sempreju.com.br/category/advpl/advpl-dicas/</link>
	<description>Conhecimento Gratuito</description>
	<lastBuildDate>Sun, 05 Sep 2021 19:17:14 +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>Criar MarkBrowse editável em advpl</title>
		<link>https://sempreju.com.br/criar-markbrowse-editavel-em-advl/</link>
					<comments>https://sempreju.com.br/criar-markbrowse-editavel-em-advl/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Sat, 04 Sep 2021 09:03:17 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[ADVPL]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=790</guid>

					<description><![CDATA[<p>Olá pessoal Hoje vou postar uma rotina para que possamos criar facilmente um markbrowse editável, assim o usuário pode selecionar os registros e tambem editar as informações. Abaixo o código fonte, a rotina é bem simples basta compilar e executar para ver um exemplo. O código fonte desse e outros<a class="moretag" href="https://sempreju.com.br/criar-markbrowse-editavel-em-advl/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/criar-markbrowse-editavel-em-advl/">Criar MarkBrowse editável em advpl</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p>Hoje vou postar uma rotina para que possamos criar facilmente um markbrowse editável, assim o usuário pode selecionar os registros e tambem editar as informações.</p>
<p>Abaixo o código fonte, a rotina é bem simples basta compilar e executar para ver um exemplo.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#Include &quot;Protheus.ch&quot;

/*/{Protheus.doc} SPMarkTe
Função SPMarkTe, cria um markbrowse editavel.
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Out|2020
/*/

User Function SPMarkTe()
Private lMarker     := .T.
Private aDespes := {}

//Alimenta o array
BUSDATA()


DEFINE MsDIALOG o3Dlg TITLE 'Clientes' From 0, 4 To 650, 1180 Pixel
    
    oPnMaster := tPanel():New(0,0,,o3Dlg,,,,,,0,0)
    oPnMaster:Align := CONTROL_ALIGN_ALLCLIENT

    oDespesBrw := fwBrowse():New()
    oDespesBrw:setOwner( oPnMaster )

    oDespesBrw:setDataArray()
    oDespesBrw:setArray( aDespes )
    oDespesBrw:disableConfig()
    oDespesBrw:disableReport()

    oDespesBrw:SetLocate() // Habilita a Localização de registros

    //Create Mark Column
    oDespesBrw:AddMarkColumns({|| IIf(aDespes&#x5B;oDespesBrw:nAt,01], &quot;LBOK&quot;, &quot;LBNO&quot;)},; //Code-Block image
        {|| SelectOne(oDespesBrw, aDespes)},; //Code-Block Double Click
        {|| SelectAll(oDespesBrw, 01, aDespes) }) //Code-Block Header Click

    oDespesBrw:addColumn({&quot;Codigo&quot;              , {||aDespes&#x5B;oDespesBrw:nAt,02]}, &quot;C&quot;, &quot;@!&quot;    , 1,  20    ,                            , .T. , , .F.,, &quot;aDespes&#x5B;oDespesBrw:nAt,02]&quot;,, .F., .T.,                                    , &quot;ETDESPES1&quot;    })
    oDespesBrw:addColumn({&quot;Nome&quot;                , {||aDespes&#x5B;oDespesBrw:nAt,03]}, &quot;C&quot;, &quot;@!&quot;    , 1, 100    ,                            , .T. , , .F.,, &quot;aDespes&#x5B;oDespesBrw:nAt,03]&quot;,, .F., .T.,                                    , &quot;ETDESPES2&quot;    })
    oDespesBrw:addColumn({&quot;End&quot;                 , {||aDespes&#x5B;oDespesBrw:nAt,04]}, &quot;C&quot;, &quot;@!&quot;    , 1, 100    ,                            , .T. , , .F.,, &quot;aDespes&#x5B;oDespesBrw:nAt,04]&quot;,, .F., .T.,                                    , &quot;ETDESPES3&quot;    })
    oDespesBrw:addColumn({&quot;Cidade&quot;              , {||aDespes&#x5B;oDespesBrw:nAt,05]}, &quot;C&quot;, &quot;@!&quot;    , 1, 100    ,                            , .T. , , .F.,, &quot;aDespes&#x5B;oDespesBrw:nAt,05]&quot;,, .F., .T.,                                    , &quot;ETDESPES4&quot;    })

    oDespesBrw:setEditCell( .T. , { || .T. } ) //activa edit and code block for validation

    /*
    oDespesBrw:acolumns&#x5B;2]:ledit     := .T.
    oDespesBrw:acolumns&#x5B;2]:cReadVar:= 'aDespes&#x5B;oBrowse:nAt,2]'*/

    oDespesBrw:Activate(.T.)

Activate MsDialog o3Dlg

return .t.



Static Function SelectOne(oBrowse, aArquivo)
aArquivo&#x5B;oDespesBrw:nAt,1] := !aArquivo&#x5B;oDespesBrw:nAt,1]
oBrowse:Refresh()
Return .T.



Static Function SelectAll(oBrowse, nCol, aArquivo)
Local _ni := 1
For _ni := 1 to len(aArquivo)
    aArquivo&#x5B;_ni,1] := lMarker
Next
oBrowse:Refresh()
lMarker:=!lMarker
Return .T.





//Alimenta a tabela temporaria
Static Function BUSDATA()
Local cQuery    as Character
Local cQryT3    as Character

cQuery      := &quot;&quot;
cQryT3      := GetNextAlias()
aDespes := {}

cQuery+=&quot;SELECT * FROM &quot; + RetSqlName(&quot;SA1&quot;)
cQuery+=&quot; WHERE D_E_L_E_T_=''&quot;
cQuery:=ChangeQuery(cQuery)
dbUseArea( .T., &quot;TOPCONN&quot;, TcGenQry( ,, cQuery ) , cQryT3, .T., .F. )

(cQryT3)-&gt;(DbGoTop())
While (cQryT3)-&gt;(!EOF())

    aadd(aDespes,{.f.,alltrim((cQryT3)-&gt;A1_COD+(cQryT3)-&gt;A1_LOJA),alltrim((cQryT3)-&gt;A1_NOME),alltrim((cQryT3)-&gt;A1_END),alltrim((cQryT3)-&gt;A1_MUN)    })

    (cQryT3)-&gt;(dbSkip())
EndDo
(cQryT3)-&gt;(dbCloseArea())
DbSelectArea('SA1')

Return .t.

</pre>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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/criar-markbrowse-editavel-em-advl/">Criar MarkBrowse editável em advpl</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/criar-markbrowse-editavel-em-advl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como executar o gatilho de um campo &#8211; RunTrigger</title>
		<link>https://sempreju.com.br/como-executar-o-gatilho-de-um-campo-runtrigger/</link>
					<comments>https://sempreju.com.br/como-executar-o-gatilho-de-um-campo-runtrigger/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Fri, 11 Dec 2020 14:41:27 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[ADVPL – Funções – Arquivos SXs]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Protheus]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=825</guid>

					<description><![CDATA[<p>Olá pessoal Algumas vezes precisamos executar o gatilho de um determinado campo, já aprendemos a verificar se um gatilho existe aqui, vamos agora aprender a executar o gatilho Para isso existe a função RunTrigger, ela é responsável por executar os gatilhos de um determinado campo. A documentação oficial pode ser<a class="moretag" href="https://sempreju.com.br/como-executar-o-gatilho-de-um-campo-runtrigger/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-executar-o-gatilho-de-um-campo-runtrigger/">Como executar o gatilho de um campo &#8211; RunTrigger</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p>Algumas vezes precisamos executar o gatilho de um determinado campo, já aprendemos a verificar se um gatilho existe <a href="https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/">aqui</a>, vamos agora aprender a executar o gatilho</p>
<p>Para isso existe a função <strong>RunTrigger</strong>, ela é responsável por executar os gatilhos de um determinado campo. A documentação oficial pode ser encontrada <a href="https://tdn.totvs.com/pages/releaseview.action?pageId=6815032">aqui</a>.</p>
<h2></h2>
<h2 class="vc_custom_heading">Sintaxe</h2>
<p><span>RunTrigger( &lt;nTipo&gt;, &lt;nLin&gt;, &lt;cMacro&gt;, &lt;oObj&gt;, &lt;cField&gt; )</span></p>
<p>&nbsp;</p>
<h2 class="vc_custom_heading">Parâmetros</h2>
<div class="avia-data-table-wrap avia_scrollable_table">
<table class="avia-table avia-data-table avia-table-3 avia-builder-el-2 el_after_av_table el_before_av_table avia_pricing_default " itemscope="itemscope" itemtype="https://schema.org/Table">
<tbody>
<tr class="">
<td class=""><span>Par</span></td>
<td class=""><span>Nome</span></td>
<td class=""><span>Tipo</span></td>
<td class=""><span>Descrição</span></td>
<td class=""><span>Default</span></td>
<td class=""><span>Obg</span></td>
<td class=""><span>Ref</span></td>
</tr>
<tr class="">
<td class="">01</td>
<td class="">nTipo</td>
<td class="">Numérico</td>
<td class=""><span>Qual tipo de objeto será executado a trigger(1-Enchoice 2-GetDados 3-F3 ).</span></td>
<td class=""></td>
<td class="">X</td>
<td class=""></td>
</tr>
<tr class="">
<td class="">02</td>
<td class="">nLin</td>
<td class="">Numérico</td>
<td class="">Quando nTipo = 2, informar a linha posicionada na Getdados</td>
<td class=""></td>
<td class=""></td>
<td class=""></td>
</tr>
<tr class="">
<td class="">03</td>
<td class="">cMacro</td>
<td class="">Caracter</td>
<td class="">Não utilizado</td>
<td class=""></td>
<td class=""></td>
<td class=""></td>
</tr>
<tr class="">
<td class="">04</td>
<td class="">oObj</td>
<td class="">Objeto</td>
<td class="">Objeto utilizado na tela, para utilizar a propriedade aGets e aTela quando for nTipo = 1.</td>
<td class=""></td>
<td class=""></td>
<td class=""></td>
</tr>
<tr class="">
<td class="">05</td>
<td class="">cField</td>
<td class="">Caracter</td>
<td class="">Nome do campo que dispara a trigger. Se não informado, considera o campo atualmente posicionado no SX3.</td>
<td class=""></td>
<td class="">X</td>
<td class=""></td>
</tr>
</tbody>
</table>
</div>
<p>&nbsp;</p>
<h2 class="vc_custom_heading">Exemplo</h2>
<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} SPEXCTG
Função SPEXCTG, para exemplificar o uso da Função RunTrigger().
@param Não recebe 
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Dez|2020
/*/
User Function SPEXCTG()
Local cCampo := 'A1_CGC'

//Para Enchoice
 If ExistTrigger(cCampo) // verifica se existe trigger para este campo
	RunTrigger(1,Nil,Nil,,cCampo)
Endif

//Para aCols
If ExistTrigger(cCampo) // verifica se existe trigger para este campo
    RunTrigger(2,n,nil,,cCampo)
Endif

Return( Nil )


</pre>
<p>&nbsp;</p>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Como verificar se campo possui gatilho <a href="https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/">aqui</a></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>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-executar-o-gatilho-de-um-campo-runtrigger/">Como executar o gatilho de um campo &#8211; RunTrigger</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-executar-o-gatilho-de-um-campo-runtrigger/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como verificar se existe gatilho para um campo &#8211; ExistTrigger</title>
		<link>https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/</link>
					<comments>https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Fri, 11 Dec 2020 14:21:00 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[ADVPL – Funções – Arquivos SXs]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Protheus]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=823</guid>

					<description><![CDATA[<p>Olá pessoal Algumas vezes precisamos verificar se um determinado campo possui gatinho, já sabemos que realizar um seek nas tabelas de dicionário deve ser evitado, então como realizar essa consulta? &#160; Para isso existe a função ExistTrigger , ela verificar se para determinado campo possui gatilhos no SX7e devolve True<a class="moretag" href="https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/">Como verificar se existe gatilho para um campo &#8211; ExistTrigger</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p>Algumas vezes precisamos verificar se um determinado campo possui gatinho, já sabemos que realizar um seek nas tabelas de dicionário deve ser evitado, então como realizar essa consulta?</p>
<p>&nbsp;</p>
<p>Para isso existe a função <strong>ExistTrigger</strong> , ela verificar se para determinado campo possui gatilhos no SX7e devolve True quando possuir ou False quando não possuir</p>
<h2 class="vc_custom_heading">Sintaxe</h2>
<p><span>ExistTrigger( &lt;cCampo&gt; )</span></p>
<p>&nbsp;</p>
<h2 class="vc_custom_heading">Parâmetros</h2>
<p>Necessário informar somente o nome do campo.</p>
<table class="avia-table avia-data-table avia-table-3 avia-builder-el-2 el_after_av_table el_before_av_table avia_pricing_default " itemscope="itemscope" itemtype="https://schema.org/Table">
<tbody>
<tr class="">
<td class=""><span>Par</span></td>
<td class=""><span>Nome</span></td>
<td class=""><span>Tipo</span></td>
<td class=""><span>Descrição</span></td>
<td class=""><span>Default</span></td>
<td class=""><span>Obg</span></td>
<td class=""><span>Ref</span></td>
</tr>
<tr class="">
<td class="">01</td>
<td class="">cCampo</td>
<td class="">Caracter</td>
<td class="">Campo a verificar</td>
<td class=""></td>
<td class="">X</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<h2 class="vc_custom_heading">Exemplo</h2>
<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} SPEXISTG
Função SPEXISTG, para exemplificar o uso da Função ExistTrigger().
@param Não recebe 
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Dez|2020
/*/
User Function SPEXISTG()
Local cCampo := 'A1_CGC'

If ExistTrigger( cCampo )
    MsgInfo( 'Campo: ' + cCampo + ENTER + &quot;Possui Gatilho.&quot;, 'SemPreju' )
else
    MsgInfo( 'Campo: ' + cCampo + ENTER + &quot;Não Possui Gatilho.&quot;, 'SemPreju' )
Endif
Return

</pre>
<p>Returno deverá ser semelhante a imagem abaixo:</p>
<p><img fetchpriority="high" decoding="async" src="https://sempreju.com.br/wp-content/uploads/2020/12/Exemplo-de-uso-ExistTrigger.png" alt="Exemplo de uso ExistTrigger" width="572" height="260" class="aligncenter size-full wp-image-826" srcset="https://sempreju.com.br/wp-content/uploads/2020/12/Exemplo-de-uso-ExistTrigger.png 572w, https://sempreju.com.br/wp-content/uploads/2020/12/Exemplo-de-uso-ExistTrigger-300x136.png 300w" sizes="(max-width: 572px) 100vw, 572px" /></p>
<p>&nbsp;</p>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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-verificar-se-existe-gatilho-para-um-campo-existtrigger/">Como verificar se existe gatilho para um campo &#8211; ExistTrigger</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-verificar-se-existe-gatilho-para-um-campo-existtrigger/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Entendendo o SX5 &#8211; Tabelas Genéricas do Protheus</title>
		<link>https://sempreju.com.br/entendendo-o-sx5-tabelas-genericas-do-protheus/</link>
					<comments>https://sempreju.com.br/entendendo-o-sx5-tabelas-genericas-do-protheus/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Mon, 07 Dec 2020 13:17:39 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[Configurador]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Protheus]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=813</guid>

					<description><![CDATA[<p>Olá pessoal Esta vez trouxe uma dica para facilitar o entendimento da SX5. O que é SX5 Algumas vezes precisamos de um cadastro simples com duas colunas  código e valor, por exemplo, estado e sua sigla, temos no Microsiga Protheus uma estrutura genéricas de tabelas. O principal ganho é em<a class="moretag" href="https://sempreju.com.br/entendendo-o-sx5-tabelas-genericas-do-protheus/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/entendendo-o-sx5-tabelas-genericas-do-protheus/">Entendendo o SX5 &#8211; Tabelas Genéricas do Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p><span>Esta vez trouxe uma dica para facilitar o entendimento da SX5.</span></p>
<div class="fullwidth">
<div class="vc_row wpb_row vc_row-fluid">
<div class="wpb_column vc_column_container vc_col-sm-12">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<h2 class="vc_custom_heading">O que é SX5</h2>
</div>
</div>
</div>
</div>
<p>Algumas vezes precisamos de um cadastro simples com duas colunas  código e valor, por exemplo, estado e sua sigla, temos no Microsiga Protheus uma estrutura genéricas de tabelas.</p>
<p>O principal ganho é em tempo, ao evitar que se crie mais uma tabela no banco de dados, crie rotinas para inclusão e consulta padrões para ela(LookUps).</p>
<p>Por padrão os valores das tabelas Genéricas são adicionados via o modulo de Configurador, que apenas os estão no grupo de Administradores tem acesso.</p>
<p>Devemos ficar atento, para identificarmos quando o uso do SX5 é uma boa ideia. Para isso tomamos como base duas simples de perguntas:</p>
<ol>
<li>O usuário comum irá poder adicionar dados nessa tabela?</li>
<li>É possível que num futuro essa tabela necessite de mais do que um campo valor?</li>
</ol>
<p>Quando respondemos sim para qualquer uma dessas perguntas, é bem provável que a tabela genérica não atenda as suas necessidades. O que ocorre quando respondemos sim para uma dessas perguntas.</p>
<ol>
<li>Se o usuário poderá adicionar os dados a tabela, é muito provável que precisaremos fazer validações sobre a entrada de dados dele, portanto uma rotina especifica é recomendada pois não temos mecanismos para efetuar isso na tabela Genérica; somente se ciarmos um fonte com essas tratativas chumbadas, o que pode não ser uma boa prática.</li>
<li>Caso se identifique que mais cedo ou mais tarde será necessário um ou mais campos na tabela não podemos o fazê-lo, pois o tabela é Genérica e não podemos criar um campo especifico apenas para sua tabela;</li>
</ol>
<div class="vc_row wpb_row vc_row-fluid">
<div class="wpb_column vc_column_container vc_col-sm-12">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<p><span style="font-size: 37px;">Estrutura SX5 Tabelas Genéricas</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="fullwidth">
<div class="vc_row wpb_row vc_row-fluid">
<div class="wpb_column vc_column_container vc_col-sm-12">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="vc_empty_space"><span class="vc_empty_space_inner"></span></div>
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<div class="table-responsive wprt_style_display">
<table class="confluenceTable table">
<tbody>
<tr>
<td class="confluenceTd"><strong>Campos</strong></td>
<td class="confluenceTd"><strong>Tipo</strong></td>
<td class="confluenceTd"><strong>Descrição</strong></td>
</tr>
<tr>
<td class="confluenceTd">X5_FILIAL</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Código da Filial do sistema</td>
</tr>
<tr>
<td class="confluenceTd">X5_TABELA</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Código da tabela que será utilizada como chave .</td>
</tr>
<tr>
<td class="confluenceTd">X5_CHAVE</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Código que pode ter 6 caracteres para identificação de um valor na tabela</td>
</tr>
<tr>
<td class="confluenceTd">X5_DESCRI</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Conteúdo no idioma Português</td>
</tr>
<tr>
<td class="confluenceTd">X5_DESCSPA</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Conteúdo  no idioma Espanhol</td>
</tr>
<tr>
<td class="confluenceTd">X5_DESCENG</td>
<td class="confluenceTd">Caracter</td>
<td class="confluenceTd">Conteúdo no idioma Inglês</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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/entendendo-o-sx5-tabelas-genericas-do-protheus/">Entendendo o SX5 &#8211; Tabelas Genéricas do Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/entendendo-o-sx5-tabelas-genericas-do-protheus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Criação de Módulos Específicos no Protheus</title>
		<link>https://sempreju.com.br/criacao-de-modulos-especificos-no-protheus/</link>
					<comments>https://sempreju.com.br/criacao-de-modulos-especificos-no-protheus/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Sun, 15 Nov 2020 15:30:46 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[Configurador]]></category>
		<category><![CDATA[ADVPL]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=794</guid>

					<description><![CDATA[<p>Olá pessoal Esta vez trouxe uma dica para quem está precisando adicionar um novo modulo? As vezes customizamos um processo inteiro em nosso cliente que as rotinas não se encaixam em nenhum módulo padrão! No Protheus existe opção de criação de até três módulos específicos. Na realidade eles já existem,<a class="moretag" href="https://sempreju.com.br/criacao-de-modulos-especificos-no-protheus/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/criacao-de-modulos-especificos-no-protheus/">Criação de Módulos Específicos no Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p><span>Esta vez trouxe uma dica para quem está precisando adicionar um novo modulo?</span></p>
<p>As vezes customizamos um processo inteiro em nosso cliente que as rotinas não se encaixam em nenhum módulo padrão!</p>
<p data-adtags-visited="true">No Protheus existe opção de criação de até três módulos específicos. Na realidade eles já existem, mas para que eles estejam disponíveis na escolha do módulos é necessário dar um nome a cada um deles como abaixo:</p>
<blockquote>
<p data-adtags-visited="true">
Não esqueça de dar permissão no configurador para o módulo e criar um menu =]</p>
</blockquote>
<p>Abaixo o código fonte, a rotina é bem simples basta compilar e executar para ver um exemplo.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#include 'totvs.ch'


/*/{Protheus.doc} SIGAESP - Módulo 97
Função ESPNOME - Define o nome para o módulo especifico - 97
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Out|2020
/*/
User Function ESPNOME
Return (&quot;Novo Modulo 97&quot;)

/*/{Protheus.doc} ESP1NOME - Módulo 98
Função ESP1NOME - Define o nome para o módulo especifico - 98
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Out|2020
/*/
User Function ESP1NOME
Return (&quot;Novo Modulo 98&quot;)

/*/{Protheus.doc} ESP2NOME - Módulo 99
Função ESP2NOME - Define o nome para o módulo especifico - 99
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Out|2020
/*/
User Function ESP2NOME
Return (&quot;Novo Modulo 98&quot;)


//Tambem temos assim o ponto de entrada de carregamento do sistema, o nome da função é o mesmo da chamado do programa inicial.
user Function SigaEsp()
Alert( Time() )
Return .t. 

</pre>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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/criacao-de-modulos-especificos-no-protheus/">Criação de Módulos Específicos no Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/criacao-de-modulos-especificos-no-protheus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como usar a classe TWebEngine e abrir páginas dentro do protheus</title>
		<link>https://sempreju.com.br/como-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/</link>
					<comments>https://sempreju.com.br/como-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Sun, 01 Nov 2020 12:00:36 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[ADVPL]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=797</guid>

					<description><![CDATA[<p>Olá pessoal Esta vez trouxe uma dica para quem está precisando abrir uma página dentro do protheus, a classe TWebEngine pode nos ajudar, abaixo no exemplo como executar a mesma, ainda é possivel usar webSockets para enviar e receber informações a página &#160; Documentação oficial da função aqui. aixo o<a class="moretag" href="https://sempreju.com.br/como-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/">Como usar a classe TWebEngine e abrir páginas dentro do protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p><span>Esta vez trouxe uma dica para quem está precisando abrir uma página dentro do protheus, a classe TWebEngine pode nos ajudar, abaixo no exemplo como executar a mesma, ainda é possivel usar webSockets para enviar e receber informações a página</span></p>
<p>&nbsp;</p>
<p>Documentação oficial da função <a href="https://tdn.totvs.com/display/tec/TWebEngine">aqui</a>.</p>
<p>aixo o código fonte, a rotina é bem simples basta compilar e executar para ver um exemplo.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#INCLUDE &quot;TOTVS.CH&quot;
#INCLUDE &quot;RWMAKE.CH&quot;


/*/{Protheus.doc} SPWEBENG
Função SPWEBENG exemplo de uso da classe TWebEngine
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Oct|2020
/*/
User Function SPWEBENG()
	If (aLLTRIM(FwRetIdiom()) =='en-us')
 		U_OpenPage('https://www.totvs.com/','TOTVS')
	Else
 		U_OpenPage('https://sempreju.com.br','Sempreju')
	Endif
Return


User Function OpenPage(cUrl,cTitle)
Local oModal
Local aSize           := {}
Local aObjects        := {} 
Local aInfo            := {} // Obt?m a a ?rea de trabalho e tamanho da dialog
Local nPort     :=  0
PRIVATE oWebChannel := TWebChannel():New()
PRIVATE oWebEngine 

DEFAULT cUrl	:=	&quot;https://sempreju.com.br&quot;
DEFAULT cTitle := cUrl
DEFAULT cRootPath	:=	&quot;/&quot;

aSize := MsAdvSize()
AAdd( aObjects, { 100, 100, .T., .T. } ) // Dados da Enchoice 
// Dados da ?rea de trabalho e separa??o
aInfo := { aSize&#x5B; 1 ], aSize&#x5B; 2 ], aSize&#x5B; 3 ], aSize&#x5B; 4 ], 3, 3 } 
aPosObj := MsObjSize( aInfo, aObjects,.T.)
DEFINE MSDIALOG oModal TITLE cTitle From aSize&#x5B;7],0 To aSize&#x5B;6],aSize&#x5B;5] of oMainWnd PIXEL // Usar sempre PIXEL !!!
    nPort := oWebChannel::connect()
    oWebEngine := TWebEngine():New(oModal, 0, 0, 100, 100,, nPort)
    //oWebEngine:cLang := FwRetIdiom() Only in smartclient higher than 19.3.1.0
    oWebEngine:bLoadFinished := {|self,url| conout(&quot;Fim do carregamento da pagina &quot; + url) }
    oWebEngine:navigate(cUrl)
    oWebEngine:Align := CONTROL_ALIGN_ALLCLIENT
  
  ACTIVATE DIALOG oModal CENTERED

Return
</pre>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/">Como usar a classe TWebEngine e abrir páginas dentro do protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-usar-a-classe-twebengine-e-abrir-paginas-dentro-do-protheus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como buscar valores no Appserver.ini e SmartClient.ini</title>
		<link>https://sempreju.com.br/como-buscar-valores-no-appserver/</link>
					<comments>https://sempreju.com.br/como-buscar-valores-no-appserver/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Mon, 12 Oct 2020 15:03:17 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Manipulação do arquivo de configuração *.INI]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=799</guid>

					<description><![CDATA[<p>Olá pessoal Esta vez trouxe uma dica para quem está precisando pegar informações do AppServer.ini ou do SmartCliente.ini e usar no ADVPL &#160; Ainda é possivel criar uma seção totalmente customizada e utilizar os mesmos recuros! legal né, então vamos ver como isso é simples! A documentação oficial da rotina<a class="moretag" href="https://sempreju.com.br/como-buscar-valores-no-appserver/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-buscar-valores-no-appserver/">Como buscar valores no Appserver.ini e SmartClient.ini</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p><span>Esta vez trouxe uma dica para quem está precisando pegar informações do AppServer.ini ou do SmartCliente.ini e usar no ADVPL</span></p>
<p>&nbsp;</p>
<p>Ainda é possivel criar uma seção totalmente customizada e utilizar os mesmos recuros! legal né, então vamos ver como isso é simples!</p>
<p>A documentação oficial da rotina pode ser encontrada <a href="https://tdn.totvs.com/display/tec/GetPvProfString">aqui</a>.</p>
<p>Abaixo o código fonte, a rotina é bem simples basta compilar e executar para ver um exemplo.</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;
#INCLUDE &quot;COLORS.CH&quot;
#INCLUDE &quot;FONT.CH&quot;  


/*/{Protheus.doc} SPCHAVIN
Função SPCHAVIN para buscar uma chave no ini e retornar o valor
@param chave e valor padrao 
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Mar|2020
/*/
User Function SPCHAVIN()          
Local cMensagem as Character        
Local cServerIni as Character        
Local cClientIni as Character
Local cSecao as Character
Local cChave as Character
Local cPadrao as Character


cServerIni := GetAdv97()
cClientIni := GetRemoteIniName()
cSecao := &quot;General&quot; //vamos ser os parametros da seção &#x5B;General]
cChave := &quot;InstallPath&quot; //qual chave queremos retornar o valor
cPadrao := &quot;NaoEncontrado&quot; //se nao encontrar esse é o valor padrao a ser retornado

cMensagem := &quot;Arquivo de configuração do servidor: &#x5B;&quot; + cServerIni + &quot;]&quot; + CRLF
cMensagem += &quot;  Seção &#x5B;&quot; + cSecao + &quot;] Chave &#x5B;&quot; + cChave + &quot;] Valor &#x5B;&quot; + ;
GetPvProfString(cSecao, cChave, cPadrao, cServerIni) + &quot;]&quot; + CRLF+ CRLF+ CRLF

cMensagem += &quot;Arquivo de configuração da estação: &#x5B;&quot; + cClientIni + &quot;]&quot; + CRLF
cMensagem += &quot;  Seção &#x5B;&quot; + cSecao + &quot;] Chave &#x5B;&quot; + cChave + &quot;] Valor &#x5B;&quot; + ;
GetPvProfString(cSecao, cChave, cPadrao, cClientIni) + &quot;]&quot; + CRLF
//+----------------------------------------------------------------------------+
//|Apresenta uma mensagem com os resultados obtidos                            |
//+----------------------------------------------------------------------------+
MsgInfo(cMensagem, &quot;Exemplo do GetPvProfString&quot;)


//é possivel assim criarmos uma chave customizada e usar ela em nossos fontes, como abaixo


cSecao := &quot;SEMPREJU&quot; //vamos ser os parametros da seção &#x5B;SEMPREJU]
cChave := &quot;url&quot; //qual chave queremos retornar o valor
cPadrao := &quot;URL Não encontrada&quot; //se nao encontrar esse é o valor padrao a ser retornado

cMensagem := &quot;Arquivo de configuração do servidor: &#x5B;&quot; + cServerIni + &quot;]&quot; + CRLF
cMensagem += &quot;  Seção &#x5B;&quot; + cSecao + &quot;] Chave &#x5B;&quot; + cChave + &quot;] Valor &#x5B;&quot; + ;
GetPvProfString(cSecao, cChave, cPadrao, cServerIni) + &quot;]&quot; + CRLF+ CRLF+ CRLF
//+----------------------------------------------------------------------------+
//|Apresenta uma mensagem com os resultados obtidos                            |
//+----------------------------------------------------------------------------+
MsgInfo(cMensagem, &quot;Exemplo do GetPvProfString&quot;)


Return .T.

</pre>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</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>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-buscar-valores-no-appserver/">Como buscar valores no Appserver.ini e SmartClient.ini</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-buscar-valores-no-appserver/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Facilitador para documentar customizações no Dicionário &#8211; Protheus</title>
		<link>https://sempreju.com.br/documentar-customizacoes-no-protheus/</link>
					<comments>https://sempreju.com.br/documentar-customizacoes-no-protheus/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Fri, 02 Oct 2020 13:00:07 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=787</guid>

					<description><![CDATA[<p>Olá pessoal Hoje vou postar uma rotina que eu uso para documentar as minhas alterações no dicionario de dados em Excel, para ser entregue ao cliente no final de um projeto. Abaixo o código fonte, a rotina é bem simples e tudo configurado em uma únida tela. #INCLUDE &#34;PROTHEUS.CH&#34; #INCLUDE<a class="moretag" href="https://sempreju.com.br/documentar-customizacoes-no-protheus/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/documentar-customizacoes-no-protheus/">Facilitador para documentar customizações no Dicionário &#8211; Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p>Hoje vou postar uma rotina que eu uso para documentar as minhas alterações no dicionario de dados em Excel, para ser entregue ao cliente no final de um projeto.</p>
<p>Abaixo o código fonte, a rotina é bem simples e tudo configurado em uma únida tela.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#INCLUDE &quot;PROTHEUS.CH&quot;    
#INCLUDE 'PARMTYPE.CH'
#INCLUDE &quot;FWMVCDEF.CH&quot;
#INCLUDE &quot;TOPCONN.CH&quot;
#include &quot;TOTVS.CH&quot;
#Include &quot;RWMAKE.CH&quot;

//define os campos que serão exportados
#DEFINE CSX2FIELD &quot;X2_CHAVE|X2_NOMEENG     |X2_NOME         |X2_MODO|X2_MODOUN  |X2_MODOEMP|X2_UNICO |      |&quot;
#DEFINE CSX2Label &quot;Key     |Name in English|Nome em Portuges|Mode   |Unit. Mode |Corp. Mode|Uniqe Key|Action|&quot;

#DEFINE CSIXFIELD &quot;INDICE|ORDEM|CHAVE|DESCENG      |DESCRICAO          |      |&quot;
#DEFINE CSIXLabel &quot;Table |Order|Key  |Title English|Titulo em Portugues|Action|&quot;

#DEFINE CSX1FIELD &quot;X1_GRUPO|X1_ORDEM|X1_PERENG    |X1_PERGUNT         |X1_TIPO|X1_TAMANHO|X1_DECIMAL|X1_GSC      |X1_F3         |X1_GRPSXG    |X1_VALID  |X1_VAR01|X1_PRESEL|X1_DEFENG1      |X1_DEF01           |X1_DEFENG2      |X1_DEF02           |X1_DEFENG3      |X1_DEF03           |X1_DEFENG4      |X1_DEF04           |X1_DEFENG5      |X1_DEF05           |X1_PICTURE|      |&quot;
#DEFINE CSX1Label &quot;Group   |Order   |Title English|Titulo em Portugues|Type   |Size      |Decimal   |Group fields|Standard Query|Group Fields |Validation|Variable|Selected |Option 1 English|Option 1 Portugues |Option 2 English|Option 2 Portugues |Option 3 English|Option 3 Portugues |Option 4 English|Option 4 Portugues |Option 5 English|Option 5 Portugues |Picture   |Action|&quot;

#DEFINE CSX6FIELD &quot;X6_VAR  |X6_TIPO|X6_DSCENG          |X6_DESCRIC            |X6_DSCENG1           |X6_DESC1                |X6_DSCENG2           |X6_DESC2                |X6_CONTENG|X6_VALID  |      |&quot;
#DEFINE CSX6Label &quot;Variable|Type   |Description English|Descricao em Portugues|Description English 1|Descricao em Portugues 1|Description English 2|Descricao em Portugues 2|Value     |Validation|Action|&quot;

#DEFINE CSX7FIELD &quot;X7_CAMPO|X7_SEQUENC|X7_REGRA|X7_CDOMIN|X7_TIPO|X7_SEEK|X7_ALIAS|X7_ORDEM|X7_CHAVE|X7_CONDIC|      |&quot;
#DEFINE CSX7Label &quot;Field   |Sequence  |Rule    |C. Domain|Type   |Seek   | Alias  |Order   |key     |Condition|Action|&quot;

#DEFINE CSXAFIELD &quot;XA_ALIAS|XA_TIPO|XA_ORDEM|XA_AGRUP|XA_DESCENG         |XA_DESCRIC            |      |&quot;
#DEFINE CSXALabel &quot;Alias   |Type   |Order   |Group   |Description English|Descricao em Portugues|Action|&quot;

#DEFINE CSXBFIELD &quot;XB_ALIAS|XB_TIPO|XB_SEQ  |XB_COLUNA|XB_DESCENG         |XB_DESCRI             |XB_CONTEM|      |&quot;
#DEFINE CSXBLabel &quot;Alias   |Type   |Sequence|Column   |Description English|Descricao em Portugues|Conteud  |Action|&quot;

#DEFINE CSX3FIELD &quot;SX3-&gt;X3_ARQUIVO  |SX3-&gt;X3_CAMPO   |cTypefield(SX3-&gt;X3_TIPO)  |SX3-&gt;X3_TAMANHO    |SX3-&gt;X3_DECIMAL    |SX3-&gt;X3_ORDEM  |SX3-&gt;X3_PICTURE    |SX3-&gt;X3_TITENG     |SX3-&gt;X3_DESCENG        |Ap5GetHelp(SX3-&gt;X3_CAMPO)   |SX3-&gt;X3_TITULO       |SX3-&gt;X3_DESCRIC         |Ap5GetHelp(SX3-&gt;X3_CAMPO)  |X3Uso()    |X3Obrigat(SX3-&gt;X3_CAMPO)   |IIF(SX3-&gt;X3_BROWSE=='S','Yes',IIF(SX3-&gt;X3_BROWSE=='N','No',''))    |SX3-&gt;X3_CBOXENG         |SX3-&gt;X3_CBOX         |IIF(SX3-&gt;X3_CONTEXT=='R','Real',IIF(SX3-&gt;X3_CONTEXT=='V','Virtual',''))   |SX3-&gt;X3_F3              |SX3-&gt;X3_RELACAO     |Iif(empty(SX3-&gt;X3_VALID),SX3-&gt;X3_VLDUSER,SX3-&gt;X3_VALID)          |SX3-&gt;X3_WHEN  |SX3-&gt;X3_GRPSXG            |SX3-&gt;X3_TRIGGER    |SX3-&gt;X3_INIBRW |SX3-&gt;X3_FOLDER |SX3-&gt;X3_AGRUP  |IIf(SX3-&gt;X3_PROPRI == 'U','Creation','Update')     |&quot;
#DEFINE CSX3Label &quot;File	            |Field	         |Type	                    |Size               |Decimal            |Order		    |Picture    		|Title English		|Description English    |Help English                |Titulo em Portugues  |Descricao em Portugues	|Help Portugues		        |Used		|Mandatory		            |Browse		                                                        |Combox(English)         |Combox(Portugues)    |Context		                                                              |Standard Search         |Standard Init       |Validation                                                       |When		     |Group of Fields		    |Trigger		    |Init Browse    |Folder 		|Grouping		|Action		                                        |&quot;


#Define ENTER	Chr(13)+Chr(10)

/*/{Protheus.doc} SPDOCAUT
Rotina responsavel por documentar dicionario de dados

@type function
@author Rafael Goncalves
@since Set|2020
/*/
User Function SPDOCAUT(cTGet1,cTGet2,cTGet3,cTGet4,cTGet5,cTGet6,cTGet7,cTGet8)

Default cTGet1 := space(250)
Default cTGet2 := space(250)
Default cTGet3 := space(250)
Default cTGet4 := space(250)
Default cTGet5 := space(250)
Default cTGet6 := space(250)
Default cTGet7 := space(250)
Default cTGet8 := space(250)

// Habilita interface com data mostrada com 4 digitos no ano
// e Habilita data em formato britânico ( Dia/Mes/Ano )
SET CENTURY ON
SET DATE BRITISH

cRmtBuild := GetBuild(.T.)
cRmtIp := GetclientIP()
cUsrName := LogUserName()
dRmtDate := GetRmtDate()
cRmtTime := GetRmtTime()
aRmtInfo := GetRmtInfo()
cRmtTmp := GetTempPath(.T.)
lActivex := IsPlugin()
lSSLConn := IsSecure()
cInfo := ''
cInfo += 'SmartClient Build ....... ' + cRmtBuild + ENTER
cInfo += 'SmartClient Activex ..... ' + IIF(lActivex,&quot;SIM&quot;,&quot;NAO&quot;) + ENTER
cInfo += 'SmartClient Connection .. ' + IIF(lSSLConn ,&quot;SSL&quot;,&quot;TCP&quot;) + ENTER
cInfo += 'SmartClient is 64 bits .. ' + IIF(IsRmt64() ,&quot;SIM&quot;,&quot;NAO&quot;) + ENTER
cInfo += 'Remote IP ............... ' + cRmtIp + ENTER
cInfo += 'Remote User Name ........ ' + cUsrName + ENTER
cInfo += 'Remote DateTime ......... ' + dtoc(dRmtDate)+' '+cRmtTime + ENTER
cInfo += 'Remote Temp Path ........ ' + cRmtTmp + ENTER
cInfo += 'Remote Computer Name .... ' + aRmtInfo&#x5B;1] + ENTER
cInfo += 'Remote O.S. ............. ' + aRmtInfo&#x5B;2] + ENTER
cInfo += 'Remote O.S. Detais ...... ' + aRmtInfo&#x5B;3] + ENTER
cInfo += 'Remote Memory (MB) ...... ' + aRmtInfo&#x5B;4] + ENTER
cInfo += 'Remote CPU Count ........ ' + aRmtInfo&#x5B;5] + ENTER
cInfo += 'Remote CPU MHZ .......... ' + aRmtInfo&#x5B;6] + ENTER
cInfo += 'Remote CPU String ....... ' + aRmtInfo&#x5B;7] + ENTER
cInfo += 'Remote O.S. Language .... ' + aRmtInfo&#x5B;8] + ENTER
cInfo += 'Remote Web Browser ...... ' + aRmtInfo&#x5B;9] + ENTER
cInfo += 'Remote Version .......... ' + RemoteXVersion()+ ENTER
cInfo += 'Remote Ini Patch ........ ' + GetRemoteIniName()+ ENTER
conout(cInfo)

//TODO remover
cTGet1 := &quot;SA1|SA2&quot; + space(250)
cTGet2 := &quot;A1_COD|A1_LOJA&quot;
cTGet3 := &quot;SA1|SA2_1&quot; + space(250)
cTGet4 := &quot;ACA890|ACA980&quot; + space(250)
cTGet5 := &quot;MV_330ATCM|MV_LOTE&quot; + space(250)
cTGet6 := &quot;A00_NIVAGR|A1_CGC_002&quot; + space(250)
cTGet7 := &quot;AA1|ABS|AD1_1&quot; + space(250)
cTGet8 := &quot;SA1|SA2|SA4&quot; + space(250)

/*If GetRemoteType() == 1  //nao for executado do menu
    RpcSetType(3)
    RpcSetEnv('00','102030')
    FSGERFILES(,,cTGet1, cTGet2, cTGet3, cTGet4, cTGet5, cTGet6, cTGet7, cTGet8)
else
*/

    DEFINE MSDIALOG oDlg FROM 0,0 TO 700,500 TITLE &quot;Fast Dictionary Production (F.D.P.) - V 1.0.0&quot; OF oMainWnd PIXEL

        nLin := 40
        //SX2
        oTGet1 := TGet():New( nLin+10,01, bSetGet( cTGet1 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SX2 - Table Key(X2_CHAVE) Ex. SA1|SA2|SF1|&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SX3
        //oTGet2 := TGet():New( nLin+10,01, bSetGet( cTGet2 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SX3 - Table File or specific field Ex. SA1|A1_COD&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        @ nLin+10,01 SAY oSay PROMPT 'Information for SX3 - Table File or specific field Ex. SA1|A1_COD' SIZE 250,09 OF oDlg PIXEL
        @ nLin+20,01 GET oGet VAR cTGet2 SIZE 248,60 MULTILINE OF oDlg PIXEL
               
        nLin += 80
        //SIX
        oTGet3 := TGet():New( nLin+10,01, bSetGet( cTGet3 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SIX - Index in total or Index+Order order Ex. SA1|SA1_1|SA1_5|&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SX1
        oTGet4 := TGet():New( nLin+10,01, bSetGet( cTGet4 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SX1 - Pergunte Group Ex. ACA180|ACA190|&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SX6
        oTGet5 := TGet():New( nLin+10,01, bSetGet( cTGet5 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SX6 - Parameter Code Ex. MV_330ATCM|MV_LOTE&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SX7
        oTGet6 := TGet():New( nLin+10,01, bSetGet( cTGet6 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SX7 - Trigger Field or Field+Sequenc Ex. A00_NIVAGR|A1_CGC_002&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SXA
        oTGet7 := TGet():New( nLin+10,01, bSetGet( cTGet7 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SXA - Folder Alias or Alias+Order Ex. AA1|ACA_1&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )
        nLin += 30
        //SXB
        oTGet8 := TGet():New( nLin+10,01, bSetGet( cTGet8 ),oDlg, 250,009,&quot;&quot;,/* &#x5B; bValid ]*/,/**nClrFore */,/**nClrBack */,/**oFont */,/**uParam12 */,/**uParam13 */, .t.,/**uParam15 */,/**uParam16 */, {|| .T.},/*uParam18*/ ,/**uParam19 */, /*bChange*/, /* lReadOnly */, /* lPassword */, /* uParam23 */, /* cReadVar */, /* uParam25 */, /* uParam26 */, /* uParam27 */, /* lHasButton */, /* lNoButton */, /* uParam30 */, &quot;Information for SXB - Standard Query  Alias Ex. SA1|SA2|SB1&quot;/* cLabelText */, 1/* nLabelPos */, /* oLabelFont */, /* nLabelColor */, /* cPlaceHold */, /* lPicturePriority */, /* lFocSel */ )

    ACTIVATE MSDIALOG oDlg CENTER ON INIT EnchoiceBar(oDlg,{|| nOpcA:= 1,;
        FWMsgRun(, {|oSay| FSGERFILES(oSay,oDlg,cTGet1, cTGet2, cTGet3, cTGet4, cTGet5, cTGet6, cTGet7, cTGet8) }, &quot;Processando&quot;, &quot;Aguarde Iniciando exportacao&quot;)},{|| oDlg:End() })
//Endif

Return .t.


/*/{Protheus.doc} FSGERFILES
Rotina gera arquivos
@type function
@author Rafael Goncalves
@since Set|2020
/*/
Static Function FSGERFILES(oSay,oDlg,cTGet1, cTGet2, cTGet3, cTGet4, cTGet5, cTGet6, cTGet7, cTGet8) as logical
Local _Ni as Numeric
Local _Nj as Numeric
Local lGerF as Logical
Local aGer as Array
Local aGer1 as Array
Local aFIELD as Array
Local aSX2 as Array
Local aSX3 as Array
Local aSIX as Array

Local aSX6 as Array
Local aSX7 as Array
Local aSXA as Array
Local aSXB as Array


//Excel Information
Local cArquivo    := GetTempPath()+'ExpDic_'+dtos(dDataBAse)+'_'+cvaltochar(hora())+'.xml'
Local oFWMSEx     := FWMsExcelEx():New()
Local oExcel

default oSay := nil
default oDlg := nil

lGerF := .F.
//Start SX2
If !Empty(alltrim(cTGet1))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gerando SX2&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSX2 := {}
    aGer := StrTokArr(alltrim(cTGet1), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSX2FIELD), '|' ) //Fields to export
    aLabel := StrTokArr(alltrim(CSX2Label), '|' ) //Labels to export
    For _Ni := 1 to len(aGer)
        //Found lines
        DbSelectArea(&quot;SX2&quot;)
        SX2-&gt;( dbSetOrder( 1 ) ) //ARQUIVO
        If SX2-&gt;( msSeek( aGer&#x5B;_Ni], .F. ) )
            //Loop Fields
            aGer1 := {}
            For _Nj := 1 to len(aFIELD)
                If !Empty(aFIELD&#x5B;_Nj])
                    aAdd(aGer1,alltrim(SX2-&gt;&amp;(aFIELD&#x5B;_Nj])))
                Elseif alltrim(aLabel&#x5B;_Nj]) == &quot;Action&quot;
                    /*If empty(SX2-&gt;X2_LOCTYP)
                        aAdd(aGer1,&quot;Creation&quot;)
                    Else
                        aAdd(aGer1,&quot;Update&quot;)
                    Endif */ 
                    aAdd(aGer1,&quot; &quot;)                    
                Else
                    aAdd(aGer1,&quot; &quot;)
                EndIf
            Next
            //add to array
            aAdd(aSX2,aGer1)
        Endif
    Next
Endif

//Start SX3

If !Empty(alltrim(cTGet2))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SX3&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSX3 := {}
    aGer := StrTokArr(alltrim(cTGet2), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSX3FIELD), '|' ) //Fields to export
    aLabel := StrTokArr(alltrim(CSX3Label), '|' ) //Labels to export
    For _Ni := 1 to len(aGer)
        //Checa se gera tabela toda ou um campo
        If len(aGer&#x5B;_Ni]) &lt; 4 //tabela toda
            SX3-&gt;(dbSetOrder(1))
            SX3-&gt;(msSeek(aGer&#x5B;_Ni]))
            While SX3-&gt;(!EOF()) .And.  SX3-&gt;X3_ARQUIVO == aGer&#x5B;_Ni]
                aGer1 := {}
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                        xValue:=&amp;(aFIELD&#x5B;_Nj])
                        If ValType(xValue) == 'C' //Char
                            aAdd(aGer1,alltrim(&amp;(aFIELD&#x5B;_Nj])))
                        ElseIf ValType(xValue) == 'L' //Char
                            IF xValue
                                aAdd(aGer1,&quot;Yes&quot;)
                            Else
                                aAdd(aGer1,&quot;No&quot;)     
                            EndIf                       
                        else
                            aAdd(aGer1,&amp;(aFIELD&#x5B;_Nj]))
                        Endif                        
                        //aAdd(aGer1,alltrim(SX3-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Elseif aLabel&#x5B;_Nj] == &quot;Action&quot;
                        /*If empty(SX3-&gt;X3_LOCTYP)
                            aAdd(aGer1,&quot;Creation&quot;)
                        Else
                            aAdd(aGer1,&quot;Update&quot;)
                        Endif */
                        aAdd(aGer1,&quot; &quot;)                   
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                //add to array
                aAdd(aSX3,aGer1)
                SX3-&gt;(dbSkip())
            EndDo
        Else //campo especifico
            DbSelectArea(&quot;SX3&quot;)
            SX3-&gt;(DbSetOrder(2))
            If SX3-&gt;(msSeek(aGer&#x5B;_Ni]))
                aGer1 := {}
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                        aAdd(aGer1,alltrim(&amp;(aFIELD&#x5B;_Nj])))
                    Elseif alltrim(aLabel&#x5B;_Nj]) == &quot;Action&quot;
                        /*If empty(SX3-&gt;X3_LOCTYP)
                            aAdd(aGer1,&quot;Creation&quot;)
                        Else
                            aAdd(aGer1,&quot;Update&quot;)
                        Endif */ 
                        aAdd(aGer1,&quot; &quot;)                    
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                //add to array
                aAdd(aSX3,aGer1)
                //cTitulo := TRIM(X3Titulo())
            EndIf
        Endif
    Next
Endif

//Start SIX
If !Empty(alltrim(cTGet3))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SIX&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSIX := {}
    aGer := StrTokArr(alltrim(cTGet3), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSIXFIELD), '|' ) //Fields to export
    aLabel := StrTokArr(alltrim(CSIXLabel), '|' ) //Labels to export
    For _Ni := 1 to len(aGer)
        //Information for SIX - Index in total or Index+Order order Ex. SA1|SA1_1|SA1_5|
        cKey := aGer&#x5B;_Ni]
        If !len(aGer&#x5B;_Ni])&lt;4 //expecific
            cKey := substring(aGer&#x5B;_Ni],1,3) + substring(aGer&#x5B;_Ni],5,len(aGer&#x5B;_Ni]))
        Endif

        //Found lines
        dbSelectArea(&quot;SIX&quot;)
        SIX-&gt;( dbSetOrder( 1 ) ) //ARQUIVO
        If SIX-&gt;( msSeek( cKey, .F. ) )
            While !eof() .and. (SIX-&gt;INDICE == cKey .or. SIX-&gt;INDICE+SIX-&gt;ORDEM == cKey)
                //Loop Fields
                aGer1 := {}
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                        aAdd(aGer1,alltrim(SIX-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Elseif aLabel&#x5B;_Nj] == &quot;Action&quot;
                        /*If empty(SIX-&gt;IX_LOCTYP)
                            aAdd(aGer1,&quot;Creation&quot;)
                        Else
                            aAdd(aGer1,&quot;Update&quot;)
                        Endif */
                        aAdd(aGer1,&quot; &quot;)                     
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next

                //add to array
                aAdd(aSIX,aGer1)

                dbSelectArea(&quot;SIX&quot;)
                SIX-&gt;(DbSkip())
            EndDo

        Endif
    Next
Endif


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////// E X P O R T   S X 1 //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

If !Empty(alltrim(cTGet4))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SX1&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSX1 := {}
    aGer := StrTokArr(alltrim(cTGet4), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSX1FIELD), '|' ) //Fields to export
    For _Ni := 1 to len(aGer)
        //Found lines
        dbSelectArea(&quot;SX1&quot;)
        SX1-&gt;( dbSetOrder( 1 ) )
        If SX1-&gt;( msSeek( aGer&#x5B;_Ni], .F. ) )
            While !eof() .and. (alltrim(SX1-&gt;X1_GRUPO) == alltrim(aGer&#x5B;_Ni]) )
                //Loop Fields
                aGer1 := {}
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                        aAdd(aGer1,(SX1-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                //add to array
                aAdd(aSX1,aGer1)
                dbSelectArea(&quot;SX1&quot;)
                SX1-&gt;(DbSkip())
            EndDo

        Endif
    Next
Endif


/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////// E X P O R T   S X 6 //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

If !Empty(alltrim(cTGet5))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SX6&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSX6 := {}
    aGer := StrTokArr(alltrim(cTGet5), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSX6FIELD), '|' ) //Fields to export
    aLabel := StrTokArr(alltrim(CSX6Label), '|' ) //Labels to export
    For _Ni := 1 to len(aGer)
        //Found lines
        dbSelectArea(&quot;SX6&quot;)
        SX6-&gt;( dbSetOrder( 1 ) )
        If SX6-&gt;( msSeek(xFilial('SX6') +  aGer&#x5B;_Ni], .F. ) )
            aGer1 := {}
            For _Nj := 1 to len(aFIELD)
                If !Empty(aFIELD&#x5B;_Nj])
                    aAdd(aGer1,alltrim(SX6-&gt;&amp;(aFIELD&#x5B;_Nj])))
                Elseif aLabel&#x5B;_Nj] == &quot;Action&quot;
                    /*If empty(SIX-&gt;IX_LOCTYP)
                        aAdd(aGer1,&quot;Creation&quot;)
                    Else
                        aAdd(aGer1,&quot;Update&quot;)
                    Endif*/
                    aAdd(aGer1,&quot; &quot;)                      
                Else
                    aAdd(aGer1,&quot; &quot;)
                EndIf
            Next
            //add to array
            aAdd(aSX6,aGer1)
        Endif
    Next
Endif





/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////// E X P O R T   S X 7 //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

If !Empty(alltrim(cTGet6))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SX7&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSX7 := {}
    aGer := StrTokArr(alltrim(cTGet6), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSX7FIELD), '|' ) //Fields to export
    For _Ni := 1 to len(aGer)
        //Found lines
        dbSelectArea(&quot;SX7&quot;)
        SX7-&gt;( dbSetOrder( 1 ) )
        If SX7-&gt;( msSeek( aGer&#x5B;_Ni], .F. ) )
            While SX7-&gt;X7_CAMPO == aGer&#x5B;_Ni]
                aGer1 := {}                    
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                    aAdd(aGer1,alltrim(SX7-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                SX7-&gt;(DbSkip())
                //add to array
                aAdd(aSX7,aGer1)                
            EndDo
        Endif
    Next
Endif



/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////// E X P O R T   S X A //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

If !Empty(alltrim(cTGet7))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SXA&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSXA := {}
    aGer := StrTokArr(alltrim(cTGet7), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSXAFIELD), '|' ) //Fields to export
    For _Ni := 1 to len(aGer)
        //Found lines
        dbSelectArea(&quot;SXA&quot;)
//        SX7-&gt;( dbSetOrder( 1 ) )
        cIndex := CriaTrab(Nil, .F.)
        cChave := IndexKey()
        IndRegua(&quot;SXA&quot;, cIndex, &quot;XA_ALIAS + XA_TIPO + XA_ORDEM&quot;, , , &quot;Selecionando Registros...&quot;)
		nIndex := RetIndex(&quot;SXA&quot;) + 1        
        dbSelectArea(&quot;SXA&quot;)
		dbSetOrder(nIndex)

        If SXA-&gt;( msSeek( aGer&#x5B;_Ni], .F. ) )
            While SXA-&gt;XA_ALIAS == aGer&#x5B;_Ni]
                aGer1 := {}                    
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                    aAdd(aGer1,alltrim(SXA-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                SXA-&gt;(DbSkip())
                //add to array
                aAdd(aSXA,aGer1)                
            EndDo
        Endif
    Next
Endif




/////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////// E X P O R T   S X B //////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////

If !Empty(alltrim(cTGet8))
    lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando SXB&quot;
        ProcessMessages()
    Endif
    aGer := {}
    aSXB := {}
    aGer := StrTokArr(alltrim(cTGet8), '|' ) //default optional fields
    aFIELD := StrTokArr(alltrim(CSXBFIELD), '|' ) //Fields to export
    For _Ni := 1 to len(aGer)
        //Found lines
        dbSelectArea(&quot;SXB&quot;)
        SXB-&gt;( dbSetOrder( 1 ) )
        If SXB-&gt;( msSeek(aGer&#x5B;_Ni], .F. ) )
            While alltrim(SXB-&gt;XB_ALIAS) == alltrim(aGer&#x5B;_Ni])
                aGer1 := {}
                For _Nj := 1 to len(aFIELD)
                    If !Empty(aFIELD&#x5B;_Nj])
                        aAdd(aGer1,alltrim(SXB-&gt;&amp;(aFIELD&#x5B;_Nj])))
                    Else
                        aAdd(aGer1,&quot; &quot;)
                    EndIf
                Next
                //add to array
                aAdd(aSXB,aGer1)
                SXB-&gt;(DbSkip())
            EndDo
        Endif
    Next
Endif


//Create Excel with informations
If lGerF := .T.
    If (GetRemoteType() == 1)
        oSay:cCaption := &quot;Gereando Excel&quot;
        ProcessMessages()
    Endif

    //SX2 Folder
    If !Empty(alltrim(cTGet1))
        aLabel := StrTokArr(alltrim(CSX2Label), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SX2&quot;,&quot;Table Information&quot;,aSX2,aLabel)
    EndIf

    //SX3 Folder
    If !Empty(alltrim(cTGet2))
        aLabel := StrTokArr(alltrim(CSX3Label), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SX3&quot;,&quot;Fields Information&quot;,aSX3,aLabel)
    EndIf

    //SIX Folder
    If !Empty(alltrim(cTGet3))
        aLabel := StrTokArr(alltrim(CSIXLabel), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SIX&quot;,&quot;Index Information&quot;,aSIX,aLabel)
    EndIf

    //SX1 Folder
    If !Empty(alltrim(cTGet4))
        aLabel := StrTokArr(alltrim(CSX1Label), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SX1&quot;,&quot;Question Information&quot;,aSX1,aLabel)
    EndIf

    //SX6 Folder
    If !Empty(alltrim(cTGet5))
        aLabel := StrTokArr(alltrim(CSX6Label), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SX6&quot;,&quot;Parameter Information&quot;,aSX6,aLabel)
    EndIf

    //SX7 Folder
    If !Empty(alltrim(cTGet6))
        aLabel := StrTokArr(alltrim(CSX7Label), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SX7&quot;,&quot;Triguer Information&quot;,aSX7,aLabel)
    EndIf

    //SXA Folder
    If !Empty(alltrim(cTGet7))
        aLabel := StrTokArr(alltrim(CSXALabel), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SXA&quot;,&quot;Grouping Information&quot;,aSXA,aLabel)
    EndIf

    //SXA Folder
    If !Empty(alltrim(cTGet8))
        aLabel := StrTokArr(alltrim(CSXBLabel ), '|' ) //Labels to export
        FSTABLE(@oFWMSEx,&quot;SXB&quot;,&quot;Standard Query Information&quot;,aSXB,aLabel)
    EndIf

    //Criando o XML
    oFWMSEx:Activate()
    oFWMSEx:GetXMLFile(cArquivo)

    //Abrindo o excel e abrindo o arquivo xml
    oExcel := MsExcel():New()               //Abre uma nova conexão com Excel
    oExcel:WorkBooks:Open(cArquivo)         //Abre uma planilha
    oExcel:SetVisible(.T.)                  //Visualiza a planilha
    oExcel:Destroy()                        //Encerra o processo do gerenciador de tarefas
Endif

If !(GetRemoteType() == 1)
    msginfo(&quot;Gerados&quot;)
Else
    Conout(&quot;End table creation&quot;)
Endif



return .t.



//Gera a tabela
Static function FSTABLE(oFWMSEx,cTable,cDesc,aInfo,aLabel) as logical
Local _Ni as Numeric
Local _Nj as Numeric
 //Criando a Aba Teste 1
oFWMSEx:AddworkSheet(cTable)
    //Adicionando a tabela
    oFWMSEx:AddTable (cTable,cDesc)
        //Adicionando as colunas
        oFWMSEx:AddColumn(cTable,cDesc,&quot;Atribute&quot;,1,1)
        oFWMSEx:AddColumn(cTable,cDesc,&quot;Value&quot;   ,1,1)

        //Adicionando Linhas
        //aLabel := StrTokArr(alltrim(CSX2Label), '|' ) //Labels to export
        For _Ni := 1 to len(aInfo) //Loop informations
            //Define colors
            oFWMSEx:SetCelFrColor(&quot;#FFFFFF&quot;)
            oFWMSEx:SetCelBgColor(&quot;#4682B4&quot;)
            //headers
            For _Nj := 1 to len(aLabel) //loop campos
                //aAdd(aGer1,alltrim(SX2-&gt;&amp;(aFIELD&#x5B;_Nj])))
                oFWMSEx:AddRow(cTable,cDesc,{alltrim(aLabel&#x5B;_Nj]),(aInfo&#x5B;_Ni,_Nj])},{1})
            Next

            //Pula uma linha
            oFWMSEx:SetCelFrColor(&quot;#FFFFFF&quot;)
            oFWMSEx:SetCelBgColor(&quot;#FFFFFF&quot;)
            oFWMSEx:AddRow(cTable,cDesc,{&quot; &quot;,&quot; &quot;},{1,2})
        Next

return .t.



Static Function cTypefield(cChar)
    Local cRet as Character 
    cRet:=&quot;&quot;
    If cChar == 'C'
        cRet:=&quot;Character&quot;
    ElseIf cChar == 'D'
        cRet:=&quot;Date&quot;
    ElseIf cChar == 'N'
        cRet:=&quot;Numeric&quot;
    Else
        cRet:=&quot;Unknow&quot;
    Endif     

return cRet

</pre>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Ponto de entrada ao acessar o sistema <a href="https://sempreju.com.br/executando-rotinas-ao-abrir-um-modulo-afterlogin-advpl/">aqui</a>.</p>
<p>Aprenda a instalar o Protheus <a href="https://sempreju.com.br/como-instalar-o-protheus-appserver-e-smartclient-parte-5/">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/documentar-customizacoes-no-protheus/">Facilitador para documentar customizações no Dicionário &#8211; Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/documentar-customizacoes-no-protheus/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Como usar a função FieldPos no advpl</title>
		<link>https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/</link>
					<comments>https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Sat, 23 May 2020 18:13:12 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=648</guid>

					<description><![CDATA[<p>Muitas vezes quando programamos em ADVPL conseguimos reutilizar fontes de outros projetos no que estamos atuando, porem alguns campos podem não serem importantes ou não estarem presentes no novo ambiente. Neste caso é uma boa prática proteger o nosso código verificando se o campo realmente existe antes de trabalharmos com<a class="moretag" href="https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/">Como usar a função FieldPos no advpl</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Muitas vezes quando programamos em ADVPL conseguimos reutilizar fontes de outros projetos no que estamos atuando, porem alguns campos podem não serem importantes ou não estarem presentes no novo ambiente. Neste caso é uma boa prática proteger o nosso código verificando se o campo realmente existe antes de trabalharmos com ele. Para isso, podemos utilizar uma função chamada <strong>FieldPos</strong>().</p>
<p>A função FieldPos tem a funcionalidade de retornar a posição de um determinado campo dentro da estrutura do alias corrente. Caso o campo não exista na estrutura, é retornado zero.</p>
<p>&nbsp;</p>
<p>Abaixo um exemplo onde verificamos se o campo A1_ZCOD existe em nosso ambiente.</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} SPFLDPOS
Função SPFLDPOS, para exemplificar o uso da função FieldPos().
@param Não recebe parâmetros
@return Não retorna nada
@author Rafael Goncalves
@owner sempreju.com.br
@version Protheus 12
@since Mai|2020
/*/
User Function SPFLDPOS()
	Local cMsgHead := &quot;TDRFocus - Conhecimento sem limite&quot;
	//-&gt; Verifica se o novo campo existe.
	If FieldPos(&quot;A1_ZCOD&quot;) &gt; 0
		MsgInfo(&quot;O campo A1_ZCOD existe!&quot;, cMsgHead)
	Else
		MsgStop(&quot;O campo A1_ZCOD não existe!&quot;, cMsgHead)
	EndIf
Return
</pre>
<p>&nbsp;</p>
<p><strong><em>Não deixe de assinar a nossa newsletter e fica por dentro de todos os post.</em></strong></p>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso<span> </span><a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Aprenda a instalar o Protheus<span> </span><a href="https://sempreju.com.br/como-instalar-o-protheus-appserver-e-smartclient-parte-5/">aqui</a>.</p>
<p>Retornar datas por extenso<span> </span><a href="https://sempreju.com.br/datas-por-extenso-no-protheus/">aqui</a>.</p>
<p>Barras de progresso<span> </span><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>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>O post <a href="https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/">Como usar a função FieldPos no advpl</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-usar-a-funcao-fieldpos-no-advpl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Remover o botão de fechar de uma Dialog no Protheus</title>
		<link>https://sempreju.com.br/advpl_remover_botao_de_fechar_na_dialog/</link>
					<comments>https://sempreju.com.br/advpl_remover_botao_de_fechar_na_dialog/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Wed, 29 Apr 2020 15:48:57 +0000</pubDate>
				<category><![CDATA[ADVPL - Dicas]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=659</guid>

					<description><![CDATA[<p>Quando criamos uma dialog no protheus, automaticamente é adicionado o botão de fechar na barra superior, mas em algumas ocasiões queremos que o usuario execute alguma ação e não feche esta janela, vamos usar um fonte que alem de ter essas configurações, tambem fechará automaticamente após determiado tempo. &#160; Na<a class="moretag" href="https://sempreju.com.br/advpl_remover_botao_de_fechar_na_dialog/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/advpl_remover_botao_de_fechar_na_dialog/">Remover o botão de fechar de uma Dialog no Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Quando criamos uma dialog no protheus, automaticamente é adicionado o botão de fechar na barra superior, mas em algumas ocasiões queremos que o usuario execute alguma ação e não feche esta janela, vamos usar um fonte que alem de ter essas configurações, tambem fechará automaticamente após determiado tempo.</p>
<p>&nbsp;</p>
<p>Na linha de implementação da dialog, podemos adicionar o comando para definir o style <b>DS_MODALFRAME, </b>ficando o final da linha toda como <b>STYLE DS_MODALFRAME.</b></p>
<p>&nbsp;</p>
<p>Ainda podemos remover a funcionalidade de fechar a janela ao pressionar a tecla de escape <strong>ESC</strong>, para isso devemos alterar a pripriedade <strong>DIALOG:lEscClose := .F.</strong></p>
<p>Aaixo o exemplo completo usado nesse post</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;

User Function SPDIALO()
Local nTimeMsg as numeric

nTimeMsg := 60000 //defini um minuto para fechar a janela

//Adiciona linha no array com as cores
DEFINE 	MSDIALOG oDlg FROM  36,1 TO 300,540 TITLE &quot;Fecha Automatico&quot; PIXEL STYLE DS_MODALFRAME //dialog sem o X para fechar
    oDlg:lEscClose := .F. //desabilita fechar a janela ao pressinar esc.
    oDlg:lCentered := .T. //abre a janela centralizado.


    @ 0.5, 1.8 Say &quot;Esta tela será finalizada automaticamente em &quot; Of oDlg	
    @ 1.5, 1.8 Say AllTrim(Str((nTimeMsg/1000)/60))+&quot; minutos.&quot;	 Of oDlg	


    oTimer2:= TTimer():New(nTimeMsg,{|| oDlg:End() },oDlg)
    oTimer2:Activate()

    DEFINE SBUTTON 	FROM 05, (oDlg:nRight / 2) - 40  TYPE 2  ENABLE OF oDlg ACTION ( oDlg:End() )
ACTIVATE MSDIALOG oDlg CENTERED
Return .T.

</pre>
<p>&nbsp;</p>
<p><strong><em>Não deixe de assinar a nossa newsletter e fica por dentro de todos os post.</em></strong></p>
<p>O código fonte desse e outros exemplos podem ser encontrados em nosso <a href="https://github.com/llrafaell/SemPreju-Exemplos">git</a>.</p>
<p>Documentação original <a href="https://tdn.totvs.com/display/tec/WebApp+-+Configurando+nativamente+o+Application+Server+como+servidor+Web">aqui</a>.</p>
<p><em>Post interessantes:</em></p>
<p>Aprenda a instalar o Protheus <a href="https://sempreju.com.br/como-instalar-o-protheus-appserver-e-smartclient-parte-5/">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>Aprenda usar o FieldPos <a href="https://sempreju.com.br/como-usar-a-funcao-fieldpos-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/advpl_remover_botao_de_fechar_na_dialog/">Remover o botão de fechar de uma Dialog no Protheus</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/advpl_remover_botao_de_fechar_na_dialog/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
