![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибки не выдает ,но и не делает того, что надо [D7, Paradox]
ViktorZ © (2005-10-23 12:13:00)Короче есть Форма вот кусок кода, который не выдает ошибки, но и не делает того, что нужно. Ладно бы ошибку выдал,
а то вслепую трудно. Грешу на второй Query.
Вот когда я пишу:
Query1.SQL.Add('UPDATE PCHECK.DB SET PCHECK.DB.Curency = 15 where PCHECK.DB.Cnum =2 ');
то все делается как надо.
Вот собстенно код:
procedure TForm1.Button3Click(Sender: TObject);
begin
Query1.Close;
Query1.SQL.Clear;
//Query1.SQL.Add('SELECT Pcheck.Curency, PcheckNEW.Curency FROM ":STANDARD1:PCHECK" PCHECK, ":STANDARD2:PCHECKNEW" PCHECKNEW');
//Query1.ExecSQL;
Query1.SQL.Add('UPDATE PCHECK.DB SET PCHECK.DB.Curency = STANDARD2.PCHECKNEW.DB.Curency where PCHECK.DB.Cnum = STANDARD2.PCHECKNEW.DB.Cnum');
Query1.ExecSQL;
end;
end.
Версия Делфи:7
ОС ХР SP2
если что нуно нужно то пишите.
Заранее спасибо.
ViktorZ (2005-10-23 20:24:00) [21]>>>ну а судя по тому что на синтаксис как раз и не ругается(в оригинале ([1]) вроде правильно), то надо смотреть условие, нет ли там чего (например точного сравнеия на неточных типах (с плавающей запятой)).
Правильно то правильно, но не работает. И нет там запятых никаких, там все числа целые.
sniknik (2005-10-23 20:16:00) [22]msguns © (23.10.05 19:58) [14]
да нет, когда в where условие на сравнение полей из разных таблиц это и означает обьеденение (join) пусть и неявное, смысл получается тот же. "жесткое" связывание получаеш по inner join, все тоже самое...
а писать, явно ну по крайней мере понятнее. (мне по крайней мере точно).
ViktorZ (2005-10-23 20:13:00) [23]Вот фигня то а. Селект канает, но как тока в апдейт,то: Single row subquery produced more than one row.
Мож кто подскажет как мне в массив затолкать из одной таблицы а потом в другую из массива вставить. ИМХо так точно должно работать.
sniknik (2005-10-23 20:10:00) [24]Anatoly Podgoretsky © (23.10.05 19:46) [10]
ну так, а я про что? см. [4], если есть возможность "наворотить" то значит нет гарантии на укальность "сам по себе" он ее не дает.
msguns (2005-10-23 19:58:00) [25]>sniknik © (23.10.05 19:01) [9]
>вообще синтаксис у вас (в LOCAL SQL (?)) какойто "неправильный" ;о) "правильный" (по типу как бы для access) был бы такой
UPDATE "PCHECK.DB" AS p LEFT JOIN "PCHECKNEW.DB" AS s ON p.Cnum = s.Cnum SET p.Curency = s.Curency
А вот не надо в кучу мух и котлеты, а ?
У Where и Join разный смысл, первый используется для "жесткого" связывания (например, для извлечения непустых (без фактур) документов), а второй - для необязательных ссылок (например, для "подкачки" справочной информации)
Апологет мелкософта, блин ;))
ViktorZ (2005-10-23 19:55:00) [26]Простите конечно уважаемый sniknik. Но ваш запрос у меня вообще не пошел ругаясь на Лефт и джоин. Сорри конечно, но у меня парадох, а он что то их не переваривает.
Baltika-16 (2005-10-23 19:53:00) [27]>ViktorZ (23.10.05 19:50) [11]
Вот этот селект работает отлично и выводит то что нужно.
Осталось условие из SELECT в UPDATE использовать;)
ViktorZ (2005-10-23 19:50:00) [28]ща попробую.Не а не работает. Пишет 2 rows are affected. А вот Селект работает. Если с помощью Алиасов в кавычках указывать. Хе че за херня не думал что это так трудно))))
Вот этот селект работает отлично и выводит то что нужно.
SELECT PCHECK.Curency, PCHECKNEW.Curency FROM ":Standard1:Pcheck" Pcheck , ":Standard1:Pchecknew" Pchecknew where Pcheck.Cnum= pChecknew.cnum
Anatoly Podgoretsky (2005-10-23 19:46:00) [29]sniknik © (23.10.05 19:01) [9]
А это уже не автоинкримент, а вручную, а вручную я и не такое могу наворотить.
sniknik (2005-10-23 19:01:00) [30]Anatoly Podgoretsky © (23.10.05 16:52) [5]
> sniknik © (23.10.05 16:46) [4]
> Это как, разумеется речь не о порушеных таблицах.
легко
пример, для MSSQL
делаем таблицу
CREATE TABLE Table1 (ID INT Identity(1, 1), InFl1 Int) -- (без ключа по ID !!!)
после
отключаем проверку и вносим сколько угодно повторяющихся значений в автоинкрементное поле
SET IDENTITY_INSERT Table1 ON
INSERT INTO Table1 (ID,InFl1) VALUES (1, 1)
INSERT INTO Table1 (ID,InFl1) VALUES (1, 2)
INSERT INTO Table1 (ID,InFl1) VALUES (1, 3)
...
и т.д. (различать теперь придется по второму полю, если и его внести повторяющимся... ну тоды ой. ;)
для access все тоже самое только SET IDENTITY_INSERT Table1 ON не нужен, команды нет но режим включен по умолчанию...
таблици будут не порушены, прошу заметить, вполне нормальные.
вообще всех сбивает то, что чаще всего автоинкремент делают PRIMARY KEY, а вот он как раз UNIQUE накладывает... но ведь это не обязательное действие. и автоинкрементное поле <> уникальному/ключу.
но для парадокса действительно непройдет (сейчас проверил), вообше нет возможности записать в автоинкремент - "не обновляемое поле".
ViktorZ
вообще синтаксис у вас (в LOCAL SQL (?)) какойто "неправильный" ;о) "правильный" (по типу как бы для access) был бы такой
UPDATE "PCHECK.DB" AS p LEFT JOIN "PCHECKNEW.DB" AS s ON p.Cnum = s.Cnum SET p.Curency = s.Curency
ну а судя по тому что на синтаксис как раз и не ругается(в оригинале ([1]) вроде правильно), то надо смотреть условие, нет ли там чего (например точного сравнеия на неточных типах (с плавающей запятой)).
Baltika-20 (2005-10-23 18:20:00) [31]>ViktorZ
Проверял - SELECT возвращает что-нибудь?
msguns (2005-10-23 18:01:00) [32]Попробуй так:
UPDATE PCHECK.DB AS P SET P.Curency = (SELECT PC.Curency FROM
PCHECKNEW.DB AS PS WHERE PS.Cnum = P.Cnum);
ViktorZ (2005-10-23 17:45:00) [33]Paradox. Раз не скажешь. Нет речь не о порушенных индексах. Ближе к делу господа, если кто-то знает.
Anatoly Podgoretsky (2005-10-23 16:52:00) [34]sniknik © (23.10.05 16:46) [4]
Это как, разумеется речь не о порушеных таблицах.
sniknik (2005-10-23 16:46:00) [35]> да гарантированно. Это автоинкремент.
автоинкремент сам по себе не гарантирует уникальности. (правда за Paradox не скажу, но в access/mssql это так)
ViktorZ (2005-10-23 16:30:00) [36]да гарантированно. Это автоинкремент.
msguns (2005-10-23 14:06:00) [37]>ViktorZ (23.10.05 12:15) [1]
Т.е. в таблице PCHECK ты хочешь во всехзаписях, у которых NUM совпадает с NUM таблицы PCHECKNEW, заменить поле CURENCY на содержимое одноименного поля PCHECKNEW ?
А NUM у тебя гарантировано уникальный в PCHECKNEW ?
ViktorZ (2005-10-23 12:15:00) [38]Сорри вот нормальный кусок кода:
Query1.SQL.Add('UPDATE PCHECK.DB SET PCHECK.DB.Curency = PCHECKNEW.DB.Curency where PCHECK.DB.Cnum = PCHECKNEW.DB.Cnum');