Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2016, 10:05   #11
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Цитата:
как это проявляется?
просто все поля становятся пустыми
Ernest027 вне форума Ответить с цитированием
Старый 02.03.2016, 10:09   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Ernest027 Посмотреть сообщение
просто все поля становятся пустыми
просто поставьте точку останова и посмотрите, что у Вас за индекс в ADOQuery4
или сделайте отладочное сообщение.
например:

Код:
var obID : integer;
begin
....
obID:=DataModule2.ADOQuery4.FieldByName('OborudovanieID').AsInteger;
DataModule2.ADOQuery3.Close;
DataModule2.ADOQuery3.SQL.Clear;
DataModule2.ADOQuery3.SQL.Add('select * from Oborudovanie where ');
DataModule2.ADOQuery3.SQL.Add('OborudovanieID = '+inttostr(obID));
DataModule2.ADOQuery3.Open;
ShowMessage('Выполнили открытие ADOQuery3 с obID = '+IntToStr(obID));
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.03.2016, 10:34   #13
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Нашел косяк, как мне кажется.
Суть моей программы вот в чем. Делаю своего рода уведомление. При запуске программы ползунок пробегает по все бд и копирует записи, соответствующие условию из adoquery3 (Oborudovanie) в adoquery4 (Notification) и выходит уведомление "У Вас столько-то уведомлений".
Всю процедуру я повесил на таймер и думаю в этом моя ошибка. Получилось ооооооооооочень криво, но оно работает. Не забрасывайте меня камнями подскажите, как это безобразие написать в sql запрос? Буду очень благодарен. Вот сам ужасный код
Код:
ADOQuery4.Locate('OborudovanieID',ADOQuery3.FieldByName('OborudovanieID').AsString, [loPartialKey]);
if ADOQuery4.FieldByName('OborudovanieID').AsString=ADOQuery3.FieldByName('OborudovanieID').AsString then
begin
ADOQuery4.Append;
ADOQuery3.Next;
end
else
begin
if MonthsBetween(Date,DataModule2.ADOQuery3.FieldByName('Дата следующих замеров').AsDateTime)<=2 then
if Int(DataModule2.ADOQuery3.FieldByName('Дата следующих замеров').AsDateTime)>=Int(Date)-7 then
begin
ADOQuery4.Append;
DataModule2.ADOQuery4.Edit;
dataModule2.adoquery4.FieldByName('OborudovanieID').AsString:=
dataModule2.adoquery3.FieldByName('OborudovanieID').AsString;
dataModule2.adoquery4.FieldByName('№ п/п').AsString:=
dataModule2.adoquery3.FieldByName('№ п/п').AsString;
dataModule2.adoquery4.FieldByName('Организация').Asstring:=
dataModule2.adoquery1.FieldByName('Организация').Asstring;
dataModule2.adoquery4.FieldByName('Структурное подразделение').Asstring:=
dataModule2.adoquery2.FieldByName('Структурное подразделение').Asstring;
dataModule2.adoquery4.FieldByName('Наименование единицы').Asstring:=
dataModule2.adoquery3.FieldByName('Наименование единицы').Asstring;
dataModule2.adoquery4.FieldByName('Оперативный номер').Asstring:=
dataModule2.adoquery3.FieldByName('Оперативный номер').Asstring;
dataModule2.adoquery4.FieldByName('Тип оборудования').Asstring:=
dataModule2.adoquery3.FieldByName('Тип оборудования').Asstring;
dataModule2.adoquery4.FieldByName('Заводской номер').Asstring:=
dataModule2.adoquery3.FieldByName('Заводской номер').Asstring;
dataModule2.adoquery4.FieldByName('Технические характеристики').Asstring:=
dataModule2.adoquery3.FieldByName('Технические характеристики').Asstring;
dataModule2.adoquery4.FieldByName('Год выпуска').Asstring:=
dataModule2.adoquery3.FieldByName('Год выпуска').Asstring;
if dataModule2.adoquery3.FieldByName('Дата замеров').AsDateTime<>0 then
dataModule2.adoquery4.FieldByName('Дата замеров').Asdatetime:=
dataModule2.adoquery3.FieldByName('Дата замеров').AsDateTime;
dataModule2.adoquery4.FieldByName('Техническое состояние').Asstring:=
dataModule2.adoquery3.FieldByName('Техническое состояние').Asstring;
if dataModule2.adoquery3.FieldByName('Дата следующих замеров').AsDateTime<>0 then
dataModule2.adoquery4.FieldByName('Дата следующих замеров').AsDateTime:=
dataModule2.adoquery3.FieldByName('Дата следующих замеров').AsDateTime;
if Date<DataModule2.ADOQuery3.FieldByName('Дата следующих замеров').AsDateTime then
DataModule2.ADOQuery4.FieldByName('До следующих замеров осталось, дней').AsString:=
inttostr(daysbetween(Date,DataModule2.ADOQuery4.FieldByName('Дата следующих замеров').AsDateTime))
else
if (Date>DataModule2.ADOQuery3.FieldByName('Дата следующих замеров').AsDateTime) then
DataModule2.ADOQuery4.FieldByName('До следующих замеров осталось, дней').AsString:=
'-'+inttostr(daysbetween(Date,DataModule2.ADOQuery4.FieldByName('Дата следующих замеров').AsDateTime));
DataModule2.ADOQuery4.Post;
end;
DataModule2.ADOQuery3.Next;
end;
if ADOQuery3.Eof then
begin
ADOQuery2.next;
end;
if ADOQuery2.Eof then
ADOQuery1.Next;
без sql-запросов никуда, так и будет подобный ужас.

