Página 1 de 1

BUG HWGUI 2.22 B4

Enviado: 28 Out 2020 14:30
por Fernando queiroz
Estou tendo um bug na HBROWSE da HWGUI usando ADO , o mesmo acontece esporadicamente quando estou consultando um produto, o produto tem um CODEBLOCK para colocar em vermelho os produtos que nao tem estoque ou preto nos que tem estoque.

Código: Selecionar todos

Error BASE/1132  Bound error: array access
Called from CLASS_PRODUTOS.PRG->(b)PRODUTOSCLASS_PRODUTOS_PESQUISA(2820)
Called from source\winapi\hbrowse.prg->HBROWSE:LINEOUT(1112)
Called from source\winapi\hbrowse.prg->HBROWSE:PAINT(813)
Called from source\winapi\hbrowse.prg->HBROWSE:ONEVENT(331)
Called from ->HWG_REDRAWWINDOW(0)
Called from source\winapi\hbrowse.prg->HBROWSE:REFRESH(2025)
Called from CLASS_PRODUTOS.PRG->PRODUTOSCLASS:PESQUISA_PRODUTOS_ONKEYDOWN(2941)
Called from CLASS_PRODUTOS.PRG->(b)PRODUTOSCLASS_PRODUTOS_PESQUISA(2802)
Called from source\winapi\hbrowse.prg->HBROWSE:ONEVENT(381)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from source\winapi\hdialog.prg->HDIALOG:ACTIVATE(156)
Called from CLASS_PRODUTOS.PRG->PRODUTOSCLASS:PRODUTOS_PESQUISA(2842)
Called from NOTADEPEDIDOGRAFICA.PRG->NOTA_DE_PEDIDO_VALIDA_PRODUTOS(579)
Called from NOTADEPEDIDOGRAFICA.PRG->(b)NOTA_DE_PEDIDO(95)
Called from source\winapi\hedit.prg->__VALID(893)
Called from source\winapi\hedit.prg->(b)HEDIT_NEW(98)
Called from source\winapi\hdialog.prg->ONDLGCOMMAND(374)
Called from source\winapi\hdialog.prg->(b)(_INITSTATICS00003)(0)
Called from source\winapi\hdialog.prg->HDIALOG:ONEVENT(211)
Called from ->HWG_SETFOCUS(0)
Called from source\winapi\hedit.prg->HWG_GETSKIP(1082)
Called from source\winapi\hdialog.prg->ONDLGCOMMAND(359)
Called from source\winapi\hdialog.prg->(b)(_INITSTATICS00003)(0)
Called from source\winapi\hdialog.prg->HDIALOG:ONEVENT(211)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from source\winapi\hdialog.prg->HDIALOG:ACTIVATE(156)
Called from NOTADEPEDIDOGRAFICA.PRG->NOTA_DE_PEDIDO(218)
Called from SGC.PRG->(b)ACESSO_9(291)
Called from source\winapi\htool.prg->HTOOLBAR:NOTIFY(414)
Called from source\winapi\hcwindow.prg->ONNOTIFY(263)
Called from source\winapi\hcwindow.prg->(b)(_INITSTATICS00005)(0)
Called from source\winapi\hcwindow.prg->HWINDOW:ONEVENT(191)
Called from source\winapi\hdialog.prg->HDIALOG:ONEVENT(219)
Called from ->HWG_DLGBOXINDIRECT(0)
Called from source\winapi\hdialog.prg->HDIALOG:ACTIVATE(156)
Called from SGC.PRG->MAIN(196)

HWGUI 2.22 Build 4
Date:28/10/2020
Time:11:36:08
minha rotina esta assim:

