Página 1 de 1

Dúvida na criação de uma função de busca

Enviado: 10 Jun 2016 10:12
por Vlademiro
Olá, pessoal. Estou desenvolvendo um sistema em hmg e estou criando uma função genérica para retornar o resultado de uma busca para um campo. A ideia é a seguinte: o usuário clica no botão de pesquisa e a janela retorna o código e a descrição. O Daniel fez um exemplo mais completo, no qual ele preenche o formulário totalmente https://youtu.be/rVIBwcHITJU?list=PLJtq ... 5mnO&t=358.

Mas não é isso que eu estou tentando fazer, é algo parecido. O meu objetivo é ter uma função genérica que retorne somente o nome e a descrição (somente, por enquanto). Eu criei o grid usando a HMG IDE e um prg associado. Mas na minha função genérica eu preciso de alguns dados (parâmetros), são eles :

( 1 ) O select que fará a consulta. Isso é fácil. Eu estou passando parâmetro.

( 2 ) O nome dos campos no formulário que receberão o código e a descrição. Esses eu posso deduzir a partir do nome dos campos do select.

( 2 ) O nome da janela que contém o formulário. O nome dessa janela eu posso também passar como parâmetro, mas eu não queria fazer assim. Tem como conseguir o nome da janela que contém o formulário automaticamente ?


Desculpem se eu estou detalhando muito. Se alguém tiver alguma dica sobre como fazer essa função por favor poste a ideia geral.

Segue a minha função principal (o trecho principal)

Código: Selecionar todos


/****m* Grupos/busca_generica
*
* NAME
*    busca_generica
*
* DESCRIPTION
*    Consulta de grupos.
*    Rotina que abre a janela principal responsável pelo grid de consultas
*
* SOURCE
*/
FUNCTION busca_generica( cSelect   )


          scFormularioOrigem := "cadastro_produtos" //  <====== AQUI! Como conseguir automaticamente ?
		  
          oSQL := TVladSQL():New()
          IF .NOT. oSQL:IsOpen()
             MsgBox("Erro durante a conexão com o banco de dados")
             RETURN NIL
          ENDIF
          oSQL:SetLimit( 7 )
          oSQL:SetQuery( cSelect  )

          IF IsWindowActive( busca_generica )
             doMethod( "busca_generica" , "MINIMIZE" )
             doMethod( "busca_generica" , "RESTORE" )
             doMethod( "busca_generica" , "SETFOCUS" )
          ELSE
             Load window busca_generica
             busca_generica.Center
             RefreshGrid()
             busca_generica.Activate
          ENDIF             
                    
          oSQL:Close()
          
           
RETURN NIL
/*******/
O trecho que retorna os dados é ...

Código: Selecionar todos



/****m* Grupos/cadastro_grupos_on_dbl_click
*
* NAME
*    cadastro_grupos_on_dbl_click
*
* DESCRIPTION
*    
*    Duplo click sobre o grid retorna dados para o formulário anterior  
*
* SOURCE
*/
***
* Pré-Alteração
****
Function busca_generica_on_dbl_click()
Local nPos
Local aData


    nPos  := GetProperty( "busca_generica" , "Grid_data" , "value" )     
    IF nPos <> 0
       aData := GetProperty( "busca_generica" , "Grid_data" , "item" , nPos )
	   IF LEN( aData ) > 0
          // scFormularioOrigem  foi passada na chamada da função. Ela é uma variável estática, por isso eu posso vê-la aqui. 
          SetProperty( scFormularioOrigem ,  "Text_" + oSQL:FieldName( 1 )  , "value" , aData[ 1 ])
          SetProperty( scFormularioOrigem ,  "Text_nome_" + oSQL:FieldName( 2 )  , "value" , aData[ 2 ])
       ENDIF
    ENDIF    

Return
/*******/

Bom... é isso.

Não sei se fui claro o suficiente, eu cheguei a usar a Minigui mas já tem muitos anos. Me considero um iniciante. Se alguém tiver uma solução melhor e quiser compartilhar ajudaria muito!

:xau

Dúvida na criação de uma função de busca

Enviado: 10 Jun 2016 11:44
por Toledo
Amigo, veja este exemplo:

https://pctoledo.org/forum/fileba ... t=c&page=1

Abraços,

Dúvida na criação de uma função de busca

Enviado: 10 Jun 2016 15:12
por Vlademiro
Obrigado pelo retorno Toledo, vou baixar o exemplo e dar uma estudada.

Dúvida na criação de uma função de busca

Enviado: 10 Jun 2016 15:26
por Vlademiro
Toledo, obrigado pela ajuda.

Então, eu dei uma olhada no código, a ideia é essa mesma, só que tem uma coisa : eu quero criar uma função genérica. Da forma como está lá eu vou ter que saber de antemão o nome da janela que originou a chamada e colocar o nome da mesma na função genérica. Aí ela não vai mais ser genérica.

Se eu entendi direito, o código na linha 99 da sua função exige que eu saiba o nome da janela e a coloque dentro da função:

Código: Selecionar todos


  principal.Text_2.value := aRet[1]
  principal.oNomeCliente.Value:=NOMES->NOM

