Duda con códigos en formato númerico o caracter

916 views
Skip to first unread message

Masternet

unread,
Jun 23, 2011, 5:33:28 AM6/23/11
to Comunidad de Visual Foxpro en Español
Hola amigos,

He leido por el foro que siempre se aconseja que los campos índice
sean de tipo caracter y no numéricos.

El caso es que así lo he hecho, lo que pasa que por otro lado al
recorrer los registros con los típicos botones de avanzar, retroceder,
los registros no se muestran ordenados numéricamente.

Es decir, del código 1 pasa al 10, 11

¿Como lo hacéis vosotros?

Agradecería una aclaración sobre este punto para no tener que
modificar el código más adelante.

Saludos.

José Luis.

Antonio Meza

unread,
Jun 23, 2011, 5:40:44 AM6/23/11
to publice...@googlegroups.com
Hola!!!
 
En el caso de campos tipo caracter debes agregar CEROS a la Izquierda, es decir si tienes un campo de 5 digitos debe quedar guardado asi
 
00001
00002
.....
00010
....
01001
 
Y de esta forma cuando ordenes la tabla por este campo te respetara el orden!!!
 
P.D.
Tambien tengo la misma inquietud sobre usar campos Indice como caracter en vez de numerico, pero hablando de mysql en el caso de usar campos autoincrementables solo pueden ser Numericos!! o sera que en este tipo de campo autoincrementable si es valido?
 
saludos
Antonio Meza

Walter R. Ojeda Valiente

unread,
Jun 23, 2011, 5:40:56 AM6/23/11
to publice...@googlegroups.com
Hola José Luis

Lo más sencillo es que les agregues espacios en blanco adelante a tus códigos, de esa manera siempre estarán correctamente ordenados.

Por ejemplo, si tu campo es de 5 caracteres:
1 se escribiría con cuatro espacios en blanco y luego el 1
11 se escribiría con tres espacios en blanco y luego el 11

Para agregarle espacios en blanco adelante puedes usar la función PADL(), como:

? PADL(1, 5, " ")
? PADL(11, 5, " ")

Saludos.

Walter.



> Date: Thu, 23 Jun 2011 02:33:28 -0700
> Subject: [vfp] Duda con códigos en formato númerico o caracter
> From: maste...@hotmail.com
> To: publice...@googlegroups.com

Walter R. Ojeda Valiente

unread,
Jun 23, 2011, 5:48:22 AM6/23/11
to publice...@googlegroups.com
Hola Antonio

Las tablas .DBF almacenan internamente todos los datos como caracteres. Por lo tanto si lo que buscas es velocidad, tus índices deberían ser de tipo caracter, ya que el proceso de convertir de caracter a numérico y quizás nuevamente a carácter lleva su tiempo. Aunque con las computadoras tan rápidas que tenemos ahora ya no es tan importante como lo era hace 15 o más años.

En cambio con las tablas SQL sí se pueden tener campos (columnas) numéricos como índice sin pérdida de performance porque los datos numéricos no se almacenan como texto.

Saludos.

Walter.




Date: Thu, 23 Jun 2011 02:40:44 -0700
From: solv...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Duda con códigos en formato númerico o caracter

Masternet

unread,
Jun 23, 2011, 7:22:32 AM6/23/11
to Comunidad de Visual Foxpro en Español
Muchas gracias Walter

On 23 jun, 11:48, "Walter R. Ojeda Valiente" <w...@hotmail.com> wrote:
> Hola Antonio
>
> Las tablas .DBF almacenan internamente todos los datos como caracteres. Por lo tanto si lo que buscas es velocidad, tus índices deberían ser de tipo caracter, ya que el proceso de convertir de caracter a numérico y quizás nuevamente a carácter lleva su tiempo. Aunque con las computadoras tan rápidas que tenemos ahora ya no es tan importante como lo era hace 15 o más años.
>
> En cambio con las tablas SQL sí se pueden tener campos (columnas) numéricos como índice sin pérdida de performance porque los datos numéricos no se almacenan como texto.
>
> Saludos.
>
> Walter.
>
> Date: Thu, 23 Jun 2011 02:40:44 -0700
> From: solver...@gmail.com

Luis Maria Guayan

unread,
Jun 23, 2011, 9:11:54 AM6/23/11
to publice...@googlegroups.com
Para que el orden sea el correcto, deberias justificar a la izquierda, ya sea con " " espacios o con "0" ceros

Ej:
"      10"
"00000010"

Para ello puedes utilizar

? TRANSFORM(10, "@L 99999999")
ó
? PADL(10, 8, "0")


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Fabricio

