Página 1 de 1

Não estou conseguindo Editar direto no browse ??

Enviado: 10 Out 2008 17:26
por Cezar
Ola,

No exemplo abaixo consigo editar direto na celula do browse, porem não consigo GRAVAR as mudanças no DBF ??

Minha duvida tambem é os travamentos do registro para gravar na rede??

Agradeço ajuda.

Código: Selecionar todos

   INIT DIALOG oDlg CLIPPER NOEXIT TITLE "Parcelas";
				AT 3,32 SIZE 290,360 ;
				ICON oIcon ;
            STYLE DS_CENTER+WS_VISIBLE+WS_POPUP+WS_VISIBLE+WS_CAPTION+WS_SYSMENU ;
				FONT oFontDlg ;
				ON INIT {|| oBrowse:SetFocus() }

	SELECT Parcelas
	Parcelas->( OrdSetFocus('I01') )
	Parcelas->( DbSeek(cCodVct) )
	Parc_d( cCodVct )
	Parcelas->( DbSeek( cCodVct ) )

	Parcelas->( OrdScope( 0, cCodVct ) )
	Parcelas->( OrdScope( 1, cCodVct ) )

	@ 005,005 BROWSE oBrowse DATABASE OF oDlg	;
				SIZE 285,300  ;
				FONT oFontBrw ;
				STYLE WS_TABSTOP + WS_VSCROLL + WS_HSCROLL  ;
				AUTOEDIT  ; //		ON UPDATE {|| oBrowse:Refresh() } ;
            ON UPDATE {|oBrow, Colpos| BrowseUpdate(oBrow, colpos) } ;
				ON KEYDOWN {|o,Key| Brw_Key(o,Key,aBtn[1]) } ;
            ON GETFOCUS {|| BrwGetFocus(oBrowse)} ;
            ON LOSTFOCUS {|| BrwLostFocus(oBrowse)}

	ADD COLUMN {|| Codigo    } TO oBrowse HEADER 'Codigo'

	ADD COLUMN {|| Dias      } TO oBrowse HEADER 'Dias'      ;
												LENGTH 6                ;
												DEC 0                   ;
												EDITABLE                ;
	                                 PICTURE '999'           ;
	                                 VALID {|| Parcelas->Dias >= 1 } ;
												JUSTIFY LINE DT_RIGHT

	ADD COLUMN {|| PercTotal } TO oBrowse HEADER '%'         ;
												LENGTH 6                ;
												DEC 2                   ;
												EDITABLE                ;
	                                 PICTURE '@E 999.99' 	   ;
	                                 VALID {|| Parcelas->PercTotal >= 0.01 } ;
											   JUSTIFY HEAD DT_CENTER 	;
											   JUSTIFY LINE DT_RIGHT
	oBrowse:Alias := "Parcelas"
	oBrowse:lEsc := .T.
   oBrowse:bColorSel := cRgb('BRIGHTBLUE')
   oBrowse:htbColor  := cRgb('RED')

   nLeft := 5
   nTop := 320
   nLeft :=	DbNavigatorNew( oDlg, oBrowse, 5, 320, aBtn )

	nLeft += 60
	@ nLeft,nTop BUTTONEX aBtn[5] CAPTION "Alterar" ;
   			SIZE 50,26 ;
   			STYLE WS_TABSTOP //;
			   //ON CLICK {|| Edita( .T., oBrowse ) }

   nLeft += 50
	@ nLeft,nTop BUTTONEX aBtn[6] CAPTION "Voltar"  ;
            SIZE 50,26 ;
   			STYLE WS_TABSTOP ;
		   	ON CLICK {|| IF(Parc_c(cCodVct),oDlg:Close(),)}

   ACTIVATE DIALOG oDlg

-----------------------------------

Static Function BrowseUpdate( oBrow, colpos)

	MsgExclamation("Column " + ltrim(str(colpos)) + " Changed")

   if colpos == 2
       oBrow:Append()
   else
       oBrow:DoHScroll( SB_LINERIGHT )
       oBrow:Edit()
   end
   oBrow:Refresh()
	Return Nil

***************************************

