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 13:35:00) [1]

2 sniknik
Во! Супер! Признал! Спасибо! :) (радости нет границ...)

2 All
Спасибо!.............

2 Jee
Спасибо!.... :))


sniknik   (2004-05-14 13:11:00) [2]

под access, тоже что в [31]

UPDATE Выполнение_Таблица ET INNER JOIN Выполнение_Шапка EH ON EH.Код=ET.КодШапки
SET ЕТ.КодВыполнившего = EH.КодВыполнившего


Вопрошающий   (2004-05-14 12:44:00) [3]

2 Johnmen ©   (14.05.04 12:34) [31]
Запрос:
UPDATE ET
SET ЕТ.КодВыполнившего = EH.КодВыполнившего
FROM Выполнение_Таблица ET
INNER JOIN Выполнение_Шапка EH ON EH.Код=ET.КодШапки


Дополнительного условия, как в [4] (WHERE <добавляй свое условие, иначе у всех строк будет исполнитель из шапки>) нет, так как мне нужно, чтобы во всехподчиненных строках был исполнитель из шапки.

Сообщение: [19]


Johnmen   (2004-05-14 12:34:00) [4]

>Вопрошающий   (14.05.04 12:32) [30]
>ЭТО [4] не работает в Jet SQL

Конкретно, вид запроса приведи.
И что значит "не работает" подробно.


Вопрошающий   (2004-05-14 12:32:00) [5]

2 Johnmen ©   (14.05.04 12:26) [28]

ЭТО [4] не работает в Jet SQL


Вопрошающий   (2004-05-14 12:30:00) [6]

Почти 2:
Поле с кодом исполнителя я в табличную часть уже добавил. Теперь надо этот код скопировать из соответствующей шапки во все подчиненные ей (шапке) строки.

Вот что, что (теперь) делается "руками" (догадайтесь, откуда руки ростут?):

var
 M: TADOQuery;
 D: TADOQuery;
