Страница 1 из 1
Проблема редактирования и удаления записи
Добавлено: 19 фев 2008, 09:38
Дмитрий Б.
Здравствуйте.
Проблема заключается в следующем:
При нажатии кнопки вызывается форма редактирования выделенной записи
В обработчике события FormShow(TObject *Sender) производится чтение значений из базы данных и запись их в компоненты формы.
Код: Выделить всё
void __fastcall TFormEdit::FormShow(TObject *Sender)
{
int CurrItem;
AnsiString NoFurmText;
NoFurmText = FormMain->IBDataSet1->FieldByName("NO_FURM")->AsString;
DT_Input->Date = FormMain->IBDataSet1->FieldByName("DT_INPUT")->AsDateTime;
DT_Output->Date = FormMain->IBDataSet1->FieldByName("DT_OUTPUT")->AsDateTime;
MemPrich->Text = FormMain->IBDataSet1->FieldByName("PRICH_ZAMENI")->AsString;
MemNotes->Text = FormMain->IBDataSet1->FieldByName("NOTES")->AsString;
for(int i=0; i<CBNoFurm->Items->Count; i++)
if(CBNoFurm->Items->Strings[i] == NoFurmText)
CBNoFurm->ItemIndex = i;
}
НО. В компоненты заносится только значения первой записи, не зависимо от того какая запись выделена.
Подобная вещь происходит и при удалении записи - удаляется только первая запись, не зависимо от того какая запись виделена. И в добавок изменения после удаления записи становятся видемыми только после выполнения запроса "select * from Table".
Код: Выделить всё
void __fastcall TFormEdit::BDelete1Click(TObject *Sender)
{
FormMain->IBDataSet1->Delete();
FormMain->Transaction->CommitReference();
// FormMain->IBDataSet1->Post(); - Ругается
}
При нажатии кнопки применить - производится сохранение изменений
Код: Выделить всё
void __fastcall TFormEdit::BApplyClick(TObject *Sender)
{
if(CBNoFurm->Text != "")
{
FormMain->IBDataSet1->Edit();
FormMain->IBDataSet1->FieldByName("NO_FURM")->AsString = CBNoFurm->Text;
FormMain->IBDataSet1->FieldByName("DT_INPUT")->AsDateTime = DT_Input->Date;
FormMain->IBDataSet1->FieldByName("DT_OUTPUT")->AsDateTime = DT_Output->Date;
FormMain->IBDataSet1->FieldByName("PRICH_ZAMENI")->AsString = MemPrich->Text;
FormMain->IBDataSet1->FieldByName("NOTES")->AsString = MemNotes->Text;
FormMain->IBDataSet1->Post();
}
else
ShowMessage("Не задан номер фурмы");
}
Заголовочный файл
Код: Выделить всё
TDateTimePicker *DT_Input;
TDateTimePicker *DT_Output;
TMemo *MemPrich;
TMemo *MemNotes;
TComboBox *CBNoFurm;
В главной форме используются компоненты
Код: Выделить всё
TDBGrid *DBGrid1;
TDataSource *DSQuery;
TIBQuery *IBQuery1;
TIBDatabase *IBDatabase1;
TIBTransaction *IBTransaction1;
TIBDataSet *IBDataSet1;
Спасибо.
Re: Проблема редактирования и удаления записи
Добавлено: 19 фев 2008, 09:58
stix-s
Дмитрий Б. писал(а):Здравствуйте.
Проблема заключается в следующем:
При нажатии кнопки вызывается форма редактирования выделенной записи
В обработчике события FormShow(TObject *Sender) производится чтение значений из базы данных и запись их в компоненты формы.
НО. В компоненты заносится только значения первой записи, не зависимо от того какая запись выделена.
Подобная вещь происходит и при удалении записи - удаляется только первая запись, не зависимо от того какая запись виделена. И в добавок изменения после удаления записи становятся видемыми только после выполнения запроса "select * from Table".
Спасибо.
Я так понимаю, что выделяешь ты в одном датасете, а затем открываешь новый без передачи ПК записи и хочешь что бы второй датасет понял, какую ты запись выделил в первом

