Ir al contenido


Foto

Diferencia FieldByName .Value, .AsString


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

#1 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 13 abril 2011 - 05:07

Apreciada comunidad:

Aprendiendo ésta maravilla de Lazarus me voy encontrando con dudas, cómo en que ocasión usar .value y en qué ocasiones usar el determinador de tipo de campo (.AsString, .AsFloat...). Viendo ejemplos he visto que algunos usan el .value y otros determinan que tipo de dato es el que se va a tratar. ¿Cuales son las bases para saber cual usar en cada momento? Igual es una tontería, pero cómo no encuentro demasiada documentación voy un poco perdido en algunas cosas.

Saludos y gracias.

Marc Miralles .
  • 0

#2 German

German

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 13 abril 2011 - 06:31

.value retorna un tipo variant, lo cual es una herencia de windows y no es para nada recomendable utilizar, mucho mas que e fpc, no estan 100% implementados y soportados. En mi caso de ser necesario siempre utilizo AsXXXX.
  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 13 abril 2011 - 08:23

Hola Marcmiralles,

Desconozco que tan parecida o diferente será respecto a Delphi el uso de .Value y los .AsXXX pero lo más probable es que sea similar.

Como te han indicado el uso de .Value recibe y devuelve un tipo Variant mientras que las propiedades .AsXXX están diseñadas para trabajar con un tipo en particular. Es por ello que existen diferentes AsXXX para cada tipo.

De todas formas, aún utilizando las propiedades .As internamente se realiza una conversión (si es posible) al tipo variant. ¿Porqué? Porque de este modo se puede almacenar el dato de forna nativa a como procede desde el motor. Las propiedades .As ofrecen una forma transparente y fácil de trabajar sobre este variant.

Cuando uno asigna un valor al campo mediante .AsTipo no sólo se hace la conversión Tipo -> Variant sino que además, establece la propiedad DataType adecuada y equivalente al tipo. Esto es útil para poder determinar, luego, si es posible hacer el paso inverso: Variant -> OtroTipo.
Como internamente se almacena un Variant nos evitamos hacer implementaciones de "traducción" Tipo -> OtroTipo por cada tipo posible.
Y en segundo lugar, cuando se trabaja con campos persistentes esta propiedad permite definir la clase del campo persistente adecuada al caso.

En lo posible hay que evitar el uso de .Value ya que por este medio no se asigna valor a DataType, y además cuando se hace una asignación como por ejemplo:



delphi
  1. FieldByName('Codigo').Value := 123456



Espera un .Variant y si bien el compilador automáticamente puede generar estas traducciones directas, no es un mecanismo seguro y puede llevar a errores inesperados debido a metidas de patas... Como por ejemplo que después se haga algo como:



delphi
  1. FieldByName('Codigo').Value := '123456'



Sobre el mismo campo. Por ello se estila y se promueve el uso de .As que se encarga de encapsular la conversión, establecer el tipo y resulta más fácil de leer y comprender que un Value arbitrario.

Saludos,
  • 0

#4 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 14 abril 2011 - 03:26

Genial, muy claro y conciso, gracias a ambos por vuestras respuestas
  • 0

#5 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 14 abril 2011 - 07:34

A lo anteriormente dicho, añadiria que en ciertas ocasiones si que interesa usar value, por ejemplo: Si quieres poner a null una campo, no puedes hacer .AsString:='' ni .AsInteger:=0... solo te funcionará con .Value o .AsVariant:=null, ya que null ni es un float ni es string ni nada de eso, solo un variant puede contener un null.
  • 0

#6 German

German

    Member

  • Miembros
  • PipPip
  • 40 mensajes

Escrito 14 abril 2011 - 07:11

Queria simplemente aclarar nuevamente, que no es necesario en absoluto usar .value y tipos variant, por lo menos en lo que respecta a SQLDB, que es lo que utilizo para conectarme a bases de datos.

Si queremos poner a null un campo, simplemente hacemos:

SQLQuery1.FieldByName('NOMBRE').SetData(nil);

Asi tambien queria aclarar que internamente, en el dataset, los valores internamente no se almacenan como tipos variant. Los tipos variant vienen de tecnologias de windows (COM, ACTIVEX, etc), y mientras no usemos estas tecnologias, no son absolutamente necesarios y menos en fpc que su implementacion esta incompleta.

Saludos.

  • 0




IP.Board spam blocked by CleanTalk.