GRID + ON HEADCLICK

HMG en Español

Moderator: Rathinagiri

User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

GRID + ON HEADCLICK

Post by SALINETAS24 »

Hola a todos,
En los programas que hago, el GRID lo puede definir el usuario, por lo tanto el nº de columnas lo desconozco.
Ahora quiero implementar la ordenación por columnas usando ON HEADCLICK
Hay alguna forma de concatenar el bloque y pasarlo a modo de variable.

Code: Select all

		DEFINE GRID BrowseDbf	
			PARENT	&GestDbf1	
			ROW 	nCol
			COL		5
			WIDTH	nAncho/2-10 
			HEIGHT	nLargoGrid 
			HEADERS _aBrowNomb
			WIDTHS	_aBrowLong	
			ITEMS	_aItem
			VALUE	1 
			JUSTIFY _aBrowJust 
			DYNAMICBACKCOLOR _aColor
			ON HEADCLICK aBlock          /// --> esto tiene que ser un array 

		END GRID
A modo de ejemplo, cuando defino el Grid, tanto HEIGHT, HEAERS WIDTHS, ITEMS...., son arrays que contienen los valores
Lo que necesitaria es algo así....., pero no me funciona

Code: Select all

FOR nFor=1 to LEN(_aBrowNomb)

   aBlock:=aBlock+"{ || ordenar_columna(nFor) }"

NEXT
Para que el define del GRID fuese algo así

Muchas gracias por anticipado y vamos con una cervecita bien fresquita.... :D
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
dragancesu
Posts: 920
Joined: Mon Jun 24, 2013 11:53 am
DBs Used: DBF, MySQL, Oracle
Location: Subotica, Serbia

Re: GRID + ON HEADCLICK

Post by dragancesu »

Code: Select all

#include "hmg.ch"

Function Main

Local aRows [20] [3]


	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 800 ;
		HEIGHT 550 ;
		TITLE 'Hello World!' ;
		MAIN 

		aRows [1]	:= {'Simpson','Homer','555-5555'}
		aRows [2]	:= {'Mulder','Fox','324-6432'} 
		aRows [3]	:= {'Smart','Max','432-5892'} 
		aRows [4]	:= {'Grillo','Pepe','894-2332'} 
		aRows [5]	:= {'Kirk','James','346-9873'} 
		aRows [6]	:= {'Barriga','Carlos','394-9654'} 
		aRows [7]	:= {'Flanders','Ned','435-3211'} 
		aRows [8]	:= {'Smith','John','123-1234'} 
		aRows [9]	:= {'Pedemonti','Flavio','000-0000'} 
		aRows [10]	:= {'Gomez','Juan','583-4832'} 
		aRows [11]	:= {'Fernandez','Raul','321-4332'} 
		aRows [12]	:= {'Borges','Javier','326-9430'} 
		aRows [13]	:= {'Alvarez','Alberto','543-7898'} 
		aRows [14]	:= {'Gonzalez','Ambo','437-8473'} 
		aRows [15]	:= {'Batistuta','Gol','485-2843'} 
		aRows [16]	:= {'Vinazzi','Amigo','394-5983'} 
		aRows [17]	:= {'Pedemonti','Flavio','534-7984'} 
		aRows [18]	:= {'Samarbide','Armando','854-7873'} 
		aRows [19]	:= {'Pradon','Alejandra','???-????'} 
		aRows [20]	:= {'Reyes','Monica','432-5836'} 

		
		@ 50,10 GRID Grid_Master ;
			WIDTH 760 ;
			HEIGHT 180 ;
			HEADERS {'Last Name','First Name','Phone'} ;
			WIDTHS {140,140,140};
			ITEMS aRows ;
			VALUE {1,1} ;
			TOOLTIP 'Editable Grid Control' ;
			EDIT ;
			JUSTIFY { GRID_JTFY_CENTER,GRID_JTFY_RIGHT, GRID_JTFY_RIGHT } ;
			CELLNAVIGATION ;
			ON INPLACEEDITEVENT ProcGridInplaceEditEvent()


		@ 240,10 GRID Grid_Detail ;
			WIDTH 760 ;
			HEIGHT 180 ;
			HEADERS {'Last Name','First Name','Phone'} ;
			WIDTHS {140,140,140};
			ITEMS aRows ;
			VALUE 1 ;
			EDIT ;
			TOOLTIP 'Editable Grid Control' ;
			ON HEADCLICK { {||MsgInfo('Click 1')} , {||MsgInfo('Click 2')} , {||MsgInfo('Click 3')} } ;
			JUSTIFY { GRID_JTFY_LEFT,GRID_JTFY_CENTER, GRID_JTFY_CENTER };
			ON INPLACEEDITEVENT ProcGridInplaceEditEvent()
                	
                	
	END WINDOW

	CENTER WINDOW Form_1

	ACTIVATE WINDOW Form_1

