Objeto Grid, seek, refresh

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Alô pessoal!

Espero que tenham curtido bem o carnaval. Pra "abrir o ano" (dizem que o ano realmente começa depois do carnaval) uma dúvida:

Fiz um GRID de uma tabela indexada, e quando faço um SEEK nessa tabela dou o REFRESH no GRID mas nada acontece, ele permanece como se no topo da tabela. Fiz um teste e o seek está funcionando, no caso com uma busca por data. Devia ser simples, pois no BROWSE isso é molinho. Usei o GRID nesse caso como aprendizado e não está dando certo apesar de ver os exemplos do HMG e o guia fornecido pelos colegas aqui.

Se alguem já passou por isso e quiser me dar uma luz, desde já agradeço.

Saudações,
Mario.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Objeto Grid, seek, refresh

Mensagem por Pablo César »

Mario, poderia postar o código onde faz o seek ? Eu assignaria o valor do RECNO ao grid, tipo:

Form_1.Grid_1.RecNo := <numero do registro encontrado pelo SEEK>
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Oi Pablo!

Eu tentei, mas não deu certo...

Código: Selecionar todos


FUNCTION BuscaOperac()

DBSELECTAR("OPERFIRM")
DBSETORDER(1)
IF ! DBSEEK(DTOS(Frm_Operacao.DatePicker.Value))
   MSGINFO("DATA NÃO LOCALIZADA")
   DBGOBOTTOM()
ENDIF   
Frm_Operacao.Grid_1.Recno := OPERFIRM->(RECNO())
Frm_Operacao.Grid_1.refresh

RETURN .T.

Dá um erro em tempo de execução:

GRID: SET RECNO PROPERTY NOT ALLOWED FOR FILTRED/CONDITIONAL INDEXED TABLES

Imagino que seja o SET DELETED ON que sempre uso. É necessário nos programas que faço.

Dizem que o GRID é mais avançado que o BROWSE, mas ele não dá essa zica não...

Abraço,
Mario.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Objeto Grid, seek, refresh

Mensagem por Pablo César »

No Browse eu faço assim: SetProperty( "Win_Edit", "Browse_1", "Value", (cArea)->( RecNo() ) )

Mas antes coloco:
DoMethod("Win_Edit","Browse_1","SetFocus")
DoMethod("Win_Edit","Browse_1","Refresh")
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Objeto Grid, seek, refresh

Mensagem por Toledo »

Mário, tenta assim:

Código: Selecionar todos

Frm_Operacao.Grid_1.Value := OPERFIRM->(RECNO())
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Fabio, valeu as dicas. Em verdade para o BROWSE não precisei fazer nada de especial, o form principal do programa gerencia uma tabela com direito a inclusão, alteração e exclusão com o BROWSE. Tudo simples e direto.

Toledo, não funcionou. O GRID fica parado no inicio da tabela, mesmo com o REFRESH, após um bem sucedido SEEK. Vai entender... Vou insistir, pois é como aprendemos a lidar com a ferramenta. Se não tiver jeito, vou pro BROWSE, fazer o que?

Obrigado, gente!

Sds,
Mario.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Objeto Grid, seek, refresh

Mensagem por Toledo »

Mário, faz um teste com este código:

Código: Selecionar todos

