Como ordenar codigos numericos almacenados tipo caracter.

530 views
Skip to first unread message

Mauricio Molinero,

unread,
May 27, 2010, 8:42:07 AM5/27/10
to Comunidad de Visual Foxpro en Español
Hola Foro,

Como puedo crear un indice para ordenar codigos que son numero pero
almacenados tipo caracter ?
Actualmente en la consulta utilizo una funcion..

FUNCTION CodigoToNumeric(tcCodigo AS Character) AS Number
lnSum = 0
FOR lnPos = 1 TO LEN(tcCodigo)
lnSum = lnSum + ASC(SUBSTR(tcCodigo,lnPos,
1))*10^(LEN(ALLT(tcCodigo))-lnPos)
ENDFOR
RETURN lnSum
ENDFUNC

Pero es bastante lenta..

Alguna Sugerencia ?

Jaime H. Díaz G.

unread,
May 27, 2010, 9:16:06 AM5/27/10
to publice...@googlegroups.com
Buenos días; genera un índice con la expresión VAL(codigo).

Mauricio Molinero,

unread,
May 27, 2010, 9:39:11 AM5/27/10
to Comunidad de Visual Foxpro en Español
Si el problema es que algunos productos tienen codigos mixtos como

CA100
CA1000
CA150
CA200

Y VAL() en estos valores devuelve 0.

Heberto Villavicencio

unread,
May 27, 2010, 9:47:08 AM5/27/10
to Comunidad de Visual Foxpro en Español
Una opcion seria tener otro campo en la tabla donde hagas precisamente
lo que hace esa funcion que tienes pero al mismo momento de ingresas
un codigo, de esta forma eliminas el tiempo de espera cada vez que
creas un indice. Otra forma si el patron es fijo (2 letras al
principio) pudiera tener los codigos justificados con 0, es decir,
algo como:

CA0100
CA1000
CA0150
CA0200

jrossi

unread,
May 27, 2010, 11:07:43 AM5/27/10
to Comunidad de Visual Foxpro en Español
Y un indice del tipo:

Index on Left(CODIGO,2) + Padl(Val(Right(CODIGO,4)),4) Tag Id_LCRC

Mauricio Molinero,

unread,
May 27, 2010, 11:45:08 AM5/27/10
to Comunidad de Visual Foxpro en Español
Gracias a todos, pero creo que lo voy a dejar como esta, ya que todos
los codigos son muy variables.

Pregunta,

Si en algun momento migro la base a SQL, esta funcion se puede
traducir a un Stored Procedure y funcionaria igual??

> > > > Buenos días; genera un índice con la expresión VAL(codigo).- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Mario Alfredo Oviedo

unread,
May 27, 2010, 3:38:55 PM5/27/10
to Comunidad de Visual Foxpro en Español
dicen que el campo es numerico y lo indexas, este almacena menos
memoria en tu PC, a nivel de gustos, te sugiero que lo dejes asi, te
resulta mas facil hacer busquedas indexadas cuando estan caracter por
ejemplo, asi, seek "101010"+"101010" por ejemplo numero de factura mas
cliente tu indice seria index on nfactura+ncliente tag factura, si
tenes un campo numerico y otro caracter, tendrias que convertir numero
factura a caracter y unirlo a numero de cliente.

Carlos Yohn (A.G.P.)

unread,
May 27, 2010, 4:43:27 PM5/27/10
to Comunidad de Visual Foxpro en Español
index on CHRTRAN(m.cadena, Chrtran(m.cadena,"1234567890", ""), "") tag
solonum

Mario López

unread,
May 27, 2010, 9:07:16 PM5/27/10
to Comunidad de Visual Foxpro en Español
Yo le agregaría un PADR():

INDEX ON PADR(CHRTRAN(cadena, CHRTRAN(cadena,"1234567890", ""), "") ,
10) TAG SOLONUM

ya que la expresión de índice debería devolver el mismo largo para
todos los elementos.

Saludos,
Mario

On 27 mayo, 17:43, "Carlos Yohn (A.G.P.)" <i...@AGPsoftware.com>
wrote:

Mauricio Ruben Molinero

unread,
May 28, 2010, 7:35:46 AM5/28/10
to publice...@googlegroups.com
Excelente Carlos!, al final quedo asi.
 
index on VAL(CHRTRAN(codigo, Chrtran(codigo,"1234567890", ""), "")) tag solonum
 
Ya que necesito ordenarlo por el valor numerico de esa expresion, y ademas me daba un error <Error building key for index "name". (Error 2199)>
Ahora.. como puedo hacer que una consulta me utilize este indice ??
--
Mauricio R. Molinero
Diseño Informático
www.gestionmagnum.com.ar

Carlos Yohn (A.G.P.)

unread,
May 29, 2010, 3:46:28 AM5/29/10
to Comunidad de Visual Foxpro en Español
Puedes referirte a dos cosas:
1.- Que una consulta utilice el índice para ejecutarse rapidamente.
Para esto, en la cláusula where debes utilizar la misma expresion que
contiene el índice. Ejemplo:
select * from mitabla where VAL(CHRTRAN(codigo,
Chrtran(codigo,"1234567890", ""), "")) > 100 into cursor lista
nofilter

2.- Que una consulta quede ordenada por estos valores:
select VAL(CHRTRAN(codigo, Chrtran(codigo,"1234567890", ""), "")) as
micampo, * from mitabla where ... order by 1 into cursor lista
nofilter

Saludos,
Reply all
Reply to author
Forward
0 new messages