STATIC FUNCTION Brw_Key( oBrowse, Key, oBtn1 )
   LOCAL lRet := .F.
   IF Key == VK_TAB
		oBtn1:SetFocus()
   ELSEIF Key == VK_RETURN
   	//MsgInfo(Str(oBrowse:ColPos),3)
   ELSE
      lRet :=.T.
   ENDIF
   RETURN lRet

***************************************
--------------------------------
Nota de Moderação (Toledo): mensagem editada para colocar a Tag [ code ]
Para mais detalhes veja: faq.php?mode=bbcode#f21

Re: Não estou conseguindo Editar direto no browse ??

Enviado: 12 Out 2008 10:20
por Itamar M. Lins Jr.
Ola!
Neste caso é bom usar um exemplo menor.
Somente o browse.
Porque até para entender seu código é mais trabalhoso.

Use alias:

Código: Selecionar todos

@ 005,005 BROWSE oBrowse DATABASE OF oDlg ;
SIZE 285,300 ;
FONT oFontBrw ;
STYLE WS_TABSTOP + WS_VSCROLL + WS_HSCROLL ;
AUTOEDIT ; // ON UPDATE {|| oBrowse:Refresh() } ;
ON UPDATE {|oBrow, Colpos| BrowseUpdate(oBrow, colpos) } ;
ON KEYDOWN {|o,Key| Brw_Key(o,Key,aBtn[1]) } ;
ON GETFOCUS {|| BrwGetFocus(oBrowse)} ;
ON LOSTFOCUS {|| BrwLostFocus(oBrowse)}

oBrowse:Alias := 'parcelas'
Teste somente com a linha:

Código: Selecionar todos

@ 005,005 BROWSE oBrowse DATABASE OF oDlg SIZE 285,300 ;
STYLE WS_TABSTOP + WS_VSCROLL + WS_HSCROLL ;
AUTOEDIT 
Saudações,
Itamar M. Lins Jr.

Re: Não estou conseguindo Editar direto no browse ??

Enviado: 13 Out 2008 14:18
por Cezar
Ola Itamar,

Testei o exemplo que sugeriu, com duplo click ou enter ele abre pra editar,
mas Não Grava, nem executa o Valid .

Olhando o HBrowse, se voce acrescentar:
@ 005,005 BROWSE oBrowse DATABASE OF oDlg SIZE 285,300 ;
STYLE WS_TABSTOP + WS_VSCROLL + WS_HSCROLL ;
AUTOEDIT

CreateList( oBrowse, .T. ) // *** acrescentei esta linha

Grava !!, mas modifica o cabeçalho do browse.

Voce já testou isso??

v_cez@yahoo.com.br

Re: Não estou conseguindo Editar direto no browse ??

Enviado: 13 Out 2008 15:32
por sygecom
Abaixo um exemplo que uso e funciona perfeitamente:

Código: Selecionar todos

***********************
Function PESQ_TAB_FRETE
***********************
Local oFrm, oFont
PRIVATE oIcon := HIcon():AddResource(1004)

SetToolTipBalloon(.t.)
GravaLog("PESQUISA DE TABELA DE FRETE")

use TAB_FRETE alias TAB_FRETE shared

SELE TAB_FRETE

PREPARE FONT oFontBtn NAME "Arial" WIDTH 0 HEIGHT -14 
        INIT DIALOG oFrm TITLE "Pesquisa da Tabelas de Fretes" CLIPPER FONT oFontBtn;
        AT 0,0;
        SIZE 500,240;
        ICON oIcon ;
        STYLE WS_DLGFRAME + WS_SYSMENU + DS_CENTER

@ 10,40 BROWSE oBrw DATABASE OF oFrm SIZE 480,130;
        STYLE  WS_VSCROLL + WS_HSCROLL;
        ON POSCHANGE {|| SetFocus(oBrw:handle ) }

oBrw:alias := aLIAS()

oBrw:bKeyDown := {|o,key| BrowseKey_Frete(o, key ) }
@ 5,185 say "Clique duas Vez no Campo FRETE para Alterar o Valor do Frete" size 500,22;
STYLE SS_CENTER COLOR x_BLUE

@ 5,10 say "F1 - Sobre  / F5 - Gera Excel" size 500,22;
STYLE SS_CENTER COLOR x_BLUE

PREPARE FONT oFont NAME "Arial" WIDTH 0 HEIGHT -16

