Ver Mensaje Individual
  #18  
Antiguo 21-04-2008
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Reputación: 18
rolandoj Va por buen camino
Comentarios a FieldByName

Hola,

Respecto a la solución basada en FieldByName, ciertamente también funciona; pero , ya que nuestro amigo está empezando, creo conveniente efectuar algunos comentarios acerca de su uso.

FieldByName es un método que devuelve automáticamente el objeto, descendiente de TField que el respectivo TDataset tiene para el campo que se la pasa como único parámetro. En ese orden de ideas, si el campo se llama Field, y el Query, Query1, como en el ejemplo, eso es, en principio, lo mismo que crear el objeto Query1Field y escribir Query1Field.AsFloat. Sin embargo, hay varias diferencias.

A efectos de simples operaciones sumatorias, como el caso presente, FieldByName es más versatil que el método que yo mencioné antes, ya que el nombre del campo puede pasarse como parámetro a tiempo de ejecución, y es por tanto la solución adecuada cuando los nombres de los campos pueden ser diferentes a tiempo de ejecución.

Por contra, es bastante ineficiente frente al método de crear el campo permanente, ya que cada vez que se llame a FieldByName, este debe realizar una busqueda entre la lista de campos del Query. Si el Query tiene muchos campos y encima hay muchos registros, esto significa muchas operaciones innecesarias extras.

A lo anterior agrega que es bastante más complicado de manejar cuando se requiere usar otras funcionalidades, tales como campos calculado y eventos OnGetText y OnSetText

Una alternativa para el ejemplo actual es obtener el objeto TField deseado antes de efectuar el While. Veamos :

Código Delphi [-]
Var
Suma: Double;
ElCampo:  TField; 
Begin
     Suma:=0;
     Try
        With query1 Do Begin
             DisableControls;
             ElCampo := fieldbyname('Field');
             First;
             While Not EoF Do Begin
                   Suma := Suma + ElCampo.AsFloat;
                   Next;
             End;
        End;
     Finally
        query1.EnableControls;
     End;
     Edit1.Text:=Floattostr(Suma);
End;

También es de anotar que FieldByName genera una excepción si el campo no existe. Para controlar eso, puede usarse FindField que es lo mismo que FieldByName excepto que si el campo no existe, en lugar de genear un error devuelve el valor Nil, permitiendo así que el programador pueda analizar el error.

Como verás, aún en este caso sencillo hay muchas cosas por anotar. Por eso mi consejo de que dediques un tiempó a leer libros de Delphi o mirar artículos en Internet. Creo que te darán una visión más amplia.

Última edición por rolandoj fecha: 21-04-2008 a las 19:13:09.
Responder Con Cita