Page 1 of 2

GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 9:52 am
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

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 11:19 am
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

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 11:28 am
by mol

Code: Select all

FOR nFor=1 to LEN(_aBrowNomb)

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

NEXT

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 11:33 am
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

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 2:24 pm
by srvet_claudio
See:

<GridControlName>.ColumnONHEADCLICK ( nColIndex ) := bColumnOnHeadClick

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 4:30 pm
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

Re: GRID + ON HEADCLICK

Posted: Thu Sep 24, 2020 9:22 pm
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

Re: GRID + ON HEADCLICK

Posted: Fri Sep 25, 2020 5:09 am
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

Re: GRID + ON HEADCLICK

Posted: Fri Sep 25, 2020 6:41 am
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....!!

Re: GRID + ON HEADCLICK

Posted: Fri Sep 25, 2020 7:01 am
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: