Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
ВнизПереименование полей на DBGrid & обработка ошибки Key Violation Найти похожие ветки
← →
Sergey_Suhoy (2002-11-27 10:44) [0]Вот утречком от нефиг делать решил спросить, может кто ответит... Сначала оформлю ситуацию: в общем все как обычно.
Алиас создается программно (что, кстати, очень удобно). На форме - DataSource, Table, DBGrid (плюс батоны и прочие
украшательства). Уверен, Мастера меня поймут и так, но для пущей наглядности не поленюсь набить кусок кода.
//=========CUT==============>
procedure TForm1.FormCreate(Sender: TObject);
var AppDir, Pathbase: string;
begin AppDir := ExtractFilePath(Application.ExeName);
Pathbase:= FileSearch("phonebase.DB", AppDir);
if Pathbase="" then begin
MessageDlg("Файл данных не найден. Создан новый.", mtInformation, [mbOk], 0);
Table1:=TTable.Create(nil);
with Table1 do
begin
DatabaseName:= AppDir; TableName:="phonebase.DB"; TableType:=ttParadox;
with FieldDefs do
begin
Add("Family", ftString, 20, false);
Add("Name", ftString, 15, false);
Add("Home phone", ftString, 7, false);
Add("Mobil phone", ftString, 11, false);
Add("Email", ftString, 20, false);
end;
with IndexDefs do //генерируем индексы
begin
Add("*", "Family",
[ixPrimary, ixUnique]);
end;
CreateTable;
if MessageDlg("Приложение необходимо перезапустить.", mtConfirmation, [mbYes,mbNo], 0) = mrYes then
begin if Table1.Active = True then
Table1.Close else
Form1.Close;
Application.Terminate;
end;
end;
end;
Table1.TableName:="phonebase.DB";
Table1.DatabaseName := AppDir;
Table1.Open;
end;
//=========CUT==============>
Но не в этом вся соль!
Вопрос первый: Borland Help напару с компилятором напугали меня досмерти, и после создания новой
таблицы с помощью компонента TTable, я вынужден заставлять юзера перезапускать приложение (от греха подальше). Нужно ли это делать? Можно ли это обойти? Если да, то как?
Вопрос второй: Поскольку имена полей в таблицах Paradox не должны включать русские символы, я, ессно давал им английские.
Если создавать алиас при помощи BDE и "жестко" (я это так называю) привязывать к нему таблицу и все такое, тогда
переименовывание полей на DBGrid возможно в режиме дизайна формы (Editing DBGrid.Columns, там Column[0], Title/Caption и т.д.).
При программном создании алиаса поля таблицы в режиме дизайна формы недоступны вообще. Как мне тогда названия полей на
DBGrid сделать русскими?
Вопрос третий: Как корректно обработать ошибку Key Violation возникающию при попытке дважды вставить запись?
Дайте хоть-какой нибудь примерчик...
Вопрос четвертый и заключительный: Может для каждого из этих вопросов надо было начать новую ветку :-))
P.S. Благодарю всех кому не было лень читать и отвечать на данный опус...
← →
ЮЮ (2002-11-27 11:02) [1]>Borland Help напару с компилятором напугали... Можно ли это обойти?
Компилятор не обойдешь :-)
>после создания новой таблицы с помощью компонента TTable, я вынужден заставлять юзера перезапускать приложение (от греха подальше). Нужно ли это делать?
А если самому попробовать не делать этого? По крайней мере открывать таблицу надо в приложении и при условии, что она существует.
>При программном создании алиаса поля таблицы в режиме дизайна формы недоступны вообще
Это у пользователя пусть программно создается, а у себя можешь сделать и постоянный, по крайней мере на период разработки
> как и все прочие: try ... except или в обработчиках событий, но это уже зависит от используемых компонентов.
← →
Johnny Smith (2002-11-27 11:06) [2]Отвечу на вопрос первый: раз сказали Борланды, значит, так оно и есть :)))).
На самом деле БДЕ, по-видимому, просто не может "перечитать" измененные свойства алиаса, поэтому и просит перезапустить приложение. Эта же просьба возникает, когда Вы изменяете свойства алиаса через BDE Administrator.
← →
Sergey_Suhoy (2002-11-27 11:17) [3]to ЮЮ
>Компилятор не обойдешь :-)
Вообще-то я не компилятор обходить хотел...
>А если самому попробовать не делать этого?
Пробовал. Приложение корректно запускается, но таблица остается не открытой :-( Понять толком не могу.
>Это у пользователя пусть программно создается...Пользователь - это я сам.
>как и все прочие: try ... except или в обработчиках событий...
Пример набивать таки лом :-(
← →
ЮЮ (2002-11-27 11:30) [4]>Это у пользователя пусть программно создается...Пользователь - это я сам.
Ну а себя - то зачем мучать. Я такую фичу, как динамически создаваемы алиас прикручивал к уже готовому проекту.
>Как корректно обработать ошибку Key Violation возникающию при попытке дважды вставить запись?
>Пример набивать таки лом :-(
Я не вставляю одну и ту же запись дважды и не представляю как это можно сделать :-)
Приложение корректно запускается, но таблица остается не открытой :-(
Table.Open, и при этом безо всякой ругани Table.Active = false?
Такого тоже не бывает :-)
← →
Sergey_Suhoy (2002-11-27 11:51) [5]to ЮЮ
>Ну а себя - то зачем мучать. Я такую фичу, как динамически
>создаваемы алиас прикручивал к уже готовому проекту.Допустим согласен... Но вопрос про DBGrid остается не решен...
>Я не вставляю одну и ту же запись дважды и не представляю как >это можно сделать :-) Цитирую учебник Тода Миллера (старший консультант отдела технической поддержки Borland corp.): "...применение метода Insert дважды подряд автоматически вызывает exception "Key Violation"". Жаль, в этом учебнике полностью отсутсвуют руководство по обработке исключительных ситуаций. Если б было я бы шас за пивом пошел :-(.
>Table.Open, и при этом безо всякой ругани Table.Active = false?
Ради эксперимента выкинь из кода (он вверху) ненужное и запусти на выполнение. Тогда посмотрим :-)
← →
ЮЮ (2002-11-28 04:26) [6]>Но вопрос про DBGrid остается не решен
А вопрос в чем? При заполненном в Design Table1.TableName и Table1.DatabaseName всё будет работать.
>применение метода Insert дважды подряд автоматически вызывает exception "Key Violation"".
procedure TForm1.Button1Click(Sender: TObject);
begin
Table1.Insert;
Table1.Insert;
end;
работает без исключений
Уникальный ключ по одному полю "Family" не позволит иметь однофамильцев. Добавь AUTOINCREMEN поле ID и ключ по полю "Family" сделай неуникальным и все проблемы пропадут
>Ради эксперимента выкинь из кода (он вверху) ненужное и запусти на выполнение. Тогда посмотрим :-)
Ради эксперимента выкинь из кода Table1:=TTable.Create(nil);
(ты создаешь новый экземпляр, а DataSource по-прежнему ссылается на первый) и всё получится без перезагрузки
← →
Victor_Cr (2002-11-28 09:19) [7]У TField есть свойство DisplayName: string;
Вот это ты изменить можешь? Если можешь, то эта строка и будет у тебя заголовком.
Table1.FieldByName("FIELD1").DisplayName := "Поле 1"
Ну попробуй. Удачи.
← →
ScareCrow (2002-11-28 10:19) [8]Обработка "Key violation" в обработчике событий
Попробуй так:
procedure TMyDataModule.MyTablePostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if Pos("Key violation.",E.Message)<>0
then
begin
ShowMessage("Дублирование информации!!!");
DataSet.Cancel;
end;
end;
Или TRY ... EXCEPT ...
← →
Виталий Панасенко (2002-11-28 13:23) [9]И кириллица в именах полей допустима (и пробелы тоже), только для редактора полей не очень удобна (он их называет не очень красиво)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.12.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c