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

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

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

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

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

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

Stilet, переделал немного структуру таблиц. Теперь что мы имеем:
Поле ZavodID есть и Табл1 и в табл2. Они могут принимать значение NULL. Обе таблицы прикрутил к таблице Zavod (Связующее поле ZavodID). Теперь переделал немного запрос:
Код:
with  DataModule2.ADOQuery3 do
begin
Close;
SQL.Clear;
SQL.Append('insert into Oborudovanie (');
SQL.Append('ZavodID,[Наименование единицы],[Оперативный номер], [Тип оборудования],');
SQL.Append('[Заводской номер], [Технические характеристики], [Год выпуска]) ');
SQL.Append('select ZavodID,[Наименование единицы],[Оперативный номер], [Тип оборудования],');
SQL.Append('[Заводской номер],[Технические характеристики], [Год выпуска]');
SQL.Append('from OborudovanieAdd where not exists (');
SQL.Append(' select * from Oborudovanie');
SQL.Append(' where OborudovanieAdd.[Оперативный номер]=Oborudovanie.[Оперативный номер])');


try
 n:=ExecSQL;
 if n=0 then ShowMessage('Ниче не вставлено') else
 if n>0 then ShowMessage('Вставлено') else
 if n<0 then ShowMessage('Чета ошибка') else
  ;
except
 on e:Exception do begin
  ShowMessage('Суперошибка: '+e.Message);
 end;
end;
Requery();
Open;
end;
теперь пишет 'Ниче не вставлено' и много раз adoquery3 dataset closed, что-то такое. Почему dataset closed если я пишу Open?
Ernest027 вне форума Ответить с цитированием
Старый 11.08.2015, 09:38   #32
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Requery();
Open;
О мои глаза... Что это за фантазия? Зачем?
Я же просил тебя - сделай ты для вставки отдельный компонент.
Ну нельзя сразу после ExecSQL делать Open да еще и не заполнить запрос SELECT...
Цитата:
теперь пишет 'Ниче не вставлено'
Значит нечего вставлять. Значит твой select, который ты используешь в INSERT-е дает пустой набор. Ну это не ошибка программы, просто данных для вставки нет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2015, 09:42   #33
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

потому что запрос с Insert не может быть открыт (Open для такого пустая операция, которая ничего не открывает)
Вам же говорят
http://programmersforum.ru/showpost....5&postcount=23
http://programmersforum.ru/showpost....5&postcount=23

Еще раз третий последний
добавьте в DataModule ОДИН ADOconnection (Если его там еще нет!!!) и потом ADOQuery столько раз сколько разных запросов вы собираетесь делать.
как минимум
  • один с SELECT-ом
  • и ЕЩЕ ОДИН с Insert
Выставьте у них ADOConnection
Запишите в каждый ADOQuery свой SQL (и больше в программе его не трогайте!!!)
Чтобы менять данные "не трогая" сам запрос пишите параметры!!!
Чтобы не запутаться какой Query для чего НАЗОВИТЕтак чтобы было понятно зачем они(что они делают),
например QueryInsert / QuertSelectMaster / QuerySelectDetail .

ВСЕ написанное есть в ЛЮБОЙ книге по Delphi + Базы данных. (В т.ч. и правила работы с параметрами и настройка связей Master -Detail)
В каждом разделе форума есть прикрепленная тема со списками литературы.
На главной странице есть КНИГИ Delphi
то что версия Delphi "устарела" не играет большой роли принципы работы остались теми же. (те же параметры, те же наборы данных, те же связи между ними).

Для новичков SQL есть Грубер Понимание SQL.
Писать ЗДЕСЬ конспекты книг мало толку, понимания что и зачем так и не придет.
программа — запись алгоритма на языке понятном транслятору

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

Цитата:
Значит нечего вставлять. Значит твой select, который ты используешь в INSERT-е дает пустой набор. Ну это не ошибка программы, просто данных для вставки нет.
В таблице 2 (Form11) есть одна запись которой нет в таблице 1 (Form1). А он ее не вставляет(((

Цитата:
Я же просил тебя - сделай ты для вставки отдельный компонент.
То есть сделать как говорит evg_m
Цитата:
добавьте в DataModule ОДИН ADOconnection (Если его там еще нет!!!) и потом ADOQuery столько раз сколько разных запросов вы собираетесь делать.
Спасибо вам большое ребята))) знаю что вы мне пальцы поотрубали чтобы не осквернять форум и Делфи)))

Цитата:
Для новичков SQL есть Грубер Понимание SQL.
Спасибо,скачаю)

Locate не работает, а так все норм)))
Код:
with DataModule2.ADOQuery3 do
begin
    Close;
    SQL.Clear;
    SQL.Add('select *');
    SQL.Add('from Oborudovanie');
    SQL.Add('where [Оперативный номер] = '+QuotedStr(Edit1.Text));
    Open;
end;
Изображения
Тип файла: jpg Безымянный.jpg (17.6 Кб, 111 просмотров)

