FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Problemas con Found()
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Problemas con Found()
Posted: Mon Aug 12, 2019 10:41 AM
Hola amigos :

No comprendo como no me funciona esto.
Busca un registro primero por numero de factura , seria cBusca
y una vez encontrado busca por proveedor.

Code (fw): Select all Collapse
LOCATE FOR Apup->Prove == cCodigo WHILE Apup->Factura == cBusca
         IF(Apup->(Found()),lEncontrado := .T., ) // No  activa lEncontrado aunque sea correcto. COMPROBADO

Y esto si funciona. Lo que significa que lo ha encontrado.
Code (fw): Select all Collapse
LOCATE FOR Apup->Prove == cCodigo WHILE Apup->Factura == cBusca
         IF(Apup->Prove == cCodigo,lEncontrado:=.T., ) // Esto si


Tengo que decir que en otro modulo y en una busqueda muy parecida, en
ese caso por fecha y numero de articulo.
Code (fw): Select all Collapse
 IF Apua->( dbSeek( CToD( cBusca ) ) )
         cCodigo:= PadL(SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ),4,"0")
         LOCATE FOR Apua->Art == cCodigo WHILE Apua->Fecha == CToD( cBusca )
         IF(Apua->(Found()),lEncontrado := .T., ) // Funciona correctamente. activa lEncontrado
      ENDIF


Espero vuestros consejos.

Saludos.

Jose.
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 1515
Joined: Thu Oct 30, 2008 02:37 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 10:46 AM

El WHILE forma parte de la condicion de busqueda, junto con el FOR.
Asi Found() es .f. porque no cumple (toda) la condicion de busqueda, pero si encontro un codigo de proveedor.

Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 11:03 AM
hmpaquito wrote:El WHILE forma parte de la condicion de busqueda, junto con el FOR.
Asi Found() es .f. porque no cumple (toda) la condicion de busqueda, pero si encontro un codigo de proveedor.


Hola gracias por responder pero el while ya es cierto ya que anteriormente busque esa condicion y si no la cumple ya no
realizo el LOCATE. Solo utilizo el WHILE para que restrinja la consulta a muy pocos registros y sea muy rapida ya que de
lo contrario el LOCATE es muy lento ya que busca en todo el fichero.

el codigo completo es este. Mira veras que si no se cumple no realiza el LOCATE.

Code (fw): Select all Collapse
   IF lBusca
      Apup->( ordSetFocus( 4 ) )
      ApuProvew:Gotop()
      nPos := At( ".", AllTrim( cNombre ) )
      cBusca := SubStr( AllTrim( cNombre ), 1, nPos - 1 )
      IF Apup->( dbSeek( cBusca ) )
         cCodigo:= PadL(SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ),4,"0")
         LOCATE FOR Apup->Prove == cCodigo WHILE Apup->Factura == cBusca
         IF(Apup->Prove == cCodigo,lEncontrado:=.T., )
         // IF(Apup->(Found()),lEncontrado := .T., ) . Esto deberia de funcionar tambien si se cumple lo de arriba.
      ENDIF
      IF !lEncontrado
         Apup->( dbGoTo( nActual ) )
         STOP( "No encuentro el Registro" )
     ENDIF
 ENDIF


Gracias amigo, de verdad que no lo entiendo.

Jose.
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 11:12 AM

Jose, no s茅 si entiendo bien tu c贸digo, pero creo que quiz谩s te falte un gotop antes del locate

Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noci贸n del tiempo

El secreto de la felicidad no est谩 en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 01:32 PM

Hola Cristobal.

Gracias por la ayuda, pero tampoco me funciona asi, debo de tener algo en el codigo, porque en 2 modulos practicamente iguales funciona bien
y en este no, en fin lo dejare en Stanby por ahora.

Saludos.

Jose.

Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 8523
Joined: Tue Dec 20, 2005 07:36 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 02:44 PM
Code (fw): Select all Collapse
FUNCTION Busca()

   IF lBusca

      SET ORDER TO 04
      GO TOP

      nPos := At( ".", AllTrim( cNombre ) )

      cBusca := SubStr( AllTrim( cNombre ), 1, nPos - 1 )

      SEEK( cBusca )

      IF FOUND()

         // ??? NO COMPRENDO ??
         cCodigo := PadL( SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ), 4, "0" )

         LOCATE FOR Apup->Prove == cCodigo WHILE Apup->Factura == cBusca

         IF FOUND()

            ? "BIEN PROVE ESTA OK"

         ELSE

            ? "ERRO EN LA BUSQUEDA DE PROVE", cCodigo, cBusca

            RETURN NIL

         ENDIF

      ELSE

         ? "QUE PASA, ESTO NO EJISTE"

         RETURN MIL

      ENDIF

   ENDIF

RETURN NIL
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341
Posts: 346
Joined: Mon Oct 05, 2009 03:35 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 03:18 PM
Jose:

Deja que el indice busque lo que necesites...yo lo har铆a as铆, tomando como ejemplo tu c贸digo:


Code (fw): Select all Collapse
聽 //-- asumo que la dbf apup tiene 4 indices y lo que quieres buscar es el c贸digo del proveedor y un numero de factura
聽 聽 聽 聽 ...
聽 聽 聽 聽 index on apup->factura + apup->PROVEE tag 5 to "paso.cdx" 聽<- asumo este nombre del archivo indice
聽 聽 聽 聽 ...
聽 聽 聽 聽 ...

