Ola Amigos,
Nos teste que estou fazendo, infelizmente existem muitas diferenças entres as versões 2.17 para a 2.22 e fica impossÃvel usar a 2.22
Nesta rotina de Browse compartilhados, na versão 2.22 existe a classe hbrwflt, para filtar os arquivos da segunda base de dados, mais quando voce faz uma alteração no meu caso no kardex, ele retorna dados de um item que não e o mesmo que filtrei.
FUNCTION PRODUTOS()
LOCAL o, nKEY, nRec:=1, oGET1, oGET2, nLast := 0, oLINE1
PRIVATE oLabel1, oEdit1, oLabel2, oEdit2, oButtonex2, oBrw1, zREC:=0, vgDESCRICAO:=[], vgMARCA:=[]
PRIVATE oButtonex1, oButtonex2, oButtonex3, oButtonex4, oBrw2, aPCHA:=0, oButtonex5, oButtonex6, oButtonex7
PRIVATE nPES, gPes, vPes:="", keyAnt:=0, aVERDE, aAMARELO, oTECLA:="", nORDEM:=1, cRAZ
PRIVATE CM1:=1, aCOMBO, nPosicao:=0, cProgressKey:="", fVLR01:=0, oBRW3
KSETCAPS(.T.)
aCOMBO:= {[1 - Descricao ],;
[2 - Sal Base ],;
[3 - Fornecedor ] }
CLOSE DATA
DBUSEAREA(.T., "DBFNTX", "xMITI", "xMITI", .T.)
SET INDEX TO xMITEMIS, xMITNOTA, xMITCOEM, xMITVEND, xMITVECT, xMIEMI, xMINNF
DBUSEAREA(.T., "DBFNTX", "xENDAS", "xENDAS", .T.)
SET INDEX TO xENDACOD
DBUSEAREA(.T., "DBFNTX", "xESTOQUE", "xESTOQUE", .T.)
SET INDEX TO xESTDES, xESTPCH, xESTFOR, xESTCOD, xESTPRI, xESTEAN, ESTSEC, xESTFRA
DBUSEAREA(.T., "DBFNTX", "xARDEX", "xARDEX", .T.)
SET INDEX TO xADES, xACOD
DBSELECTAREA("xESTOQUE")
xESTOQUE->(DBSETORDER(nORDEM))
xESTOQUE->(DBSEEK(xARDEX->DESCRICAO, .F.))
INIT DIALOG oDlg TITLE "Pesquisar Produto " AT 0,0 SIZE 980,600 ;
FONT HFont():Add( 'tahoma',0,-13,400,,,) CLIPPER ;
STYLE WS_POPUP+WS_CAPTION+WS_SYSMENU+WS_MAXIMIZEBOX+WS_SIZEBOX+DS_CENTER
ThisBUSCA := oDlg
@ 13, 10 SAY [Pesquisando :] SIZE 100,19
@ 100, 10 SAY gPes CAPTION vPes SIZE 300,22 COLOR 255
@ 13, 35 SAY [Localizado :] SIZE 100,19
@ 100, 35 SAY cRAZ CAPTION SPAC(50) SIZE 400,22
@ 0, 62 LINE oLine1 LENGTH 980
@ 13,070 BROWSE oBrw1 DATABASE SIZE 960,270 STYLE WS_TABSTOP ;
ON POSCHANGE {|| EVAL(oBrw2:bFirst), ESTOQUE_onPosChange(), oBrw2:Refresh() } ;
ON CLICK {||zREC:=xESTOQUE->(RECNO()), ThisBUSCA:CLOSE(), PRODUTO_INCLUIR(zREC), oBU4:SetFocus() }
oBrw1:alias := 'xESTOQUE'
oBrw1:nColumns := 10
oBrw1:freeze := 1
// oBrw1:lAdjRight := .F.
SELECT (oBrw1:alias)
oBrw1:AddColumn( HColumn():New('EAN' , FieldBlock( 'EAN' ) ,'C',16, 0 ,.F.,0,0,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Descrição' , FieldBlock( 'DESCRICAO' ) ,'C',45, 0 ,.F.,0,0,,,,,,,,,)) // DIREITA
oBrw1:AddColumn( HColumn():New('Fornecedor' , FieldBlock( 'FORNECEDOR' ),'C',15, 0 ,.F.,0,0,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Estoque' , FieldBlock( 'QTDEESTOQU') ,'N',08, 0 ,.F.,2,2,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Reservado' , FieldBlock( 'QTDEVENDA' ) ,'N',08, 0 ,.F.,2,2,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Sal Base' , FieldBlock( 'SALBASE' ) ,'C',70, 0 ,.F.,0,0,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Promoção' , FieldBlock( 'MINIMO' ) ,'N',05, 0 ,.F.,1,1,,,,,,,,,)) // ESQUERDA
oBrw1:AddColumn( HColumn():New('Codigo' , FieldBlock( 'CODIGO' ) ,'N',06, 0 ,.F.,0,0,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('P.M.C.' , FieldBlock( 'PRECOMC' ) ,'N',10, 2 ,.F.,2,2,,,,,,,,,))
oBrw1:AddColumn( HColumn():New('Preço Fabr.', FieldBlock( 'TABELA01' ) ,'N',10, 2 ,.F.,2,2,,,,,,,,,))
oBrw1:bKeyDown := { |o,key|HB_SYMBOL_UNUSED(o),IIF(key==27,(hwg_EndDialog(oDlg:handle),.F.),a_BrwKeyfun(o,key))}
oBrw1:aColumns[02]:bHeadClick := {|| oBrw1_2_onHeadClick( ) } // 1 - Descricao
oBrw1:aColumns[03]:bHeadClick := {|| oBrw1_3_onHeadClick( ) } // 3 - Fornecedor
oBrw1:aColumns[06]:bHeadClick := {|| oBrw1_6_onHeadClick( ) } // 2 - sAL
oBrw1:nFootRows := 1 // numero de colunas para mostrar os totais no final do browse
oBrw1:acolumns[01]:footing := [ ]
oBrw1:acolumns[02]:footing := [<F5>Descricao <F6>SalBase <F7>Fornecedor]
FOR nI := 1 TO 10
oBrw1:aColumns[nI]:bColorBlock := ; // LETRA CAIXA LET_CX BARRA
{|nI| IF(xESTOQUE->QTDEESTOQU > 0, {x_RED, x_WHITE, x_BLACK, CINZA}, {x_BLACK, x_WHITE, x_BLACK, CINZA} )}
NEXT
oBrw1:aColumns[7]:bColorBlock := ;
{|n| IF( (xESTOQUE->MINIMO > 0 .AND. xESTOQUE->MINIMO < 10 .AND. xESTOQUE->(QTDEESTOQU-QTDEVENDA) > 0), ;
{x_BLUE, x_WHITE, x_WHITE, CINZA}, {CINZA, CINZA, CINZA, CINZA} )}
oBrw1:Anchor := 15
oBrw1:Refresh()
@ 13,350 BROWSE oBrw2 FILTER SIZE 960,170 STYLE WS_TABSTOP AUTOEDIT ;
FIRST {|| XARDEX->( DBSEEK(xESTOQUE->(SUBSTR(DESCRICAO,1,49)), .F.) ) } ;
WHILE {|| XARDEX->(SUBSTR(DESCRICAO,1,49)) == xESTOQUE->(SUBSTR(DESCRICAO,1,49))} ;
ON UPDATE {|| kardex_onPosChange() }
//oBrw2:nHeadHeight := 24
oBrw2:alias := 'xARDEX'
oBrw2:nColumns := 4
//Obrw2:freeze := 1
SELECT (oBrw2:alias)
// ( cHeading, block, type, length, dec, lEditable, nJusHead, nJusLin, cPict, bValid, bWhen, aItem, bColorBlock, bHeadClick ) CLASS HColumn
// ('Descrição', FieldBlock( 'DESCRICAO' ),'C' , 50, 0 , .F. ,0 , 0 , , , , , , ,,,))
oBrw2:AddColumn( HColumn():New('Descrição', FieldBlock( 'DESCRICAO' ) ,'C',50, 0 ,.F.,0,0,,,,,,,,,)) // ESQUERDA
oBrw2:AddColumn( HColumn():New('N Lote' , FieldBlock( 'Nlote' ) ,'C',20, 0 ,.T.,0,0,,,,,,,,,))
oBrw2:AddColumn( HColumn():New('Validade' , FieldBlock( 'Validade') ,'C',10, 0 ,.T.,0,0,'99/9999',,,,,,,,)) // CENTRO
oBrw2:AddColumn( HColumn():New('Qtde' , FieldBlock( 'Qtde' ) ,'N',06, 0 ,.T.,DT_CENTER,DT_RIGHT,'9999999',,,,,,,,))
oBrw2:acolumns[03]:footing := [Qtde Total: ]
oBrw2:acolumns[04]:footing := TRANSF( fVLR01, [@E 999,999] )
oBrw2:aColumns[04]:lResizable:= .F.
oBrw2:Anchor := ANCHOR_LEFTABS + ANCHOR_BOTTOMABS //12+ ANCHOR_RIGHTABS
oBrw2:Refresh()
@ 203,550 BUTTON oButtonex1 CAPTION "&Vendas" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {|| zREC:=xESTOQUE->(RECNO()), aPCHA:=xESTOQUE->CODIGO, VENDAS_PRO(), xESTOQUE->(DBGOTO(zREC)), oBrw1:REFRESH(), oBrw1:setfocus() }
oButtonex1:Anchor := 12
@ 311,550 BUTTON oButtonex2 CAPTION "C&have" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {|| zREC:=xESTOQUE->(RECNO()), PESQUISA_CHAVE(), xESTOQUE->(DBGOTO(zREC)), oBrw1:REFRESH(), oBrw1:setfocus() }
oButtonex2:Anchor := 12
@ 419,550 BUTTON oButtonex3 CAPTION "&Reservas" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {|| zREC:=xESTOQUE->(RECNO()), aPCHA:=xESTOQUE->CODIGO, HWG_PEUMSO(aPCHA), xESTOQUE->(DBGOTO(zREC)), oBrw1:REFRESH(), oBrw1:setfocus() }
oButtonex3:Anchor := 12
@ 527,550 BUTTON oButtonex4 CAPTION "Excluir" SIZE 98,32 STYLE WS_TABSTOP //;
//ON CLICK {|| zREC:=xARDEX->(RECNO()), Excluir_Kardex(zRec), oBrw1:REFRESH(), oBrw1:setfocus() }
oButtonex4:Anchor := 12
@ 635,550 BUTTON oButtonex5 CAPTION "&Importar" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {||zREC:=xESTOQUE->(RECNO()), ThisBUSCA:CLOSE(), PRODUTO_INCLUIR(zREC), oBU4:SetFocus() }
oButtonex5:Anchor := 12
@ 740,550 BUTTON oButtonex6 CAPTION "&Ordem" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {|| MsgGetORDEM( @nORDEM, @aCOMBO ), xESTOQUE->(DBSETORDER(nORDEM)), oBrw1:Refresh(), oBrw1:Setfocus() }
oButtonex6:Anchor := 12
@ 848,550 BUTTON oButtonex7 CAPTION "Sai&r" SIZE 98,32 STYLE WS_TABSTOP ;
ON CLICK {|| DBCLOSEALL(), ThisBUSCA:CLOSE() }
oButtonex7:Anchor := 12
ACTIVATE DIALOG oDlg
RETURN(NIL)
Olhem a primeira imagem feito na 2.17 como é, e como fica com a versão 2.22 nas outras duas imagens
Infelizmente, a versão 2.22 e muito pobre em exemplos, e mesmo no tutorial feito pelo Kresin, não existem exemplos, nem mesmo os mais básicos para voce ter noção de como usa-la.
Creio que existe muito potencial, na GUI, mais infelizmente, para usuários leigos, como eu, fica difÃcil ...