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

 
Удаление записи с помощью FIB Plus
telepath
Отправлено: 07.02.2005, 16:57


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

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



Как правильно удалять записи с помощью FIB Plus?
Пытаюсь вот так, но полагаю это неправильно:
tRec это датасет, tTrasact это транзакция

CODE
tTransact->StartTransaction();
               org_year_typ_per* oytp = (org_year_typ_per *)tnode->Data;
               tRec->Close();
               tRec->SQLs->SelectSQL->Clear();
               tRec->SQLs->SelectSQL->Add("DELETE FROM REC WHERE");
               tRec->SQLs->SelectSQL->Add("ORG_ID=" + IntToStr(oytp->id_org));
               tRec->SQLs->SelectSQL->Add("AND YEARS_NUM=" + IntToStr(oytp->year));
               tRec->SQLs->SelectSQL->Add("AND PER_ID=" + IntToStr(oytp->per));
               tRec->SQLs->SelectSQL->Add("AND TYP_ID=" + IntToStr(oytp->type));
               tRec->Open();
               tTransact->Commit();
olegenty
Отправлено: 07.02.2005, 17:03


Ветеран

Группа: Модератор
Сообщений: 2412



а чем тебе не подходят параметрические запросы???
telepath
Отправлено: 07.02.2005, 17:10


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

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



Тот код, что я привел, как-то криво работает (или я что-то наломал).
Вобщем обращение к таблице идет через treeview, в ветках которого хранятся sql-запросы. При удалении записи и повторном нажатии на удаленный узел, показывает что есть там пустая запись, в от после второго нажатия — запись исчезает. Как будто Commit запаздывает.
olegenty
Отправлено: 08.02.2005, 11:08


Ветеран

Группа: Модератор
Сообщений: 2412



да, и я не обратил внимания — не Open, а ExecQuery надо использовать для инструкций, не возвращающих наборов данных.
telepath
Отправлено: 08.02.2005, 14:22


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

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



А сам запрос в SelectSQL писать или где?
olegenty
Отправлено: 08.02.2005, 14:50


Ветеран

Группа: Модератор
Сообщений: 2412



TpFIBQuery::SQL

всё, что не возвращает наборов данных должно делаться в TpFIBQuery
telepath
Отправлено: 08.02.2005, 15:00


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

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



Спасибо, есть проблема: после удаления (как я описывал выше), попытка внести записи оканчивается сообщением о невозможности записи в закрытый tRes. это по той же причине?
telepath
Отправлено: 08.02.2005, 16:23


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

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



Все, разобрался, еще раз спасибо! smile.gif
olegenty
Отправлено: 08.02.2005, 16:51


Ветеран

Группа: Модератор
Сообщений: 2412



это тебе не ADO + MSSQL, IB/FB не поддерживают скриптов с клиента.
telepath
Отправлено: 08.02.2005, 17:10


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

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



Сорри, еще раз с Query возникла проблема — вот запрос:
CODE
tQuery->SQL->Add("INSERT INTO RES (REC_ID, CODE_ID, SUMW, SUMB,SUMYW, SUMYB)");
tQuery->SQL->Add("VALUES (" + IntToStr(idr)+ "," + IntToStr(c_id) + "," + FloatToStr(sw) + "," + FloatToStr(sb) + "," + FloatToStr(syw) + "," + FloatToStr(syb) + ")");


но он не выполняется, потому что FloatToStr делает из флоат строку с запятыми... в результате Query воспринимает дробную часть как еще одно значение. Помогите, как это обойти?

Отредактировано telepath — 08/02/2005, 18:13
olegenty
Отправлено: 09.02.2005, 07:46


Ветеран

Группа: Модератор
Сообщений: 2412



a) Разобраться с региональными настройками/языковыми параметрами
б) Как и было предложено ранее — снизойти до параметрических запросов.
поясню.
допустим, есть запрос
SQL
SELECT * FROM SOME_TABLE WHERE SOME_DATE_FIELD = :DATE

здесь :DATE — это параметр
обращаться к нему так:
CODE

pFIBQuery->ParamByName("DATE")->AsDateTime = Now();

плюсы: запрос, попмипо прочего будет подготавливаться только 1 раз (prepare), в то время как при перезаписи SQL он подготавливается ежеразно.
AVC
Отправлено: 09.02.2005, 09:42


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

потому что FloatToStr делает из флоат строку с запятыми... в результате Query воспринимает дробную часть как еще одно значение


Включаете в Main следующий код
CODE

Application->UpdateFormatSettings = false;
DecimalSeparator = '.';
ListSeparator = ',';
DateSeparator = '.';
ShortDateFormat = "dd.mm.yyyy";

и после этого приложение "плевать хотело" на языковые настройки винды
(эти настройки должны соответствовать настройкам сервера БД)
olegenty
Отправлено: 11.02.2005, 10:25


Ветеран

Группа: Модератор
Сообщений: 2412



опа! а вот этой фичи-то я и не знал. век живи, век учись!
AVC
Отправлено: 11.02.2005, 11:47


Ветеран

Группа: Модератор
Сообщений: 1583



Ну тогда еще одна.
Замена раскладкам клавиатуры так, что бы они в русском режиме на доколнительной клавиатуре при нажатии точки печатали именно точку а не запятую.
kbdru.kbd для 98 (кажется и на 95, но давно дело было)
kbdru.dll для 2k


User Attached Image Скачать файл
kbdru.rar



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