Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Shurentij
Зарегистрирован: 27.09.2005 Сообщения: 19
|
Добавлено: Ср Окт 26 2005 14:29 Заголовок сообщения: Работа с БД |
|
|
Builder C++ 6
Имеется компонент DBGrid в которов выводится данные из базы №1.
Хотелось бы сделать следующее:
При выделении одной из строчек по нажатию клавиши (обработку нажатия клавиш пояснять не надо) эта строка копируется в другую базу №2 (структура ее та же).
Базы DBF.
И еще пару вопросов - как сделать чтобы при нажатии правой кнопки мыщи по выделенной строке выпадало контекстное меню.
Каким образом обрабатывать несколько выделенных строк (т.е. параметр MultiSelekt у DBGrid =true, и можно выделить несколько строк удерживая CTRL.) |
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Ср Окт 26 2005 15:10 Заголовок сообщения: Re: Работа с БД |
|
|
Shurentij писал(а): | Builder C++ 6
Имеется компонент DBGrid в которов выводится данные из базы №1.
Хотелось бы сделать следующее:
При выделении одной из строчек по нажатию клавиши (обработку нажатия клавиш пояснять не надо) эта строка копируется в другую базу №2 (структура ее та же).
Базы DBF. |
Код: |
Table2->Append();
Table2->FieldByNams("Field1")->Value = Table1->FieldByName("Field1")->Value;
Table2->FieldByNams("Field2")->Value = Table1->FieldByName("Field2")->Value;
....
Table2->Post();
|
примерно так |
|
Вернуться к началу |
|
|
Shurentij
Зарегистрирован: 27.09.2005 Сообщения: 19
|
Добавлено: Сб Окт 29 2005 09:30 Заголовок сообщения: |
|
|
А как же все-таки обрабатывать строки если их выделено несколько?
Хотелось бы увидеть кусочек кода.
Спасибо |
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Сб Окт 29 2005 14:07 Заголовок сообщения: |
|
|
Shurentij писал(а): | А как же все-таки обрабатывать строки если их выделено несколько?
Хотелось бы увидеть кусочек кода. |
есть ADOTable1 - DataSoure1 - DBGrid1 , Memo1
Код: | TBookmark Bookmark = ADOTable1->GetBookmark();
ADOTable1->DisableControls();
for( int i = 0; i < DBGrid1->SelectedRows->Count ; i ++ )
{
DBGrid1->DataSource->DataSet->Bookmark
= DBGrid1->SelectedRows->Items[i];
// или так
// ADOTable1->Bookmark=DBGrid1->SelectedRows->Items[i];
Memo1->Lines->Append(
ADOTable1->FieldByName("Men_ID")->AsString+"\t"+
ADOTable1->FieldByName("Men_name")->AsString
);
};
ADOTable1->GotoBookmark(Bookmark);
ADOTable1->EnableControls();
ADOTable1->FreeBookmark(Bookmark);
; |
_________________ С уважением Dimasm |
|
Вернуться к началу |
|
|
Shurentij
Зарегистрирован: 27.09.2005 Сообщения: 19
|
Добавлено: Вс Окт 30 2005 17:13 Заголовок сообщения: |
|
|
Зачем такой сложный код - имеется в виду зачем использовать ADO (я не знаю что это такое).
Переписал код так и он работает.
Код: |
for( int i = 0; i < DBGrid1->SelectedRows->Count ; i ++ )
{
DBGrid1->DataSource->DataSet->Bookmark
= DBGrid1->SelectedRows->Items[i];
Memo1->Lines->Append(
DBGrid1->DataSource->DataSet->
FieldByName("Men_ID")->AsString+"\t"+
DBGrid1->DataSource->DataSet->
FieldByName("Men_name")->AsString);
}
|
На мой взгляд так понятнее.
И еще небольшая пачка вопросов. Зачем использовать метод Table->Post(). И без него вроде все работает, а с ним у меня компилятор ругается. База DBF.
Как програмно полностью отчистить БД. Есть ли какиенибудь функции или надо использовать цикл и Delete().
Почему когда мы удаляем из БД строки, то размер файла БД не изменяется. |
|
Вернуться к началу |
|
|
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Вс Окт 30 2005 17:40 Заголовок сообщения: |
|
|
Shurentij писал(а): | Зачем такой сложный код - имеется в виду зачем использовать ADO (я не знаю что это такое).. |
Сложный код, во превых для того, чтобы курсор в DBGrid остался там же где и был до выполнения кода
Код: | TBookmark Bookmark = ADOTable1->GetBookmark();
ADOTable1->DisableControls();
...
ADOTable1->GotoBookmark(Bookmark);
ADOTable1->EnableControls();
ADOTable1->FreeBookmark(Bookmark); |
ADOTable это примерно тоже что и Tabe, в том смысле, что работа с ними почти не отличается
Просто мне BDE кажется таким неудобным и корявым. Этот BDE ещё и с собой (программой) тягать надо, фу
С базками Access на мой взгляд работать проще, по этому я использую ADO и OLE.Jet или ODBC провайдеры.
Shurentij писал(а): |
И еще небольшая пачка вопросов. Зачем использовать метод Table->Post(). И без него вроде все работает, а с ним у меня компилятор ругается. База DBF.
|
->Edit() - переводит базу в режим изменения записи
->Append() - режим добавления новой записи
->Insert() - вставка записи
а потом в конце
->Post() - подтверждает изменение(добавление, вставку)
по поводу ошибки
Shurentij писал(а): | Как програмно полностью отчистить БД. Есть ли какиенибудь функции или надо использовать цикл и Delete(). |
Ты вообще с SQL знаком? если работаешь с БД настоятельно советую его изучить. SQL ГАРАЗДО ВАЖНЕЕ чем всякие Table и Post
С ADO компанентами я делаю так
Код: |
ADOCommand1->CommandText = "DELETE * FROM MyDataBase";
ADOCommand1->Excute();
|
само собой ADOCommand должен быть подключён к БД
с BDE компанентами не пробовал
Shurentij писал(а): |
Почему когда мы удаляем из БД строки, то размер файла БД не изменяется. |
Ой, файл базы данных такая сложная штука, в общем провайдеру данных (в твоём случае BDE) лучше знать какой должен быть размер. Не заморачивайся по этому поводу.
У меня одна базка Access после года работы выросла до 12 метров и стала тормозить.
Операция "сжать и восстановить" сжала базу до 4-х метров, и тормоза пропали. Думаю подобное есть и для dbf _________________ С уважением Dimasm |
|
Вернуться к началу |
|
|
|