Página 1 de 2

Pesquisa letra-a-letra em campo Data

Enviado: 11 Set 2014 17:37
por Softwhouse
Utlilizo a seguinte rotina para fazer uma pesquisa letra-a-letra em uma grid, de acordo com a coluna selecionada em uma rotina anterior.

Código: Selecionar todos


Function Pesquisa()
Local cPesq := AllTrim(Form_Propostas.Txt_Pesquisa.Value) 
Local nTamNomePesq := Len(cPesq)
Local cCampo:=OrdSetFocus() 
Local cTxt, nLen, i

DbSelectArea('Propostas')
Propostas->(DbGoTop())
Propostas->(DbSeek(cPesq))             
                                   
Form_Propostas.Grid_Propostas.DisableUpdate
    
Delete Item All From Grid_Propostas Of Form_Propostas

Do While !Eof()
      If SubStr(Field->&cCampo,1,nTamNomePesq) == cPesq   
         Add item {Propostas->Numero,Dtoc(Propostas->Data),Propostas->Codigo,AllTrim(Propostas->Nome),;
         AllTrim(Propostas->Municipio),Dtoc(Propostas->Abertura),Propostas->Horario} To Grid_Propostas Of Form_Propostas
      ElseIf SubStr(Field->&cCampo,1,nTamNomePesq) > cPesq
         Exit
      EndIf
      Propostas->(DbSkip())
EndDo    

Form_Propostas.Grid_Propostas.EnableUpdate    
Form_Propostas.Grid_Propostas.Value:=Form_Propostas.Grid_Propostas.ItemCount // Posiciona no último registro
     
Return ( NIL )


Ocorre que preciso pesquisar no campo Data e não dá certo. Alguém teria um exemplo de como realizar essa pesquisa?

Também não sei se está muito certo a maneira que usei para descobrir qual coluna foi selecionada anteriormente:

cCampo:=OrdSetFocus()

Para descobrir qual é a coluna: Field->&cCampo

Tem como descobrir o nome do campo que foi clicado na grid?

Obrigado

Pesquisa letra-a-letra em campo Data

Enviado: 11 Set 2014 18:42
por Toledo
Softwhouse escreveu:fazer uma pesquisa letra-a-letra em uma grid, de acordo com a coluna selecionada
Fernando, para preencher esta grid você vai ter que buscar os dados em um arquivo DBF, então para pesquisar de acordo com a coluna selecionada em uma grid, este DBF teria que ter um índice para campo usado nas colunas da grid. Por exemplo, se na grid tem as colunas Número, Data, Código, Nome, Município, Abertura e Horário, então o DBF vai ter que ter 7 índices, um para cada coluna da grid.
Softwhouse escreveu:Também não sei se está muito certo a maneira que usei para descobrir qual coluna foi selecionada anteriormente:
cCampo:=OrdSetFocus()
No caso da função OrdSetFocus(), vai retornar o nome de controle do índice que está selecionado, não tem nada a ver com o nome do campo ou coluna selecionada na grid. Para saber qual a coluna selecionada, use a propriedade Col, por exemplo: nColuna:=Form_Propostas.Grid_Propostas.Col
Softwhouse escreveu:Tem como descobrir o nome do campo que foi clicado na grid?
Somente com as propriedades da grid, não tem como saber qual o nome do campo usado para o conteúdo de uma coluna na grid.

Você poderia verificar qual a coluna selecionada na grid e depois conforme a coluna indicar qual é o campo, por exemplo:

Código: Selecionar todos

nColuna:=Form_Propostas.Grid_Propostas.Col
If nColuna==1
   cCampo:="numero"
ElseIf nColuna==2
   cCampo:="data"
ElseIf nColuna==3
   cCampo:="codigo"
ElseIf nColuna==4
   cCampo:="nome"
ElseIf nColuna==5
   cCampo:="municipio"
Endif
Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 11 Set 2014 18:56
por Softwhouse
Toledo,

O DBF e os índices estão da maneira que vc colocou, igualando a variável cCampo ao OrdSetFocus() está dando certo porque os índices tem o mesmo nome dos campos. Vou mudar para usar a propriedade Col. Mas a pesquisa no campo Data, conhece alguma maneira de resolver isso ?

Obrigado

Pesquisa letra-a-letra em campo Data

