Problemas con Found()

Problemas con Found()

Postby jvtecheto » 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: Select all  Expand view  RUN

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  Expand view  RUN

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  Expand view  RUN

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

Re: Problemas con Found()

Postby hmpaquito » 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.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: Problemas con Found()

Postby jvtecheto » 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: Select all  Expand view  RUN

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

Re: Problemas con Found()

Postby cnavarro » 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
User avatar
cnavarro
 
Posts: 6549
Joined: Wed Feb 15, 2012 8:25 pm
Location: España

Re: Problemas con Found()

Postby jvtecheto » Mon Aug 12, 2019 1: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
User avatar
jvtecheto
 
Posts: 600
Joined: Mon Mar 04, 2013 4:32 pm
Location: Spain

Re: Problemas con Found()

Postby karinha » Mon Aug 12, 2019 2:44 pm

Code: Select all  Expand view  RUN

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
User avatar
karinha
 
Posts: 7848
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Problemas con Found()

Postby armando.lagunas » Mon Aug 12, 2019 3:18 pm

Jose:

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


Code: Select all  Expand view  RUN

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

Re: Problemas con Found()

Postby jvtecheto » Mon Aug 12, 2019 3: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: Select all  Expand view  RUN

// ??? 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  Expand view  RUN

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

Re: Problemas con Found()

Postby jvtecheto » Mon Aug 12, 2019 3: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: Select all  Expand view  RUN

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


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 46 guests