A pergunta é: tem como eu identificar automaticamente qual janela chamou a função de busca, para colocar o nome automaticamente ?
Tentei usar Procname( 1 ) mas ela retorna o nome da função. Mas o que eu quero é o nome da janela FMG.

Eu estou pensando como um programador clipper, mas em outras linguagens também dão suporte a essa forma. Por exemplo, em Javascript tem o objeto opened.variavel = valor, onde opened refere-se a janela anterior que abriu a consulta. No hmg tem algo parecido também ? Eu estou olhando o manual mas não estou encontrando nada.

Obrigado :xau

Dúvida na criação de uma função de busca

Enviado: 10 Jun 2016 16:52
por Toledo
Amigo, segue algumas alterações:

Código: Selecionar todos

#include "minigui.ch"

Function Main
cInstr := MemoRead( "edit.txt" )
REQUEST DBFCDX , DBFFPT
RDDSETDEFAULT( "DBFCDX" )
SET NAVIGATION EXTENDED

USE NOMES NEW
IF !FILE("NOMES.CDX")
  INDEX ON CODIGO TAG Codigo TO NOMES.CDX
  INDEX ON NOME TAG Nome TO NOMES.CDX
ENDIF
SET INDEX TO NOMES.CDX

Load Window principal

principal.Edit_1.Value:=cInstr
principal.Text_1.SetFocus
On Key F8 Of principal Action FazConsulta("principal","Text_2","oNomeCliente")
Center Window principal
Activate Window principal
Return

***************************************************************
Func FazConsulta(pForm,pCampo,pLabel)
if _GetFocusedControl ( pForm ) == pCampo
  Busca_Nome(pForm,pCampo,pLabel)
endif
Return Nil

***************************************************************
Function Busca_Nome(pForm,pCampo,pLabel)
Private aBuscaCli:={}
Declare Window consulta
Load Window consulta
Pesq_Nome()
On Key escape Of consulta Action consulta.release
consulta.Center
consulta.Activate
Return Nil

**************************
Function Pesq_Nome()
Local cPesq:= consulta.oBusca.value
Local nTamanhoNomeParaPesquisa:= Len(cPesq)
Local nQuantRegistrosProcessados:= 0
Local nQuantMaximaDeRegistrosNoGrid:= 60

NOMES->(DBSetOrder(2))
NOMES->(DBSeek(cPesq))
DELETE ITEM ALL FROM Grid_1 OF consulta
IF LEFT(cPesq,1)="*" .OR. "*" $ cPesq .OR. "?" $ cPesq
 IF LEN(cPesq)>1
   cPesq+="*"
   nPas_:=1
   DO WHILE OrdWildSeek( cPesq, iif(nPas_=1,.F.,.T.) )
     consulta.Grid_1.AddItem ( {NOMES->CODIGO,NOMES->NOME} )
     nPas_+=1
     if nPas_ > nQuantMaximaDeRegistrosNoGrid
       EXIT
     EndIf
   ENDDO
 ENDIF
ELSE
 SEEK cPesq
 IF FOUND() .and. !EMPT(cPesq)
  Do While !Eof()
    If Substr(NOMES->NOME,1,nTamanhoNomeParaPesquisa) == cPesq
       nQuantRegistrosProcessados += 1
       if nQuantRegistrosProcessados > nQuantMaximaDeRegistrosNoGrid
	  EXIT
       EndIf
       consulta.Grid_1.AddItem ( {NOMES->CODIGO,NOMES->NOME} )
    ElseIf Substr(NOMES->NOME,1,nTamanhoNomeParaPesquisa) > cPesq
      EXIT
    Endif
    SKIP
  EndDo
 ENDIF
ENDIF
NOMES->(DBSetOrder(1))
Return Nil

**************************
Function Pega_Nome()
consulta.Grid_1.SetFocus
consulta.Grid_1.value:=1
Return Nil

**************************
Function Sel_Nome(pForm,pCampo,pLabel)
Local nPos := consulta.Grid_1.value
aRet := consulta.Grid_1.Item(nPos)
SELE NOMES
GO TOP
SEEK aRet[1]
IF FOUND()
  SetProperty( pForm, pCampo, "Value", aRet[1] )
  SetProperty( pForm, pLabel, "Value", NOMES->NOME )
ENDIF
consulta.release
Return Nil
Observe a linha 20, que agora tem que passar 3 parâmetros:

FazConsulta("NomeJanela","NomeCampo","NomeLabel")

1-NomeJanela = o nome da janela (Form/Window)
2-NomeCampo = o nome do campo (TEXTBOX/GETBOX) que vai receber o CÓDIGO.
3-NomeLabel = o nome da label que vai mostrar o NOME

No arquivo consulta.fmg alterar:

Código: Selecionar todos

     DEFINE GRID Grid_1
            ROW    50
            COL    10
            WIDTH  470
            HEIGHT 230
            ITEMS aBuscaCli
            WIDTHS { 82,360 }
            HEADERS {'Código','Nome do Cliente'}
            ONDBLCLICK Sel_Nome(pForm,pCampo,pLabel)
     END GRID  
Abraços,

Dúvida na criação de uma função de busca

Enviado: 11 Jun 2016 12:28
por Vlademiro
Obrigado por ter analisado o código!

Segunda-feira espero concluir a construção da rotina.