Enviado: 11 Set 2014 19:05
por Toledo
Softwhouse escreveu:está dando certo porque os índices tem o mesmo nome dos campos
Então já está certo, assim você vai descobrir o nome do campo, já que a tag tem o mesmo nome do campo. Então o que você tem que se preocupar e selecionar o índice correspondente a coluna selecionada antes de dar o DbSeek().
No caso do campo data, ai resta saber qual foi a chave que você usou para fazer a indexação (DTOS(), DTOC(), etc). O DbSeek() tem que seguir o mesmo formato da chave de indexação.
Atenção: se a pesquisa é letra-a-letra então os campos tipo data vai ter que usar DTOC() para chave de indexação.

Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 12 Set 2014 09:15
por Softwhouse
Toledo escreveu:Então já está certo, assim você vai descobrir o nome do campo, já que a tag tem o mesmo nome do campo.
Considerei como uma gambiarra, por isso procurei uma forma melhor de resolver...
Toledo escreveu:Para saber qual a coluna selecionada, use a propriedade Col, por exemplo: nColuna:=Form_Propostas.Grid_Propostas.Col
Não funcionou, sempre retorna o mesmo número.

Pesquisa letra-a-letra em campo Data

Enviado: 12 Set 2014 10:08
por Toledo
Softwhouse escreveu:Não funcionou, sempre retorna o mesmo número.
Fernando, se possível, poste o código desta tela de pesquisa aqui neste tópico. Sem ver o código onde está a grid e o campo onde você digita o que vai pesquisar, fica complicado poder lhe ajudar.

Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 16 Set 2014 10:49
por Softwhouse
Toledo, segue um exemplo de onde preciso descobrir o número da Coluna.

Código: Selecionar todos


#include "minigui.ch"

Function Main
private aRows [10] [2]


   aRows  [1]   := {'Simpson'   , 'Homer'  }
   aRows  [2]   := {'Mulder'    , 'Fox'   } 
   aRows  [3]   := {'Smart'     , 'Max'   } 
   aRows  [4]   := {'Grillo'    , 'Pepe'  } 
   aRows  [5]   := {'Kirk'      , 'James' } 
   aRows  [6]   := {'Barriga'   , 'Carlos' } 
   aRows  [7]   := {'Flanders'  , 'Ned'    } 
   aRows  [8]   := {'Smith'     , 'John'   } 
   aRows  [9]   := {'Pedemonti' , 'Flavio'  } 
   aRows [10]   := {'Gomez'     , 'Juan'   } 
  

   DEFINE WINDOW Form_1 ;
       AT     0,0 ;
       WIDTH  568 ;
       HEIGHT 430 ;
       TITLE 'Pesquisa incremental no Grid' ;
       MAIN ;
       FONT 'Arial' ;
       SIZE 9 ;
       ON INIT FillGrid()          
       
       DEFINE LABEL Label_1
              ROW   360
              COL   10
              WIDTH 80
              VALUE 'Pesquisando:'
              VCENTERALIGN .T.
       END LABEL

       DEFINE TEXTBOX Text_1
              ROW   360
              COL   95
              WIDTH 150
              ONCHANGE SearchChange()
       END TEXTBOX

       DEFINE GRID Grid_1 
              ROW     10             
              COL     10
              WIDTH   420
              HEIGHT  330
              HEADERS { 'Sobrenome' , 'Nome' } 
              WIDTHS  { 80, 180 }
       END GRID   
             
       
END WINDOW
    
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

Return(Nil)

/*********************************************************/
Procedure SearchChange()
/*********************************************************/
Local  cTxt, nLen, i
cTxt := GetProperty( 'Form_1' , 'Text_1' , 'Value' )
nLen := Len( cTxt )


// Nesse ponto preciso saber qual o número da coluna da Grid
nCol:= Form_1.Grid_1.Col
MsgInfo(nCol)


Form_1.Grid_1.DeleteAllItems

// Procura o texto 

For i := 1 To Len( aRows )
    If Upper( cTxt ) = Upper( Left( aRows [ i ] [ 1 ] , nLen ) )
       Form_1.Grid_1.AddItem ( aRows [ i ] )
    Endif
Next
     
Return
 
/*********************************************************/
Procedure FillGrid()
/*********************************************************/
Local i 
For i := 1 To Len( aRows )
    Form_1.Grid_1.AddItem ( aRows [ i ] )
Next
Return

Obrigado.

Pesquisa letra-a-letra em campo Data