Código: Selecionar todos

	@ 4,70 BROWSE oBrowse1 ARRAY OF oDlgPROD SIZE 900,304 STYLE WS_BORDER + WS_VSCROLL +WS_HSCROLL ;
			ON SIZE ANCHOR_TOPABS + ANCHOR_LEFTABS + ANCHOR_RIGHTABS + ANCHOR_BOTTOMABS ;
			ON CLICK {|| oDlgPROD:Close()  } ;
			ON KEYDOWN {|oBrowse1,nKeyPress| ::PESQUISA_PRODUTOS_onKeyDown( oBrowse1, nKeyPress, oDlgProd, @cProgressKey, cAlvo_Consulta ) }

		oBrowse1:oStyleHead := HStyle():New( { 0xffffff, 0xbbbbbb }, 1,, 0.4, 16759929 )
		oBrowse1:oFont := HFont():Add( '',0,-15,700,,,)
		oBrowse1:freeze := 2
		oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( "ORDER BY PRODUTOS.DESPRO LIMIT 50" ) 

		oBrowse1:AddColumn( HColumn():New( "ID",hwg_ColumnArBlock(),"N",13,0,.F.,1,2,'99999999999',,,,,; 
					{|| oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( "ORDER BY PRODUTOS.PRODUTOS_ID LIMIT 50" ),cAlvo_Consulta:="PRODUTOS.PRODUTOS_ID",obrowse1:Refresh(), hwg_WriteStatus( oDlgPROD,3,"Ordem: CODIGO") } ,,,,))

		oBrowse1:AddColumn( HColumn():New('DESCRIÇÃO/NOME PRODUTO', hwg_ColumnArBlock() ,'C',85, 0 ,.F.,1,,,,,,,;
					{|| oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( "ORDER BY PRODUTOS.DESPRO LIMIT 50" ), cAlvo_Consulta:="PRODUTOS.DESPRO",obrowse1:Refresh(), hwg_WriteStatus( oDlgPROD,3,"Ordem: DESCRIÇÃO/NOME PRODUTO") } ,,,,))

		oBrowse1:AddColumn( HColumn():New('Unidade', hwg_ColumnArBlock() ,'C',9, 0 ,.F.,1,,,,,,,,,,,))
		oBrowse1:AddColumn( HColumn():New('Preço Venda', hwg_ColumnArBlock() ,'N',14, 2 ,.F.,1,2,'@E 999,999.99',,,,,,,,,))
		oBrowse1:AddColumn( HColumn():New('Estoque Loja', hwg_ColumnArBlock() ,'N',22, 3 ,.F.,1,2,,,,,,,,,,))

		BEGIN SEQUENCE 
			bColorBlock :={|| IIF( oBrowse1:aArray[oBrowse1:nCurrent,6] < 0.001 ,{255, 16777215 ,16777215,255 },{0,16777215,16777215,0 }) }	
		RECOVER 
			bColorBlock :={|| {0,16777215,16777215,0 } }	
		END SEQUENCE
		

		FOR EACH oColuna IN oBrowse1:aColumns
			oColuna:bColorBlock := bColorBlock
		NEXT
a rotina de carga e consulta esta assim:

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD PESQUISA_PRODUTOS_CARREGA( cAlvo_Consulta ) CLASS PRODUTOSCLASS
************************************************************************************************************************************************************************************************************************
LOCAL aResult :={};
	, oQuery;
	, cQuery
	
	cQuery := "SELECT PRODUTOS.PRODUTOS_ID, ";
					+ "PRODUTOS.DESPRO, ";
					+ "PRODUTOS.TIPUNI, ";
					+ "PRODUTOS.preven, ";
					+ "PRODUTOS.ESTATU, ";
					+ "(PRODUTOS.ESTATU + PRODUTOS.ESTL02) SOMA ";
					+ "from PRODUTOS ";
					+ cAlvo_Consulta
	oQuery := ::oServer:Execute(cQuery)

	if oQuery:Eof()
		aAdd( aResult, {0,;
						'',;
						'',;
						0.00,;
						0.000,;
						0.000} ) 
	endif
	DO WHILE ! oQuery:Eof()
		aAdd( aResult, {oQuery:Fields( "PRODUTOS_ID" ):Value,;
						oQuery:Fields( "DESPRO" ):Value,;
						oQuery:Fields( "TIPUNI" ):Value,;
						oQuery:Fields( "preven" ):Value,;
						oQuery:Fields( "ESTATU" ):Value,;
						oQuery:Fields( "SOMA" ):Value} ) 
		oQuery:MoveNext()
	ENDDO
	oQuery:Close()	
		
