Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

var iDBIError: Integer;

begin

 if (E is EDBEngineError) then begin

iDBIError := (E as EDBEngineError).Errors[0].Errorcode;

case iDBIError of

eKeyViol:

begin

MessageDlg('Нарушение уникальности записи ', mtWarning, [mbOK], 0);

Abort;

end;

end;

Затем

для каждой таблицы вашего приложения создайте следующий обработчик события:

procedure TMainForm.Table1EditError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);

begin

 DBError(Table1, E, Action);

end;

Таким образом вы можете перехватить множество ошибок. Смотрите примеры от Borland, там много чего есть полезного. 

При выполнении некоторых живых запросов, возвращающих единственную запись, BDE ругается 'multiple records found, but only one was expected'. Как лечить?

Nomadic отвечает:

Запросы вида SELECT c, b, a, q FROM T WHERE b = :b, где ключ c, но BDE посчитала ключом a. Интересный запрос, да? Такое впечатление, что, поскольку ключом в исходной таблице являлась третья колонка, то Дельфы посчитали ключом третью колонку.

Перестановкой SELECT a, b, c, q… все исправилось. Я решил теперь использовать в таких (live) запросах только SELECT *.

Как поймать свой RAISEERROR в Delphi?

Nomadic отвечает:

procedure TFDMUtils.GeneralError( DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);

var

 i: Word;

 ExtInfo : String;

begin

 ExtInfo := '';

 if (E is EDBEngineError) then begin

if (EDBEngineError(E).Errors[0].NativeError = 0) then begin // Local Error

if EDBEngineError(E).Errors[0].Errorcode = 9732 then

ExtInfo := DataSet.FieldByName(trim(copy(E.Message, 29, 20))).DisplayLabel;

.......................................

end

else begin // Remote SQL Server error

ExtInfo := ExtractFieldLabels(DataSet, E.Message);

case EDBEngineError( E ).Errors[0].NativeError of

233, 515:

Alert('Ошибка', 'Hе все поля заполнены ! ' + ExtInfo);

547:

if (StrPos(PChar(E.Message), PChar('DELETE')) <> nil) then

Alert('Ошибка
пpи удалении', 'Имеются подчиненные записи, удаление (изменение) невозможно! ' + ExtInfo)

else if (StrPos(PChar(E.Message), PChar('INSERT')) <> nil) then

Alert('Ошибка пpи вставке', 'Отсутствует запись в МАСТЕР-таблице!' + ExtInfo)

else if (StrPos(PChar(E.Message), PChar('UPDATE')) <> nil) then

Alert('Ошибка пpи обновлении', 'Отсутствует запись в МАСТЕР-таблице! ' + ExtInfo);

2601:

Alert('Ошибка', 'Такая запись уже есть!');

else

Alert('Ошибка', 'Hеизвестная ошибка, код – ' + inttostr(EDBEngineError(E).Errors[0].NativeError) + ExtInfo);

end;

end;

 end;

end;

Этот код был заточен под MSSQL, но не нужно пытаться его использовать, а лучше по этому пpимеpу написать свою процедуру.

Как добиться верной работы фильтра на запросах и на неиндексированных таблицах?

Nomadic отвечает:

(Т.е. при работе программы наблюдалась следующая картина: в результате очередной фильтрации оставалось видно 4 записи из восьми. Добавляем букву к фильтру, остается, допустим, две. Убираем букву, которую только что добавили, в гриде все равно видно только две записи)

Эта проблема была в Delphi 3.0 только на TQuery, а в Delphi 3.01 появилась и в TTable.

Лечится так (простой пример):

procedure TMainForm.Edit1Change(Sender: TObject);

begin

 if length(Edit1.Text) > 0 then begin

Table1.Filtered := TRUE;

UpdateFilter(Table1);

 end

 else Table1.Filtered := FALSE;

end;

procedure TMainForm.UpdateFilter(DataSet: TDataSet);

var FR: TFilterRecordEvent;

begin

 with DataSet do begin

FR := OnFilterRecord;

if Assigned(FR) and Active then begin

DisableControls;

try

Поделиться с друзьями: