Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.007 c
1-51782
lety
2002-12-04 22:12
2002.12.16
Курсор в мемо


14-51915
Anatoly Podgoretsky
2002-11-24 08:56
2002.12.16
Именинники 24 ноября


3-51574
Шурик Ш
2002-11-27 11:54
2002.12.16
Ввод дат в DBGrid


1-51722
vasilly
2002-12-06 11:13
2002.12.16
Как встроить форму из DLL в любой контрол, например TPanel????:(


14-51945
snoup
2002-11-23 21:49
2002.12.16
Помогите с шифрованием!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский