C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < 1 [2] >
Ключевое поле, дублирование
Admin
Отправлено: 23.10.2006, 14:28


Владимир

Группа: Администратор
Сообщений: 1190



А где DataSet->Cancel();
по идее должно быть перед Abort();
Лена
Отправлено: 23.10.2006, 14:38


Мастер участка

Группа: Участник
Сообщений: 501



Что-то на сервер форума зайти сегодня трудновато. ohmy.gif

ShowMessage появляется для всех полей в гриде если туда вводить дублированные записи. Мне хочется ограничить проверку на дублирование только для первой колонки грида, а в остальные колокни грида пусть пользователь вводит что хочет.

Отредактировано Лена — 23.10.2006, 15:42
Лена
Отправлено: 23.10.2006, 15:23


Мастер участка

Группа: Участник
Сообщений: 501



Вроде нашла, что надо. Свойство SelectedIndex:
CODE

ADOQueryKey->Open();
 Variant Rez = ADOQueryKey->Lookup("code", Form1->DBGrid1->Fields[0]->AsString, "code");
  if(!Rez.IsNull() && Form1->DBGrid1->SelectedIndex == 0)
            {
            ShowMessage("Дублирование запрещено");
            DataSet->Cancel();
            Abort();
            }
  ADOQueryKey->Close();


И еще придумала:
CODE

AnsiString Params = DataModule2->ClientDataSetKey->FieldByName("code")->AsString;
  TADOQuery * ADOQuery1 = new TADOQuery(this);
  ADOQuery1->Connection = DataModule2->ADOConnection1;
  ADOQuery1->Close();
  ADOQuery1->SQL->Text = "select * from keys where code ='" + Params + "'";
  ADOQuery1->Open();
  ADOQuery1->First();
  AnsiString Found;
         for (int i = 0; i<ADOQuery1->RecordCount; i ++)
         {
          Found = ADOQuery1->FieldByName("code")->AsString;
                if (Found == Params && Form1->DBGrid1->SelectedIndex == 0)
                {
                  ShowMessage("Дублирование запрещено");
                  DataSet->Cancel();
                  ADOQuery1->Close();
                  delete ADOQuery1;
                  Abort();
                }
          ADOQuery1->Next();
         }
  ADOQuery1->Close();
  delete ADOQuery1;


Первый вариант вроде лучше?

Отредактировано Лена — 23.10.2006, 17:05
Admin
Отправлено: 23.10.2006, 16:57


Владимир

Группа: Администратор
Сообщений: 1190



Какой лучше сами решайте.

В первом тогда уж тоже вставить
ADOQueryKey->Close(); перед Abort();

Во втором:
А зачем цикл по i если возвращаемое значение только одно ?
и тогда ADOQuery1->First(); тоже лишнее и ADOQuery1->Close();
сразу после создания
И зачем Select * если нужно только одно поле code ?
beginner
Отправлено: 23.10.2006, 19:43


Дежурный стрелочник

Группа: Участник
Сообщений: 44



QUOTE (Лена @ 23.10.2006, 16:23)
Вроде нашла, что надо. Свойство SelectedIndex:
CODE

ADOQueryKey->Open();
Variant Rez = ADOQueryKey->Lookup("code", Form1->DBGrid1->Fields[0]->AsString, "code");
if(!Rez.IsNull() && Form1->DBGrid1->SelectedIndex == 0)
{
ShowMessage("Дублирование запрещено");
DataSet->Cancel();
Abort();
}
ADOQueryKey->Close();

Если нет записей, то скорей всего
Rez.IsEmpty() == true;
Rez.IsNull() == false.

Отредактировано beginner — 23.10.2006, 20:43
Лена
Отправлено: 24.10.2006, 09:47


Мастер участка

Группа: Участник
Сообщений: 501



Спасибо за замечания. smile.gif
Буду вносить изменения.
beginner
Отправлено: 24.10.2006, 11:58


Дежурный стрелочник

Группа: Участник
Сообщений: 44



Может имеет смысл перенести Lookup в событие OnValidate поля code?
nawok78
Отправлено: 12.02.2007, 10:36


Станционный диспетчер

Группа: Участник
Сообщений: 115



Тоже столкнулся с проблеммой первичного ключа в криво спроектированной БД.
ухудшает ситуацию еще и то, что пока точно не знаю ск-ко программ работает с конкретной таблицей.
несколько программ, каждую ведет отдельный человек....
а то бы перекроил часть...
слов нет — одни эмоциии....

но собственно ближе к вопросу -
Есть ADOQuery к одной таблице.
вызываю метод Insert
но в AfterInsert не указываю ключевое поле (NotNull) — ну и естественно ругань и т.д.

неужто придется писать запрос к БД и вставлять туда какое-то значение? (да еще уникальное).
компоненты ADO... как-то корректно работают с Автоинкрементом?
nawok78
Отправлено: 12.02.2007, 10:49


Станционный диспетчер

Группа: Участник
Сообщений: 115



вроде гемор прошел — откорректировал таблицу — поставил indentify=true для ключевого поля...
как задолбала такая БД! кто ее так проектировал?....

да там нередкость когда Id — строчка smile.gif а потом по ней еще и ссылаются. ладно хоть не редактируют... ой блин.. да еще седня понедельник....
стр.: (2) < 1 [2] >
Вернуться в Работа с базами данных в C++Builder