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

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

Копирование данных [D6, MS Jet SQL (Access)]


Страницы:   1 2

Вопрошающий ©   (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 (...)


Страницы:   1 2

Наверх

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