Enviado: 16 Set 2014 11:49
por Toledo
Fernando, fiz alguma alterações neste seu exemplo:

Código: Selecionar todos

#include "minigui.ch"

Function Main
private aRows [10] [2]

   aRows  [1]   := {'Simpson'   , 'Homer'  }
   aRows  [2]   := {'Mulder'    , 'Fox'   } 
   aRows  [3]   := {'Smart'     , 'Max'   } 
   aRows  [4]   := {'Grillo'    , 'Pepe'  } 
   aRows  [5]   := {'Kirk'      , 'James' } 
   aRows  [6]   := {'Barriga'   , 'Carlos' } 
   aRows  [7]   := {'Flanders'  , 'Ned'    } 
   aRows  [8]   := {'Smith'     , 'John'   } 
   aRows  [9]   := {'Pedemonti' , 'Flavio'  } 
   aRows [10]   := {'Gomez'     , 'Juan'   } 
  

   DEFINE WINDOW Form_1 ;
       AT     0,0 ;
       WIDTH  568 ;
       HEIGHT 430 ;
       TITLE 'Pesquisa incremental no Grid' ;
       MAIN ;
       FONT 'Arial' ;
       SIZE 9 ;
       ON INIT FillGrid()          
       
       DEFINE LABEL Label_1
              ROW   360
              COL   10
              WIDTH 80
              VALUE 'Pesquisando:'
              VCENTERALIGN .T.
       END LABEL

       DEFINE TEXTBOX Text_1
              ROW   360
              COL   95
              WIDTH 150
              ONCHANGE SearchChange()
       END TEXTBOX

       DEFINE GRID Grid_1 
              ROW     10             
              COL     10
              WIDTH   420
              HEIGHT  330
              HEADERS { 'Sobrenome' , 'Nome' } 
              WIDTHS  { 80, 180 }
              CELLNAVIGATION .T.
              Value {1,1}
       END GRID   
             
       
END WINDOW
    
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

Return(Nil)

/*********************************************************/
Procedure SearchChange()
/*********************************************************/
Local  cTxt, nLen, i
cTxt := GetProperty( 'Form_1' , 'Text_1' , 'Value' )
nLen := Len( cTxt )

// Nesse ponto preciso saber qual o número da coluna da Grid
nCol:= Form_1.Grid_1.Value[2]
MsgInfo(Str(nCol))

Form_1.Grid_1.DeleteAllItems

// Procura o texto 

For i := 1 To Len( aRows )
    If Upper( cTxt ) = Upper( Left( aRows [ i ] [ nCol ] , nLen ) )
       Form_1.Grid_1.AddItem ( aRows [ i ] )
    Endif
Next
Form_1.Grid_1.Value:={1,nCol}
     
Return
 
/*********************************************************/
Procedure FillGrid()
/*********************************************************/
Local i 
For i := 1 To Len( aRows )
    Form_1.Grid_1.AddItem ( aRows [ i ] )
Next
Return
Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 16 Set 2014 16:42
por Softwhouse
Toledo,

Funcionou... Tentei melhorar o código para ordenar os itens com OnHeadClick mas não consegui entender o erro. Se Vc puder dar uma olhada...

Código: Selecionar todos


#include "minigui.ch"

Function Main
Local aHeadClick [2]
private aRows [10] [2]

aRows  [1]   := {'Simpson'   , 'Homer'  }
aRows  [2]   := {'Mulder'    , 'Fox'   } 
aRows  [3]   := {'Smart'     , 'Max'   } 
aRows  [4]   := {'Grillo'    , 'Pepe'  } 
aRows  [5]   := {'Kirk'      , 'James' } 
aRows  [6]   := {'Barriga'   , 'Carlos' } 
aRows  [7]   := {'Flanders'  , 'Ned'    } 
aRows  [8]   := {'Smith'     , 'John'   } 
aRows  [9]   := {'Pedemonti' , 'Flavio'  } 
aRows [10]   := {'Gomez'     , 'Juan'   } 
  