begin
 Kernel.xDS.BeginTransaction;
 try
   try
     M := TADOQuery.Create(nil);
     D := TADOQuery.Create(nil);

     // выполнение -------------------------------------
     M.Connection := Kernel.xDS.Connection;
     M.SQL.Add('SELECT * FROM Выполнение_Шапка');
     M.Open;
     D.Connection := Kernel.xDS.Connection;
     D.SQL.Add('SELECT * FROM Выполнение_Таблица');
     D.Open;
     M.First;
     while not M.Eof do
     begin
       ShowStatus('Выполнения: ' + IntToStr(M.RecNo) + ' из ' + IntToStr(M.RecordCount));
       D.Filtered := false;
       D.Filter := 'КодШапки=''' + M.FieldByName('Код').AsString + '''';
       D.Filtered := true;
       D.First;
       while not D.Eof do
       begin
         D.Edit;
         D.FieldByName('КодВыполнившего').AsString := M.FieldByName('КодВыполнившего').AsString;
         D.Post;
         D.Next;
       end;
       M.Next;
     end;

     // анализы --------------------------------------
     M.Connection := Kernel.xDS.Connection;
     M.SQL.Add('SELECT * FROM Анализы_Шапка');
     M.Open;
     D.Connection := Kernel.xDS.Connection;
     D.SQL.Add('SELECT * FROM Анализы_Таблица');
     D.Open;
     M.First;
     while not M.Eof do
     begin
       ShowStatus('Анализы: ' + IntToStr(M.RecNo) + ' из ' + IntToStr(M.RecordCount));
       D.Filtered := false;
       D.Filter := 'КодШапки=''' + M.FieldByName('Код').AsString + '''';
       D.Filtered := true;
       D.First;
       while not D.Eof do
       begin
         D.Edit;
         D.FieldByName('КодЛаборатории').AsString := M.FieldByName('КодЛаборатории').AsString;
         D.FieldByName('КодБиоматериала').AsString := M.FieldByName('КодБиоматериала').AsString;
         D.Post;
         D.Next;
       end;
       M.Next;
     end;
   finally
     if (M <> nil) then FreeAndNil(M);
     if (D <> nil) then FreeAndNil(D);
   end;
   Kernel.xDS.CommitTransaction;
 except
   Kernel.xDS.RollbackTransaction;
 end;
end;


Johnmen   (2004-05-14 12:26:00) [7]

>Вопрошающий

Поднять тебе веки ?
Или голову сориентировать ?
[4]


Jee   (2004-05-14 12:21:00) [8]


> Вопрошающий   (14.05.04 11:59) [24]

Да не надо никаких конверторов.
Давай по порядку. Варианта два.
1. У тебя нет строк в табличной части. И тебе из нужно вставить.
2. Строки есть, но нет поля с кодом исполнителя. Тогда нужно его добавить и заполнить значением из шапки.
Так какой вариант?


Вопрошающий   (2004-05-14 12:21:00) [9]

Хорошо хоть мысли (заказчика) меняются вовремя. В таблице всего 2000 заказов. Конвертировало "вручную" секунд 40. Прочитало-записало-прочитало-записало... Построчно, блин! А на 20000 заказов что? А если больше? А транзакция всех других пользователей блокирует. Блин...


Курдль   (2004-05-14 12:13:00) [10]

Да полно! Вот пример:

Syntax 1
UPDATE WHERE CURRENT OF cursor-name
{ USING DESCRIPTOR sqlda-name | FROM hostvar-list }

Syntax 2
UPDATE table-list
SET set-item, ...
WHERE CURRENT OF cursor-name


Только это, увы, не Ассеss. Может удастся переубедить заказчика сменить СУБД?
А с другой, стороны... если "клиеент платит" каждый раз, как только мысли у него сменятся...


Вопрошающий   (2004-05-14 11:59:00) [11]

Ладно. Делать нечего. Напишу конвертер. С тупым перебором строк.
Только вот что делать, если у заказчика опять мысли сменятся? Опять писать конвертер? Неужели нет запроса, при помощи которого можно копировать поля обной таблицы в поля другой таблицы с условием?


Danilka   (2004-05-14 11:56:00) [12]

[18] sniknik ©   (14.05.04 11:43)
Понятно.
Вобщем-то, когда я писал, что возможны 2 варианта, то имел ввиду то, что все вышеперечисленное в аццессе не работает. :)


Johnmen   (2004-05-14 11:46:00) [13]

Вижу 3 варианта:
1. [0]
2. [4]
3. [12].1
Если 1. не проходит по синтаксису, то 2.
Если 2. не проходит по синтаксису, то 3.
Вобщем зависит от реализации SQL в аксесе...


Курдль   (2004-05-14 11:44:00) [14]


> Вопрошающий   (14.05.04 11:36) [16]

Это делается на клиенте?


> Алгоритм:
> 1. Выбираем строку Шапки_Документа.
> 2. Выбираем все строки из ТабличнойЧасти_Документа, у которых
> КодШапки = Шапка_Документа.Код
> 3. Устанавливаем: ТабличнаяЧасть_Документа.КодИсполнителя
> := Шапка_Документа.КодИсполнителя

1. select * from DOCUMENT_HEADER where DH_ID = :DH_ID
2. select * from DOCUMENT_LINES where DH_ID = :DH_ID
3. update DOCUMENT_LINES set MAKER_ID = :MAKER_ID
Не зная конкретики я тупо перекодировал Ваш алгоритм.


Mike Kouzmine   (2004-05-14 11:44:00) [15]

Курдль ©   (14.05.04 11:35) [14] Очень просто. Если голова на плечах есть, то инструмент не имеет значения.


Вопрошающий   (2004-05-14 11:44:00) [16]

[4]:
Ошибка синтаксиса (пропущен оператор) в выражении запроса 'EH.КодВыполнившего
FROM Выполнение_Таблица ET
INNER JOIN Выполнение_Шапка EH ON EH.Код=ET.КодШапки'


sniknik   (2004-05-14 11:43:00) [17]

Danilka ©   (14.05.04 11:38) [17]
ну да, посмотри что давалось и что пробовалось > [6]
если в нем и есть неточности то это дело подгонки под конкретику, а не такое.


Danilka   (2004-05-14 11:38:00) [18]

[15] sniknik ©   (14.05.04 11:36)
> один из них кстати был приведен и позже благополучно исковеркан

[4]?


Вопрошающий   (2004-05-14 11:36:00) [19]

Исполнители:
 Код - первичный ключ
 ФИО - строка

Шапка_Документа:
 Код - первичный ключ
 КодИсполнителя - вторичный индекс (на таблицу "Исполнители")
 ...

ТабличнаяЧасть_Документа:
 КодШапки - вторичный индекс
 НомерСтроки - вместе с КодомШапки составляет первичный ключ
 КодИсполнителя - вторичный индекс (на таблицу "Исполнители")
 ...

Сейчас КодИсполнителя в ТабличнойЧасти пустой.

Алгоритм:
1. Выбираем строку Шапки_Документа.
2. Выбираем все строки из ТабличнойЧасти_Документа, у которых КодШапки = Шапка_Документа.Код
3. Устанавливаем: ТабличнаяЧасть_Документа.КодИсполнителя := Шапка_Документа.КодИсполнителя

Как сформулировать такой SQL-запрос?

P.S. Я с Aceess'ом не работаю. И никогда не работал. Я просто использую *.mdb файл БД Access'а. С доступом через ADO.


sniknik   (2004-05-14 11:36:00) [20]

Danilka ©   (14.05.04 11:29) [12]
ошибаешся вариантов больше, один из них кстати был приведен и позже благополучно исковеркан (и естественно заклеймен как неработающий).


Страницы:   1 2

Наверх

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