#include "hmg.ch"
Function Main

        Set Date to British
	Private aCampos := { {"DATA","D",8,0}, {"CAMPO1","C",30,0}, ;
                          {"CAMPO2","C",30,0}, {"CAMPO3","N",10,0},;
                          {"CAMPO4","L",1,0}, {"CAMPO5","M",10,0} }

        If !File( "TESTE.DBF" )
          DBcreate( "TESTE", aCampos )
        EndIF

	aCtrl_1 := {'DATEPICKER','UPDOWN'}
	aCtrl_2 := {'TEXTBOX','CHARACTER'}
	aCtrl_3 := {'TEXTBOX','CHARACTER'}
	aCtrl_4 := {'TEXTBOX','NUMERIC','9999999999'}
	aCtrl_5 := { 'CHECKBOX' , 'Sim' , 'Nao' }
	aCtrl_6 := { 'EDITBOX' }

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 800 ;
		HEIGHT 510 ;
		TITLE 'Busca em Grid' ;
		MAIN 

		DEFINE MAIN MENU 
			POPUP 'Fazer Busca'
				ITEM 'Busca 1 - Recno' ACTION BuscaOperac(1)
				ITEM 'Busca 2 - Value' ACTION BuscaOperac(2)
			END POPUP
		END MENU

		USE TESTE

                If Lastrec()==0
                  For i=(date()-180) to date()
                   Append Blank
                   TESTE->data:=i
                   TESTE->Campo1:="Nome "+STR(RECNO())
                   TESTE->Campo2:="Endereco "+STR(RECNO())
                   TESTE->Campo3:=RECNO()
                   TESTE->Campo4:=(RECNO()/2)=INT(RECNO()/2)
                  Next
                  INDEX ON DTOS(data) TO TESTE
                Endif
                SET INDEX TO TESTE

		GO TOP

		@ 10,10 GRID Grid_1 ;
			WIDTH 770 ;
			HEIGHT 440 ;
			HEADERS {'Coluna 1','Coluna 2','Coluna 3','Coluna 4','Coluna 5','Coluna 6'} ;
			WIDTHS {100,140,140,140,100,100};
			VALUE { 1 , 1 } ;
			EDIT ;
			COLUMNCONTROLS { aCtrl_1 , aCtrl_2 , aCtrl_3 , aCtrl_4 , aCtrl_5 , aCtrl_6 } ;
			ROWSOURCE "Teste" ;
			COLUMNFIELDS { 'Data' ,  'Campo1' , 'Campo2' ,  'Campo3' , 'Campo4' , 'Campo5' } ;
			ALLOWAPPEND ;
			ALLOWDELETE

		
	END WINDOW
	CENTER WINDOW Form_1
	ACTIVATE WINDOW Form_1
Return

FUNCTION BuscaOperac(vQual)
Local vData, Title , aLabels , aInitValues , aFormats , aResults 

IF vQual==1
 Title:='Seleciona usando Recno'
ELSE
 Title:='Seleciona usando Value'
ENDIF

aLabels 	:= { 'Informe a Data:' }
aInitValues 	:= { Date() }
aFormats 	:= { Nil }

aResults 	:= InputWindow ( Title , aLabels , aInitValues , aFormats )

If aResults [1] == Nil
  MsgInfo ('Não foi informado uma data','Cancelado')
  Retu Nil
Else
  vData := aResults [1]
Endif

If ! DBSEEK(DTOS(vData))
   MSGINFO("DATA NÃO LOCALIZADA")
   DBGOBOTTOM()
ENDIF

IF vQual==1
 Form_1.Grid_1.Recno := OrdKeyNo()
ELSE
 Form_1.Grid_1.Value := {OrdKeyNo(),1}
ENDIF
RETURN .T.
Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Toledo, rodei o codigo que vc mandou e funcionou. Tentei colar o OrdKeyNo() na minha função e não atualiza. Imagino que tenho quer configurar a propriedade VALUE com um valor inicial ou algo assim. Vou fuçar e dou noticias.

Como sempre, obrigado...

sds,
Mario.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Objeto Grid, seek, refresh

Mensagem por Toledo »

Mário, observe que no meu código eu não estou usando o Refresh.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Toledo, eu notei. E faz diferença. Com ele não acha, vai pro topo do GRID.

Uma coisa: Rodei seu programa com SET DELETED ON e deu pau no RECNO(). Erro que comentei acima. Fica a dica pros que lerem. Como é um tipo de filtro, zica o GRID. Isso é ruim pois restringe o uso em tabelas pequenas, de pouca importância, pois em um cadastro de clientes, por exemplo, quendo se deleta, tem que sumir com o cabra. E não se pode dar PACK numa tabela a qualquer hora...

