Page 1 of 2

Need help with code block

Posted: Tue Dec 29, 2020 10:32 pm
by Claudio Ricardo
Hi All...

In Browse with DBF work fine:
PRIVATE bColor := { || If ( Articulos->Stock < Articulos->Stk_Min , { 255,80,80 } , { 255,255,255 } ) }

Now i need some but in Grid control, add data from array
i need: if col number 3 (Stock) < col number 4 (Stock Min) show row in red... othercase normal white

Any can help me please.

Code: Select all

#include "hmg.ch"

Declare Window Stock

Function Stock_button_suc10_action

LOCAL aTable := {}
LOCAL aTotal := {}
LOCAL cQuery := ""
LOCAL tQuery := ""

PRIVATE bColor := {|| If ((This.CellColIndex,3) < (This.CellColIndex,4) , { 255,80,80 } , { 255,255,255 } ) }     // Don't work

	Load Window Stock_Sucursales
	
		SetProperty ("Stock_Sucursales" , "Title" , "Stock Sucursal 10")
	
	Stock_Sucursales. Center


	cQuery := " SELECT * FROM Stock_10;"	
	tQuery := " SELECT COALESCE(SUM(Stock_Kg),0) AS T1, COALESCE(SUM(Stock_Un),0) AS T2 FROM Stock_10;"


	If MySQL_Connect ()
	
		If MySQL_Database_Connect ()
		
			aTable := MySQL_ExecQuery (oServer,cQuery)

			aTotal := MySQL_ExecQuery (oServer,tQuery)

			DoMethod ("Stock_Sucursales" , "Grid_Stock" , "DeleteAllItems")

			If Len (aTable) > 0
			
				For n := 1 TO Len (aTable)
				
					DoMethod("Stock_Sucursales","Grid_Stock","AddItem", aTable[n] )
					
				Next
				
			EndIf

			DoMethod (Stock_Sucursales.StatusBar.Item (1) := "  Stock de Sucursal: 10 ")
			DoMethod (Stock_Sucursales.StatusBar.Item (2) := "  Total Peso:   " + AllTrim (Str (aTotal[1,1])))
			DoMethod (Stock_Sucursales.StatusBar.Item (3) := "  Total Cantidades:   " + AllTrim (Str (aTotal[1,2])))

		EndIf
	
	EndIf

	Stock_Sucursales. Activate
	
Return Nil

Re: Need help with code block

Posted: Tue Dec 29, 2020 11:18 pm
by SALINETAS24
Hola Claudio,
Aquí tienes varios ejemplos ya publicados en el foro.
Espero que te sirvan.

viewtopic.php?f=5&t=6248&p=60424&hilit= ... mna#p60424

Un saludo,

Re: Need help with code block

Posted: Tue Dec 29, 2020 11:31 pm
by movilceles
Hola Claudio,

No se si te servira algo asi:

FUNCTION ON_INIT_Stock_Sucursales

bColor := {|| If ((This.CellColIndex,3) < (This.CellColIndex,4) , { 255,80,80 } , { 255,255,255 } ) }

SETPROPERTY("Stock_Sucursales","Grid_Stock","ColumnDYNAMICFORECOLOR",3,bColor)

RETURN

Re: Need help with code block

Posted: Tue Dec 29, 2020 11:46 pm
by Claudio Ricardo
Muchas Gracias Salinetas pero no encontre nada ahi igual que en los mas de 40 ejemplos de grid que hay en samples.
Sera que no se podra hacer como en el Browse ?

Re: Need help with code block

Posted: Tue Dec 29, 2020 11:56 pm
by Claudio Ricardo
Muchas Gracias Movilceles... yo ya habia puesto en el FMG:
DYNAMICBACKCOLOR { bColor , bColor , bColor , bColor , bColor , bColor , bColor , bColor , bColor , bColor }
lo reemplace por Nil y probe tu funcion pero pone en rojo TODA la tercer columna.

Lo que necesito es destacar los registros en los que el campo (Stock en este caso) sea menor que
el campo (Stock Minimo) para que el cliente lo vea en otro color.
En el control Browse funciona perfecto el code block que muestro arriba.
pero aqui necesito usar grid porque el contenido viene de un array.

Re: Need help with code block

Posted: Wed Dec 30, 2020 12:15 am
by movilceles
Claudio prueba asi:

bColor := {|| If (Val(This.CellColIndex,3) < Val(This.CellColIndex,4) , { 255,80,80 } , { 255,255,255 } ) }

Re: Need help with code block

Posted: Wed Dec 30, 2020 12:25 am
by Claudio Ricardo
movilceles wrote: Wed Dec 30, 2020 12:15 am Claudio prueba asi:

bColor := {|| If (Val(This.CellColIndex,3) < Val(This.CellColIndex,4) , { 255,80,80 } , { 255,255,255 } ) }
Da error al compilar...
Mi error esta en como tomo el dato de cada celda para compararlo...
Intentare evaluar el array y no el grid, tal vez asi funcione...

