Busqueda por contenido

HMG en Español

Moderator: Rathinagiri

Post Reply
User avatar
edufloriv
Posts: 237
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Busqueda por contenido

Post by edufloriv »

Saludos amigos,

Cree la siguiente función para buscar los productos que "contengan" la cadena solicitada. Al principio use esto:

Code: Select all

SET FILTER TO UPPER(cContenido) $ MARTI->DES_ARTI
Pero mis clientes me reportan que se hace lento en las estaciones y a veces hasta se cuelga, solo funciona bien en el servidor.

Así que voy a probar con esto:

Code: Select all

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

FUNC VentArtiBuscarContenido

LOCAL cContenido   := Inputbox('Buscar contenido:')

IF ! IsWindowDefined(Win_Venta_Arti)
   RETURN
ENDIF

IF ! EMPTY(cContenido)

   Wait Window "Buscando contenido. . ." NOWait

   SELE TMPLST // tabla temporal en local
   ZAP

   SELE MARTI  // tabla de productos en el servidor
   SET ORDER TO TAG ArtixDesc
   DBGOTOP()
   DO WHILE ! MARTI->(EOF())
      IF UPPER(cContenido) $ MARTI->DES_ARTI
         SELE TMPLST
         APPEND BLANK
         TMPLST->COD_ARTI := MARTI->COD_ARTI
         TMPLST->DES_ARTI := MARTI->DES_ARTI
         TMPLST->COD_MARK := MARTI->COD_MARK
         TMPLST->COD_GENE := MARTI->COD_GENE
         TMPLST->STOCK_U  := MARTI->STOCK_U
         TMPLST->STOCK_F  := MARTI->STOCK_F
         TMPLST->PRECIO_U := MARTI->PRECIO_U
         TMPLST->PRECIO_F := MARTI->PRECIO_F
         TMPLST->PRECIO_B := MARTI->PRECIO_B
         TMPLST->INCENTIVO:= MARTI->INCENTIVO
         SELE MARTI
      ENDIF
      SKIP
   ENDDO
   SELE MARTI

   Wait Clear
   VentArtiEnfocaBrowse()

ENDIF

RETURN
Mi pregunta es si alguien tiene un método más eficaz para realizar lo mismo, buscar por el contenido en el campo DESCRIPCIÓN.

Cordiales saludos,

Eduardo Flores Rivas


LIMA - PERU
User avatar
danielmaximiliano
Posts: 2611
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Busqueda por contenido

Post by danielmaximiliano »

Buen dia Edu, la unica aplicacion que tengo en red con 10 estaciones utiliza para consultas varias es

Code: Select all

   REQUEST DBFCDX, DBFFPT
   RDDSETDEFAULT ("DBFCDX")
    If ! FILE( "c:\SERVIDOR.TXT")  
   cDisco := "Z:\Seguros"
   else
   cDisco := "C:\Seguros"
   Endif  
   
    cPathbases := cDisco + '\Bases\'
   SET DEFAULT TO ( cPathbases )
   SET PATH TO    ( cPathbases )
    Load Window .\Formularios\Principal
    Principal.Activate
   
y un Search en dbf gigante sin perdida de tiempo con

Code: Select all

   cBusca:= cNum + cApei
   seek "&cBusca"
   skip -(cTop1 - 1)
   cApei:= bNombret
   do while (l < cTop1 .AND. val(cNum) = bNumerot .AND. !EOF())
no hay diferencia entre las teerminales y el servidor (este tambien se usa para gestiones comerciales)
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Busqueda por contenido

Post by SALINETAS24 »

Hola Eduardo, veo que en tu aplicación lees un registro y si cumple lo añades en una nueva DBF, y eso lo repites hasta el final. desde mi punto de vista ese acceso continuo al Disco Duro (leer y grabar, leer y grabar :oops: ) retrasa mucho el resultado y en Red Local te provoca bloqueos.
Prueba a leer solo y cargar un Array seguro que ganas velocidad y después lo muestras en un GRID.
Te he modificado un poco tu código, pero no lo he probado (eso te lo dejo a ti) :lol: .

quedaría algo así

Code: Select all

*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------

FUNC VentArtiBuscarContenido

