Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Ошибки не выдает ,но и не делает того, что надо   Найти похожие ветки 

 
ViktorZ   (2005-10-23 12:13) [0]

Короче есть Форма вот кусок кода, который не выдает ошибки, но и не делает того, что нужно. Ладно бы ошибку выдал,
а то вслепую трудно. Грешу на второй 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 12:15) [1]

Сорри вот нормальный кусок кода:
Query1.SQL.Add("UPDATE PCHECK.DB SET PCHECK.DB.Curency = PCHECKNEW.DB.Curency where PCHECK.DB.Cnum = PCHECKNEW.DB.Cnum");


 
msguns ©   (2005-10-23 14:06) [2]

>ViktorZ   (23.10.05 12:15) [1]

Т.е. в таблице PCHECK ты хочешь во всех записях, у которых NUM совпадает с NUM таблицы PCHECKNEW, заменить поле CURENCY на содержимое одноименного поля PCHECKNEW ?

А NUM у тебя гарантировано уникальный в PCHECKNEW ?


 
ViktorZ   (2005-10-23 16:30) [3]

да гарантированно. Это автоинкремент.


 
sniknik ©   (2005-10-23 16:46) [4]

> да гарантированно. Это автоинкремент.
автоинкремент сам по себе не гарантирует уникальности. (правда за Paradox не скажу, но в access/mssql это так)


 
Anatoly Podgoretsky ©   (2005-10-23 16:52) [5]

sniknik ©   (23.10.05 16:46) [4]
Это как, разумеется речь не о порушеных таблицах.


 
ViktorZ   (2005-10-23 17:45) [6]

Paradox. Раз не скажешь. Нет речь не о порушенных индексах. Ближе к делу господа, если кто-то знает.


 
msguns ©   (2005-10-23 18:01) [7]

Попробуй так:

UPDATE PCHECK.DB AS P SET P.Curency = (SELECT PC.Curency FROM
PCHECKNEW.DB AS PS WHERE PS.Cnum = P.Cnum);


 
Baltika-20   (2005-10-23 18:20) [8]

>ViktorZ  

Проверял - SELECT возвращает что-нибудь?


 
sniknik ©   (2005-10-23 19:01) [9]

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


 
Anatoly Podgoretsky ©   (2005-10-23 19:46) [10]

sniknik ©   (23.10.05 19:01) [9]
А это уже не автоинкримент, а вручную, а вручную я и не такое могу наворотить.


 
ViktorZ   (2005-10-23 19:50) [11]

ща попробую.Не а не работает. Пишет 2 rows are affected. А вот Селект работает. Если с помощью Алиасов в кавычках указывать. Хе че за херня не думал что это так трудно))))
Вот этот селект работает отлично и выводит то что нужно.
SELECT PCHECK.Curency, PCHECKNEW.Curency FROM ":Standard1:Pcheck" Pcheck , ":Standard1:Pchecknew" Pchecknew where Pcheck.Cnum= pChecknew.cnum


 
Baltika-16   (2005-10-23 19:53) [12]

>ViktorZ   (23.10.05 19:50) [11]

Вот этот селект работает отлично и выводит то что нужно.


Осталось условие из SELECT в UPDATE использовать;)


 
ViktorZ   (2005-10-23 19:55) [13]

Простите конечно уважаемый sniknik. Но ваш запрос у меня вообще не пошел ругаясь на Лефт и джоин. Сорри конечно, но у меня парадох, а он что то их не переваривает.


 
msguns ©   (2005-10-23 19:58) [14]

>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 разный смысл, первый используется для "жесткого" связывания (например, для извлечения непустых (без фактур) документов), а второй - для необязательных ссылок (например, для "подкачки" справочной информации)

Апологет мелкософта, блин ;))


 
sniknik ©   (2005-10-23 20:10) [15]

Anatoly Podgoretsky ©   (23.10.05 19:46) [10]
ну так, а я про что? см. [4], если есть возможность "наворотить" то значит нет гарантии на укальность "сам по себе" он ее не дает.


 
ViktorZ   (2005-10-23 20:13) [16]

Вот фигня то а. Селект канает, но как тока в апдейт,то: Single row subquery produced more than one row.
Мож кто подскажет как мне в массив затолкать из одной таблицы а потом в другую из массива вставить. ИМХо так точно должно работать.


 
sniknik ©   (2005-10-23 20:16) [17]

msguns ©   (23.10.05 19:58) [14]
да нет, когда в where условие на сравнение полей из разных таблиц это и означает обьеденение (join) пусть и неявное, смысл получается тот же. "жесткое" связывание получаеш по inner join, все тоже самое...
а писать, явно ну по крайней мере понятнее. (мне по крайней мере точно).


 
ViktorZ   (2005-10-23 20:24) [18]

>>>ну а судя по тому что на синтаксис как раз и не ругается(в оригинале ([1]) вроде правильно), то надо смотреть условие, нет ли там чего (например точного сравнеия на неточных типах (с плавающей запятой)).

