Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 31

стр.

Я поместил имя модуля с формой ввода данных в список используемых модулей главной формы. Вот базовая схема моего кода: 

>procedure TFrmItemNav.BtnChangeLocClick(Sender: TObject);

>{var DlgItemLoc: TDlgItemLoc;}

>begin

> DlgItemLoc := TDlgItemLoc.Create(FrmItemNav);

> DlgItemLoc.ShowModal;

> if DlgItemLoc.ModalResult = mrOk then

>  {делаем все, что необходимо для постинга данных}

else

>  {очищаем и делаем Cancel};

> DlgItemLoc.Free;

>end; 

Отображение определенных полей БД

Delphi 1

Вот что можно сделать во время выполнения программы: 

>Table1.FieldByName(RemovedFieldName).Visible := False;

или 

>Table1.Field[removedFieldNumber-1].Visible := false; 

Из базы данных в переменные

Delphi 1

Примерно так вы можете программным путем извлечь содержимое поля: 

>aValue := TMyTable.FieldByName('SomeField').AsText;

или 

>aValue := TMyTable.FieldByName('SomeField').AsInteger;

или 

>aValue := TMyTable.Fields[1].AsFloat;

В действительности здесь вы получаете объект TField от объекта TTable (или TQuery), и затем вызываете соответствующий метод объекта TField для получения самих данных. Вы можете также изменить значение самого поля, но только в случае, если объект TTable находится в режиме вставки (Insert) или редактирования (Edit). Члены AsFloat, AsInteger, AsDateTime и AsString в действительности являются свойствами, и как таковые также могут принимать значения. С помощью Редактора Полей (Fields Editor, для вызова которого достаточно дважды щелкнуть на объекте TTable или TQuery) также возможно создание объектов-полей. Эти объекты могут быть использованы вместо получения их каждый раз от объекта TTable или TQuery.

Получение информации о таблице

Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:

>procedure TForm1.ShowFields;

>var

> i : Word;

>begin

> Memo1.Lines.Clear;Table1.FieldDefs.Update; { должно быть вызвано, если Table1 не активна }

> for i:= 0 to Table1.FieldDefs.Count - 1 do With Table1.FieldDefs.Items[i] do Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));

> Memo1.Lines.Add(Name + ' – ' + IntToStr(Size));

end;

Если вам просто нужны имена полей (FieldNames), то используйте метод TTable GetFieldNames:

GetIndexNames для получения имен индексов:

>var FldNames, IdxNames : TStringList

>begin

> FldNames := TStringList.Create;

> IdxNames := TStringList.Create;

> If Table1.State = dsInactive then Table1.Open;

> Table1.GetFieldNames(FldNames);

> Table1.GetIndexNames(IdxNames);

> {…… используем полученную информацию ……}

> FldNames.Free; {освобождаем stringlist}

> IdxNames.Free;

>end;

Для получения информации об определенном поле вы должны использовать FieldDef. 

Обмен данными между TMemoField и TMemo

Delphi 1

>Procedure TMemoToTMemoField;

>begin

> TMemoField.Assign(TMemo.Lines);

>end;


>Procedure TMemoFieldToTMemo;

>VAR aBlobStream : TBlobStream;

>begin

> aBlobStream := TBlobStream.Create(TMemoField, bmRead);

> TMemo.Lines.LoadFromStream(aBlobStream);

> aBlobStream.Free;

>end; 

Если в транзакции изменена какая-то таблица, то для другого пользователя блокируется вся таблица, до окончания транзакции. Как лечить?

Nomadic отвечает:

По умолчанию, оператор UPDATE в MS SQL Server пытается поставить эксклюзивную табличную блокировку. Вы можете обойти это, используя ключевое слово FROM в сочетании с опцией PAGLOCK для использования MS SQL Server страничных блокировок вместо эксклюзивной табличной блокировки:

>UPDATE orders SET customer_id=NULL FROM orders(PAGLOCK) WHERE customer_id=32;

Блокиpовка на всю таблицу пpи UPDATE ставится только в том случае, если по предикату нет индекса. Так, можно просто проиндексировать таблицу orders по полю customer_id, и не забывать делать UPDATE STATISTIC, хотя будет работать и с PAGLOCK. Просто не факт, что UPDATE всегда делает табличную блокировку. 

Форма Мастер-Деталь

Delphi 1

…это нормально в двух случаях:

1. Эксперт баз данных по умолчанию создает запрос, где RequestLive установлен в False; если вы хотите что-либо изменить, установите RequestLive в True.

2. При отношениях «один к многим», из-за правил сохранения целостности, вам дозволяется делать изменения только на форме «многих», а не на форме «один».