Последний раз редактировалось Stilet; 11.08.2015 в 11:29.
Ernest027 вне форума Ответить с цитированием
Старый 11.08.2015, 11:15   #35
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Locate не работает
Да все с ним Ok. Вот руки-крюки это да
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.08.2015, 11:20   #36
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

не исключено))) мне запросом тоже нравится)))

вам покажется ооооочень коряво, но оно работает)))
Код:
while not DataModule2.ADOQuery6.Eof do
begin
with DataModule2.ADOQuery3 do
begin
    Close;
    SQL.Clear;
    SQL.Add('select *');
    SQL.Add('from Oborudovanie');
    SQL.Add('where [Оперативный номер] = '+QuotedStr(DataModule2.ADOQuery6.FieldByName('Оперативный номер').AsString));
    Open;
end;
if DataModule2.ADOQuery6.FieldByName('Оперативный номер').AsString<>DataModule2.ADOQuery3.FieldByName('Оперативный номер').AsString then
begin
DataModule2.ADOQuery3.Edit;
DataModule2.ADOQuery3.FieldByName('Оперативный номер').AsString:=DataModule2.ADOQuery6.FieldByName('Оперативный номер').AsString;
DataModule2.ADOQuery3.Post;
DataModule2.ADOQuery6.Next;
end
else
DataModule2.ADOQuery6.Next;
end;
DataModule2.ADOQuery3.SQL.Clear;
DataModule2.ADOQuery3.SQL.Add('select * from Oborudovanie where ZavodID=:ZavodID');
DataModule2.ADOQuery3.Open;
Спасибо вам всем большое)))

Последний раз редактировалось Stilet; 11.08.2015 в 11:29.
Ernest027 вне форума Ответить с цитированием
Старый 11.08.2015, 11:43   #37
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
знаю что вы мне пальцы поотрубали чтобы не осквернять форум и Делфи)
То ли еще будет - ой ой ой...
Пинков, пока опыта не наберешься, получишь достаточно типа "Копать отсюда и до вечера", так что эта тема - мелочи жести.
Цитата:
но оно работает)
Запросом было бы быстрее. А так - чисто отмазаться от препода.
Да и оптимизировать можно:
Код:
with DataModule2.ADOQuery3 do begin
 ADOQuery6.first;
 while not ADOQuery6.Eof do begin

  with ADOQuery3 do begin
    Close;
    SQL.Clear;
    SQL.Add('select *');
    SQL.Add('from Oborudovanie');
    SQL.Add('where [Оперативный номер] = '
           +QuotedStr(ADOQuery6.FieldByName('Оперативный номер').AsString));
    Open;
  end;

  if ADOQuery6.FieldByName('Оперативный номер').AsString<>ADOQuery3.FieldByName('Оперативный номер').AsString 
  then   begin
   ADOQuery3.Insert;
   ADOQuery3.FieldByName('Оперативный номер').AsString:= ADOQuery6.FieldByName('Оперативный номер').AsString;
  end; 

  ADOQuery6.Next;
 end;
 ADOQuery3.Post;

 ADOQuery3.SQL.Text:=('select * from Oborudovanie where ZavodID=:ZavodID');
 ADOQuery3.Open;
end;
Но! В этом коде зарыто одно ма-а-а-ленькое, но огромное НО!
Ты из Oborudovanie отбираешь набор, а потом даже не проверяешь пустой он или нет, не говоря уже о ситуации, когда этот запрос вернет несколько записей. Это ты не учитываешь, а зря. Это грабли. Причем с огроменными шпичками. Бо-бо будет однажды
Поэтому садись назад за запросы и изучай INSERT
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2015, 11:55   #38
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

Цитата:
Ты из Oborudovanie отбираешь набор, а потом даже не проверяешь пустой он или нет
это я сделаю))) кстати,он не ругается что записи пустые.
Цитата:
Поэтому садись назад за запросы и изучай INSERT
буду изучать))) пока так пойдет, я и этому ох как обрадовался)))
Цитата:
А так - чисто отмазаться от препода
не студентик я))) сам для себя пишу)))
А вам всем еще раз спасибо)))
Ernest027 вне форума Ответить с цитированием
Старый 11.08.2015, 12:12   #39
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
он не ругается что записи пустые.
Потому что ты не поставил условие обязательно быть не пустыми.
Цитата:
пока так пойдет

Да по любому
14173797986022.jpg
Цитата:
сам для себя пишу)

Значит так. За изобретение ставлю пять, а за экзамен...
Безымянный.jpg
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.08.2015, 12:18   #40
Ernest027
Форумчанин
 
Регистрация: 27.04.2015
Сообщений: 437
По умолчанию

проверку сделаю)))
Ernest027 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к USB на С# Кандибобр C# (си шарп) 6 09.10.2014 16:30
как обратиться к браузеру? gazellea Помощь студентам 0 26.06.2012 20:26
как в Delphi присвоить полю DBEdit целочисленное значение поля из DBText (как правильно )? ГОСЕАН Помощь студентам 0 10.01.2012 06:12
Как обратиться к ячейке? baddog БД в Delphi 2 30.04.2010 15:43
Как отсортировать НД по Lookup-полю? Schumacher БД в Delphi 4 21.06.2007 14:07