Re: Need help with code block

Posted: Wed Dec 30, 2020 4:41 am
by Claudio Ricardo
Al no poder armar el condicional en el codeblock para grid opte por lo seguro:
Cree una DBF temporal, la cargo desde el array y reemplace el grid por browse...
Funciona perfecto aunque un poquito mas lento... Paso el codigo terminado y captura.

Code: Select all

#include "hmg.ch"

Declare Window Stock

Function Stock_button_suc10_action

LOCAL aTable := {}
LOCAL aTotal := {}
LOCAL cQuery := ""
LOCAL tQuery := ""
PRIVATE bColor := { || If ( TmpStk->Stock_Kg < TmpStk->Min_Kg .OR. TmpStk->Stock_Un < TmpStk->Min_Un ,{255,80,80} , {255,255,255} ) }

	cQuery := " SELECT * FROM Stock_10;"	
	tQuery := " SELECT COALESCE(SUM(Stock_Kg),0) AS T1, COALESCE(SUM(Stock_Un),0) AS T2 FROM Stock_10;"

	If MySQL_Connect ()
	
		If MySQL_Database_Connect ()
		
			aTable := MySQL_ExecQuery (oServer,cQuery)

			aTotal := MySQL_ExecQuery (oServer,tQuery)

			Use TmpStk New
			
				Zap

			If Len (aTable) > 0
			
				For n := 1 TO Len (aTable)
				
					Append Blank
					
						Replace Codigo With aTable[n,1]
						Replace Descrip With aTable[n,2]
						Replace Stock_Kg With aTable[n,3]
						Replace Min_Kg With aTable[n,4]
						Replace Ult_Ing_Kg With aTable[n,5]
						Replace Stock_Un With aTable[n,6]
						Replace Min_Un With aTable[n,7]
						Replace Ult_Ing_Un With aTable[n,8]
						Replace Fecha With aTable[n,9]
						Replace Hora With aTable[n,10]

				Next

					Commit
				Go Top
				
			EndIf

		Else

			MsgStop ("Error conectando a la base de datos !" , "SQL Error !")
			Return Nil

		EndIf
	
	Else

		MsgStop ("Error al intentar conectar con el Hosting !" , "Internet Error !")
		Return Nil

	EndIf

	If IsWindowActive (Stock_Sucursales)
	
		DoMethod ("Stock_Sucursales" , " SetFocus ")
		
	Else
	
		Load Window Stock_Sucursales
	
			SetProperty ("Stock_Sucursales" , "Title" , "Stock Sucursal 10")
	
			Stock_Sucursales. Center

			DoMethod (Stock_Sucursales.StatusBar.Item (1) := "  Stock de Sucursal: 10 ")
			DoMethod (Stock_Sucursales.StatusBar.Item (2) := "  Total Peso:   " + AllTrim (Str (aTotal[1,1])))
			DoMethod (Stock_Sucursales.StatusBar.Item (3) := "  Total Cantidades:   " + AllTrim (Str (aTotal[1,2])))

		Stock_Sucursales. Activate
			
	EndIf
	
Return Nil
//--------------------------------------------------------------------------------------------------------//

Function Stock_Sucursales_Form_OnRelease

	Use
	
Return Nil
Screenshot_20201230_014308.png
Screenshot_20201230_014308.png (7.83 KiB) Viewed 1523 times

Re: Need help with code block

Posted: Wed Dec 30, 2020 11:40 am
by SALINETAS24
by Claudio Ricardo » Wed Dec 30, 2020 4:41 am

Al no poder armar el condicional en el codeblock para grid opte por lo seguro:

Hola Claudio Ricardo.

La pequeña "tara" que tiene el GRID es que en tiempo de CREACIÓN solo da acceso al valor de la CELDA (This.CellValue) que se está en ese momento procesando, lo cual nos genera un problema cuando lo que queremos es comparar su valor con el valor de otra celda para pintar.

Te paso una solución al mismo, que he venido utilizando. No es muy ortodoxa pero es "resultona". y visualmente hace lo que quieres. Se trata de crear una primera Celda, no visible, (de longitud 1) y que tiene el resultado de la operación (en tu caso del Stock Actual menos el stock Mínimo) y según su valor pintamos toda la fila de un color o de otro.

Un saludo y vamos con esa cervecita.....

Re: Need help with code block

Posted: Wed Dec 30, 2020 3:02 pm
by martingz
Claudio Ricardo mil disculpas por contestar tan tarde yo uso esto en el grid para poner en rojo los cancelados, el que esta en la celda 12 si es 0 esta activo si es uno esta cancelado, creo que te serviria.

aColCan:={ ||if( ordencompra.grid_1.Cell(This.CellRowIndex,12) == '1',{244,0,0},{0,0,0})}



saludos