Почему свойство DefaultExpression работает только с BDE?

Как я могу использовать свойство DefaultExpression для TField с MS Access или SQL Server, похоже, оно работает только с BDE.


person Kachwahed    schedule 02.11.2009    source источник


Ответы (2)


Не точный ответ, но это обходной путь. Я просто вызываю что-то вроде следующей процедуры из обработчика событий AfterInsert набора данных:

procedure Flds_SetToDefExpr(const AFlds: array of TField);
var
  i : Integer;
begin
  for i := Low(AFlds) to High(AFlds) do
    with AFlds[i] do begin
      DataSet.Edit;
      if ( DefaultExpression='' ) then
        Clear
      else if HasOuterQuotes(DefaultExpression) then
        Value := RemoveOuterQuotes( DefaultExpression,True,False )
      else
        Value := StrToInt(DefaultExpression); //raises if not an integer!
    end;
end;

Конечно, вы можете изменить эту процедуру, чтобы она принимала TDataSet, который зацикливает свои поля и делает то же самое со всеми полями.

person MvdH    schedule 02.11.2009
comment
Спасибо, MvdH, хорошая идея, но есть еще один простой способ: просто установите для CursorLocation значение clUseServer для TADOTable и задайте для полей значение по умолчанию с сервера, но я хотел бы использовать свойство DefaultExpression, потому что оно, кроме SQL-выражений, имеет какое-либо решение для тела? - person Kachwahed; 03.11.2009

Я думаю, что свойство DefaultExpression не работает с ADO, но мы находим обходной путь, используя TBetterADODataSet Василя Назарова, который использует что-то вроде:

Procedure TBetterADODataSet.DoOnNewRecord;
  Var i: Integer;
Begin
  FModifiedFields.Clear;
  For i:=0 To Pred(Fields.Count) Do With Fields[i] Do
    If DefaultExpression<>'' Then Try
      AsString:=DefaultExpression;
    Except
      On E: Exception Do
        ShowMessage(E.Message);
      End;
  Inherited DoOnNewRecord;
End;

Вы можете получить его бесплатно здесь: TBetterADODataSet

person Kachwahed    schedule 11.11.2009