Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 575

/ вопрос решён /

Приветствую, уважаемые эксперты! У меня проблема при банальном запросе SQL "SELECT MAX(№) FROM Sotrudniki". При запросе выдает ошибку Field "FIO" not found. Если убираю строки "Close" "SQL.Clear" то выдает ошибку синтаксиса FROM. Куда копать?

Приложение:
  1. close;
  2. SQL.Clear;
  3.  
  4. Active:=true;
  5. Open;
  6.  


Примечание #1 (26 января 2015, 14:16):
procedure TForm7.Button1Click(Sender: TObject);
var
isot:integer;
begin
with Form2.ADOQuery1 do begin
close;
SQL.Clear;
SQL.Add('SELECT max(*)'+'From Sotrudniki;');
Active:=true;
Open;
isot:=Form2.ADOquery1.FieldByName('№').AsInteger+1;
end;

Raven_di Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Raven_di (статус: Посетитель)
Вопрос отправлен: 26 января 2015, 14:07
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 16; последнее сообщение — 27 января 2015, 11:32; участников в обсуждении: 3.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 января 2015, 14:22 [#1]:

max(*) - это что за конструкция?
№ - это имя поля такое?
вообще плохая идея таким образом вычислять уникальный номер
Raven_di

Raven_di (статус: Посетитель), 26 января 2015, 14:29 [#2]:

max(*) - это я не туда напечатал(ступил)
№ - имя поля в котором содержатся порядковые номера.
procedure TForm7.Button1Click(Sender: TObject);
var
isot:integer;
begin
with Form2.ADOQuery1 do begin
close;
SQL.Clear;
SQL.Add('SELECT max(№)'+'From Sotrudniki;');
Active:=true;
Open;
isot:=Form2.ADOquery1.FieldByName('№').AsInteger+1;
end;
Raven_di

Raven_di (статус: Посетитель), 26 января 2015, 14:32 [#3]:

У меня проблема с SQL запросами какой бы я запрос не делал, на суммирование или нахождения максимального значения выдает ошибку Field "имя поля " not Found, и я не пойму, что я не так делаю
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 14:34 [#4]:

Max(*) - для какого поля ищется макс значение?
Может так:
'SELECT max(№) From Sotrudniki'
А вообще назначение номеров должно происходить через автоинкремент (тригеры, генераторы - в зависимости от базы данных), иначе при совместной работе будут проблемы
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 14:36 [#5]:

возможно неудачная идея называть поле "№", назовите "ID" и проверьте еще раз
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 14:40 [#6]:

Active:=true; и Open;
это одно и то же, зачем 2 раза давать команду открытия?
Raven_di

Raven_di (статус: Посетитель), 26 января 2015, 14:46 [#7]:

Про открытие на форуме увидел.
Поменял № на ID - результат не изменился
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 14:48 [#8]:

база данных какая?
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 14:52 [#9]:

какие поля возвращает запрос
'SELECT * From Sotrudniki'
Raven_di

Raven_di (статус: Посетитель), 26 января 2015, 14:53 [#10]:

ID , FIO, DR, dolgnost, bort, telephon
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 15:08 [#11]:

Попробуйте
'SELECT ID From Sotrudniki'
если выполняется, то
'SELECT MAX(ID) From Sotrudniki'
если первое работает, а второе нет, это что-то непонятное
попробуйте выполнить эти запросы другими средствами
(SQLExplorer или штатными средствами для используемой БД)
ANBsoft

ANBsoft (статус: Студент), 26 января 2015, 15:10 [#12]:

кстати, я не работал с ADO компонентами,
но, возможно, у Вас статически добавлены поля в Query, и когда вы меняете запрос динамически, этих полей больше нет, поэтому выдает что не может найти FIO, когда запрашиваете MAX(ID)
Удалите все статические поля.
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 26 января 2015, 15:42 [#13]:

Цитата (ANBsoft):

возможно, у Вас статически добавлены поля в Query

Скорее всего, так оно и есть
Raven_di

Raven_di (статус: Посетитель), 27 января 2015, 11:10 [#14]:

Вот так работает с динамически прописанными полями, но нарушается ширина столбцов.
procedure TForm7.Button1Click(Sender: TObject);
var
isot:integer;
begin
with Form2.ADOQuery1 do begin
close;
Field.Clear;
SQL.Clear;
isot:=('SELECT max(ID)From Sotrudniki');
SQL.ADD(SELECT * From Dotrudniki);
Open;
isot:=Form2.ADOquery1.FieldByName('ID').AsInteger+1;
end;
Мережников Андрей

Мережников Андрей (статус: Абитуриент), 27 января 2015, 11:20 [#15]:

ну так добавьте еще один объект ADO.Query и его используйте для вычисления max(ID), а объект, связанный с таблицей, оставьте в покое. И подумайте над вышесказанным, что выбран очень плохой способ для вычисления ID. Надо использовать либо триггеры, либо автоинкрементные поля (если они поддерживаются выбранной СУБД)
Raven_di

Raven_di (статус: Посетитель), 27 января 2015, 11:32 [#16]:

Спасибо! Вопрос решен!

27 января 2015, 11:32: Статус вопроса изменён на решённый (изменил автор вопроса — Raven_di)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.03 сек.