Consulta para ir al ultimo registro despues de aplicar un filtro en una tabla indexada

1,812 views
Skip to first unread message

Dunio

unread,
Mar 28, 2012, 12:12:32 AM3/28/12
to publice...@googlegroups.com
Hola
Tengo una pequeña rutina para crear un codigo de servicios que debe comenzar con SI si es servicio o OI si es una obra, luego le agrego un valor incremental independiente para cada caso, y finalmente le agrego las dos ultimas cifras del año. Todavia quiero ver que funcione y le agrego en automatico el año variable ya que eso es facil pero para no complicarme he puesto algunos datos como constantes.
Mi consulta va en como puedo hacer para luego de filtrar la tabla por codiobra pueda ir al ultimo registro filtrado, use en principio go bottom pero va al ultimo registro de la tabla sin filtro. Tengan piedad al responder porque no programo hace 20 años y el retorno es doloroso.
Adjunto parte del codigo explicado
DO CASE 
CASE vobra=6
SET FILTER TO SUBSTR(codiobra,1,2)="OI"
GO bottom
vcodiobra=m.codiobra
vcodiobra=SUBSTR(vcodiobra,3,4)
ncodiobra=VAL(vcodiobra)+1
nccodiobra=PADL(ALLTRIM(STR(ncodiobra)),4,"0")
thisform.tb_codiobra.Value="OI"+nccodiobra+"12"
Saludos y gracias por las respuestas

Douglas Sánchez Guillén

unread,
Mar 28, 2012, 12:28:13 AM3/28/12
to publice...@googlegroups.com
hola yo lo haria de la siguiente manera   where SUBSTR(codiobra,1,2)="OI" into cursor tmp1
Dimension amaximo(1, 1)

Select Max(codiobra) From tutabla iNTO Array amaximo
If Type("amaximo") = "C"
    amaximo = PadL(Int(Val(amaximo)) + 1, 4, "0")
Else
    amaximo = "0001"
Endif

Espero le sirva
Saludes

Jorge Javier Gutierrez

unread,
Mar 28, 2012, 1:10:26 AM3/28/12
to publice...@googlegroups.com
Hola, si te toma el último registro es porque el puntero ya estaba en ese lugar,
podrías hacer "go top" antes del set filter, y luego el go bottom.


Saludos

Dunio Odiaga

unread,
Mar 28, 2012, 1:13:52 AM3/28/12
to publice...@googlegroups.com
hola gracias por responder pero no encuentro ayuda para where?? es por el comando sql select?. 
Saludos

Douglas Sánchez Guillén

unread,
Mar 28, 2012, 1:24:14 AM3/28/12
to publice...@googlegroups.com
Bueno yo uso vfp9sp2, en la ayuda sale todo acerca de  SELECT - SQL command, sino busca en google
pone manual de consultas sql vfp
ejemplo
por lo general se usa

select tucampo1, tucampo2 from tutabla where tucampo1="tucriterio" into cursor Tmptutabla

saludes

Alfonso Arce Silvestre

unread,
Mar 28, 2012, 10:47:47 AM3/28/12
to publice...@googlegroups.com
con el resultado de tu consulta crea un cursor donde solo tengas los regitrsos filtrados

asi tendras solo los regsiustros requeridos basados en tu consulta

Saludos

TheNewInquirer

unread,
Mar 28, 2012, 11:40:59 AM3/28/12
to Comunidad de Visual Foxpro en Español
Hola Dunio,

Y si usas filtro sobre filtro sin usar indices?...

Despues de cada filtro puedes usar go bottom.

Pero eso solo tendría un uso limitado y temporal, ya que trabajas
sobre la tabla real.

Como dicen los compañeros, talvez el usar un cursor puede ayudar mas
por aquellos de los cortes de energia.

Lee sobre SELECT-SQL en la ayuda de fox.

Saludos!

Carlos Miguel FARIAS

unread,
Mar 28, 2012, 12:13:05 PM3/28/12
to publice...@googlegroups.com
Si, usar un filtro, sobre una tabla indexada puede tener desempeño dudoso.
Puede haber muchas soluciones, pero dependerá de algunos factores.

Si se usa poco, con que funcione cualquier algoritmo es bueno.
Si se usa mucho, dependera si los datos accedidos deben ser modificados o no.
Tambien depende si el filtro es muy selectivo (recupera pocos
registros) o muchos.
Como sugiere el colega, posiblemente un select (sin indices activados)
te de la mejor solución.
Saludos: Miguel, Santa Rosa (LP)

El 28/03/12, TheNewInquirer <thenewin...@gmail.com> escribió:

Victor Espina

unread,
Mar 28, 2012, 1:34:52 PM3/28/12
to publice...@googlegroups.com
Correcto aarces.  SET FILTER solo deberia usarse en situaciones muy especificas sobre cursores con unos pocos cientos de registros a lo sumo. En todos los demas casos, es mucho mejor hacer un SELECT que cree un cursor con los datos a mostrar ya filtrados.

Saludos

Victor Espina

Dunio Odiaga

unread,
Mar 29, 2012, 12:34:30 AM3/29/12
to publice...@googlegroups.com
Gracias a todos por sus comentarios, entonces para ver si entendí, hay que volcar la informacion en un cursor y de ahi tomo el mayor valor del dato que necesito con Max(), correcto?. En realidad solo es para extraer un valor de un campo que se encuentra inmerso entre un indicador de dos digitos de tipo de trabajo y un final de dos digitos de año del trabajo, los 4 del centro son el numero de trabajo correlativo pero independiente por cada tipo de trabajo, es decir OIXXX512 y SIXXX312, serian los dos ultimos trabajos realizados uno un servicio y otro una obra de la empresa I, si creo un nuevo servicio seria SIXXX412, y asi sucesivamente.
Los registros solo son de cientos por ahora. Pero tampoco seran miles en varios años. 
Gracias por las respuestas a todos.
Un abrazo

Gorka

unread,
Mar 29, 2012, 1:26:07 AM3/29/12
to publice...@googlegroups.com
Hola Dunio
Me pregunto si no te sería mas util y práctico modificar la composición de tu clave de la siguiente forma:
OI AA XXXX don de AA sería el año y XXXX tu correlativo.
Es decir en vez de poner el año al final ponerlo enmedio.
Esto haría mucho mas facil locallizar el último registro de cada servicio y año, no?
Saludos
Gorka
Reply all
Reply to author
Forward
0 new messages