Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.16;
Скачать: CL | DM;

Вниз

Переименование полей на 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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.015 c
1-51834
BJValentine
2002-12-05 15:24
2002.12.16
Лёгкий вопрос


1-51819
kingdom
2002-12-04 17:38
2002.12.16
Как вызвать диалог добавления пользователей в группу?


6-51869
Georg
2002-10-22 10:54
2002.12.16
Люди!!! Помогите!!!


14-51906
Filat
2002-11-24 10:00
2002.12.16
Запись на CD-R, CD-RW


1-51808
kepten
2002-12-05 09:50
2002.12.16
Как неписать много if