AEVAL(aHeadClick, {| x, i | aHeadClick[ i ] := { |n| SortColumn( n ) }})
  
  
  
   DEFINE WINDOW Form_1 ;
       AT     0,0 ;
       WIDTH  568 ;
       HEIGHT 430 ;
       TITLE 'Pesquisa incremental no Grid' ;
       MAIN ;
       FONT 'Arial' ;
       SIZE 9 ;
       ON INIT FillGrid()          
       
       DEFINE LABEL Label_1
              ROW   360
              COL   10
              WIDTH 80
              VALUE 'Pesquisando:'
              VCENTERALIGN .T.
       END LABEL

       DEFINE TEXTBOX Text_1
              ROW   360
              COL   95
              WIDTH 150
              ONCHANGE {||SearchChange()}
       END TEXTBOX

       DEFINE GRID Grid_1 
              ROW     10             
              COL     10
              WIDTH   420
              HEIGHT  330
              HEADERS { 'Sobrenome' , 'Nome' } 
              WIDTHS  { 80, 180 }
              CELLNAVIGATION .T.
              ONHEADCLICK aHEADCLICK
              Value {1,1}
       END GRID   
             
       
END WINDOW
    
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

Return(Nil)

/*********************************************************/
Procedure SearchChange()
/*********************************************************/
Local  cTxt, nLen, i
cTxt := GetProperty( 'Form_1' , 'Text_1' , 'Value' )
nLen := Len( cTxt )

nCol:= Form_1.Grid_1.Value[2]  // Não entendí porque Value[2]

Form_1.Grid_1.DeleteAllItems

// Procura o texto 

For i := 1 To Len( aRows )
    If Upper( cTxt ) = Upper( Left( aRows [ i ] [ nCol ] , nLen ) )
       Form_1.Grid_1.AddItem ( aRows [ i ] )
    Endif
Next
Form_1.Grid_1.Value:={1,nCol}  // Não entendí
     
Return
 
/*********************************************************/
Procedure FillGrid()
/*********************************************************/
Local i 
For i := 1 To Len( aRows )
    Form_1.Grid_1.AddItem ( aRows [ i ] )
Next
Return

/*********************************************************/
Procedure SortColumn(nColumnNo)
/*********************************************************/
Form_1.Grid_1.Refresh
Asort( aRows, , , { | x, y | x[ nColumnNo ] < y[ nColumnNo ] })
Form_1.Grid_1.DeleteAllItems
Aeval( aRows, { | x | Form_1.Grid_1.AddItem( x ) } )
Return (Nil)

Obrigado.

Pesquisa letra-a-letra em campo Data

Enviado: 16 Set 2014 17:25
por Toledo
Fernando, segue uma pequena alteração em SortColumn():

Código: Selecionar todos

/*********************************************************/
Procedure SortColumn(nColumnNo)
/*********************************************************/
Form_1.Grid_1.Refresh
Asort( aRows, , , { | x, y | x[ nColumnNo ] < y[ nColumnNo ] })
Form_1.Grid_1.DeleteAllItems
Aeval( aRows, { | x | Form_1.Grid_1.AddItem( x ) } )
Form_1.Grid_1.Value:={1,nColumnNo}
Return (Nil)
Softwhouse escreveu:nCol:= Form_1.Grid_1.Value[2] // Não entendí porque Value[2]
Neste caso deste Grid, a propriedade Value do grid vai retornar um array, contendo dois elementos {linha,coluna}, então o [2] é para pegar o número da coluna.
Softwhouse escreveu:Form_1.Grid_1.Value:={1,nCol} // Não entend
Aqui será selecionado novamente a mesma coluna do grid que estava antes do filtro.

Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 16 Set 2014 18:02
por Softwhouse
Perfeito Toledo. Vc não imagina o problema que me resolveu. Muito Obrigado.

Pesquisa letra-a-letra em campo Data

Enviado: 17 Set 2014 16:38
por Softwhouse
Caro Toledo, vou lhe pedir socorro novamente...

Adicionei a Procedure id() para saber, com duplo click, o conteúdo da primeira coluna da Grid mas não está funcionando...

Código: Selecionar todos


#include "minigui.ch"

Function Main
Local aHeadClick [2]
private aRows [10] [2]

aRows  [1]   := {'Simpson'   , 'Homer'  }
aRows  [2]   := {'Mulder'    , 'Fox'   } 
aRows  [3]   := {'Smart'     , 'Max'   } 
aRows  [4]   := {'Grillo'    , 'Pepe'  } 
aRows  [5]   := {'Kirk'      , 'James' } 
aRows  [6]   := {'Barriga'   , 'Carlos' } 
aRows  [7]   := {'Flanders'  , 'Ned'    } 
aRows  [8]   := {'Smith'     , 'John'   } 
aRows  [9]   := {'Pedemonti' , 'Flavio'  } 
aRows [10]   := {'Gomez'     , 'Juan'   } 
  
