![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование данных [D6, MS Jet SQL (Access)]
Вопрошающий © (2004-05-14 09:53:00)Необходимо скопировать данные из одной таблицы в другую по условию.
Запрос:
UPDATE
Выполнение_Таблица ET
SET
КодВыполнившего=(SELECT
EH.КодВыполнившего
FROM
Выполнение_Шапка EH
WHERE
EH.Код=ET.КодШапки)
не проходит. Сообщение: В операции должен использоваться обновляемый запрос.
Подскажите, что надо поменять?
Курдль (2004-05-14 11:35:00) [21]
> Mike Kouzmine © (14.05.04 11:31) [13]
Пропустим сарказЬм, но все же меня интересует вопрос, как можно делать проект, в котором более 30 разных таблиц, связанных при помощи синтетических ключей(последняя фраза мне не совсем ясна) на Ассеss-е? Я думал, что это инструмент для юзеров уровня "пользователь МС Офис", а программисты могут упростить себе (и заказчикам) жизнь.
Mike Kouzmine (2004-05-14 11:31:00) [22]Курдль © (14.05.04 11:23) [11] Про вас речь не идет. Такой талантище и на этом форуме.....
Danilka (2004-05-14 11:29:00) [23]Я не силен в аццессе, но, думаю что для него возможны только 2 варианта:
1. тупым перебором на клиенте, в дельфях например. т.к. операция разовая, то ничего страшного.
2. через временную таблицу.
Курдль (2004-05-14 11:23:00) [24]
> А слабо в самом аксессе построить и посмотреть?
Мне? СлабО... :(
Один раз глянув на работу в аксессе решил его даже не устанавливать себе на комп.
Mike Kouzmine (2004-05-14 11:21:00) [25]А слабо в самом аксессе построить и посмотреть?
Курдль (2004-05-14 11:19:00) [26]
> Докумен "услуги" имеет "Шапку", где указано где это делается,
> и "Табличную часть", в которой перечисляется, что делается.
> Это относится не к структурам БД, это относится к обыкновенному
> бумажному документообороту. Жизненный пример: Накладная.
Это уже предмет обсуждения не БД, а "...Report"-а типа Мастер-деталь.
> Мне нужно конвертануть данные из старого формата в новый!...
И кто это может сделать за Вас, не зная структуры источника и приемника? Обратитесь к местным телепатам!
Я вижу один способ - продумать структуру приложения, которое отработает один раз на благо конвертации.
Вопрошающий (2004-05-14 11:10:00) [27]1. Таблица "Исполнители":
ID_исполнителя первичный_ключ,
ФИО_исполнителя.
2. Таблица "Объекты":
ID_объекта первичный_ключ,
наименование_объекта.
3. Таблица "Услуги":
ID_услуги первичный_ключ,
наименование_услуги,
тариф_услуги.
4.1. Таблица "Шапка_Услуг"
ID_шапки первичный_ключ
ID_объекта внешний_ключ
4.2. Таблица "ТабличнаяЧасть_Услуг"
ID_шапки первичный_ключ
Номер_Строки первичный_ключ
ID_услуги внешний_ключ
ID_исполнпителя внешний_ключ
Комментарий к 4:
Докумен "услуги" имеет "Шапку", где указано где это делается, и "Табличную часть", в которой перечисляется, что делается. Это относится не к структурам БД, это относится к обыкновенному бумажному документообороту. Жизненный пример: Накладная.
P.S. В проекте более 30 разных таблиц, связанных при помощи синтетических ключей. Мне не структура БД нужна! Мне нужно конвертануть данные из старого формата в новый!...
Курдль (2004-05-14 11:01:00) [28]
> Шапка...
> ...табличной части
Я что-то не силен в терминологии Access-а.
Но в терминологии Баз Данныхэто выглядело бы так:
1. Таблица "Исполнители":
ID_исполнителя первичный_ключ,
ФИО_исполнителя.
2. Таблица "Объекты":
ID_объекта первичный_ключ,
наименование_объекта.
3. Таблица "Услуги":
ID_услуги первичный_ключ,
наименование_услуги,
тариф_услуги.
4. Таблица "Счета":
ID_счета первичный_ключ,
ID_объекта внешний_ключ,
ID_исполнителя внешний_ключ,
ID_услуги внешний_ключ
Если Вы приведете свою "базу" хотя бы к такому виду, то и мысли Ваши встанут на свое место.
Вопрошающий (2004-05-14 10:52:00) [29]2Jee
К сожалению, не проходит... :(
Насколько я понимаю, прежде чем писать FROM, надо написать SELECT.
UPDATE ET
SET ЕТ.КодВыполнившего = (SELECT EH.КодВыполнившего
FROM Выполнение_Таблица ET
INNER JOIN Выполнение_Шапка EH ON EH.Код=ET.КодШапки)
И получаем то же сообщение: В операции должен использоваться обновляемый запрос.
Вопрошающий (2004-05-14 10:41:00) [30]Да со структурой БД все ОК.
Я же говорю: раньше по одному документу проходил один исполнитель. Поэтому в шапке было поле "КодИсполнителя". Теперь по одному документу могут проходить несколько исполнителей - по одному исполнителю на каждую строку табличной части документа. Поэтому в строки добавлено поле "КодИсполнителя".
Показываю "на пальцах".
Было:
Шапка:
Объект: Огород тети Люси
Исполнитель: Вася
Табличная часть:
Вскопка огорода - 100 руб.
Посадка картошки - 200 руб.
Внесение удобрений - 120 руб.
...
Теперь нужно:
Шапка:
Объект: Огород тети Люси
Табличная часть:
Вскопка огорода - Вася - 100 руб.
Посадка картошки - Петя - 200 руб.
Внесение удобрений - корова Мурка - 0 руб.
Вопрос: Как в старых документах, переместить данные из шапки в табличную часть?
Шапка:
Объект: Огород тети Люси
Исполнитель: Вася
Табличная часть:
Вскопка огорода - Вася - 100 руб.
Посадка картошки - Вася - 200 руб.
Внесение удобрений - Вася - 120 руб.
Чтобы после этого вообще убрать поле исполнителя из шапки...
Jee (2004-05-14 10:38:00) [31]UPDATE ET
SET ЕТ.КодВыполнившего = EH.КодВыполнившего
FROM Выполнение_Таблица ET
INNER JOIN Выполнение_Шапка EH ON EH.Код=ET.КодШапки
WHERE <добавляй свое условие, иначе у всех строк будет исполнитель из шапки>
Курдль (2004-05-14 10:23:00) [32]Не правильно спроектированная база. Налицо денормализация.
Надо не перемещать "из шапки в строки табличной части" а "выбирать...".
Вопрошающий (2004-05-14 10:13:00) [33]Не совсем так. Похоже, я неправильно сормулировал вопрос.
Есть две таблицы. Одна из них - шапка документа. Вторая - табличная часть. Связь - по полям Шапка.Код=Таблица.КодШапки.
После изменения заказчиком требований к хранимым данным, необходимо переместить некоторые данные из шапки в строки табличной части. Конкретно: раньше по одному документу проходил один исполнитель. Теперь по разным строкам могут быть разные исполнители.
БД реорганизована. Все работает. Теперь просто необходимо в старых документах перекинуть данные (код исполнителя) из шапки документа - в каждую строку.
То-есть, не просто скопировать строки из таблицы в таблицу, а данные одного поля одной таблицы - в другое поле другой таблицы. И сделать это по условию, дескать, Таблица.КодШапки = Шапка.Код
Курдль (2004-05-14 10:00:00) [34]Копировать одним скриптом - это так (но не уверен, что Access это съест):
insert into TABLE1 (...)
select from TABLE2 (...)