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

 
Работа с блоками записей в Interbase, Работа с блоками записей в Interbase
Alex-San
Отправлено: 29.11.2003, 10:39


Ученик-кочегар

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



Добрый день!

У меня такой вопрос:
Есть мастер-таблица (справочник)

Есть детайл-таблица (рабочая)в которой все столбцы указаны как NOT NULL

Задача в том, чтобы создать для заполнения блок пустых записей, аналогичных по структуре детайл-таблице, в котором присутствуют поля справочника для заполнения и потом добавить их в детайл-таблицу, а не добавлять по одному как обычно
Мастер — таблица — марки автомобилей
Детайл- к-во и цвета

Блок примерно такой:
---------------------------
Модель !к-во! Цвет!
---------------------------
Ваз 2107 ! ! !
Ваз 2108 ! ! !
и т.д.

Подскажите как в Builder решить эту проблему?
Admin
Отправлено: 29.11.2003, 13:40


Владимир

Группа: Администратор
Сообщений: 1190



Ну структура таблиц понятна.
CODE

Marki
-------
ID   Marka
1   ВАЗ2107
2   ВАЗ2108
3   ВАЗ2109
...

MVar
------
ID   IDMarki MCount  MColor
1         1          120      Red
2         2            50      Blue
3         1            15      Green
4         3            62      Red
5         2            50      Yellow
6         2            28      Red


А вот это непонятно, можно яснее ? :
QUOTE

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


Alex-San
Отправлено: 29.11.2003, 15:19


Ученик-кочегар

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



Создать что-то типа курсора со структурой MVar, чтобы там все марки из справочника присутствовали...
А потом пользователь в DBGride заполняет поля с количеством и цветами....
Иначе придется добавлять каждую запись по отдельности, а это не есть хорошо..
И по кнопке сохранить все ненулевые (измененные) записи забрасываются в основную таблицу...

Не хочется создавать постоянные temp-таблицы. Может можно без них?
Nick
Отправлено: 30.11.2003, 09:08


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

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



Попробуй мое извращение.
DataSet — "Select m.id, m.Marka, v.MCount, v.MColor from marki m left join MVar v on m.id = v.IDMarki"

По событию onAfterPost вызывешь Процедуру на сервере
с параметром Марка, Количество, Цвет
Процедура должна сначала найти запись в детаил (MVar)
Если запись не найдена добавить иначе изменить.

В гриде запретить добавление и удаление. Marka — read only.

Процедуру написать ???
Alex-San
Отправлено: 03.12.2003, 10:50


Ученик-кочегар

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



Победил!
Сделел временную таблицу с той-же структурой кроме ID.
При открвтии формы таблица чистится и через tibquery добавляются пустые записи, в которых уже проставлены марки.
в dbGridEh запрещено удаление и добавление, кроме того запрещено редактирование некоторых столбцов (ключевых).в компоненте tibdataset, который отобрадает таблицу CashedUpdate-false. Присле изменения запись сразу падает в временную таблицу.
Далее при сохранении блока вызывается хранимая процедура, которая контролирует заполненность полей и перебрасывает данные из временной таблицы в постоянную.

Задача теперь: как обойтись без временной таблицы? Хоть она и не тянет, но такой способ будет применяться еще в нескольких случаях для других таблиц, что потащит засобой столько-же временных таблиц..

Давным-давно я писал на фоксе и там было такое понятие как cursor — временная таблица в памяти. Жалко, что в семействе INTERBASE такого нет... sad.gif

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