Tengo un TClientDataSet, que es proporcionada por un TTable‘s conjunto de datos.
El conjunto de datos tiene dos campos: código postal (cadena, 5) y la calle (string, 20)

En tiempo de ejecución quiero mostrar un tercer campo (string, 20). La rutina de este campo es conseguir el código postal como un parámetro y le da la espalda a la ciudad pertenece a este código postal.

El problema es sólo acerca de cómo agregar un campo calculado para los ya existentes. El llenado de los datos en sí no es el problema.

He intentado:

  cds.SetProvider(Table1);
  cds.FieldDefs.Add('city', ftString, 20);

  cds.Open;

  cds.Edit;
  cds.FieldByName('city').AsString := 'Test';  // --> errormessage (field not found)
  cds.Post;

cds es mi clientdataset, Table1 es una Tabla de paradox, pero el problema es el mismo con otras bases de datos.

Gracias de antemano

similarmente a mi question

OriginalEl autor CloudyMarble | 2011-02-08

5 Comentarios

  1. 20

    Si quieres añadir campos adicionales distintos de los que existen en los datos subyacentes, también es necesario agregar los campos existentes manualmente. El conjunto de datos debe estar cerrado cuando está agregando campos, pero usted puede tener los metadatos necesarios con FieldDefs.Update si no queremos seguir todos los detalles del campo de forma manual. Básicamente algo como esto:

    var
      i: Integer;
      Field: TField;
    begin    
      cds.SetProvider(Table1);
    
      // add existing fields
      cds.FieldDefs.Update;
      for i := 0 to cds.FieldDefs.Count - 1 do 
        cds.FieldDefs[i].CreateField(cds);
    
      // add calculated field
      Field := TStringField.Create(cds);
      Field.FieldName := 'city';
      Field.Calculated := True;
      Field.DataSet := cds;
    
      cds.Open;
    end;

    Ver esta excelente artículo por Cary Jensen.

    Gracias por la respuesta y el buen vínculo, enfermo intenta esto, aunque el enfermo tiene que añadir todo el campo en mi sql manualmente.

    OriginalEl autor Sertac Akyuz

  2. 4

    Bien, he encontrado una solución más simple, ya que tengo 24 campos en mi sql yo no quería para añadirlos manualmente así que he añadido un campo ficticio para la instrucción sql en lugar como:

    select '      ' as city, the rest of the fields ... 

    que puedo modificar en mi programa de OnAfterOpen evento.

    Bueno, he tenido a definir en el sql cuánto tiempo que el campo debe ser dejando suficiente espacio vacío, por ejemplo 5 espacios vacíos de 5 caracteres, así que debe saber el tiempo que el nombre de la ciudad podría ser.

    Esto puede no parecer elegante, pero es muy fácil de implementar.

    OriginalEl autor CloudyMarble

  3. 2

    Gustaría compartir más precisa de Consulta para unexisting campos. Creo que es mejor usar el elenco, ni espacios!

    select E.NAME, E.SURNAME, cast(null as varchar(20)) as CITY
    from EMPLOYEE E

    por ejemplo, | Marc'O | Polo | <NULL> |

    Es más precisa, puede uno ver el tamaño del campo, comprensible, fácil, seguro!

    OriginalEl autor xoxn-- 1’w3k4n

  4. 2

    Debe utilizar CreateDataset después de agregar el campo:

    cds.SetProvider(Table1);
    cds.FieldDefs.Add('city', ftString, 20);
    cds.CreateDataset; 
    
    cds.Open;
    cds.Edit;
    cds.FieldByName('city').AsString := 'Test';  
    cds.Post;

    OriginalEl autor Morteza Esmizadeh

  5. 1

    si quieres combinar la ya existente «dinámico» campos de datos (desde el proveedor de lado) con otros secundarios persistentes campos (calculado, de búsqueda, de internalcalc, agregado) debe subclase de CDS. acaba de introducir extra propiedad booleana CombineFields y reemplazar BindFields (en las nuevas versiones de delphi) o de toda la InternalOpen (como hice en d2006/2007) con la siguiente línea

    si DefaultFields o CombineFields luego CreateFields; { TODO-ovavan -cSIC : si CombineFields es cierto, entonces persistente campos va a coexistir con los de fábrica }

    que le permitirá evitar todo lo que en tiempo de ejecución lío con FieldDefs/CreateField

    OriginalEl autor vavan

Dejar respuesta

Please enter your comment!
Please enter your name here