Ir al contenido


Foto

[RESUELTO] Tipos de datos, Delphi y MySql


  • Por favor identifícate para responder
8 respuestas en este tema

#1 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 25 septiembre 2010 - 12:10

Hola como estan! les hago la siguiente consulta!

Resulta que estoy utilizando Delphi 7 y tengo una base de datos en MySQL.
En la base de datos, tengo una tabla de clientes, que posee un campo CUIT. Este campo, en la base de datos, esta definido como BIGINT, de manera que pueda almacenar un numero de 11 digitos.
El conflicto que tengo es a la hora de querer cargar un valor ahi desde delphi por medio de un Edit.

El codigo que tengo es el siguiente



delphi
  1. TClientes.FieldByName('cuit').AsInteger:=strtoint(Ecuit.text);



Cuando quiero guardar el valor en la base de datos, me dice que "no es un valor entero valido". Puede ser por el "AsInteger" ?? no encuentro forma de poner BIGINT u otro mayor.

Saludos!!
  • 0

#2 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 septiembre 2010 - 12:28

Hola

Y si haces esto que te hace ?



delphi
  1. TClientes.FieldByName('cuit').Value :=strtoint(Ecuit.text);



Salud OS
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 septiembre 2010 - 12:34

Hola GUN10,

El asunto es que integer, al menos en la arquitectura 32 bits, es de 32 bits... un entero con signo por lo que el mayor número (en términos de valor absoluto) que puede almacenarse en él es 2^31 = 2147483648. Y como puede apreciarse... ¡es un número de 10 dígitos!

Desafortunadamente, al menos en D6 y D7 los TFields no tienen soporte a un método AsInt64. Una posible solución sería cambiar a un tipo a flotante que tenga capacidad de soportar dicha cantidad de dígitos (el Double tiene para 15-16 dígitos), o la otra es con strings.

No estoy familiarizado con MySQL por lo que no te sabría decir como será la equivalencia entre el formato de los tipos de MySQL y los de Delphi. ¿Tienes los campos de forma persistente?
Si es así podríamos indicarnos la clase del campo persistente que te ha creado Delphi para el campo en cuestión?

Partiendo de allí podríamos ver el modo de como asesorarte. Ya que nos daría una excelente pista de como tratar a ese campo. Resultaría extraño que no hubiera soporte para números más grandes...

Saludos,
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 septiembre 2010 - 01:02

Deberías trabajar con el campo persistente, ya que éste debería tener el soporte adecuado para el tipo.

Al menos el tipo BIGINT de Firebird, que corresponde a un integer de 64 bits, tiene una representación directa en Delphi. El campo persistente que genera IBX (no he probado con dbExpress, si es tu caso) es de tipo TLargeInteger. Cuyo contenido interno opera con el tipo TLargeInt, que no es más que un alias de Int64.

De modo que bastaría algo como:


delphi
  1. NombreCampoPersistente.Value := StrToInt64(Edit1.Text);



Ahora, no se como procedería con el caso de MySQL. Supuestamente debería ser igual, ya que el tipo BIGINT está definido por el estándar y corresponde al Int64.
Sabiendo que tanto dbExpress como IBX internamente usen uso de los mismos Fields, es de esperar que el campo persistente que te genere sea TLargeInteger.

Saludos,
  • 0

#5 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 25 septiembre 2010 - 05:08

Gracias por las respuestas que me dieron y perdon por la demora!

Probe de las formas que me dijeron pero me da un error, me dice que no se puede acceder el valor de tipo variant.
Tambien probe de la siguiente manera..



delphi
  1. TClientes.FieldByName('cuit').AsInteger:=strtoint64(Ecuit.text);



En este caso si me guarda un numero de 11 digitos pero si por ejemplo escribo "99999999999" (once nueves), me almacena el siguiente valor: "1215752191"

Delphius, no se bien a lo que te referis como campos persistentes, si me lo podrias aclarar.
Agrego tambien que estoy utilizando los componentes Zeos para realizar la conexion con la base de datos.

Saludos y gracias!
  • 0

#6 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 25 septiembre 2010 - 07:03

almacenamiento.

Para crear los campos persistentes haz doble clics sobre tu ZTable. Debería mostrarte el editor de campos. Presiona en Add Fields (dependiendo de la versión de Delphi, el editor ofrece un botón... o sino se hace con el menú contextual: botón secundario). Te debería aparecer una lista con los campos de la tabla, agrégalos.

