<?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 &#8211; Sem Preju</title>
	<atom:link href="https://sempreju.com.br/tag/advpl/feed/" rel="self" type="application/rss+xml" />
	<link>https://sempreju.com.br/tag/advpl/</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>Alterando para o novo visual do Protheus com PO UI</title>
		<link>https://sempreju.com.br/novo-vizual-do-protheus/</link>
					<comments>https://sempreju.com.br/novo-vizual-do-protheus/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Tue, 15 Dec 2020 13:43:41 +0000</pubDate>
				<category><![CDATA[ADVPL - REST]]></category>
		<category><![CDATA[Configurador]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Protheus]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=815</guid>

					<description><![CDATA[<p>Olá pessoal, já conferiram o novo visual do protheus? Com a evolução da tecnologia, o Protheus veio se adaptando e evoluindo conforme as necessidades do mercado, um avanço mesmo por exemplo, foi a utilização de CSS nos componentes gráficos, através das funcionalidades fornecidas com o usdo to TWebEngine e FWCallApp,<a class="moretag" href="https://sempreju.com.br/novo-vizual-do-protheus/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/novo-vizual-do-protheus/">Alterando para o novo visual do Protheus com PO UI</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal, já conferiram o novo visual do protheus?</p>
<p>Com a evolução da tecnologia, o Protheus veio se adaptando e evoluindo conforme as necessidades do mercado, um avanço mesmo por exemplo, foi a utilização de CSS nos componentes gráficos, através das funcionalidades fornecidas com o usdo to TWebEngine e FWCallApp, será possível criar aplicações com o visual e recursos usados na web, ou seja visualmente mais modernos, e através de REST integrá-las com o Protheus.</p>
<p>A documentação (inclusive em como ativar) você confere em<span> </span><a href="https://tdn.totvs.com/display/framework/Nova+interface+do+Protheus+com+PO+UI">https://tdn.totvs.com/display/framework/Nova+interface+do+Protheus+com+PO+UI</a></p>
<p><span>Nessa primeira fase, a novidade chega com a tela de login e a de seleção de ambiente, abaixo o print do novo visual.</span></p>
<p><img decoding="async" src="https://tdn.totvs.com/download/attachments/573183963/2020-11-18%2016_52_57-TOTVS%20Constru%C3%A7%C3%A3o%20e%20Projetos%20%28TOTVS%29%2002.9.0099.png?version=1&amp;modificationDate=1605901009927&amp;api=v2" /></p>
<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/novo-vizual-do-protheus/">Alterando para o novo visual do Protheus com PO UI</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/novo-vizual-do-protheus/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>Como atualizar os arquivos de Help dos Campos &#8211; Completo</title>
		<link>https://sempreju.com.br/como-atualizar-o-help-de-campo/</link>
					<comments>https://sempreju.com.br/como-atualizar-o-help-de-campo/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Tue, 08 Dec 2020 17:53:26 +0000</pubDate>
				<category><![CDATA[Administração]]></category>
		<category><![CDATA[Configurador]]></category>
		<category><![CDATA[ADVPL]]></category>
		<category><![CDATA[Protheus]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=817</guid>

					<description><![CDATA[<p>Olá pessoal Segue como realizar a atualização do help dos campos, auxiliando o usuário na identificação de ajuda. &#160; Primeiramente faça o download do arquivo, seguindo as etapas abaixo: &#8211; Portal do Cliente: http://suporte.totvs.com &#8211; Menu Downloads e Atualizações &#8211; Linha Protheus &#8211; Microsiga Protheus Versão 12.1.XX (onde XX é a<a class="moretag" href="https://sempreju.com.br/como-atualizar-o-help-de-campo/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/como-atualizar-o-help-de-campo/">Como atualizar os arquivos de Help dos Campos &#8211; Completo</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Olá pessoal</p>
<p>Segue como realizar a atualização do help dos campos, auxiliando o usuário na identificação de ajuda.</p>
<p>&nbsp;</p>
<p>Primeiramente faça o download do arquivo, seguindo as etapas abaixo:</p>
<p><span>&#8211; Portal do Cliente: </span><a href="http://suporte.totvs.com/" class="external-link" rel="nofollow">http://suporte.totvs.com</a><br />
<span>&#8211; Menu Downloads e Atualizações</span><br />
<span>&#8211; Linha Protheus</span><br />
<span>&#8211; Microsiga Protheus Versão 12.1.XX (onde XX é a Release do seu P12)</span><br />
<span>&#8211; Todos</span><br />
<span>&#8211; Categoria: Help de campo/pergunta</span><br />
<span>&#8211; Baixe os arquivos HELPS DE CAMPOS/PERGUNTAS DIFERENCIAL &#8211; BRASIL e HELPS DE CAMPOS/PERGUNTAS COMPLETO &#8211; BRASIL</span></p>
<p>&nbsp;</p>
<p>Após baixar o pacote, descompacte os arquivos .txt para dentro da pasta<span> </span><strong>Systemload</strong><span> </span>do Protheus.</p>
<p>Para atualizar, pare o serviço do Protheus, acesse o módulo 99-Configurador, navegue em Atualizações / Help / Atualização do Help</p>
<p>&nbsp;</p>
<p>Aguarde o processamento para a atualizar todos os help.</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-atualizar-o-help-de-campo/">Como atualizar os arquivos de Help dos Campos &#8211; Completo</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/como-atualizar-o-help-de-campo/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>Classe ClassMethArr</title>
		<link>https://sempreju.com.br/classe-classmetharr/</link>
					<comments>https://sempreju.com.br/classe-classmetharr/#respond</comments>
		
		<dc:creator><![CDATA[Rafael Gonçalves]]></dc:creator>
		<pubDate>Thu, 16 Jan 2020 18:53:01 +0000</pubDate>
				<category><![CDATA[ADVPL]]></category>
		<guid isPermaLink="false">https://sempreju.com.br/?p=452</guid>

					<description><![CDATA[<p>As vezes queremos saber todos os métodos de um determinado objeto, durante o debug conseguimos visualizar os métodos mas como poderíamos salvar todos eles? Ai que entra a classe ClassMethArr, essa classe retorna um array multidimensional com todas as informações sobre os métodos do objeto passado no parâmetro. Exemplo de<a class="moretag" href="https://sempreju.com.br/classe-classmetharr/"> Leia mais&#8230;</a></p>
<p>O post <a href="https://sempreju.com.br/classe-classmetharr/">Classe ClassMethArr</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>As vezes queremos saber todos os métodos de um determinado objeto, durante o debug conseguimos visualizar os métodos mas como poderíamos salvar todos eles?</p>
<p>Ai que entra a classe <a href="https://tdn.totvs.com/display/tec/ClassMethArr">ClassMethArr</a>, essa classe retorna um array multidimensional com todas as informações sobre os métodos do objeto passado no parâmetro.</p>
<p>Exemplo de uso do código pode ser baixado <a href="https://github.com/llrafaell/SemPreju-Exemplos/blob/master/Exemplos/Classes/SPCLASSM.PRW">aqui</a>.</p>
<pre class="brush: cpp; light: false; title: ; toolbar: true; notranslate">
#Include &quot;Protheus.ch&quot;

/*/{Protheus.doc} areaQuad
Essa classe retorna um array multidimensional com todas as informações sobre os métodos do objeto passado no parâmetro.
@type function
@author  Rafael Gonçalves
@since janeiro/2020
@version 12.1.25
@param nil
@return nil
/*/
user function sempreju()
    u_SPCLASSM()
return

User Function SPCLASSM()

//Exemplo de objeto
oMsDialog := MSDialog():New(180,180,550,700,'Exemplo MSDialog',,,,,CLR_BLACK,CLR_WHITE,,,.T.)

//Parametro 1 - Objeto
//Parametro 2 - Se verdadeiro (.T.) retorna todos os parametros, inclusive os parâmetros herdados de outras classes, adiciona o nome da classe na 3ª coluna do array
aMethods := ClassMethArr(oMsDialog, .T.)
cMethods := PadR(&quot;METHOD&quot;, 30) + &quot;|OWNER&quot; + CRLF

//Concateno todas as informações
For nI := 01 To Len(aMethods)
    cMethods += PadR(AllTrim(aMethods&#x5B;nI, 01]), 30) + &quot;|&quot; + AllTrim(aMethods&#x5B;nI, 03]) + CRLF
Next nI

//Salvo
MemoWrite(&quot;D:\Rafael\Workspace_SemPreju\SemPreju-Exemplos\Exemplos\Classes\FWMBrowse_Methods.txt&quot;, cMethods) //Salva resultado da ClassMethArr

Return .t.

</pre>
<p>Bom pessoal, por hoje é só. Qualquer dúvida ou seguestão entre em contato</p>
<p>Abraços e até a próxima.</p>
<p>O post <a href="https://sempreju.com.br/classe-classmetharr/">Classe ClassMethArr</a> apareceu primeiro em <a href="https://sempreju.com.br">Sem Preju</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sempreju.com.br/classe-classmetharr/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
