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

 
Компонент "IBDataSet" в С++ Builder, подскажите как действовать. Ужесхожусума
anatoliys
Отправлено: 16.12.2003, 16:01


Не зарегистрирован







ЗАПИСЬ НЕ ФИКСИРУЕТСЯ В БД. Что делать не пойму никак, уже 3й день. Помогите.

Может у кого есть исходники для примера. reut@land.ru

В связке:
- IBDatabase1 (направленный на БД)
- IBTransaction1 (направленный на IBDatabase1)
- IBDataSet1 (направленный на IBDatabase1)
- DataSource1(направленный на IBDataSet1)

В компопнете IBDataSet1
- в параметре "Модифи" написано: update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where EDOCNAME = "nname" and PATHDOC = "npat"
- в параметре Select: select * from DOCUMENTS

В программе на кнопке:
AnsiString nname = ExtractFileName(FMain->OpenDialog->FileName);
AnsiString npat = FMain->OpenDialog->FileName;

if (DataModule1->IBDataSet1->State == dsBrowse ) {

DataModule1->IBDataSet1->Edit();

DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = npat;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != nname)
DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = nname;

DataModule1->IBDataSet1->Post();
DataModule1->IBTransaction1->Commit();



Nick
Отправлено: 16.12.2003, 16:48


Машинист паровоза

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




if(FMain->OpenDialog->Execute()) {
// вот сдесь ты не понял
// если состояние не dsBrowse -просмотр
if (DataModule1->IBDataSet1->State == dsBrowse ) DataModule1->IBDataSet1->Edit(); // переводим в состояние Edit


DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = FMain->OpenDialog->FileName;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != ExtractFileName(FMain->OpenDialog->FileName))
DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = ExtractFileName(FMain->OpenDialog->FileName);
DataModule1->IBDataSet1->Post();
// убрать DataModule1->IBTransaction1->CommitRetaining();

}
Guest
Отправлено: 16.12.2003, 17:18


Не зарегистрирован







Так у меня и стоит так. Когда жмен на кнопку:
if (DataModule1->IBDataSet1->State == dsBrowse ) {
DataModule1->IBDataSet1->Edit();
DataModule1->IBDataSet1->FieldByName("PATHDOC")->AsString = npat;
if(DataModule1->IBDataSet1->FieldValues["EDOCNAME"] != nname)
DataModule1->IBDataSet1->FieldByName("EDOCNAME")->AsString = nname;
DataModule1->IBDataSet1->Post();

Если "IBDataSet1" в статусе просмотра, то перевести в режим редактирования, и полям присвоить значение из переменных, затем сохранить все. Или я не правильно мыслю????

Меня смущает:
В компопнете IBDataSet1
- в параметре "Модифи" написано: update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where EDOCNAME = "nname" and PATHDOC = "npat"
Правильно ли это написано? ( Кавычки пробывал и (') так и так ("))
Или я не указал чтот в настройках компонента IBDataSet1 или IBTransaction1.

Транзакцию не завершу, мне кажется тут проблема у меня.
Открывается она автоматически насколько я понял, когда при открытии формы выполняется код "DataModule1->IBDataSet1->Active = true;" . Пробывал стартовать ее сам, ругается что уже открыта.



Nick
Отправлено: 16.12.2003, 18:24


Машинист паровоза

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




update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where EDOCNAME = "nname" and PATHDOC = "npat"

Изменяется запись у которой конкретно
EDOCNAME = "nname" and PATHDOC = "npat"

если изменить на
EDOCNAME = :nname and PATHDOC = :npat
нужно будет присваивать параметрам запроса перед Post


у тебя что нет ключевого поля.

Пойду посмотрю на начало твоих мучений вроде ты приводил структуры таблиц и запросы.

Перед компиляцией лучше делать Connected = false у компонента IBDataBase.
При открытии приложения Connected = true // подключение базы

if ( ! Transaction->Active ) Transaction->StartTransaction();




Nick
Отправлено: 16.12.2003, 18:36


Машинист паровоза

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



Посмотрел
Если Update запрос
update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where EDOCNAME = "'+nname+'" and PATHDOC = '"+npat+"'
ты заполнил при проектировании
то изменяются записи с
"+nname+" — EDOCNAME
"+npat+" — PATHDOC
записей таких естественно нет.

Советую сделать ключевое поле, хотябы из-за того что если мы совместными усилиями что нибудь добьемся при наличии нескольких записей с полями EDOCNAME и PATHDOC равными текущей записи Запрос изменит все эти записи.

Начнем.
Добавляем в таблицу Docs_Id Integer.
Создаем генератор Gen_Docs_ID
В DataSet указываем этот генератор.

Update Select =
update DOCUMENTS set EDOCNAME =:EDOCNAME, PATHDOC =:PATHDOC where Docs_ID = :Docs_ID

Не получится пришли проект Soltami@yandex.ru






Вернуться в Работа с базами данных в C++Builder