<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Leandro Lemos</title>
    <description>The latest articles on DEV Community by Leandro Lemos (@lemossleandro).</description>
    <link>https://dev.to/lemossleandro</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F624478%2F49ff4757-4431-45de-8e9b-f72954db683e.jpeg</url>
      <title>DEV Community: Leandro Lemos</title>
      <link>https://dev.to/lemossleandro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lemossleandro"/>
    <language>en</language>
    <item>
      <title>Consulta Especifica com retorno em variável</title>
      <dc:creator>Leandro Lemos</dc:creator>
      <pubDate>Thu, 10 Nov 2022 12:47:39 +0000</pubDate>
      <link>https://dev.to/lemossleandro/consulta-especifica-com-retorno-em-variavel-365p</link>
      <guid>https://dev.to/lemossleandro/consulta-especifica-com-retorno-em-variavel-365p</guid>
      <description>&lt;p&gt;Prezados, recentemente recebi uma demanda para incluir um campo no Item do Orçamento(SCK) onde fosse possível pesquisar o fornecedor ou digitar um nome com texto livre.&lt;br&gt;
Esse campo deveria ter uma consulta padrão(F3) e o retorno da consulta deveria ser no formato Código do Fornecedor / Loja - Razão Social em outras palavras SA2-&amp;gt;A2_COD+'/'+SA2-&amp;gt;A2_LOJA+'-'+A2_NOME, então precisei incluir uma Consulta Especifica&lt;/p&gt;

&lt;p&gt;Mas qual o problema? Poderia simplesmente alterar o retorno da função de lógico para caractere e resolvido. &lt;br&gt;
Ai que está o problema, a função utilizada como expressão na consulta especifica deve retornar lógico, caso contrario vai arremessar o erro "invalid typecast in file"&lt;/p&gt;

&lt;p&gt;Como resolver?&lt;br&gt;
Logo no inicio do fonte declarei uma variável do tipo Static&lt;br&gt;&lt;br&gt;
Essa variável será atribuída na função FAT001 que está parametrizada na expressão da Consulta, e será retornada na função FAT001A que está parametrizada no retorno da consulta&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QAh33aUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92k7mrc7vkqljbklpf0i.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QAh33aUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/92k7mrc7vkqljbklpf0i.PNG" alt="Variavel Static" width="363" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A variável será atribuída no fonte que será utilizado na Expressão da consulta&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Include 'protheus.ch'
#Include 'totvs.ch'
#Include "FWMVCDEF.ch"

Static SV_CUSTFORN As Character

/*/{Protheus.doc} User Function CFG0001
  (Função responasvel pela Consulta Padrão FAT001)
  @type  Function
  @author Leandro Lemos
  @since 09/11/22
  @version P12
  @param param_name, param_type, param_descr
  @return return_var, return_type, return_description
  @example
  (examples)
  @see ()
  /*/
User Function CFG0001()
    Local oDlg
    Local aRet          := {}
    Local lRet          := .F.
    Local cPlaceNome    := PADR('Digite o Nome',TAMSX3("A2_NOME")[1])
    Local cPlaceCod     := PADR('Digite o Codigo',100) // usei A2_NOME para exibir todo placeholder
    Local cPlaceDoc     := 'Digite o Documento'
    Local cGetCli       := Space(TAMSX3("A2_NOME")[1])
    Local cGetCodCli    := Space(TAMSX3("A2_NOME")[1])
    Local cGetDocCli    := Space(TAMSX3("A2_CGC")[1])
    Local lHasButton    := .T.
    Local cDescriSay    := 'Consulta'
    Local oSay := NIL

    Private oLbx
    Private aCpos   := {}
    Private cRet        := ''