unread,
Jun 23, 2011, 10:28:22 AM6/23/11
to Comunidad de Visual Foxpro en Español
Tus índices deben tener llaves tipo caracter di combinas varios campos
llaves, si tu llave primaria solo es un campo, puedes dejarlo como
entero, le creas un indices y no hay problema, también puedes crear un
segundo índices y conviertes el valor numérico en caracter para poder
concatenarlo.

Saludos

Fabricio

Antonio Meza

unread,
Jun 23, 2011, 1:40:12 PM6/23/11
to publice...@googlegroups.com
Gracias Walter por los comentarios!!! quedo claro y anotado!!!
 
saludos!!!

miltonvas

unread,
Jun 23, 2011, 3:29:08 PM6/23/11
to Comunidad de Visual Foxpro en Español

que es mejor transform o padl(), yo utilizo padl

repl codi with padl(kcodi,10,"0")

Saludos



On 23 jun, 08:11, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Para que el orden sea el correcto, deberias justificar a la izquierda, ya sea con " " espacios o con "0" ceros
> Ej:
> "      10"
> "00000010"
> Para ello puedes utilizar
> ? TRANSFORM(10, "@L 99999999")
> ó
> ? PADL(10, 8, "0")
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com

Luis Mata

unread,
Jun 23, 2011, 3:32:03 PM6/23/11
to publice...@googlegroups.com
Mejor en que? el resultado es el mismo

-----Mensaje original-----
From: miltonvas
Sent: Thursday, June 23, 2011 2:29 PM
To: Comunidad de Visual Foxpro en Espa�ol
Subject: [vfp] Re: Duda con c�digos en formato n�merico o caracter


que es mejor transform o padl(), yo utilizo padl

repl codi with padl(kcodi,10,"0")

Saludos

On 23 jun, 08:11, Luis Maria Guayan <luismar...@gmail.com> wrote:
> Para que el orden sea el correcto, deberias justificar a la izquierda, ya
> sea con " " espacios o con "0" ceros
> Ej:
> " 10"
> "00000010"
> Para ello puedes utilizar
> ? TRANSFORM(10, "@L 99999999")

> �


> ? PADL(10, 8, "0")
>

> Luis Mar�a Guay�n
> Tucum�n, Argentina


> _________________________http://www.PortalFox.com
> Nada corre como un zorro
> _________________________
>
>

> El 23/06/2011 06:33, Masternet escribi�:Hola amigos, He leido por el foro
> que siempre se aconseja que los campos �ndice sean de tipo caracter y no
> num�ricos. El caso es que as� lo he hecho, lo que pasa que por otro lado
> al recorrer los registros con los t�picos botones de avanzar, retroceder,
> los registros no se muestran ordenados num�ricamente. Es decir, del c�digo
> 1 pasa al 10, 11 �Como lo hac�is vosotros? Agradecer�a una aclaraci�n
> sobre este punto para no tener que modificar el c�digo m�s adelante.
> Saludos. Jos� Luis.


Luis Maria Guayan

unread,
Jun 23, 2011, 9:37:31 PM6/23/11
to publice...@googlegroups.com
Yo opte por TRANSFORM(), ya que a veces el comportamiento de PADL() con números que tenían operaciones matemáticas era un poco extraño

ln = 4.00
? ln
? PADL(ln,6,"0")
? TRANSFORM(ln,"@L 999999")



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________


edgar suarez kummers

unread,
Jun 23, 2011, 9:50:47 PM6/23/11
to publice...@googlegroups.com
Existen dos casos en donde los KEYS ponen problemas.

Primero, cuando un KEY numérico en su estructura pero que se transforma en CHARACTER y se exporta a EXCEL.

Segundo, cuando se hace un KEY de dos columnas, por ejemplo ESPACIO y TIEMPO para hacer logística espacial y temporal.

Ejemplo:

edificio la argentina, piso 4 ocupado todos los viernes de 4:00 P.M. a 10:00 P.M.

En el primer caso EXCEL se trastorna al encontrar números que se le exportan como caracteres.

En el segundo caso si se repitiera la KEY principal, marca error la tabla al agregar nuevos términos, porque ya existen en dos columnas diferentes (de llave normal) elementos que al juntarse se hacen iguales.

Saludos

Edgar



De: Luis Maria Guayan <luism...@gmail.com>
Para: publice...@googlegroups.com
Enviado: jueves 23 de junio de 2011 20:37
Asunto: Re: [vfp] Re: Duda con códigos en formato númerico o caracter

ibania blanco

