Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Параметры в fibdataset... [Firebird 1.5]


malefik ©   (2005-02-25 12:33:00) 

Есть датасет....его запрос select выглядит как

SELECT
   TYPES,
   RESOURCES,
   POSITIONS,
   MAX_Q,
   MAX_P,
   MAX_T,
   CONSTANT
FROM
   "_MESTO_EDIT"
// это представление на сервере FB

Соответственно к нему подключен DBGrid который все это отображает..
соответственно запрос insert необходимо переделать...

INSERT INTO "_MESTO"(
   KOD_RES, KOD_POS, KOD_MAX_Q, KOD_MAX_P, KOD_MAX_T, KOD_TYPE, KOD_CONST
)
VALUES(
   :KOD_RES, :KOD_POS, :KOD_MAX_Q, :KOD_MAX_P, :KOD_MAX_T, :KOD_TYPE, :KOD_CONST
)

дальше делаю так....

_data_module->_position_pFIBTransaction->StartTransaction();
_data_module->_position_pFIBDataSet->Append();
_data_module->_mesto_pFIBDataSet->ParamByName("KOD_RES")->AsInteger = _mesto_data->kod_res; на этой строчке ругается на отсутствующий параметр
_data_module->_mesto_pFIBDataSet->Post();
_data_module->_mesto_pFIBTransaction->Commit();
_data_module->_mesto_pFIBDataSet->Open();

пробовал ...

int zzz = _data_module->_mesto_pFIBDataSet->ParamCount();

= 0

КАК С ПАРАМЕТРАМИ РАБОТАТЬ???? И ВОЗМОЖНО ЛИ ТО ЧТО Я ПОСТАРАЛСЯ ОБЬЯСНИТЬ???


DSKalugin   (2005-02-25 17:11:00) [1]

1
>AutoCommit
А кто/что будет подтвердать изменения если они делаются руками в гриде? Или вызывай явно Коммит на программном уровне или изменения ничем не подтвердятся.
2
>Дело в том что значение InsertSQL я задал на этапе проектирования (его я привел выше с соответствующими параметрами)...а вот до параметров я не могу добратся...при

А дело в том, что до них и не надо добираться. Они передаются автоматически и привязываются к ключевым полям. Есть мастер/визард этиз апросов, которые сами формируются. Читай доку к фибам. Вот мой пример

UPDATE TORBA
SET
   MANAGER_ID = :MANAGER_ID,
   SKLAD_COD = :SKLAD_COD,
   MAKER_NAME = :MAKER_NAME,
   OPIS = :OPIS,
   PRICE = :PRICE,
 .......
WHERE
   ID_TB = :OLD_ID_TB

Параметр OLD_ID_TB это старое значение ключевого поля ID_TB. Суффикс OLD_расценивается компонентами как предыдущеезначение
С вставкой еще проще. Там вообще параметров заполнять не надо.
Что видится в гриде то и вставляется.

INSERT INTO TORBA(
   MANAGER_ID,
   SKLAD_COD,
   MAKER_NAME,
  ...
)
VALUES(
   :MANAGER_ID,
   :SKLAD_COD,
   :MAKER_NAME,
...
)


Если есть скрытые поля, надо заполнять их в соответствующих обработчиках типа

procedure TdmRead.tbTorbaNewRecord(DataSet: TDataSet);
begin
 tbTorbaMANAGER_ID.AsInteger:=dbClient.dbClientID;
 tbTorbaTB_MODE.Value:='t';
end;


malefik   (2005-02-25 13:46:00) [2]

А насчет AutoCommit мне кажется ты немного не прав...


malefik   (2005-02-25 13:40:00) [3]

В датасете находится  "_MESTO_EDIT"
Просто я хотел использовать компонент для редактирования другий таблицы написав соответствющий запрос в INSERT SQL


malefik   (2005-02-25 13:13:00) [4]

