![]() |
| ||
|
|
Новости |
Поиск |
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 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]
ошибаешся вариантов больше, один из них кстати был приведен и позже благополучно исковеркан (и естественно заклеймен как неработающий).