2012-01-30 7 views
6

Estoy usando TADODataSet (D7).
No creo campos persistentes en el modo de diseño con mi DataSet.¿Cómo crear un campo de búsqueda TDataSet en tiempo de ejecución?

dsItems.CommandText := 'select ID, ItemName, UserIDCreate from Items'; 
dsUsers.CommandText := 'select ID, LoginName from Users'; // lookup dataset 

Si hago doble clic en dsItems y "Agregar todos los campos campos" y haga clic en "Nueva presentada" y definir mi campo de búsqueda, todo está funcionando bien. El dsItems resultante debe contener: ID, ItemName, UserIDCreate, LoginName_Lookup

¿Cómo puedo evitar hacer todo esto en tiempo de diseño y añadir un campo de búsqueda después de/o antes de la apertura (no estoy seguro?) Del conjunto de datos.

En otras palabras: ¿Cómo emular "Agregar todos los campos campos" y luego "Nueva Archivado" añadir operaciones de búsqueda presentada en tiempo de ejecución?


NOTA: consigo una excepción cuando se ejecuta el código de John desde el IDE. La excepción se produce al intentar abrir el DataSet: EOleException with message 'An unknown error has occured'.

function TCustomADODataSet.LocateRecord (ADODB.pas) en línea if FieldCount = 1 then FLookupCursor.Find...

Estoy aceptando la respuesta lástima pues el programa está trabajando cumplido.
Sería bueno que alguien pudiera verificar el obtener (o no) una excepción al ejecutar el formulario dentro del IDE.

Respuesta

8

El conjunto de datos no se puede abrir para agregar un campo de búsqueda en el tiempo de ejecución.

También deberá agregar cualquier otro campo al que necesite acceder como campos persistentes, de lo contrario, será inaccesible. Los siguientes procedimientos deberían funcionar. Sin embargo, te recomiendo que, si puedes, utilices consultas y te unas a tus tablas, es mucho menos codificante y mucho más limpio en mi opinión.

procedure CreatePersistentFields(ADataset: TDataset); 
Var 
    i: Integer; 
Begin 
    ADataset.FieldDefs.Update; 
    for I := 0 to ADataset.FieldDefs.Count - 1 do 
    if ADataset.FindField(ADataset.FieldDefs[i].Name) = Nil then 
     ADataset.FieldDefs.Items[i].CreateField(ADataset); 
End; 

Procedure CreateLookupField(ATable: TDataSet; AFieldName: String; ALookupDataset:   TDataset; AKeyfields: String; ALookupKeyfields: String; ALookupResultField : String); 
Var 
    I : Integer; 
    NewField : TField; 
Begin 
    with ATable do begin 
    if FieldDefs.Updated = False then 
     FieldDefs.Update; 
    If FindField(AFieldName) = Nil then 
    begin 
     NewField := TStringField.Create(ATable); 
     NewField.FieldName := AFieldName; 
     NewField.KeyFields := AKeyFields; 
     NewFIeld.LookupDataSet := ALookupDataset; 
     NewField.LookupKeyFields := ALookupKeyFields; 
     NewField.LookupResultField := ALookupResultField; 
     NewField.FieldKind := fkLookup; 
     NewField.Dataset := ATable; 
    end; 
    end; 
End; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    AdoDataset1.Close; 
    CreatePersistentFields(TDataset(AdoDataset1)); 
    CreateLookupField(TDataset(AdoDataset1), 'EmployeeNameLook', TDataset(EmployeeTable), 'EmployeeID', 'EmployeeID', 'EmployeeName'); 
end; 
+0

¿Quiere decir que primero necesito crear "cualquier otro campo al que necesite acceder como campos persistentes" en el modo de diseño para ejecutar este código? – Vlad

+0

Aparece 'EOleException con el mensaje 'Se ha producido un error desconocido' al intentar abrir el DataSet. – Vlad

+0

Puede agregar todos los campos persistentes en tiempo de ejecución. ¿Qué parte arroja la excepción y qué línea? –

Cuestiones relacionadas