Return


***********************************
FUNCTION ProcGridInplaceEditEvent()
Local  lCellNavigation := _HMG_SYSDATA [ 32 ] [_HMG_SYSDATA [ 203 ]]
Static lInitByDblClick := .F.

   DO CASE

      CASE This.IsInplaceEditEventInit == .T.
		lInitByDblClick := _HMG_GridEx_InplaceEdit_nMsg == WM_LBUTTONDBLCLK
      
      CASE This.IsInplaceEditEventRun == .T.

      CASE This.IsInplaceEditEventFinish == .T.
      
		IF lCellNavigation
			IF _HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] = 1										//first column
				_HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] := _HMG_SYSDATA [ 15 ] [_HMG_SYSDATA [ 203 ]] + IF (lInitByDblClick, 2, 1)	//skip one column
			ENDIF
		ELSE
			IF _HMG_SYSDATA [ 340 ] = 1						//first column
				_HMG_SYSDATA [ 340 ] := _HMG_SYSDATA [ 340 ] + IF (lInitByDblClick, 2, 1)	//skip one column
			ENDIF
		ENDIF
   ENDCASE

RETURN NIL
**********************************

look http://hmgforum.com/viewtopic.php?f=5&t ... ick#p58885
User avatar
mol
Posts: 3718
Joined: Thu Sep 11, 2008 5:31 am
Location: Myszków, Poland
Contact:

Re: GRID + ON HEADCLICK

Post by mol »

Code: Select all

FOR nFor=1 to LEN(_aBrowNomb)

   aBlock:=aBlock+"{ || ordenar_columna(" + hb_ntos(nFor) + ") }"

NEXT
User avatar
mustafa
Posts: 1158
Joined: Fri Mar 20, 2009 11:38 am
DBs Used: DBF
Location: Alicante - Spain
Contact:

Re: GRID + ON HEADCLICK

Post by mustafa »

Hola amic , como estas ?
No se si te puede servir este Sample que adjunto es para calcular
el número de columnas para que se organice el color automático
en el Grid

Code: Select all

*---------------------------------------------------------*
 FUNCTION CreateArray_1Q() 
*---------------------------------------------------------*
       dbCloseAll()
        SELECT 2
        USE STOCK EXCLUSIVE NEW
        INDEX ON REF TO Stock
        CLOSE DATABASE
        SELECT 2
        USE STOCK INDEX STOCK
	DbGOTOP()
  *     COUNT TO nBra1 FOR STOCK->REF >= 0 
  *     DBEVAL( {|| AADD( arows32,{ STOCK->REF,STOCK->PRODUCTO,STOCK->TIPO,TRAN(STOCK->PRECIO, "@E 999,999.99"),STOCK->CBARRAS ,STOCK->VECTOR } )})    
        
        nCount  := STOCK->( FCOUNT() )   // <----  Saber Número Columnas del Grid para el Color  Automático

	aGrid := {}
	DO WHILE !  STOCK->( Eof()) 
		AADD( aGrid , { STOCK->REF,STOCK->PRODUCTO,STOCK->TIPO,TRAN(STOCK->PRECIO,"@E 999,999.99"),STOCK->CBARRAS ,STOCK->VECTOR } )
		STOCK->(DbSkip())
	ENDDO

Return Nil

*---------------------------------------------------------*
 Procedure SearchChange_3()