LOCAL cContenido   := Inputbox('Buscar contenido:')
LOCAL aCadena      := {}	
IF ! IsWindowDefined(Win_Venta_Arti)
   RETURN
ENDIF

IF ! EMPTY(cContenido)

   Wait Window "Buscando contenido. . ." NOWait

   SELE MARTI  // tabla de productos en el servidor
   SET ORDER TO TAG ArtixDesc
   DBGOTOP()
   DO WHILE ! MARTI->(EOF())
      IF UPPER(cContenido) $ MARTI->DES_ARTI
		AADD (aCadena,{MARTI->COD_ARTI,MARTI->DES_ARTI,MARTI->COD_MARK,MARTI->COD_GENE })
      ENDIF
      SKIP
   ENDDO

   Wait Clear
   VentArtiEnfocaBrowse(aCadena)  --> aqui visualizas el GRID.

ENDIF
          
RETURN


// --> Seria algo así
STATIC FUNCTION  VentArtiEnfocaBrowse(aCadena)

	DEFINE WINDOW Form_1 ;
		AT 0,0 ;
		WIDTH 800 ;
		HEIGHT 550 ;
		TITLE 'Hello World!' ;
		MAIN 

		@ 10,10 GRID Grid_1 ;
			WIDTH 760 ;
			HEIGHT 240 ;
			HEADERS aCadena ;
			WIDTHS {140,140,140,140};
			ITEMS aCadena ;
			VALUE {1,1} ;
			TOOLTIP 'Editable Grid Control' 
    
	END WINDOW

	CENTER WINDOW Form_1

	ACTIVATE WINDOW Form_1

Return


Salud y vamos con una cervecita !!
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
JALMAG
Posts: 262
Joined: Sun Jan 10, 2010 7:05 pm
DBs Used: DBF, MariaDB
Location: España - Spain

Re: Busqueda por contenido

Post by JALMAG »

Yo utilizaría un DbEval()

DBEVAL(<bBlock>,
[<bForCondition>],
[<bWhileCondition>],
[<nNextRecords>],
[<nRecord>],
[<lRest>]) --> NIL



Saludos
User avatar
edufloriv
Posts: 237
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: Busqueda por contenido

Post by edufloriv »

Saludos amigos,

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 :roll:

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.

Eduardo Flores Rivas


LIMA - PERU
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Busqueda por contenido

Post by andyglezl »

Andrés González López
Desde Guadalajara, Jalisco. México.
Pcmodula
Posts: 34
Joined: Thu Nov 22, 2012 6:00 pm

Re: Busqueda por contenido

Post by Pcmodula »

Echar un vistazo en Minigui Extended 19.08 (Update 2) quì:

* New: 'OrdWildSeek() Test' sample.
Note: Harbour has this function in core without documentation.
Based upon a contribution of Mario Mansilla and Pete D.
(see in folder \samples\Basic\OrdWildSeek)

Es un buen ejemplo simple y eficaz

Salu2
Pcmodula
franco
Posts: 816
Joined: Sat Nov 02, 2013 5:42 am
DBs Used: DBF
Location: Canada

Re: Busqueda por contenido

Post by franco »

I use this and seems to work well on terminals.
at start of main program I create a local folder, if it exists it does nothing.
create folder ("c:\mybrow") //this creates in all computers when first starting
then when I want to search by anything in the station I create temp indexes.
in this case
I map network drive to server. The main program is on the c: drive
use table
set index to indexes
eg: if I only want index on station I use if statement below
if upper(substr(getcurrentfolder(),1,1)) <> "C" //eg: terminal may be Z
index on (somefield) to c:\mybrow\temp for UPPER(cContenido) $ MARTI->DES_ARTI
endif
browse ??
you can erase temp index or just keep overwriting it.

I use this without the if statement on server for temp indexes
I did this as I was starting to not have enough memory in some computers.

REMEMBER WHEN USING WORKSTATIONS TO SET EXECEPTIONS IN ANTIVIRUS ON ALL COMPUTERS TO STOP CHECKING COMING AND GOING BYTES. THIS REALLY SPEEDS UP PERFORMANCE.
Regards Franco
All The Best,
Franco
Canada
Post Reply