Mil gracias por sus aportaciones, definitivamente tenian razón, el resultado es más rápido trabajándolo en memoria todo.
Me quedó así, este será mi nuevo estandar para búsqueda de SKU. No más BROWSEs
Code: Select all
* ------------------------------------------------------ *
* SISTEMA : INFO-FARMA *
* PRG : VentArti.PRG *
* CREADO : 15-12-2005 *
* ACTUALIZADO : 11-09-2019 *
* AUTOR : EDUARDO V. FLORES RIVAS *
* COMENTARIOS : PRG PARA SELECCION DE ARTICULOS *
* ------------------------------------------------------ *
FUNC Ayuda_VentArti
LOCAL OldSele := SELECT()
LOCAL OldRecno := MARTI->(RECNO())
IF IsWindowDefined(Win_Venta_Arti) = .T.
RETURN({})
ENDIF
PRIVATE aTMPLSTXXX := {}
PRIVATE aLISTDCIS := {}
PRIVATE MemBusqueda := ''
PRIVATE nHARow1 := 1
PRIVATE nHARow2 := 1
PRIVATE nHACol1 := 0
PRIVATE nHACol2 := 0
PRIVATE bHABack := { || IF( EsPar(This.CellRowIndex) , {255,255,192} , {255,255,255} ) }
PRIVATE bHAFore := { || {000,000,000} }
IF SIS_BLIST = 'S'
PRIVATE aBrwArtH := {'Código' ,'Artículo','Marca' ,'Unid.' ,'Frac.' ,'P.Uni.' ,'P.Fra.' ,'P.Bli.' ,'Incen.' }
PRIVATE aBrwArtW := { 70 , 320 , 70 , 60 , 60 , 80 , 80 , 80 , 70 }
PRIVATE aBrwArtF := {'COD_ARTI','DES_ARTI','COD_MARK','STOCK_U','STOCK_F','PRECIO_U','PRECIO_F','PRECIO_B','INCENTIVO'}
PRIVATE aBrwArtJ := { BrwL , BrwL , BrwL , BrwR , BrwR , BrwR , BrwR , BrwR , BrwR }
PRIVATE aBrwArtB := { bHABack , bHABack , bHABack , bHABack , bHABack , bHABack , bHABack , bHABack , bHABack }
PRIVATE aBrwArtO := { bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore }
ELSE
PRIVATE aBrwArtH := {'Código' ,'Artículo','Marca' ,'Unid.' ,'Frac.' ,'P.Uni.' ,'P.Fra.' ,'Incen.' }
PRIVATE aBrwArtW := { 80 , 380 , 90 , 60 , 60 , 80 , 80 , 70 }
PRIVATE aBrwArtF := {'COD_ARTI','DES_ARTI','COD_MARK','STOCK_U','STOCK_F','PRECIO_U','PRECIO_F','INCENTIVO'}
PRIVATE aBrwArtJ := { BrwL , BrwL , BrwL , BrwR , BrwR , BrwR , BrwR , BrwR }
PRIVATE aBrwArtB := { bHABack , bHABack , bHABack , bHABack , bHABack , bHABack , bHABack , bHABack }
PRIVATE aBrwArtO := { bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore , bHAFore }
ENDIF
DEFINE WINDOW Win_Venta_Arti ;
AT 0,0 ;
WIDTH 960 HEIGHT 580 ;
TITLE 'Seleccionar Artículo' ;
MODAL ;
FONT 'Arial' SIZE SCR_FNTSZ ;
ON INIT VentArtiIniciar()
ON KEY F1 OF Win_Venta_Arti ACTION VentArtiEnfocaBuscar()
ON KEY F2 OF Win_Venta_Arti ACTION VentArtiEnfocaBuscar()
ON KEY F3 OF Win_Venta_Arti ACTION VentArtiBuscarPorGene()
ON KEY F4 OF Win_Venta_Arti ACTION VentArtiBuscarGeneActual()
ON KEY F5 OF Win_Venta_Arti ACTION VentArtiBuscarContenido()
ON KEY ESCAPE OF Win_Venta_Arti ACTION VentArtiCierra()
@ 10, 10 BUTTON BotBuscar ;
CAPTION '[F1]Buscar:' ;
ACTION VentArtiEnfocaBuscar() ;
WIDTH 80 ;
HEIGHT 20
@ 10,100 TEXTBOX TxtBuscar ;
WIDTH 300 ;
HEIGHT 20 ;
UPPERCASE ;
ON ENTER VentArtiBusca()
@ 10, 410 BUTTON BotBuscar2 ;
PICTURE 'imagen\regbuscar.bmp' ;
ACTION VentArtiBuscarPorGene() ;
WIDTH 30 ;
HEIGHT 30 ;
TOOLTIP '|F3| Buscar por DCI'
@ 10, 450 BUTTON BotBuscar3 ;
PICTURE 'imagen\lupa.bmp' ;
ACTION VentArtiBuscarGeneActual() ;
WIDTH 30 ;
HEIGHT 30 ;
TOOLTIP '|F4| Buscar DCI Actual'
@ 10, 490 BUTTON BotBuscar4 ;
PICTURE 'imagen\prismarojo.bmp' ;
ACTION VentArtiBuscarContenido() ;
WIDTH 30 ;
HEIGHT 30 ;
TOOLTIP '|F5| Buscar contenido'
@ 40, 10 GRID GrdArticulos ;
WIDTH 930 ;
HEIGHT 410 ;
HEADERS aBrwArtH ;
WIDTHS aBrwArtW ;
JUSTIFY aBrwArtJ ;
DYNAMICBACKCOLOR aBrwArtB ;
DYNAMICFORECOLOR aBrwArtO ;
NOLINES ;
ON DBLCLICK VentArtiElige() ;
ON CHANGE VentArtiShowDCI()
@ 460, 10 TEXTBOX TxtDCI ;
WIDTH 930 ;
HEIGHT 20 ;
READONLY
@ 500, 10 BUTTON BotAceptar ;
CAPTION "Aceptar" ;
ACTION VentArtiElige() ;
WIDTH 80 ;
HEIGHT 30
@ 500, 110 BUTTON BotCancelar ;
CAPTION "Cancelar" ;
ACTION VentArtiCierra() ;
WIDTH 80 ;
HEIGHT 30
END WINDOW
CENTER WINDOW Win_Venta_Arti
ACTIVATE WINDOW Win_Venta_Arti
RETURN(aTMPLSTXXX)
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiIniciar
VentArtiShowDCI()
Win_Venta_Arti.TxtBuscar.SetFocus
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiShowDCI
IF Win_Venta_Arti.GrdArticulos.Value > 0
Win_Venta_Arti.TxtDCI.Value := aLISTDCIS[ Win_Venta_Arti.GrdArticulos.Value , 2 ]
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiCierra
aTMPLSTXXX := {}
IF IsWindowDefined(Win_Venta_Arti)
RELEASE WINDOW Win_Venta_Arti
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiElige
IF Win_Venta_Arti.GrdArticulos.Value > 0
aTMPLSTXXX := Win_Venta_Arti.GrdArticulos.Item (Win_Venta_Arti.GrdArticulos.Value)
IF IsWindowDefined(Win_Venta_Arti)
RELEASE WINDOW Win_Venta_Arti
ENDIF
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiEnfocaBuscar
Win_Venta_Arti.TxtBuscar.Value := SPACE(30)
Win_Venta_Arti.TxtBuscar.SetFocus
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiEnfocaBrowse
Win_Venta_Arti.GrdArticulos.Value := 1
Win_Venta_Arti.GrdArticulos.SetFocus
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiBusca
LOCAL Busqueda := ALLTRIM(Win_Venta_Arti.TxtBuscar.Value)
LOCAL cTipBus := ''
IF LENNOSPC(Busqueda) = 0
Win_Venta_Arti.TxtBuscar.Setfocus
RETURN
ENDIF
DELETE ITEM ALL FROM GrdArticulos OF Win_Venta_Arti
cTipBus := TIPOBUSCA( Busqueda )
SELE MARTI
SET RELATION TO COD_GENE INTO MGENE
DO CASE
CASE cTipBus = 'nombre'
SET ORDER TO TAG ArtixDesc
DBSEEK(Busqueda)
IF FOUND()
DO WHILE MARTI->(LEFT(DES_ARTI,LEN(Busqueda))) = Busqueda .AND. ! MARTI->(EOF())
VentArtiAddItem()
SKIP
ENDDO
ENDIF
CASE cTipBus = 'codigo'
SET ORDER TO TAG ArtixCodi
DBSEEK(Busqueda)
IF FOUND()
DO WHILE MARTI->COD_ARTI = Busqueda .AND. ! MARTI->(EOF())
VentArtiAddItem()
SKIP
ENDDO
ENDIF
CASE cTipBus = 'barra'
SET ORDER TO TAG ArtixBarr
DBSEEK(Busqueda)
IF FOUND()
DO WHILE MARTI->COD_BARR = Busqueda .AND. ! MARTI->(EOF())
VentArtiAddItem()
SKIP
ENDDO
ENDIF
ENDCASE
VentArtiEnfocaBrowse()
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
FUNC VentArtiBuscarPorGene
LOCAL nMemoOrden := 0
LOCAL nMemoRecno := 0
LOCAL cBuscaCodigo := ''
LOCAL nRegMaes := 0
LOCAL lAmpay := .F.
LOCAL aDataGene := Ayuda_Gene()
IF ! IsWindowDefined(Win_Venta_Arti)
RETURN
ENDIF
IF LEN(aDataGene)>0
DELETE ITEM ALL FROM GrdArticulos OF Win_Venta_Arti
SELE MARTI
SET ORDER TO TAG ArtixGene
DBSEEK(aDataGene[1])
IF FOUND()
DO WHILE MARTI->COD_GENE = aDataGene[1] .AND. ! MARTI->(EOF())
VentArtiAddItem()
SKIP
ENDDO
ENDIF
VentArtiEnfocaBrowse()
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
FUNC VentArtiBuscarGeneActual
IF Win_Venta_Arti.GrdArticulos.Value > 0
cQueGene := aLISTDCIS[ Win_Venta_Arti.GrdArticulos.Value , 1 ]
DELETE ITEM ALL FROM GrdArticulos OF Win_Venta_Arti
SELE MARTI
SET ORDER TO TAG ArtixGene
DBSEEK(cQueGene)
IF FOUND()
DO WHILE MARTI->COD_GENE = cQueGene .AND. ! MARTI->(EOF())
VentArtiAddItem()
SKIP
ENDDO
ENDIF
VentArtiEnfocaBrowse()
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
FUNC VentArtiBuscarContenido
LOCAL cContenido := ALLTRIM( Inputbox('Buscar contenido:') )
IF ! IsWindowDefined(Win_Venta_Arti)
RETURN
ENDIF
IF ! EMPTY(cContenido)
DELETE ITEM ALL FROM GrdArticulos OF Win_Venta_Arti
Wait Window "Buscando contenido. . ." NOWait
SELE MARTI
SET ORDER TO TAG ArtixDesc
DBGOTOP()
DO WHILE ! MARTI->(EOF())
IF UPPER(cContenido) $ MARTI->DES_ARTI
VentArtiAddItem()
ENDIF
SKIP
ENDDO
SELE MARTI
Wait Clear
VentArtiEnfocaBrowse()
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC VentArtiAddItem
IF SIS_BLIST = 'S'
ADD ITEM { MARTI->COD_ARTI ,;
MARTI->DES_ARTI ,;
MARTI->COD_MARK ,;
MARTI->STOCK_U ,;
MARTI->STOCK_F ,;
MARTI->PRECIO_U ,;
MARTI->PRECIO_F ,;
MARTI->PRECIO_B ,;
MARTI->INCENTIVO } TO GrdArticulos OF Win_Venta_Arti
AADD( aLISTDCIS , { MARTI->COD_GENE , MGENE->DES_GENE } )
ELSE
ADD ITEM { MARTI->COD_ARTI ,;
MARTI->DES_ARTI ,;
MARTI->COD_MARK ,;
MARTI->STOCK_U ,;
MARTI->STOCK_F ,;
MARTI->PRECIO_U ,;
MARTI->PRECIO_F ,;
MARTI->INCENTIVO } TO GrdArticulos OF Win_Venta_Arti
AADD( aLISTDCIS , { MARTI->COD_GENE , MGENE->DES_GENE } )
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
FUNC TIPOBUSCA(cCadena)
LOCAL QueEs := ''
LOCAL nCount := 0
cCadena := RTRIM(cCadena)
IF LEN(cCadena) >= 5
FOR nCad=1 TO LEN(cCadena)
IF SUBSTR(cCadena,nCad,1) $ '0123456789'
nCount++
ENDIF
NEXT
ENDIF
DO CASE
CASE LEN(cCadena) = nCount .AND. nCount = 6 // <- de acuerdo a la longitud que se usa como código
QueEs := 'codigo'
CASE LEN(cCadena) = nCount .AND. nCount > 6 // <- detecta código de barra
QueEs := 'barra'
OTHERWISE
QueEs := 'nombre'
ENDCASE
RETURN( QueEs )
Cordiales saludos.