unread,
Jun 24, 2011, 5:29:14 PM6/24/11
to Comunidad de Visual Foxpro en Español
en mi experiencia espacial pero no en la nasa, sino en la luna.
los indices son caracteres y las llaves de los indices de codigos y
numeros de documentos como factura y otros, los relleno con 000001 y
cuando solicito un codigo lo pido como numero ejemplo 1 y
acontinuacion lo relleno con ceros para que quede asi en la tabla
000001

On 23 jun, 19:50, edgar suarez kummers <edgarkumm...@yahoo.es> wrote:
> Existen dos casos en donde los KEYS ponen problemas.
>
> Primero, cuando un KEY numérico en su estructura pero que se transforma en CHARACTER y se exporta a EXCEL.
>
> Segundo, cuando se hace un KEY de dos columnas, por ejemplo ESPACIO y TIEMPO para hacer logística espacial y temporal.
>
> Ejemplo:
>
> edificio la argentina, piso 4 ocupado todos los viernes de 4:00 P.M. a 10:00 P.M.
>
> En el primer caso EXCEL se trastorna al encontrar números que se le exportan como caracteres.
>
> En el segundo caso si se repitiera la KEY principal, marca error la tabla al agregar nuevos términos, porque ya existen en dos columnas diferentes (de llave normal) elementos que al juntarse se hacen iguales.
>
> Saludos
>
> Edgar
>
> ________________________________
> De: Luis Maria Guayan <luismar...@gmail.com>Para:publice...@googlegroups.com
> Enviado: jueves 23 de junio de 2011 20:37
> Asunto: Re: [vfp] Re: Duda con códigos en formato númerico o caracter
>
>  Yo opte por TRANSFORM(), ya que a veces el comportamiento de PADL() con números que tenían operaciones matemáticas era un poco extraño
>
> ln = 4.00
> ? ln
> ? PADL(ln,6,"0")
> ? TRANSFORM(ln,"@L 999999")
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com
> Nada corre como un zorro
> _________________________
>
> El 23/06/2011 16:29, miltonvas escribió:
> que es mejor transform o padl(), yo utilizo padl repl codi with padl(kcodi,10,"0") Saludos On 23 jun, 08:11, Luis Maria Guayan <luismar...@gmail.com> wrote:>Para que el orden sea el correcto, deberias justificar a la izquierda, ya sea con " " espacios o con "0" ceros
>
> Ej:
> "      10"
> "00000010"
> Para ello puedes utilizar
> ? TRANSFORM(10, "@L 99999999")
> ó
> ? PADL(10, 8, "0") Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.comNada corre como un zorro

Carlos Miguel FARIAS

unread,
Jun 24, 2011, 6:07:59 PM6/24/11
to publice...@googlegroups.com
Los indices en fox conviene que sean fisicamente lo mas chico posibles. Y que al momento de ejecutarlos no tengan que ser calculados.
En fox, cuando un indice es puramente numerico, lo convierte a un campo binario de 8 bytes (que manejaria tantos digitos como un campo currency) para almacenarlo en el indice.
Por cada indice, ademas, agrega un entero de 4 bytes (en binario) que es la dirección del registro al que debe acceder.
Cada nodo del arbol del indice (son indices B+) puede tener una cantidad entera de claves y sus punteros. con 12 bytes entran unos 40 claves +/-
Si nosotros tenemos un campo numerico de menos de 8 digitos, al convertirlo a caracters (o ser de tipo caracter) la clave ocupa el espacio en caracteres, si por ejemplo son 5 digitos en caracter, cada clave ocupara en el indice 9 bytes y por nodo entrarian mas de 50 claves.
A mayor cantidad de claves en un nodo, menor cantidad de nodos (para una cantidad de registros dada).
Para achicar el tamaño de los indices numericos estan disponibles las funciones BINTOC que permite convertir un numero hasta unos 9 digitos en caracter binario (que ocupa 4 caracteres) y asi achicar el espacio requerido por clave, menor tamaño de indice y mas velocidad en el proceso.
Si es correcto que es muchas veces tener los campos claves sobre datos numericos, tener a estos como tipo caracter, porque al crear indices compuestos (con expresiones) es mas facil.
Si tengo dos campos numericos y estos conforman una clave tengo que
STR( camponumerico1, 8, 0 ) + STR( camponumerico2, 8, 0 ), o sea convertirlos a caracteres y concatenarlos (y esa formula usarlo cada vez que hago un acceso con seek o equivalente.
En cambio, si ambos campos son del tipo caracter, una simple concatenacion compone el indice (al construirlo y al accederlo).
Reply all
Reply to author
Forward
0 new messages