聽 聽IF lBusca
聽 聽 聽 select Apup
聽 聽 聽 set order to 5
聽 聽 聽 ApuProvew:Gotop()
聽 聽 聽 nPos 聽 聽:= At( ".", AllTrim( cNombre ) )
聽 聽 聽 cBusca := SubStr( AllTrim( cNombre ), 1, nPos - 1 )
聽 聽 聽 lEncontrado := .f.

聽 聽 聽 Seek cBusca softseek
聽 聽 聽 do while Apup->Factura == cBusca
聽 聽 聽 聽 聽 cCodigo:= PadL(SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ),4,"0")
聽 聽 聽 聽 聽 seek cBusca + cCodigo
聽 聽 聽 聽 聽 if Found()
聽 聽 聽 聽 聽 聽 聽lEncontrado := .t.
聽 聽 聽 聽 聽 聽 聽exit
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 skip
聽 聽 聽 enddo

聽 聽 聽 IF !lEncontrado
聽 聽 聽 聽 聽STOP( "No encuentro el Registro" )
聽 聽 聽ENDIF
聽ENDIF


pd: la variable cnombre no se entiende bien como la utilizas, asumo que debe ser algo asi: "0012345.NOMBRE PROVEEDOR" y el c贸digo es parte de las primeras 4 letras despu茅s del punto una vez obtenido el numero de factura.

es una sugerencia que espero te sea 煤til

Saludos
SkyPe: armando.lagunas@hotmail.com

Mail: armando.lagunas@gmail.com
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 03:23 PM
Hola Joao.

Efectuo una busqueda en una database de apuntes de proveedores para una obra.
la base de datos consta de los campos: fecha , codigo de la obra, codigo del proveedor, factura, total
Busco por numero de factura y por codigo de proveedor (Ya que no habra 2 facturas de proveedor con igual numero)
Entonces la busqueda la realizo de la siguiente forma: introduzco factura , un punto y luego el codigo del proveedor
ejemplo: 162.16 (Pero el codigo son 4 digitos con ceros a la izquierda , si no los introuzco relleno con 0 ).

Code (fw): Select all Collapse
// ??? NO COMPRENDO ??
cCodigo := PadL( SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ), 4, "0" )


El nPos es el punto , entonces a partir de ahi viene el codigo del proveedor el cual si no esta de la forma 0016 lo relleno
con la funcion PadL y con
Code (fw): Select all Collapse
SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos )

consigo el codigo introducido que estara a partir del "."

Gracias por tu interes.

Saludos.

Jose.
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64
Posts: 607
Joined: Mon Mar 04, 2013 04:32 PM
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 03:30 PM
armando.lagunas wrote:Jose:

Deja que el indice busque lo que necesites...yo lo har铆a as铆, tomando como ejemplo tu c贸digo:


Code (fw): Select all Collapse
聽 //-- asumo que la dbf apup tiene 4 indices y lo que quieres buscar es el c贸digo del proveedor y un numero de factura
聽 聽 聽 聽 ...
聽 聽 聽 聽 index on apup->factura + apup->PROVEE tag 5 to "paso.cdx" 聽<- asumo este nombre del archivo indice
聽 聽 聽 聽 ...
聽 聽 聽 聽 ...

聽 聽IF lBusca
聽 聽 聽 select Apup
聽 聽 聽 set order to 5
聽 聽 聽 ApuProvew:Gotop()
聽 聽 聽 nPos 聽 聽:= At( ".", AllTrim( cNombre ) )
聽 聽 聽 cBusca := SubStr( AllTrim( cNombre ), 1, nPos - 1 )
聽 聽 聽 lEncontrado := .f.

聽 聽 聽 Seek cBusca softseek
聽 聽 聽 do while Apup->Factura == cBusca
聽 聽 聽 聽 聽 cCodigo:= PadL(SubStr( AllTrim( cNombre ), nPos + 1, Len( AllTrim( cNombre ) ) - nPos ),4,"0")
聽 聽 聽 聽 聽 seek cBusca + cCodigo
聽 聽 聽 聽 聽 if Found()
聽 聽 聽 聽 聽 聽 聽lEncontrado := .t.
聽 聽 聽 聽 聽 聽 聽exit
聽 聽 聽 聽 聽 endif
聽 聽 聽 聽 聽 skip
聽 聽 聽 enddo

聽 聽 聽 IF !lEncontrado
聽 聽 聽 聽 聽STOP( "No encuentro el Registro" )
聽 聽 聽ENDIF
聽ENDIF


pd: la variable cnombre no se entiende bien como la utilizas, asumo que debe ser algo asi: "0012345.NOMBRE PROVEEDOR" y el c贸digo es parte de las primeras 4 letras despu茅s del punto una vez obtenido el numero de factura.

es una sugerencia que espero te sea 煤til

Saludos


Muchisimas gracias Armando lo del indice compuesto me parece muy buena solucion , tambien para los otros modulos que comentaba. Has entendido perfectamente lo que quiero hacer.
es la busqueda por factura.codigo proveedor. Ejemplo. 162.0016 , incluso por el indice compuesto podre realizarla no por codigo sino por nombre que sera mejor para el cliente.
ejemplo 162.MARMOLES P.

Saludos.

Jose.
Fwh 24.07 64 bits + Harbour 64 bits 3.2dev(r2407221137) + MSVC64

Continue the discussion