*---------------------------------------------------------*
Local  cTxt, nLen, i
cTxt := GetProperty( 'Form_50','Text_002X','Value' )
nLen := Len( cTxt )

 // Nesse ponto preciso saber qual o número da coluna da Grid

 nCol:= Form_50.Grid_6.Col

  Form_50.Grid_6.DeleteAllItems

 // Procura o texto 

 For i := 1 To Len( aGrid )
     If Upper( cTxt ) = Upper( Left( aGrid [ i ] [ 2] , nLen ) )   // [ 2] <------- PRODUCTO
        Form_50.Grid_6.AddItem ( aGrid [ i ] )
     Endif
 Next

Return

Cuidarse del maldito "bixu"
Salud
Mustafa
Attachments
Grid_DBF_Array.zip
(1.85 MiB) Downloaded 129 times
screenshot.jpg
screenshot.jpg (119.05 KiB) Viewed 1938 times
User avatar
srvet_claudio
Posts: 2193
Joined: Thu Feb 25, 2010 8:43 pm
Location: Uruguay
Contact:

Re: GRID + ON HEADCLICK

Post by srvet_claudio »

See:

<GridControlName>.ColumnONHEADCLICK ( nColIndex ) := bColumnOnHeadClick
Best regards.
Dr. Claudio Soto
(from Uruguay)
http://srvet.blogspot.com
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: GRID + ON HEADCLICK

Post by SALINETAS24 »

Muchas gracias a todos por la rápida respuesta.
Lo mejor que tiene HMG es sin duda la ayuda desinteresada que prestáis en el foro..., sois todos una gente magnifica!!!!.

Y después de esto vamos al grano.
Lo que andaba buscando fue lo que indicó srvt_claudio, pero al trabajar con los nombre de las pantallas en variables lo cambie por esto.. y funciona

Code: Select all

		FOR nFor=1 to LEN(_aBrowNomb)
			SetProperty (GestDbf1, "BrowseDbf", "ColumnOnHeadClick ", nFor,; 
					{|| ordena(nFor) } )
		next
		
Muchas gracias y vamos con esa cervecita, bien fresquita....... !!! :D
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: GRID + ON HEADCLICK

Post by SALINETAS24 »

Hola de nuevo.
He tenido un problema, cada vez que ejecutaba la función "ordena(nFor)" la variable "nFor" siempre tenia el mismo valor, (lo podeis comprobar), con lo cual resulta imposible saber en que columna de la cabecera se hizo CLICK. Así que he tenido que cambiar y reajustar y ahora ya funciona correctamente.

Code: Select all


	// nueva carga del bloque

	FOR nFor=1 to LEN(_aBrowNomb)
		B:=STR(nFor)
		A:={ { || ordena(&B)} }	
		aadd(aBlock,a[1] )
	NEXT
	
	
	DEFINE GRID BrowseDbf	
			PARENT	&GestDbf1	
			ROW 	nCol
			COL		5
			WIDTH	nAncho/2-10 
			HEIGHT	nLargoGrid 
			HEADERS _aBrowNomb
			WIDTHS	_aBrowLong	
			ITEMS	_aItem
			VALUE	1 
			JUSTIFY _aBrowJust 
			DYNAMICBACKCOLOR _aColor
			ON HEADCLICK aBlock          /// --> esto tiene que ser un array 
	END GRID
Después he creado una función que ordena el GRID por cualquier columna (sin indices), rápido y veloz...,

Code: Select all

FUNCTION ORDENA(nOrden)
LOCAL nFor,nFor1,xVar,xVar1
LOCAL nFin:= GetProperty (GestDbf1,"BrowseDbf","ItemCount")  	// Nº DE ELEMENTOS
LOCAL aTemp:=aTemp1:={}
LOCAL aFalsa:={}

	
	FOR nFor=1 TO nFin
		AADD(aTemp,GetProperty (GestDbf1,"BrowseDbf","Item",nFor) )
	NEXT
	
	FOR nFor:=1 TO nFin
		FOR nFor1:= 1 to nFin
			IF nFor != nFor1
				IF aTemp[nFor][nOrden]	< aTemp[nFor1][nOrden]
						aFalsa       := aTemp[nFor1]
						aTemp1[nFor1]:= aTemp[nFor]
						aTemp[nFor]  := aFalsa
				ENDIF
			ENDIF
		NEXT
	NEXT
						
	DoMethod( GestDbf1,"BrowseDbf","DeleteAllItems")
	FOR nFor:=1 TO nFin
		DoMethod( GestDbf1,"BrowseDbf","AddItem",aTemp[nFor] )
	NEXT	
	
		
