Devem pensar: como é que dá pra trabalhar sem variável PUBLIC/PRIVATE?
E não é que dá....
Situação: Usar o TBrowse para um array
Mas... e o contador de controle?
Colocar parcial aqui.
STATIC FUNCTION f_consulta()
LOCAL oMyBrowse, oTbrowse, nBrowItem := 1
LOCAL nKey := 0, lin := 4
LOCAL aRecNoList := {}, nPos
SELECT RQR3
GOTO TOP
DO WHILE ! Eof()
AAdd( aRecNoList, { RQR3->( RecNo() ), .F. } )
RQR3->( dbSkip() )
ENDDO
oMyBrowse := TBrowseDB( lin + 1, 3, MaxRow() - 4, MaxCol() - 4 )
oMyBrowse:SkipBlock := { | nSkip, nTemp | nTemp := nBrowItem, nBrowItem := Max( 1, Min( Len( aRecnoList), nBrowItem + nSkip ) ), nBrowItem - nTemp }
oMyBrowse:GoTopBlock := { || nBrowItem := 1 }
oMyBrowse:GoBottomBLock := { || nBrowItem := Len( aRecnoList ) }
oTBrowse := { ;
{ " " , { || f_flag( aRecNoList, nBrowItem ) } }, ;
{ "R.M" , { || RQR3->cod_rm } }, ;
{ " " , { || RQR3->cod_pro } }, ;
{ "Produto" , { || f_nome() } }, ;
{ "Quantidade", { || Transform( RQR3->qde_almc + RQR3->qde_alms,"99999.999" ) } }, ;
{ "Obra" , { || RQR3->cod_pi } }, ;
{ "Emp" , { || RQR3->cod_emp } } }
ToBrowse( oTBrowse, oMyBrowse )
DO WHILE .T.
Mensagem( "<F3 Marca/Desmarca Item para Impressao> <F6 Imprime> <F7 Exclui> <Esc Sair>" )
IF BrowseNavigate( oMyBrowse, @nKey )
ELSEIF nKey == K_F3
f_Marca( @aRecNoList )
oMyBrowse:refreshCurrent()
ELSEIF nKey == K_F6
f_imparcial( aRecNoList )
FOR nPos = Len( aRecNoList ) TO 1 STEP -1
IF aRecNoList[ nPos, 2 ]
ADel( aRecNoList, nPos )
ASize( aRecNoList, Len( aRecNoList ) - 1 )
ENDIF
NEXT
oMyBrowse:RefreshAll()
ELSEIF nKey == K_F7
IF ! Eof()
IF MsgYesNo( AppUserName() + " confirma exclusao do registro atual?" )
nPos := ASCan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) } )
IF nPos != 0
ADel( aRecNoList, nPos )
ASize( aRecnoList, Len( aRecnoList ) - 1 )
ENDIF
RecLock()
DELETE
RecUnlock()
oMyBrowse:RefreshAll()
ENDIF
ENDIF
ELSEIF nKey == K_ESC
EXIT
ENDIF
ENDDO
RETURN .T.
STATIC FUNCTION f_flag( aRecNoList, nBrowItem )
LOCAL nPos
GOTO ( aRecnoList[ nBrowItem, 1 ] )
nPos := AScan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) .AND. e[ 2 ] } )
RETURN iif( nPos != 0, "*", " " )
STATIC FUNCTION f_Marca( aRecNoList )
LOCAL nPos
nPos := AScan( aRecNoList, { | e | e[ 1 ] == RQR3->( RecNo() ) } )
IF nPos != 0
aRecNoList[ nPos, 2 ] := ( ! aRecNoList[ nPos, 2 ] )
ELSE
AAdd( aRecnoList, { RecNo(), .T. } )
ENDIF
RETURN NIL
No começo o tbrowse era do arquivo, e o array só guardava a lista de marcados.
Precisei acelerar (aà não tem tudo) pra Flagship, então pensei no array.
O browse é de array, mas o arquivo vai acompanhando o array (f_Flag() posiciona)
O array contém o número de registro e a indicação se está marcado.
nBrowItem é atualizado durante a movimentação, e nem precisou ser PUBLIC/PRIVATE.
A gente acostuma com PUBLIC/PRIVATE, e acabam sendo as primeiras opções que vém à cabeça.
Como eu já evito ao máximo isso, acabei achando essa solução até interessante.
E a rotina é interessante, independente disso:
- Sem uso de PUBLIC/PRIVATE
- Browse com Array
- Browse com opção de marcar registros
- Usando array pra navegar no arquivo (com SET FILTER ficaria lento)
Nota: Agora daria pra retirar o Add() da função f_Marca(), mas ainda vou deixar lá, como precaução.