Последний раз редактировалось Ernest027; 02.03.2016 в 11:14.
Ernest027 вне форума Ответить с цитированием
Старый 02.03.2016, 11:25   #14
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Ребята, хээээээээээээлп
Ernest027 вне форума Ответить с цитированием
Старый 02.03.2016, 12:04   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

ну прочитайте наконец учебник по SQL.
Вложения
Тип файла: zip Грубер Понимание SQL.zip (320.9 Кб, 7 просмотров)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.03.2016, 12:13   #16
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Спасибо, почитаю
Вот пока что получается
Код:
DataModule2.ADOQuery4.Close;
DataModule2.ADOQuery4.SQL.Clear;
DataModule2.ADOQuery4.SQL.Add('insert into Notification (');
DataModule2.ADOQuery4.SQL.Add('[Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],');
DataModule2.ADOQuery4.SQL.Add('[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней]) select ');
DataModule2.ADOQuery4.SQL.Add('[Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],');
DataModule2.ADOQuery4.SQL.Add('[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней] from Oborudovanie');
DataModule2.ADOQuery4.SQL.Add('where not exists (select [Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],');
DataModule2.ADOQuery4.SQL.Add('[Технические характеристики],[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней] from Notification ');
DataModule2.ADOQuery4.SQL.Add('where [Организация]=Organization.[Организация] and [Структурное подразделение]=Zavod.[Структурное подразделение] and OborudovanieID=Oborudovanie.OborudovanieID and ');
DataModule2.ADOQuery4.SQL.Add('[№ п/п]=Oborudovanie.[№ п/п] and [Наименование единицы]=Oborudovanie.[Наименование единицы] and [Оперативный номер]=Oborudovanie.[Оперативный номер] and [Тип оборудования]=Oborudovanie.[Тип оборудования] and ');
DataModule2.ADOQuery4.SQL.Add('[Заводской номер]=Oborudovanie.[Заводской номер] and [Технические характеристики]=Oborudovanie.[Технические характеристики])');
if dataModule2.adoquery3.FieldByName('Дата замеров').AsDateTime<>0 then
DataModule2.ADOQuery4.SQL.Add('and [Дата замеров]=Oborudovanie.[Дата замеров]');
DataModule2.ADOQuery4.ExecSQL;
DataModule2.ADOQuery4.SQL.Clear;
DataModule2.ADOQuery4.SQL.Add('select * from Notification');
DataModule2.ADOQuery4.Open;
пишет "не удалось привязать составной идентификатор Organization.Организация."
Ernest027 вне форума Ответить с цитированием
Старый 02.03.2016, 12:26   #17
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

чтобы использовать поле таблицы в запросе( в условии ) ЭТА таблица должна быть задана в списке таблиц (from).
Код:
insert into Notification ([Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],
[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней]) 
select [Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],
[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней] 
from Oborudovanie

where not exists ( select [Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],
                         [Технические характеристики],[Год выпуска],[Техническое состояние], [До следующих замеров осталось, дней] 
                   from Notification 
                   where [Организация]=Organization.[Организация] and [Структурное подразделение]=Zavod.[Структурное подразделение] and OborudovanieID=Oborudovanie.OborudovanieID and 
                         [№ п/п]=Oborudovanie.[№ п/п] and [Наименование единицы]=Oborudovanie.[Наименование единицы] and [Оперативный номер]=Oborudovanie.[Оперативный номер] and [Тип оборудования]=Oborudovanie.[Тип оборудования] and 
                         [Заводской номер]=Oborudovanie.[Заводской номер] and [Технические характеристики]=Oborudovanie.[Технические характеристики]
                 )
  and [Дата замеров]=Oborudovanie.[Дата замеров]
