Page 1 of 1
Problemas con Found()
Posted: Mon Aug 12, 2019 10:41 am
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.
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 10:46 am
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.
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 11:03 am
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.
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 11:12 am
by cnavarro
Jose, no sé si entiendo bien tu código, pero creo que quizás te falte un gotop antes del locate
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 1:32 pm
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.
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 2:44 pm
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
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 3:18 pm
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
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 3:23 pm
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.
Re: Problemas con Found()
Posted: Mon Aug 12, 2019 3:30 pm
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.