RETURN aResult
************************************************************************************************************************************************************************************************************************
METHOD PESQUISA_PRODUTOS_onKeyDown( oBrowse1, nKeyPress, oDlgProd, cProgressKey, cAlvo_Consulta ) CLASS PRODUTOSCLASS
************************************************************************************************************************************************************************************************************************
LOCAL nPosicao:=0;
	, cConsulta;
	
	KSETCAPS(.T.);

	IF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ "34|33|37|38|39|40|20|16"
		cProgressKey:=""
		oDlgProd:oLabel2:settext(cProgressKey)
		RETURN .T.
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [90]
		nKeyPress := 90
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [96]
		nKeyPress := 48
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [97]
		nKeyPress := 49
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [98]
		nKeyPress := 50
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [99]
		nKeyPress := 51
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [100]
		nKeyPress := 52
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [101]
		nKeyPress := 53
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [102]
		nKeyPress := 54
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [103]
		nKeyPress := 55
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [104]
		nKeyPress := 56
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [105]
		nKeyPress := 57
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [106]
		nKeyPress := 42
	ELSEIF nKeyPress # 8 .AND. AllTrim(Str(nKeyPress)) $ [190]
		nKeyPress := 46
	ELSEIF nKeyPress == Asc("8") .AND. hwg_isCtrlShift( .F.,.T. )
		nKeyPress := 42		
	ENDIF   
	
	IF  nKeyPress = VK_RETURN .OR. nKeyPress = VK_ESCAPE
			oDlgProd:Close()
		RETURN .T.
	ENDIF
		
	If nKeyPress # 8
		cProgressKey += Chr(nKeyPress)
		nPosicao:=AScan(oBrowse1:aArray,cProgressKey)
		oDlgProd:oLabel2:settext(cProgressKey)
//		cConsulta:= "WHERE " + cAlvo_Consulta + IF(isalpha(cProgressKey), " LIKE '%" + cProgressKey + "%'" ,  " LIKE '" + cProgressKey + "%'") + " ORDER BY " + cAlvo_Consulta
		cConsulta:= "WHERE " +cAlvo_Consulta + " LIKE '%" + cProgressKey + "%'" + " ORDER BY " + cAlvo_Consulta
		oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( cConsulta )
		oDlgProd:obrowse1:REFRESH()
	ELSEIF nKeyPress = 8 .AND. Len(cProgressKey) >= 1
		cProgressKey:=Left(cProgressKey,Len(cProgressKey) - 1)
		nPosicao:=AScan(oBrowse1:aArray,cProgressKey)
		oDlgProd:oLabel2:settext(cProgressKey)
//		cConsulta:= "WHERE " + cAlvo_Consulta + IF(isalpha(cProgressKey), " LIKE '%" + cProgressKey + "%'" ,  " LIKE '" + cProgressKey + "%'") + " ORDER BY " + cAlvo_Consulta
		cConsulta:= "WHERE " +cAlvo_Consulta + " LIKE '%" + cProgressKey + "%'" + " ORDER BY " + cAlvo_Consulta
		oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( cConsulta )
		oDlgProd:obrowse1:REFRESH()
	ENDIF   
	IF nPosicao # 0
		cConsulta:= "WHERE " + cAlvo_Consulta + " LIKE '%" + cProgressKey + "%'" + " ORDER BY " + cAlvo_Consulta
//		cConsulta:= "WHERE " +cAlvo_Consulta + IF(isalpha(cProgressKey), " LIKE '%" + cProgressKey + "%'" ,  " LIKE '" + cProgressKey + "%'") + " ORDER BY " + cAlvo_Consulta
		oBrowse1:aArray := ::PESQUISA_PRODUTOS_CARREGA( cConsulta )
		oDlgProd:obrowse1:REFRESH()
	ENDIF  

return .T. 
estou achando que deve ser um problema com o ADO que nao esta retornando os dados ou o HBROWSE que se perde com o retorno
obs: o erro nao acontece sempre

BUG HWGUI 2.22 B4

Enviado: 28 Out 2020 17:46
por sygecom
Não sei qual SGBD está usando, mas já tentou forçar no SQL para sempre ser um determinado tipo de campo ?
ex?

Código: Selecionar todos