P.S. я понимаю, что скопировать код как есть гораздо проще, но вот разобраться В НЕМ гораздо сложней, и не каждый кто мог бы помочь станет это делать.
Код:
SQLQuery4.SQL.SaveToFile(....); 
ShowMessage(SQLQuery4.SQL.Text);
ВАМ (и нам тоже) в помощь.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.03.2016 в 12:35.
evg_m вне форума Ответить с цитированием
Старый 02.03.2016, 12:49   #18
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Код:
insert into Notification (
[Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],
[Год выпуска],[Техническое состояние]) select 
[Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],
[Год выпуска],[Техническое состояние] from Organization, Zavod, Oborudovanie
where not exists (select [Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],
[Технические характеристики],[Год выпуска],[Техническое состояние] from Notification 
where [Организация]=Organization.[Организация] and [Структурное подразделение]=Zavod.[Структурное подразделение] and OborudovanieID=Oborudovanie.OborudovanieID and 
[№ п/п]=Oborudovanie.[№ п/п] and [Наименование единицы]=Oborudovanie.[Наименование единицы] and [Оперативный номер]=Oborudovanie.[Оперативный номер] and [Тип оборудования]=Oborudovanie.[Тип оборудования] and 
[Заводской номер]=Oborudovanie.[Заводской номер] and [Технические характеристики]=Oborudovanie.[Технические характеристики]
and [Дата замеров]=Oborudovanie.[Дата замеров])
все работает, но все данные перемешались, каша какая-то получилась

Последний раз редактировалось Ernest027; 02.03.2016 в 12:59.
Ernest027 вне форума Ответить с цитированием
Старый 02.03.2016, 13:07   #19
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
from Organization, Zavod, Oborudovanie
стр. 53
Цитата:
Что SQL в основном делает в объединении, так это исследует каждую комбинацию строк двух или более возможных таблиц, и проверяет эти комбинации по их предикатам. В предыдущем примере, требовалась строка продавца Peel из таблицы Продавцов и объединение ее с каждой строкой таблицы Пользователей, по одной в каждый момент времени.
Если комбинация производит значение которое делает предикат верным, и если поле city из строк таблиц Заказчика равно London, то Peel — это то запрашиваемое значение которое комби-нация выберет для вывода. То же самое будет затем выполнено для каждого продавца в таблице Продавцов (у некоторых из которых не было никаких заказчиков в этих городах).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.03.2016 в 13:10.
evg_m вне форума Ответить с цитированием
Старый 02.03.2016, 18:06   #20
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Решил сократить запрос, такая же фигня
Код:
insert into Notification (
[Организация], [Структурное подразделение],OborudovanieID,[№ п/п],[Наименование единицы],[Оперативный номер],[Тип оборудования],[Заводской номер],[Технические характеристики],
[Год выпуска],[Техническое состояние]) 
select Organization.[Организация], Zavod.[Структурное подразделение], Oborudovanie.OborudovanieID,Oborudovanie.[№ п/п],
Oborudovanie.[Наименование единицы],Oborudovanie.[Оперативный номер],Oborudovanie.[Тип оборудования],Oborudovanie.[Заводской номер],Oborudovanie.[Технические характеристики],
Oborudovanie.[Год выпуска],Oborudovanie.[Техническое состояние] from Organization, Zavod, Oborudovanie
where [Организация]<>Organization.[Организация] and [Структурное подразделение]<>Zavod.[Структурное подразделение] and 
OborudovanieID<>Oborudovanie.OborudovanieID and 
[№ п/п]<>Oborudovanie.[№ п/п] and [Наименование единицы]<>Oborudovanie.[Наименование единицы] and 
[Оперативный номер]<>Oborudovanie.[Оперативный номер] and [Тип оборудования]<>Oborudovanie.[Тип оборудования] and 
[Заводской номер]<>Oborudovanie.[Заводской номер] and [Технические характеристики]<>Oborudovanie.[Технические характеристики]
and [Дата замеров]<>Oborudovanie.[Дата замеров]
Ernest027 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
SQL запрос Tanushka=) SQL, базы данных 2 23.05.2011 17:09
Запрос в SQL Анн Помощь студентам 2 16.12.2010 19:51
Запрос с CASE переделать в запрос с PIVOT (MS SQL Server 2005) Машуля SQL, базы данных 4 06.05.2010 21:09
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15