FWMsgRun(, {|oSay| fMontaArray(oSay) }, cDescriSay, "Carregando dados...")

    DEFINE MSDIALOG oDlg TITLE "Consulta de Fornecedores" FROM 0,0 TO 320,700 PIXEL

    oTGetCli := TGet():New( 001, 010, { | u | If( PCount() == 0, cGetCli, cGetCli := u ) },oDlg, ;
        317, 009, "@!",, 0, 16777215,,.F.,,.T.,,.F.,,.F.,.F.,{||FWMsgRun(, {|oSay| fMontaArray(oSay,cGetCli,cGetCodCli,cGetDocCli) }, cDescriSay, "Carregando dados...")},.F.,.F. ,,cGetCli/*24*/,,,,lHasButton/*28*/,,,'Nome'+Space(02)/*cLabelText*/,,,,cPlaceNome/*cPlaceHold*/)

    oTGetCod    := TGet():New( 015, 010, { | u | If( PCount() == 0, cGetCodCli, cGetCodCli := u ) },oDlg, ;
        317, 009, "@!",, 0, 16777215,,.F.,,.T.,,.F.,,.F.,.F.,{||FWMsgRun(, {|oSay| fMontaArray(oSay,cGetCli,cGetCodCli,cGetDocCli) }, cDescriSay, "Carregando dados...")},.F.,.F. ,,cGetCodCli,,,,lHasButton,,,'Codigo'/*cLabelText*/,,,,cPlaceCod/*cPlaceHold*/)

    oTGetCnpj   := TGet():New( 030, 010, { | u | If( PCount() == 0, cGetDocCli, cGetDocCli := u ) },oDlg, ;
        317, 009, "@!",, 0, 16777215,,.F.,,.T.,,.F.,,.F.,.F.,{||FWMsgRun(, {|oSay| fMontaArray(oSay,cGetCli,cGetCodCli,cGetDocCli) }, cDescriSay, "Carregando dados...")},.F.,.F. ,,cGetDocCli,,,,lHasButton,,,'CNPJ'+Space(03)/*cLabelText*/,,,,cPlaceDoc/*cPlaceHold*/)

    @ 050,010 LISTBOX oLbx FIELDS HEADER 'Codigo','Loja' , 'Nome','CNPJ','Municipio' SIZE 335,95 OF oDlg PIXEL

oLbx:SetArray( aCpos )
    oLbx:bLine      := {|| aCpos[oLbx:nAt]}
    oLbx:bLDblClick := {|| {oDlg:End(), lRet:=.T.,aRet := oLbx:aArray[oLbx:nAt]} }

    oTBtn1 := TButton():New( 148, 260, "Visualizar",oDlg,{||FwMsgRun(Nil,{ |oSay| fVisualiza(oSay,oLbx:aArray[oLbx:nAt]) }, cDescriSay, 'Carregando dados...')}, 40,10,,,.F.,.T.,.F.,,.F.,,,.F. )
    oTBtn2 := TButton():New( 148, 305, "Selecionar",oDlg,{|| oDlg:End(), lRet:=.T., aRet := oLbx:aArray[oLbx:nAt] }, 040, 010,,,.F.,.T.,.F.,,.F.,,,.F. )


    ACTIVATE MSDIALOG oDlg CENTER

    If Len(aRet) &amp;gt; 0 .And. lRet
If Empty(aRet[1])
            lRet := .F.
        Else
            DBSelectArea('SA2')
            SA2-&amp;gt;(DBSetOrder(1))
            SA2-&amp;gt;(DBSeek(xFilial('SA2')+aRet[1]+aRet[2]))
            GP_CUSTFORN := SA2-&amp;gt;A2_COD+'/'+SA2-&amp;gt;A2_LOJA+'-'+A2_NOME
            lOk := .T.
        EndIf
    EndIf

Return lOk

/*/{Protheus.doc} User Function CFG0001A
    (Retorna o resultado da pesquisa)
    @type  Function
    @author Leandro Lemos       
    @since 09/11/2022
    @version P12
    @param param_name, param_type, param_descr
    @return return_var, return_type, return_description
    @example
    (examples)
    @see (links_or_references)
    /*/
User Function CFG0001A()    
Return SV_CUSTFORN

/*/{Protheus.doc} fVisualiza
    (Função responsavel pela visualização do cadastro do cliente posicionado no grid)
    @type  Static Function
    @author Leandro Lemos
    @since 22/06/2022
    @version P12
    @param param_name, param_type, param_descr
    @return return_var, return_type, return_description
    @example
    (examples)
    @see (https://tdn.totvs.com/display/framework/FWExecView)
/*/
Static Function fVisualiza(oSay,aForn)

    //Posiciona o cliente para visualização
    IF Len(aForn) &amp;gt; 0
        DBSelectArea('SA2')
        SA2-&amp;gt;(DBSetOrder(1))
        SA2-&amp;gt;(DBSeek(xFilial('SA2')+aForn[1]+aForn[2]))
    EndIF
    oSay:SetText("Carregando cliente "+SA2-&amp;gt;A2_NOME)
    lOk := ( FWExecView('Visualização de Fornecedores','CRMA980', MODEL_OPERATION_VIEW,,  { || .T. } ) == 0 )

