![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Кэшированные изменения [D6, IB6.x]
Jaxtor © (2003-04-21 12:26:00)У меня в цикле находится SelectSQL из IBDataSet с параметром. В приведенном
ниже варианте работает все нормально, за исключением того, что
в DBGrid выводится последнее значение из списка ProdList, что
неправильно. Как быть? Почему это происходит понятно, а как избежать этого неясно.
type
P_Id=^_Id;
_Id=integer;
TProdList = class(TList)
var
A_Id: P_Id;
i: integer;
ProdList: TProdList;
For i:=0 to ProdList.Count-1 do begin
A_Id:=ProdList.Items[i];
With qrInsert do begin
If Active then Close;
With SelectSQL do begin
Clear;
Add("select ProdId, PN, Product, WarantyId, UnitId, NDS from Products where ProdId="+IntToStr(A_Id^));
end;//With SelectSQL
With InsertSQL do begin
Clear;
Add("insert into SaveProd (ProdId, PN, Product, WarantyId, UnitId, NDS) select ProdId, PN, Product, WarantyId, UnitId, NDS from Products where ProdId="+IntToStr(A_Id^));
end;//With InsertSQL
With RefreshSQL do begin
Clear;
Add("select ProdId, PN, Product, WarantyId, UnitId, NDS from Products where ProdId="+IntToStr(A_Id^));
end;//With RefreshSQL
Open;
ApplyUpdates;
end;//With qrInsert
end;//For
В ProdList находится ID продукта.
Jaxtor (2003-04-21 17:32:00) [1]Я все сделал через кэшированные изменения.
Zacho (2003-04-21 16:14:00) [2]
> Jaxtor © (21.04.03 15:38)
Обойтись.
Я же писал - нужно дваTIBDataSet. Один - для выборки из одной таблицы, второй - для вставки в другую и отображения ее в гриде. И все будет гораздо проще и без извращений.
Jaxtor (2003-04-21 15:38:00) [3]Но все равно без кэшированных изменений не обойтись.
Jaxtor (2003-04-21 15:33:00) [4]Ладно, попробую через IBQuery.
Соловьев (2003-04-21 15:29:00) [5]IBQuery
и забудь тогда про IBDataSet
Jaxtor (2003-04-21 15:26:00) [6]Ничего не написано.
Соловьев (2003-04-21 15:06:00) [7]что в селект написано?
Jaxtor (2003-04-21 14:58:00) [8]
with IBdataSet do
begin
Insert;
FieldByName("ProdId").AsInteger := //из своего листа и заноси;
// остальные поля в гриде заполняй или едитах
Post;
end;
Вообще-то при этом у меня возникает ошибка, что IBDataSet это набор данных только для чтения, хотя CacheUpdates=true.
Zacho (2003-04-21 13:05:00) [9]
> Zacho © (21.04.03 12:55)
Еще дополню: в общем случае, как бы ты не делал, тебе понадобятся как минимум два IBDataSet (или IBDataSet и IBSQL)
Zacho (2003-04-21 12:55:00) [10]
> Jaxtor © (21.04.03 12:37)
Решить эту задачу можно по-разному, например так:
1.Формируешь строку с нужными ProdId, разделенными запятыми.
2. Берешь TIBSQL и пишешь запрос INSERT INTO SAVEPROD (bla-bla...) SELECT bla-bla,.. FROM PRODUCTS WHERE PRODID IN (твоя строка).
3. Запускаешь этот запрос.
4. Выбирашь то, что вставил, в IBDataSet, подключенном к нужному тебе DBGrid.
P.S. IMHO, неправильно спроектирована структура БД. Я, например, без очень веских оснований не стал бы делать таблицу SAVEPROD.
Jaxtor (2003-04-21 12:48:00) [11]похоже на правду
Соловьев (2003-04-21 12:46:00) [12]
with IBdataSet do
begin
Insert;
FieldByName("ProdId").AsInteger := //из своего листа и заноси;
// остальные поля в гриде заполняй или едитах
Post;
end;
Jaxtor (2003-04-21 12:37:00) [13]Задача такова. Нужно занести товары в таблицу SaveProd и отобразить их в DBGrid.
Запрос на вставку:
With InsertSQL do begin
Clear;
Add("insert into SaveProd (ProdId, PN, Product, WarantyId, UnitId, NDS) select ProdId, PN, Product, WarantyId, UnitId, NDS from Products where ProdId="+IntToStr(A_Id^));
end;//With InsertSQL
Запрос на просмотр:
With SelectSQL do begin
Clear;
Add("select ProdId, PN, Product, WarantyId, UnitId, NDS from Products where ProdId="+IntToStr(A_Id^));
end;//With SelectSQL
Zacho (2003-04-21 12:33:00) [14]1.Не совсем понятно, что ты все-таки хочешь получить.
2.Формировать запросы динамически в твое случае не надо, достаточно запроса с параметром, и присваивания этому параметру нужного значения.
Соловьев (2003-04-21 12:33:00) [15]что-то ты не понял как работать с этим компонентом...