cQuery := "SELECT PRODUTOS.PRODUTOS_ID, ";
009	               + "PRODUTOS.DESPRO, ";
010	               + "PRODUTOS.TIPUNI, ";
011	               + "PRODUTOS.preven, ";
012	               + "PRODUTOS.ESTATU, ";
013	               + "(PRODUTOS.ESTATU + PRODUTOS.ESTL02)::numeric(19,2) SOMA ";
014	               + "from PRODUTOS ";
015	               + cAlvo_Consulta

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 10:40
por JoséQuintas
Fernando queiroz escreveu:estou achando que deve ser um problema com o ADO que nao esta retornando os dados ou o HBROWSE que se perde com o retorno
Aqui você está errado pra você mesmo, ao mesmo tempo que está cortando possível ajuda.
Você está usando ADO, ok, mas isso não tem nada a ver com o browse, porque no browse está usando ARRAY.

A mensagem de erro é sobre elemento que não existe no array.
Olhe a linha do erro, para tentar descobrir as variáveis envolvidas: array e elemento

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 10:47
por JoséQuintas
E se está recarregando o array durante o browse.....

Supondo que o array tem 11 elementos, e está posicionado no elemento 10....
Se recarrega o array com 5 elementos... a posição 10 se tornou inválida e vai gerar esse erro.
Verifique se ao recarregar o array está atualizando para uma nova posição.

Como eu já disse, a linha do erro é o ponto de referência, pra olhar as variáveis envolvidas.
Olhando o fonte postado não dá pra saber que linha é essa.

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 14:23
por Fernando queiroz
Quinta o Array estava sendo carregado corretamente tanto que o erro não aparece sempre, a coisa pode passar vários dias sem erro e em algum momento ocorrer o erro, sem compilar novamente e tentando simular o mesmo procedimento no momento em que deu o erro ele não se repete mais,

tanto que:
o campo testado no CODEBLOCK constava do ARRAY

a única coisa que depois verifique era que eu somava decimal(10,3) + decimal(10,3) < 0.0001 ou < 1 fiz a correção para < 0.001
e agora estou testando para ver se não acontece mais.

e durante alguns teste fiz ate a soma pelo banco de dados e retornava 0 = false ou 1 = true e mesmo assim ocorria o erro , coloquei o campo no hbrowse e no array e o erro persistia.

parecia que ele em algum momento nao conseguia fazer o EVAL do CODEBLOCK , e na maior parte do tempo ele fazia corretamente, isso que achei estranho.

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 14:35
por Fernando queiroz
a minha solução mais pratica foi carregar o array somente com os produtos que tem estoque , não mostro mais os que estão zerados em vermelho, mas ficou a duvida quanto ao problema.

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 15:13
por joaoalpande
Boa tarde,

Já me ocorreu um erro desses , por algum motivo o :nCurrent fica com um valor superior ao tamanho do array do browse e ocorre esse erro, na altura eu fiz uma validação para testar se é superior ao tamanho do array, para solucionar esse erro que ocorria esporádicamente:

IF LEN(:oBrw:aArray)>0 .AND. LEN(:oBrw:aArray) >= :oBrw:nCurrent

Pode tentar se resolve seu problema.

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 17:19
por Fernando queiroz
joaoalpande escreveu:Boa tarde,

Já me ocorreu um erro desses , por algum motivo o :nCurrent fica com um valor superior ao tamanho do array do browse e ocorre esse erro, na altura eu fiz uma validação para testar se é superior ao tamanho do array, para solucionar esse erro que ocorria esporádicamente:

IF LEN(:oBrw:aArray)>0 .AND. LEN(:oBrw:aArray) >= :oBrw:nCurrent

Pode tentar se resolve seu problema.
João com o seu POST reforçou a certeza que o problema é na HWGUI , pois testei de varias formas e acontecia esporadicamente

Valeu pela dica!!

BUG HWGUI 2.22 B4

Enviado: 29 Out 2020 23:04
por JoséQuintas
joaoalpande escreveu:por algum motivo o :nCurrent fica com um valor superior ao tamanho do array do browse e ocorre esse erro
Tive essa impressão quando tive problema com ADO.
Até mencionei que tudo estava diferente do tbrowse, não só pra ADO, mas também pra array e DBF.
Pra incluir novos registros, talvez seja criado o registro "fantasma", com um número maior do que existe.

Talvez ajustar o hbrowse de uma vez igual ao tbrowse, os codeblocks de movimentação de dbf e array.
Mas vai precisar ajustar internamente também, fazer o que fez pra ADO também em dbf e array.