а после изменения обычно рефреш записи делают
да, а он вообще у тебя есть, ПК?
хотелось бы увидеть запрос UPDATE в твоем датасете
Re: Проблема редактирования и удаления записи
Добавлено: 19 фев 2008, 12:00
Дмитрий Б.
stix-s писал(а):
Я так понимаю, что выделяешь ты в одном датасете, а затем открываешь новый без передачи ПК записи и хочешь что бы второй датасет понял, какую ты запись выделил в первом

а после изменения обычно рефреш записи делают
да, а он вообще у тебя есть, ПК?
хотелось бы увидеть запрос UPDATE в твоем датасете
ПК у меня по NO_FURM и DT_INPUT
ДатаСет у меня один.
в UPDATE у меня следующее
Код: Выделить всё
update STOYKOST
set
NO_FURM = :NO_FURM,
DT_INPUT = :DT_INPUT,
DT_OUTPUT = :DT_OUTPUT,
STOYKOST = :STOYKOST,
PRICH_ZAMENI = :PRICH_ZAMENI,
NOTES = :NOTES
where
NO_FURM = :OLD_NO_FURM and
DT_INPUT = :OLD_DT_INPUT
Re: Проблема редактирования и удаления записи
Добавлено: 19 фев 2008, 12:43
stix-s
Дмитрий Б. писал(а):
ПК у меня по NO_FURM и DT_INPUT
ДатаСет у меня один.
в UPDATE у меня следующее
версию сервера и используемых компонентов, конечно не скажешь

первичный ключ с датой и
FieldByName("DT_INPUT")->AsDateTime
-что туда попадет в итоге - аллах ведает
датасет один, а вот набора данных я два вижу (если я правильно помню, что в IBX TIBQuery можно связать в визуальными компонентами)и что у тебя к чему привязано - понятия не имею
TIBQuery *IBQuery1;
TIBDataSet *IBDataSet1;
Добавлено: 19 фев 2008, 15:28
Дмитрий Б.
версию сервера - FireBird 1.0 бета (на работе), FireBird 1.5 (дома).
и используемых компонентов - стандартный набор в С++ Билдер 6
первичный ключ с датой и Цитата:
FieldByName("DT_INPUT")->AsDateTime
Все нормально работает.
-что туда попадет в итоге - аллах ведает
Попадает туда дата причем все корректно получается.
датасет один, а вот набора данных я два вижу (если я правильно помню, что в IBX TIBQuery можно связать в визуальными компонентами)и что у тебя к чему привязано - понятия не имею
Объясни, где ты увидел два набора данных, а то мне не понятно.
По поводу привязки:
Код: Выделить всё
IBDatabas->IBTransaction->IBDataSet->DataSource->IBQuery;
DBGrid->DataSource;
Добавлено: 19 фев 2008, 20:12
kdv
FireBird 1.0 бета (на работе)
это как, простите???
стандартный набор в С++ Билдер 6
т.е. предупреждения сайта игнорируем?
www.ibase.ru/components.htm
Все нормально работает.
ну-ну.
По поводу привязки:
это ересь какая-то.
Добавлено: 20 фев 2008, 07:00
stix-s
Дмитрий Б. писал(а):
Объясни, где ты увидел два набора данных, а то мне не понятно.
По поводу привязки:
Код: Выделить всё
IBDatabas->IBTransaction-> DataSource-> ;
DBGrid->DataSource;
на пальцах:
первый набор данных - IBQuery
второй набор данных - IBDataSet
если грид привязан к квери, а редактировать пытаешься в датасете, то редактировать ты будешь завсегда одну и ту же запись