Por defecto los nombra siguiendo la regla: NombreZTable + NombreCampo.

Si te fijas, ahora tienes en el código una lista de los campos, cada uno de una clase especialmente diseñada para trabajar y representar al tipo de datos de la base de datos.

Este es un ejemplo de una tabla que tengo de pruebas:


delphi
  1.     IBDatabase1: TIBDatabase;
  2.     IBTransaction1: TIBTransaction;
  3.     IBTable1: TIBTable;
  4.     IBTable1ID: TIntegerField;
  5.     IBTable1NOMBRE: TIBStringField;
  6.     IBTable1FECHA: TDateTimeField;
  7.     IBTable1CANTIDAD: TIBBCDField;
  8.     IBTable1MONEDA: TIBBCDField;
  9.     IBTable1FECHA1: TDateField;
  10.     IBTable1INTPEQUE: TSmallintField;
  11.     IBTable1HORA: TTimeField;
  12.     IBTable1ENTEROGRANDE1: TLargeintField;



Ahora puedes acceder a los campos con algo tan simple como:



delphi
  1. IBTable1ENTEROGRANDE1.Value := StrToInt64(Edit1.Text);



Todos los campos persistentes tienen la propiedad Value mediante ésta se puede leer y almacenar valores. Cada campo tiene el tipo adecuado y diseñado para Value. En el ejemplo, el campo persistente IBTABLEENTEROGRANDE1 los datos se almacenan como Int64, por lo que su .Value es de Int64.

Con campos persistentes no deberías tener problemas. Si sigues optando por el uso de FieldByName() no podrás, puesto que como verás... no cuenta con un AsInt64... ¡debo reconocer que recién caigo en eso!  :o

Espero que se me entienda. Sino vuelvo a explicar.

Si aún no lo hiciste, recomiendo la lectura del libro La Cara Oculta de D4. Te ayudará a comprender mejor todo esto. No te resultará difícil descargarlo, muchos sitios ofrecen su descarga.

Saludos,
  • 0

#7 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 26 septiembre 2010 - 01:33

Gracias por la explicación Delphius!
Hice lo que me dijiste y pude solucionar el problema, ahora se guardan bien los datos que ingreso.

Te hago una pregunta mas referida a los campos persistentes y el uso de "value".
Es recomendable que trabaje con esta propiedad para almacenar todos los campos? Es decir, que a todos los campos los haga persistentes y en cada uno trabaje con la propiedad value para almacenar los datos y asi reemplazar "filedbyname"

Saludos!
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 26 septiembre 2010 - 06:50

Hola GUN10,

Los campos persistentes pueden resultar muy fáciles y atractivos de usar pero como muchas cosas de esta vida, hay un "depende".

Lo malo de emplear campos persistentes es que tu ejecutable pesa unos cuantos kb más. Y sobre todo, son fijos... en algunos casos uno necesita el acceso a campos de forma dinámica por lo que los campos persistentes no son la mejor opción en esos casos. Es allí donde tratar el acceso a los campos de forma dinámica como con FieldByName() es recomendable.

Yo te dí la solución más simple y directa a tu caso. Pero si en futuro o si tus requerimientos indican que ese ZTable contenga el contenido de una tabla definida en tiempo de ejecución no se puede disponer de campos persistentes.

Pero no te preocupes, hay una alternativa a ello: emplear type casting. Es decir tratar al Field en cuestión como si fuera de la clase que maneja ese tipo de dato. En mi ejemplo, TLargeIntField. Como por ejemplo:



delphi
  1. TLargeintField(IBTable1.FieldByName('ENTEROGRANDE1')).Value := 12345678901;



Recomiendo la lectura tanto de Delphi como de la Cara Oculta sobre el tema de campos persistentes. En lo personal, Ian Marteens en la Cara Oculta explica mucho mejor que yo los pros y contras de los campos persistentes.

Saludos,
  • 0

#9 GUN10

GUN10

    Advanced Member

  • Miembros
  • PipPipPip
  • 79 mensajes
  • LocationArgentina

Escrito 26 septiembre 2010 - 08:25

Muchisimas gracias por la explicación Delphius! ahora me quedo mas claro.
Voy a leer un poco mas en la Cara Oculta de Delphi, gracias por la recomendación.

Saludos!
  • 0




IP.Board spam blocked by CleanTalk.