Problemas con Found()

Post Reply
User avatar
jvtecheto
Posts: 357
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Problemas con Found()

Post by jvtecheto »

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: Select all

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: Select all

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: Select all

 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 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: Problemas con Found()

Post by hmpaquito »

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.
User avatar
jvtecheto
Posts: 357
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Problemas con Found()

Post by jvtecheto »

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: Select all

   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 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
User avatar
cnavarro
Posts: 5792
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problemas con Found()

Post by cnavarro »

Jose, no sé si entiendo bien tu código, pero creo que quizás te falte un gotop antes del locate
C. Navarro
Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo
Si alguien te dice que algo no se puede hacer, recuerda que esta hablando de sus limitaciones, no de las tuyas.
User avatar
jvtecheto
Posts: 357
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Problemas con Found()

Post by jvtecheto »

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 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Problemas con Found()

Post by karinha »

Code: Select all

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
User avatar
armando.lagunas
Posts: 340
Joined: Mon Oct 05, 2009 3:35 pm
Location: Curico-Chile
Contact:

Re: Problemas con Found()

Post by armando.lagunas »

Jose:

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

Code: Select all

  //-- 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
User avatar
jvtecheto
Posts: 357
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Problemas con Found()

Post by jvtecheto »

Hola Joao.

Efectuo una busqueda en una database de apuntes de proveedores para una obra.
la base de datos consta de _: 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: Select all

// ??? 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: Select all

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 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
User avatar
jvtecheto
Posts: 357
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Problemas con Found()

Post by jvtecheto »

armando.lagunas wrote:Jose:

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

Code: Select all

  //-- 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 19.06 32 bits + Harbour 3.2dev(r2011030937)+ Borland 7.4 + FivEdit
Post Reply