либо первую, либо последнюю (от компонентов зависит)
про версии сервера и компонентов тебе уже все
kdv сказал, добавлю лишь, что ИМХО использование в качестве ПК строки+дата - тихий ужос
Добавлено: 20 фев 2008, 10:07
Дмитрий Б.
Я извеняюсь, но я непонял почему замечание?
Может быть надо было указать так: IBSERVER60, v1.0.0.338?
2 KDV А почему ересть по поводу привязки?
Код: Выделить всё
object DSQuery: TDataSource
DataSet = IBQuery1
...
end
object IBQuery1: TIBQuery
Database = IBDatabase1
Transaction = IBTransaction1
...
end
object IBDatabase1: TIBDatabase
...
DefaultTransaction = IBTransaction1
...
end
object IBTransaction1: TIBTransaction
...
DefaultDatabase = IBDatabase1
...
end
object IBDataSet1: TIBDataSet
Database = IBDatabase1
Transaction = IBTransaction1
...
DataSource = DSQuery
...
end
object DBGrid1: TDBGrid
...
DataSource = DSQuery
...
end
2 stix-s
1) Скажи пожалуйста, почему использование составного ПК из строки и даты - тихий ужас?
2) Попробовал убрать Квери, но теперь я в тупике - не могу дошурупать как сделать, чтобы данные отображались в Гриде? И как теперь делать выборку. В Квери я делал так SQL->Add("select * from ..."), а в Датасете куда, в Параметры заносить скрипт?
Добавлено: 20 фев 2008, 10:11
kdv
www.ibase.ru/devinfo/ibx.htm
насчет ужаса, посмотри что ты в том написал. якобы у тебя связаны
ibdataset -> DataSource ->IBQuery
IBSERVER60, v1.0.0.338?
замечательно. Это действительно кривая бета Firebird 1.0. Как вообще можно использовать бету на работе? Тем более такую древнюю, и с известным серьезным багом?
ты тут, среди нормальных версий, эту версию видишь?
www.ibase.ru/devinfo/allversions.htm
Добавлено: 20 фев 2008, 12:08
stix-s
Дмитрий Б. писал(а):
2 stix-s
1) Скажи пожалуйста, почему использование составного ПК из строки и даты - тихий ужас?
2) Попробовал убрать Квери, но теперь я в тупике - не могу дошурупать как сделать, чтобы данные отображались в Гриде? И как теперь делать выборку. В Квери я делал так SQL->Add("select * from ..."), а в Датасете куда, в Параметры заносить скрипт?
1)А ты подумай хоть о том, что в строках бывают буковки большие и маленькие, пробелы лидирущие-замыкающие никто не запрещает вводить - что для человека одно, для компа - разное
2)Мастер-деталь, значиццо построил на одной таблице

читай ссылку, что
kdv дал по IBX
квери выкинуть

грид привязать к датасету, выставить гриду ReadOnly (раз в другой форме заполняешь)

Добавлено: 20 фев 2008, 13:49
Дмитрий Б.
stix-s писал(а):
1)А ты подумай хоть о том, что в строках бывают буковки большие и маленькие, пробелы лидирущие-замыкающие никто не запрещает вводить - что для человека одно, для компа - разное
2)Мастер-деталь, значиццо построил на одной таблице

читай ссылку, что
kdv дал по IBX
квери выкинуть

грид привязать к датасету, выставить гриду ReadOnly (раз в другой форме заполняешь)

1) Ну вопервых в этих строках могут быть значения только такого типа (1/1, 1/2, 1/3, 2/1, 2/3 ...) и тем более они их редактировани запрещено пользователю - пользователь производит только их выбор из комбобокса.
2)Никакого мастер-деталь не построено, просто я через Квери производил добавление, редактирование и удаление записей посредством языка SQL. А теперь решил разобраться, как это все можно делать через датасет и наткнулся на камень приткновения (тот самый квери), как выяснилось из оветов беседы с вами.
В итоге все получилось, когда злосный квери был удален и переназначены связи
2 KDV По поводу следующего замечания:
Это действительно кривая бета Firebird 1.0. Как вообще можно использовать бету на работе? Тем более такую древнюю, и с известным серьезным багом?
На работе стоит такая древняя версия потому-что установлена программа (БД) по учету произведенной продукции которую я заполняю, разработчиком которой я не являюсь, т.к. у нас для этого есть отдельный отдел.
Программер, который эту прогу налабал и осуществляет поддержку (ну типа если надо исправить баг или букву на форме или поменять местами Эдиты) мотивирует использование такой антикварной версии базы тем, что он знает все ее баги и поэтому ею пользуется.
Я вообще по своей натуре стараюсь внедрять свежий софт (конечно если "Fe" позволяет).
Хочу задать надеюсь последний вопрос в этом топике.
Выборку данных можно также осуществлять посредством SQL?, но как тогда выполнять запросы?
Большое спасибо.
Добавлено: 20 фев 2008, 15:22
stix-s
Дмитрий Б. писал(а):
1) Ну вопервых в этих строках могут быть значения только такого типа (1/1, 1/2, 1/3, 2/1, 2/3 ...) и тем более они их редактировани запрещено пользователю - пользователь производит только их выбор из комбобокса.
Вольному-воля, не мне баги разгребать
Дмитрий Б. писал(а):
просто я через Квери производил добавление, редактирование и удаление записей посредством языка SQL.
Мдя, стоило почитать сначала хелп для чего вообще предназначен IBQuery и IBUpdateSQL (статью похоже читать не стал

)
Дмитрий Б. писал(а):
Хочу задать надеюсь последний вопрос в этом топике.
Выборку данных можно также осуществлять посредством SQL?, но как тогда выполнять запросы?
Большое спасибо.
вопрос не понят, чем это выборка отличается от запроса?
select - эт выборка и есть

