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.