/*
	// Código desechado.....
	// Esta parte de aquí es lenta.., lenta..., lenta... muy lenta. 
	FOR nFor:= 1 to nFin
		FOR nFor1:= 1 to nFin
	    	aTemp:=GetProperty (GestDbf1,"BrowseDbf","Item",nFor)	// SACO VALORES
			xVar:=aTemp[nOrden]	// Cargo la columna que compara
			IF nFor != nFor1      // Estoy comprando distintos registros
				aTemp1:=GetProperty (GestDbf1,"BrowseDbf","Item",nFor1)
				xVar1:=aTemp1[nOrden]	// Cargo la 2ªcolumna que compara
				IF xVar < xVar1
					// Intercambio posicoines
					SetProperty (GestDbf1,"BrowseDbf","Item",nFor,aTemp1)
					SetProperty (GestDbf1,"BrowseDbf","Item",nFor1,aTemp)
					xVar:=xVar1
				ENDIF
			ENDIF
		NEXT
	NEXT
*/
RETURN
Lo dicho anteriormente, muchas gracias por vuestros consejos y esta ronda la pago yo.... :lol:
vamos con una cervecita frequita.... :D
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
mol
Posts: 3718
Joined: Thu Sep 11, 2008 5:31 am
Location: Myszków, Poland
Contact:

Re: GRID + ON HEADCLICK

Post by mol »

Code: Select all

       FOR nFor=1 to LEN(_aBrowNomb)
		B:=STR(nFor)
		A:="{ || ordena(" + B + ") }"
		aadd(aBlock, & A )
	NEXT
You have to build array of blocks.
You can't use your local variable in block because it's unknown in time of block execution
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: GRID + ON HEADCLICK

Post by SALINETAS24 »

Hola a todos...
mustafa wrote: Thu Sep 24, 2020 11:33 am Hola amic , como estas ?
No se si te puede servir este Sample que adjunto es para calcular
el número de columnas para que se organice el color automático
en el Grid
Con el permiso del "amic" Mustafa he modificado su código y le he incorporado mi rutina para poder ordenar por cualquier columna. :P

mol wrote: Fri Sep 25, 2020 5:09 am

Code: Select all

       FOR nFor=1 to LEN(_aBrowNomb)
		B:=STR(nFor)
		A:="{ || ordena(" + B + ") }"
		aadd(aBlock, & A )
	NEXT
You have to build array of blocks.
You can't use your local variable in block because it's unknown in time of block execution
Hola Mol, como puedes comprobar el código que yo pongo funciona, (el tuyo no lo he probado :| ), lo único que hay que tener en cuenta es definir las variables como PRIVATE.

Un saludo a todos y vamos con la cervecita....!!
Attachments
Grid_DBF_Array.rar
ORDENACION POR COLUMNAS
(3.13 MiB) Downloaded 110 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: GRID + ON HEADCLICK

Post by SALINETAS24 »

Perdon..,
mustafa wrote: Thu Sep 24, 2020 11:33 am Hola amic , como estas ?
.......
Salud
Mustafa
Todo bien y bajo control (de momento).
Me he vuelto a tomar la libertad y te he modificado el código.
He visto que realizas una busca alfabetica, ahora te he cambiado el patrón y con esta modificación te busca por aproximación, no hace falta que la cadena empiece igual, puedes buscar una palabra.... pruebalo y me dices.
Ahora si que me tomo la cervecita..., una caña como un cañon !! :lol:
Attachments
Grid_DBF_Array.rar
ORDENACION Y BUSQUEDA - ULT.VERSION
(3.13 MiB) Downloaded 120 times
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
Post Reply