Em tese, pro meu programa o VALUE do GRID devia resolver com o OrdKeyNo(), mas não está funcionando bem. O SEEK acha o registro, o OrdKeyNo() informa corretamente, mas não para no registro correto. Minha tabela está com quatro indices, usando CDX. Verifiquei SET SOFT (está OFF), SET CENT (ON), SET EPOC (1964). Não é SEEK. É o GRID. Alguma coisa está provocando falha no seu ponteiramento interno.

A luta continua. Insisto pois calculo que o GRID será util no futuro, então vamos lá...

Abraço,
Mario.
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

Re: Objeto Grid, seek, refresh

Mensagem por Toledo »

Olá Mário, notei que com o Refresh acontece isto mesmo, retorna para o primeiro registro. Então, por este motivo retirei o Refresh neste meu exemplo.
Mario Mesquita escreveu:Rodei seu programa com SET DELETED ON e deu pau no RECNO()
Fiz a mesma coisa aqui, coloquei o SET DELETED ON neste meu exemplo e depois exclui dois registros no arquivo TESTE.DBF, foram o registro número 10 (Nome 10) e 20 (Nome 20). Não usei o pack, e funcionou sem erro algum, mas só é posiciona certinho na data escolhida com o RECNO, já o VALUE posiciona duas datas pra frente.

Bom, estou usando a MiniGui oficial, versão HMG 3.0.35 (http://www.hmgforum.com/site).

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Bom tarde a todos.

Toledo, estou usando a 3.0.27 e me parece estável, mas sabe-se lá... Tô tentando até agora e fiquei num beco sem saída, aparentemente. Penso que algo no ambiente do programa esteja emperrando o GRID. Mistério...

Tenho medo de atualizar e "desandar a maionese" aqui. Estou com prazo pra entregar um trabalho e temo ter que perder muito tempo acertando setups para usar a nova versão. Mas claro, é melhor atualizar, vai que tem um bug e já tá ok?

Valeu a força. Qualquer avanço, aviso a voce. Obrigado de novo.

Sds,
Mario.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Alô, vcs, voltei.

Toledo, algo estranho acontece.

Baixei a 3.0.35 e compilei o programa. funcionou. Só que de repente, recompilo ou rodo de novo e o erro acontece de novo. Deleto o .EXE e funciona. Recompilo e não funciona.

E agora? Não é estranho? Pelo que li no histórico de atualizações, o GRID tinha bugs a rodo... Será que numa rotina simples ele vai bem, mas dentro de uma sistema um pouco mais complexo, ele falha??

Abraço,
Mario.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Ultima forma: Está funcionando corretamente. Por que? Não sei. Fechei a IDE, abri de novo, deletei o .EXE, recompilei, funcionou.

Estou tentando forçar erro nele. Aviso o resultado.

Sds,
Mario.
Avatar do usuário
Mario Mesquita
Usuário Nível 4
Usuário Nível 4
Mensagens: 613
Registrado em: 08 Dez 2009 13:47
Localização: Rio de Janeiro

Re: Objeto Grid, seek, refresh

Mensagem por Mario Mesquita »

Olá, pessoal. Boa tarde a todos.

Volto no post para relatar um comportamento estranho do GRID. Testando meu programa, tem eventos que quando abro a tabela e a edito, o GRID não mostra a mesma, ficando todo preto. Os dados estão lá, posso editá-los, mas o GRID não faz o display. Percebi que isso ocorre em momentos específicos, quando abro e fecho a tabela. Na rotina em questão, o GRID está ok. Saio da rotina e fecho a tabela. Vou em outra rotina, a tabela é aberta de novo. Saio desta e fecha-se a tabela. Volto na rotina do GRID, e aí acontece. Ela aparece toda preta, sem exibir as celulas. Elas estão lá, pode ser editadas, mas não as vejo.

Deve ser alguma coisa que estou fazendo errado ou deixando de fazer. Mas o fato é que com BROWSE, tudo roda beleza, sem sustos. O GRID parece mais manhoso. Ou tem falhas ainda não corrigidas. Não tenho como atestar isso, dada minha pouca experiencia com as ferramentas, logo se voces viram algo sobre isso e quiserem comentar, fiquem a vontade.

Obrigado a todos,
Mario.
Responder