AEVAL(aHeadClick, {| x, i | aHeadClick[ i ] := { |n| SortColumn( n ) }})
  
  
  
   DEFINE WINDOW Form_1 ;
       AT     0,0 ;
       WIDTH  568 ;
       HEIGHT 430 ;
       TITLE 'Pesquisa incremental no Grid' ;
       MAIN ;
       FONT 'Arial' ;
       SIZE 9 ;
       ON INIT FillGrid()          
       
       DEFINE LABEL Label_1
              ROW   360
              COL   10
              WIDTH 80
              VALUE 'Pesquisando:'
              VCENTERALIGN .T.
       END LABEL

       DEFINE TEXTBOX Text_1
              ROW   360
              COL   95
              WIDTH 150
              ONCHANGE {||SearchChange()}
       END TEXTBOX

       DEFINE GRID Grid_1 
              ROW     10             
              COL     10
              WIDTH   420
              HEIGHT  330
              HEADERS { 'Sobrenome' , 'Nome' } 
              WIDTHS  { 80, 180 }
              CELLNAVIGATION .T.
              ONHEADCLICK aHEADCLICK
              ONDBLCLICK id('Form_1','Grid_1',1)
              Value {1,1}
       END GRID   
             
       
END WINDOW
    
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1

Return(Nil)

/*********************************************************/
Procedure SearchChange()
/*********************************************************/
Local  cTxt, nLen, i
cTxt := GetProperty( 'Form_1' , 'Text_1' , 'Value' )
nLen := Len( cTxt )

nCol:= Form_1.Grid_1.Value[2]  

Form_1.Grid_1.DeleteAllItems

// Procura o texto 

For i := 1 To Len( aRows )
    If Upper( cTxt ) = Upper( Left( aRows [ i ] [ nCol ] , nLen ) )
       Form_1.Grid_1.AddItem ( aRows [ i ] )
    Endif
Next
Form_1.Grid_1.Value:={1,nCol}    
    
     
     
Return
 
/*********************************************************/
Procedure FillGrid()
/*********************************************************/
Local i 
For i := 1 To Len( aRows )
    Form_1.Grid_1.AddItem ( aRows [ i ] )
Next
Return

/*********************************************************/
Procedure SortColumn(nColumnNo)
/*********************************************************/
Form_1.Grid_1.Refresh
Asort( aRows, , , { | x, y | x[ nColumnNo ] < y[ nColumnNo ] })
Form_1.Grid_1.DeleteAllItems
Aeval( aRows, { | x | Form_1.Grid_1.AddItem( x ) } )
Form_1.Grid_1.Value:= {1,nColumnNo}
Return (Nil)

/*********************************************************/
Procedure id(xForm,xObj,nCol)
/*********************************************************/
Local nPos := GetProperty(xForm,xObj,'Value')
Local aRet := GetProperty(xForm,xObj,'Item',nPos)
MsgInfo(aRet)
Return(Nil)

Obrigado.

Pesquisa letra-a-letra em campo Data

Enviado: 17 Set 2014 20:35
por Toledo
Toledo escreveu:Neste caso deste Grid, a propriedade Value do grid vai retornar um array, contendo dois elementos {linha,coluna}
Sendo assim, uma pequena alteração no id():

Código: Selecionar todos

/*********************************************************/
Procedure id(xForm,xObj,nCol)
/*********************************************************/
Local nPos := GetProperty(xForm,xObj,'Value')
Local aRet := GetProperty(xForm,xObj,'Item',nPos[1])
MsgInfo(aRet[nCol])
Return(Nil)
Softwhouse escreveu:Caro Toledo, vou lhe pedir socorro novamente...
Evite postar mensagens exclusiva para um membro do fórum, isto inibe a participação de outros membros que poderia ajudar.

Abraços,

Pesquisa letra-a-letra em campo Data

Enviado: 18 Set 2014 08:54
por Softwhouse
Funcionou certinho, muito obrigado.

Pesquisa letra-a-letra em campo Data

Enviado: 18 Set 2014 17:50
por Softwhouse
Abusando mais um pouco, não conseguí descobrir como posicionar o cursor no último registro da Grid.