Return


/*/{Protheus.doc} fMontaArray
  (Retorna array com os dados)
  @type  Static Function
  @author Leandro Lemos
  @since 22/06/2022
  @version P12
  @param param_name, param_type, param_descr
  @return return_var, return_type, return_description
  @example
  (examples)
  @see (links_or_references)
/*/
Static Function fMontaArray(oSay,cCliNome,cCliCod,cGetDocCli)
    Local cQuery := ""
    Local cAlias := GetNextAlias()

    aCpos := {}
    cQuery := " SELECT A2_COD,A2_LOJA,A2_NOME,A2_CGC,A2_MUN "+CRLF
    cQuery += " FROM " + RetSqlName("SA2") + " SA2 "+CRLF
    cQuery += " WHERE SA2.D_E_L_E_T_ = ' ' "+CRLF
    cQuery += " AND SA2.A2_FILIAL  = '" + xFilial("SA2") + "' "+CRLF
    cQuery += " AND A2_MSBLQL &amp;lt;&amp;gt; '1' "+CRLF

    IF !Empty(cCliNome)
        cQuery += " AND A2_NOME LIKE '%" + AllTrim(cCliNome) + "%' "+CRLF
    EndIF

IF !Empty(cCliCod)
        cQuery += " AND A2_COD LIKE '%" + AllTrim(cCliCod) + "%' "+CRLF
    EndIf

    IF !Empty(cGetDocCli)
        cQuery += " AND A2_CGC LIKE '%" + AllTrim(cGetDocCli) + "%' "+CRLF
    EndIf

    cQuery += " ORDER BY 1,2 "

    cQuery := ChangeQuery(cQuery)

    dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cAlias,.T.,.T.)

    While (cAlias)-&amp;gt;(!Eof())
        oSay:SetText("Carregando cliente "+SA2-&amp;gt;A2_NOME)
        aAdd(aCpos,{(cAlias)-&amp;gt;(A2_COD),;
            AllTrim((cAlias)-&amp;gt;(A2_LOJA)),;
            AllTrim((cAlias)-&amp;gt;(A2_NOME)),;
            AllTrim((cAlias)-&amp;gt;(A2_CGC)),;
            AllTrim((cAlias)-&amp;gt;(A2_MUN));
            })
        (cAlias)-&amp;gt;(dbSkip())
    End

(cAlias)-&amp;gt;(dbCloseArea())

    If Len(aCpos) &amp;lt; 1
        aAdd(aCpos,{" "," "," "," ", " "})
    EndIf

    IF ValType(oLbx) == 'O'
        oLbx:SetArray( aCpos )
        oLbx:bLine     := {|| aCpos[oLbx:nAt]}
        oLbx:nAt := 1
        oLbx:refresh()
    EndIF

Return

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configuração da Consulta Especifica &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rgWSV1CL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpikts0v99565hmcwcnm.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rgWSV1CL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zpikts0v99565hmcwcnm.PNG" alt="Consulta Especifica" width="613" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O código está disponível no github&lt;br&gt;
&lt;a href="https://github.com/lemossleandro/erplabs"&gt;https://github.com/lemossleandro/erplabs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Referencia: &lt;a href="https://centraldeatendimento.totvs.com/hc/pt-br/articles/360027506172-Cross-Segmento-TOTVS-Backoffice-Linha-Protheus-ADVPL-Consulta-especifica-com-retorno-em-vari%C3%A1vel"&gt;https://centraldeatendimento.totvs.com/hc/pt-br/articles/360027506172-Cross-Segmento-TOTVS-Backoffice-Linha-Protheus-ADVPL-Consulta-especifica-com-retorno-em-vari%C3%A1vel&lt;/a&gt;&lt;/p&gt;

</description>
      <category>advpl</category>
      <category>programming</category>
      <category>totvs</category>
      <category>protheus</category>
    </item>
  </channel>
</rss>