Добавлено: 20 фев 2008, 17:04
WildSery
Дмитрий Б. писал(а):он знает все ее баги и поэтому ею пользуется.
То есть релизноты по найденным багам он всё-таки читал?

))
Добавлено: 20 фев 2008, 17:07
Дмитрий Б.
stix-s писал(а):
Мдя, стоило почитать сначала хелп для чего вообще предназначен IBQuery и IBUpdateSQL (статью похоже читать не стал

)
Хелп читал, а то как бы я сделал клиента с возможностью добавления, редактирования, удаления и выборки данных посредством языка SQL.
вопрос не понят, чем это выборка отличается от запроса?
select - эт выборка и есть
Виноват, некорректно задал вопрос.
Например у меня есть текст запроса:
Код: Выделить всё
"SELECT * FROM mytable WHERE (field_1='qwerty' AND field_2='123')"
Куда мне его вставлять в IBDataSet1->SelectSQL->Add()?
Добавлено: 20 фев 2008, 23:46
kdv
мотивирует использование такой антикварной версии базы тем, что он знает все ее баги и поэтому ею пользуется.
брешет, не стесняясь. знал бы про баг с метаданными, мигом бы обновил хотя бы до релиза. Я же не говорю, что надо бегом все на FB 2 переделывать.
К слову, если мне память не изменяет, то этот билд лежал у меня на сайте потому, что я сам научился бету FB компилировать. А так его в публичном доступе явно не было. Когда нашелся в нем серьезный баг, я этот билд удалил, разумеется.
http://www.ibase.ru/ibo/n7.htm
а в
http://www.ibase.ru/ibo/n8.htm
уже написано:
за год релиз Firebird так и не был выпущен. Причем именно за год, т.к. Firebird 0.9.4 вышел 27 декабря 2000 года. Тем не менее, исправлено около 85 разных ошибок. Некоторые ошибки были несущественными, вроде неверного поведения ISQL, другие - фатальными для работы с БД. Часть исправленных - концептуальные, например срабатывание check constraints после триггеров (исправлено и в IB 6.5).
Добавлено: 21 фев 2008, 07:36
stix-s
Дмитрий Б. писал(а):
Хелп читал, а то как бы я сделал клиента с возможностью добавления, редактирования, удаления и выборки данных посредством языка SQL.
да нифига ты не читал
Description
Use TIBQuery to access one or more tables in a database using SQL statements.
The TIBQuery component provides a read-only dataset, and adapts well to the InterBase client/server environment.
To update the result set that TIBQuery represents, use this component in conjunction with a TIBUpdateSQL component.
Дмитрий Б. писал(а):
Виноват, некорректно задал вопрос.
Например у меня есть текст запроса:
Код: Выделить всё
"SELECT * FROM mytable WHERE (field_1='qwerty' AND field_2='123')"
Куда мне его вставлять в IBDataSet1->SelectSQL->Add()?
Да хоть в IBDataSet1->SelectSQL->Text
только параметры вообще-то надо использовать
ну прочитай ты хелп по использованию компонентов, статью, что
kdv
дал, там ведь все расписано