oBrw:AddColumn( HColumn():New( "Solto / Fardo",        FieldBlock(Fieldname(1)),"C",   5,0) )
oBrw:AddColumn( HColumn():New( "Entrada / Saida",      FieldBlock(Fieldname(2)),"C",   7,0) )
oBrw:AddColumn( HColumn():New( "R$ Frete Por Tonelada",FieldBlock(Fieldname(3)),"N",   10,2,.T.,0,0,,,,,,))

FOR nI := 1 TO 3
    oBrw:aColumns[nI]:nJusHead := DT_CENTER    //CENTRALIZA NO NOME DO CAMPO
    oBrw:aColumns[nI]:nJusLin  := DT_LEFT     //COLOCA PARA DIREITA A LINHA
NEXT
oBrw:aColumns[1]:length := 5
oBrw:aColumns[2]:length := 7
oBrw:aColumns[3] :picture:="@E 9,999,999.99"

oBrw:aColumns[3]:lEditable := .F.

oBrw:Refresh()
oBrw:SetFocus()
setfocus(obrw)

oFrm:Activate()
return nil

Re: Não estou conseguindo Editar direto no browse ??

Enviado: 13 Out 2008 17:27
por Itamar M. Lins Jr.
No exemplo abaixo consigo editar direto na celula do browse, porem não consigo GRAVAR as mudanças no DBF ??
Minha duvida tambem é os travamentos do registro para gravar na rede??
Pode ser porque estejas usando o ordscope.
E o ponteiro caindo em BOF ou EOF.
Não vai adicionar e ou gravar as alterações mesmo, tem que ter o append olhe a sintaxe do browse.
Eu tenho no meu sistema apenas um browse que o usuário digita(muda) a data de vencimento de uma parcela a vencer, e funciona.
Agora é examinar esse "CreateList" e colocar a parte que te interessa no seu sistema.


Saudações,
Itamar M. Lins Jr.

Re: Não estou conseguindo Editar direto no browse ??

Enviado: 14 Out 2008 17:33
por Cezar
Boa tarde,

O problema porque minha rotina não funcionava:

Usando a função FieldBlock(Fieldname(1)), Funciona!!!
Usando a função {|| Parcelas->Dias } , Não Funciona!!!
( Exemplos abaixo )
O hBrowse.prg não diferencia o parametro recebido.

O problema de usar FieldBlock(FieldName(1)) é que as vezes o arquivo tem muitos campos, nem sempre na sequencia, se for incluido ou excluido, muda a sequencia e vai bagunçar o browse.

Grato, Cezar.


EXEMPLO-1 ( Funciona! )

Código: Selecionar todos

oBrw:AddColumn( HColumn():New( "Solto / Fardo",        FieldBlock(Fieldname(1)),"C",   5,0) )
oBrw:AddColumn( HColumn():New( "Entrada / Saida",      FieldBlock(Fieldname(2)),"C",   7,0) )
oBrw:AddColumn( HColumn():New( "R$ Frete Por Tonelada",FieldBlock(Fieldname(3)),"N",   10,2,.T.,0,0,,,,,,))

Ou
ADD COLUMN FieldBlock(Fieldname(1) ) TO oBrowse HEADER 'Codigo'
ADD COLUMN FieldBlock(Fieldname(2) ) TO oBrowse HEADER 'Dias'   ;
			LENGTH 6                ;
		                DEC 0                   ;
			EDITABLE                ;
EXEMPLO-2 ( Não Funciona! )

Código: Selecionar todos

oBrw:AddColumn( HColumn():New( "Solto / Fardo",        {||AAA}  ,"C", 5,0) )
oBrw:AddColumn( HColumn():New( "Entrada / Saida",      {||BBB}  ,"C", 7,0) )
oBrw:AddColumn( HColumn():New( "R$ Frete Por Tonelada", ||FRETE},"N",10,2,.T.,0,0,,,,,,))

Ou
ADD COLUMN {|| AAA } TO oBrowse HEADER 'Codigo'
ADD COLUMN {|| BBB } TO oBrowse HEADER 'Dias'   ;
			LENGTH 6                ;
		                DEC 0                   ;
--------------------------------
Nota de Moderação (Toledo): mensagem editada para colocar a Tag [ code ]
Já enviei um MP para o autor, solicitando o uso da tag nas próximas mensagens.