Правильно то правильно, но не работает. И нет там запятых никаких, там все числа целые.


 
sniknik ©   (2005-10-23 20:27) [19]

> Мож кто подскажет как мне в массив затолкать из одной таблицы а потом в другую из массива вставить.
ну "дошол до ручки" ;о))

можно так, без массива.
делаеш коннект к ADO, Jet
кидаеш на форму ADOConnection1
в ADOConnection1.ConnectionString пишеш строку
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties=Paradox 7.x;Persist Security Info=False
(D:\ это типа твой путь к базе)
в ADOConnection1.LoginPrompt пишеш false

после по кнопке(например) выполняеш слегка модифицированный запрос из [9]
ADOConnection1.Execute("UPDATE PCHECK AS p INNER JOIN PCHECKNEW AS s ON p.Cnum = s.Cnum SET p.[Curency] = s.[Curency]");
должно сработать. ну или более менее понятную ошибку выдать ;о)). для гарантии надо попробовать.


 
msguns ©   (2005-10-23 20:33) [20]

>ViktorZ   (23.10.05 20:24) [18]
>Правильно то правильно, но не работает

1. Пробовал через подзапрос как в [7] ?

2. Попробуй в DBD дать QBE запрос на аналогичный селект с CheckPlus во всех колонках и посмотри сколько записей вернет.


 
Anatoly Podgoretsky ©   (2005-10-23 20:52) [21]

mnm   (23.10.05 20:12) [17]
Во второй таблице более одной записи с кодом. Что означает отсутствие уникальности по полю связи.


 
sniknik ©   (2005-10-23 20:59) [22]

ViktorZ   (23.10.05 19:55) [13]
> Простите конечно уважаемый sniknik. Но ваш запрос у меня
> вообще не пошел ругаясь на Лефт и джоин. Сорри конечно,
> но у меня парадох, а он что то их не переваривает.


прощаю... ;о))
он правильно не сработал, я же там писал что это "если бы синтаксис был как access"... а кавычки "" BDE шные поставил, в обшем это пример "наугад" (запрос мутант ;) а не рабочий запрос.
и не переваривает "Лефт и джоин" в апдейте не парадокс а движок исполняющий запрос (BDE)
другой движок - Jet это поймет (с исправлениями) хотя там теже парадоксные таблици останутся см. [19]

Anatoly Podgoretsky ©   (23.10.05 20:52) [21]
mnm   (23.10.05 20:12) [17]
> Во второй таблице более одной записи с кодом. Что означает отсутствие уникальности по полю связи.
;о))) вот вам и автоинкремент. ;о)

>  А NUM у тебя гарантировано уникальный в PCHECKNEW ?
ViktorZ   (23.10.05 16:30) [3]
> да гарантированно. Это автоинкремент.

(ну тут конечно не автоинкремент виноват. так думаю ;)


 
Anatoly Podgoretsky ©   (2005-10-23 21:33) [23]

sniknik ©   (23.10.05 20:59) [22]
То что он обманывает насчет дублей я был уверен.
Только добавь еще оди нфактор - это Парадокс!


 
ViktorZ   (2005-10-24 06:11) [24]

msguns ©   (23.10.05 20:33) [20]

>ViktorZ   (23.10.05 20:24) [18]
>Правильно то правильно, но не работает

1. Пробовал через подзапрос как в [7] ?
Да пробовал аналогично, ошибки не выдает, но и не ничено не делает. А Мож это поможет. Две табличы полностья совпадают кроме одного поля Curency и они запаролены.


 
ViktorZ   (2005-10-24 08:36) [25]

Пробовал АДО. ПИшет. Должен использоваться обновляемый запрос.


 
sniknik ©   (2005-10-24 09:02) [26]

> Должен использоваться обновляемый запрос.
я же говорил будет более понятная ошибка. так и есть, это понятнее чем ничего. ;о)

В операции должен использоваться обновляемый запрос. (Ошибка 3073)
Попытка запустить, открыть или изменить запрос, который не является обновляемым.

Возможные причины:

&#9632; Попытка запустить запрос, в котором предпринимается попытка обновить необновляемое поле. Например, создан запрос, в котором предпринимается попытка обновить поле на стороне «один» отношения «один-ко-многим».
&#9632; Попытка использовать устаревший метод OpenQueryDef для запроса, находящегося в базе данных, открытой с доступом только для чтения.
База данных может быть доступной только для чтения по одной из следующих причин:

&#9632; База данных была открыта только для чтения с помощью метода OpenDatabase или элемента управления Data Visual Basic.
&#9632; Файл базы данных определен с доступом только для чтения в сетевой операционной системе.
&#9632; Пользователь не имеет привилегий записи в этот файл базы данных в сетевой среде.
Закройте базу данных, снимите ограничение доступа только для чтения и вновь откройте файл с доступом для чтения/записи.