to DSKalugin>> Я прекрасно понял это давно ...Представление у меня действительно сложное ...я вроде и не пытаюсь его обновлять ... ведь представление это "_MESTO_EDIT" а таблица "_MESTO"...

FROM
  "_MESTO_EDIT"

и

INSERT INTO "_MESTO"


Дело в том что значение InsertSQL я задал на этапе проектирования (его я привел выше с соответствующими параметрами)...а вот до параметров я не могу добратся...при

_data_module->_mesto_pFIBDataSet->ParamByName("KOD_RES")->AsInteger = _mesto_data->kod_res; на этой строчке ругается на отсутствующий параметр


Идет ругань на соответствующий параметр..
И Count параметров равен 0 ...почему я сам не пойму..


malefik   (2005-02-25 13:12:00) [5]

to DSKalugin>> Я прекрасно понял это давно ...Представление у меня действительно сложное ...я вроде и не пытаюсь его обновлять ... ведь представление это "_MESTO_EDIT" а таблица "_MESTO"...

FROM
  "_MESTO_EDIT"

и

INSERT INTO "_MESTO"


Дело в том что значение InsertSQL я задал на этапе проектирования (его я привел выше с соответствующими параметрами)...а вот до параметров я не могу добратся...при

_data_module->_mesto_pFIBDataSet->ParamByName("KOD_RES")->AsInteger = _mesto_data->kod_res; на этой строчке ругается на отсутствующий параметр


Идет ругань на соответствующий параметр..
И Count параметров равен 0 ...почему я сам не пойму..


Johnmen   (2005-02-25 13:11:00) [6]

>DSKalugin ©   (25.02.05 13:07) [3]
>для ручной правки в гриде надо установить свойство АвтоКоммит=Истина

Какая связь ?


DSKalugin   (2005-02-25 13:07:00) [7]

>int zzz = _data_module->_mesto_pFIBDataSet->ParamCount();

разберись что у тебя находиться в датасете _mesto_pFIBDataSet
ИНСЁТ или СЕЛЕКТ?
для выборки ясно дело ParamCount()=0
для программной правки лучше использовать отдельный от этого датасета запрос на компоненте TpFIBQuery
для ручной правки в гриде надо установить свойство АвтоКоммит=Истина и заполнить все SQL соответствующими запросами для правки, вставки и удаления


DSKalugin   (2005-02-25 12:57:00) [8]

1
не все представления могут быть обновляемыми. Т.к. они могут содержать несколько таблиц со сложными выборками и группировками.
Поэтому обновлять надо не представление, а исходную таблицу.
Глупо присваивать полю представления, которо получено как max(price) новое значение. Ты меня понимаешь?
2
Append(),Post() не нужны в данном случае если речь идет о явных транзакциях
делается этто так

 EngineDM.EngineIBT.StartTransaction;
 with EngineDM.VocabIBQ do begin
   Close;
   SQL.Clear;
   SQL.Add('insert into "Opt_Nacenki" ("id_optclient", "id_seller", "Nacenka")');
   SQL.Add('values (:"p_client", :"p_seller", :"kf")');
   ParamByName('"p_client"').AsInteger:=id_cl;
   ParamByName('"p_seller"').AsInteger:=id_Sel;
   ParamByName('"kf"').AsFloat:=Koeff;
   Prepare;
   ExecSQL;
 end;
 EngineDM.EngineIBT.Commit;
и перечитать результирующую таблицу


Johnmen   (2005-02-25 12:57:00) [9]

1. Делай INSERT/DELETE/UPDATE в твоём VIEW, а не в реальной тбл. При этом значения параметров, стандартно, берутся из текущей записи, и их не надо прописывать.
2. Этот VIEW будет обновляемым, и чтобы изменения в нём отображались в реальную тбл/тблы сделай соответствующие триггеры на VIEW.


Наверх

Титульная страница Поиск, карта сайта Написать письмо