&#9632; Отсутствуют разрешения на внесение изменений в запрос. Для изменения разрешений обратитесь к системному администратору или создателю таблицы или запроса.


кстати ты вроде говорил у тебя таблици запаролены... говорил после того как я показывал как через ADO делается... как думаеш я учел пароль на базу если ты сказал про него позже? сними и попробуй еще раз.


 
msguns ©   (2005-10-24 09:20) [27]

Блин, уже четверть сотни постов, а воз и ныне там..
Может уж раскроешь Великую Тайну Мальчишов и покажешь таки структуры обеих таблиц, в частности инфу о ключах ?


 
ViktorZ   (2005-10-24 19:39) [28]

Конешно учел пароль. Я ж не тупой))) глядите на базы:
www.viksite.narod.ru/PCHECK.DB
www.viksite.narod.ru/PCHECKNEW.DB
Пароль Aeroflot_Plus.


 
sniknik ©   (2005-10-24 20:20) [29]

> Конешно учел пароль.
а ключь про который так долго все говорят? раз не приведены файлы ключей то значит нет их. (ну или хоть сказал бы, восстановите ключь вот по этому полю)
а без него таблица тоже ведь становится необновляемой (для запросов), табличными методами вроде бы можно обновить.


 
ViktorZ   (2005-10-25 20:03) [30]

Sorry, я с базами мало знаком. Начитался тут всего с подряд.Про воостановление ключа я просто не знал. Вообще идеяу меня такая взять два грида для 2ух таблиц. В 1 загрузить одну таблицу и др в другой грид. А потом по циклу перегнать из одного в другой.


 
msguns ©   (2005-10-26 09:18) [31]

>ViktorZ   (25.10.05 20:03) [30]

Ты когда овощи покупаешь, домой по картошине носишь ?


 
ViktorZ   (2005-10-26 10:51) [32]

конечно нет, но тут мне похоже придется раз не вдомек.


 
sniknik ©   (2005-10-26 11:16) [33]

ViktorZ   (26.10.05 10:51) [32]
не придется, если реализуеш то что сдесь советовали. т.е. досточно восстановить ключь (а еще лучше создать таблици заново с той же структурой и с ключевым полем (восстановление геморнее), и перелить данные, плюс при копировании "отловятся" дубли, при восстановлении может просто сказать "не могу изза дубликатов" и все. дубли у тебя наверняка есть т.к. поле которое ты называл гарантированно автоинкрементным и недублирующимся на самом деле простого целого типа... в общем обманывал ты нас по полной... )

сделаеш все и тогда запрос из msguns ©   (23.10.05 18:01) [7] на твоих таблицах станет рабочим.


 
msguns ©   (2005-10-26 11:22) [34]

>ViktorZ   (26.10.05 10:51) [32]

Ты проверял наличие повторяющихся "ключей" как советовали в [20] (QBE) ?
Если нет, то проверь. И хватит людям голову морочить "петербургскими тайнами"


 
ViktorZ   (2005-10-26 13:11) [35]

Я ж не со зла а от непонимания?  Я не знаю что такое QBE. По поводу создать таблицы заново то: ситуация такая, таблицу берут с объекта, несут мне, я в таблице менаю столбец Куренси на все четверки(я это сделал), потом ее относят обратно и делают там с ней что-то потом опять дают мне и я там где были четверки ставлю те цифры которые были первоначально. Вот вся задача, вижу свою вину в том чо сразу не сказал как есть, наверное это от безысходности. Заранее прошу прощения что так получилось.


 
ANB ©   (2005-10-26 14:21) [36]


> ViktorZ   (26.10.05 13:11) [35]

Тогда прежде чем отдавать таблицу, и портить ее четверками, заводи в ней доп поле (ID), заполняй его уникальными значениями, делай копию. Потом порти, после возврата чини. Связывай строки именно по этому полю - ID. Иначе счастья не будет. Впрочем, если записи физически местами не менялись, можно сию процедуру и сейчас проделать. Только придется это делать с двумя таблицами и результат не очень гарантирован. С помощью SQL и в парадоксовской таблице ты это не проделаешь, хотя может АП сможет помочь. Задай новый вопрос.


 
ViktorZ   (2005-10-27 17:43) [37]

Спасибо всем.


 
ViktorZ   (2005-10-27 19:52) [38]

Все сделал почти. Теперь вроде все работает. Узнал нового и полезного.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.041 c
14-1132150008
ISP
2005-11-16 17:06
2005.12.11
Интересно, что за штука такая...


4-1129090176
Smertb
2005-10-12 08:09
2005.12.11
hook


2-1132661817
Esenin
2005-11-22 15:16
2005.12.11
Помогите загрузить jpeg в TImage из TMemoryStream.


14-1132410065
quickblack
2005-11-19 17:21
2005.12.11
Командная строка DOS


4-1128570737
Angel[Saint]
2005-10-06 07:52
2005.12.11
Сервис и RegisterHotKey





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский