|
Вопрос # 6 575/ вопрос решён / |
|
Приветствую, уважаемые эксперты! У меня проблема при банальном запросе SQL "SELECT MAX(№) FROM Sotrudniki". При запросе выдает ошибку Field "FIO" not found. Если убираю строки "Close" "SQL.Clear" то выдает ошибку синтаксиса FROM. Куда копать?
Примечание #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 (статус: Посетитель)
Вопрос отправлен: 26 января 2015, 14:07
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 16; последнее сообщение — 27 января 2015, 11:32; участников в обсуждении: 3.
|
Мережников Андрей (статус: Абитуриент), 26 января 2015, 14:22 [#1]:
max(*) - это что за конструкция?
№ - это имя поля такое?
вообще плохая идея таким образом вычислять уникальный номер
|
|
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 (статус: Посетитель), 26 января 2015, 14:32 [#3]:
У меня проблема с SQL запросами какой бы я запрос не делал, на суммирование или нахождения максимального значения выдает ошибку Field "имя поля " not Found, и я не пойму, что я не так делаю
|
|
ANBsoft (статус: Студент), 26 января 2015, 14:34 [#4]:
Max(*) - для какого поля ищется макс значение?
Может так:
'SELECT max(№) From Sotrudniki'
А вообще назначение номеров должно происходить через автоинкремент (тригеры, генераторы - в зависимости от базы данных), иначе при совместной работе будут проблемы
|
|
ANBsoft (статус: Студент), 26 января 2015, 14:36 [#5]:
возможно неудачная идея называть поле "№", назовите "ID" и проверьте еще раз
|
|
ANBsoft (статус: Студент), 26 января 2015, 14:40 [#6]:
Active:=true; и Open;
это одно и то же, зачем 2 раза давать команду открытия?
|
|
Raven_di (статус: Посетитель), 26 января 2015, 14:46 [#7]:
Про открытие на форуме увидел.
Поменял № на ID - результат не изменился
|
|
ANBsoft (статус: Студент), 26 января 2015, 14:48 [#8]:
база данных какая?
|
|
ANBsoft (статус: Студент), 26 января 2015, 14:52 [#9]:
какие поля возвращает запрос
'SELECT * From Sotrudniki'
|
|
Raven_di (статус: Посетитель), 26 января 2015, 14:53 [#10]:
ID , FIO, DR, dolgnost, bort, telephon
|
|
ANBsoft (статус: Студент), 26 января 2015, 15:08 [#11]:
Попробуйте
'SELECT ID From Sotrudniki'
если выполняется, то
'SELECT MAX(ID) From Sotrudniki'
если первое работает, а второе нет, это что-то непонятное
попробуйте выполнить эти запросы другими средствами
(SQLExplorer или штатными средствами для используемой БД)
|
|
ANBsoft (статус: Студент), 26 января 2015, 15:10 [#12]:
кстати, я не работал с ADO компонентами,
но, возможно, у Вас статически добавлены поля в Query, и когда вы меняете запрос динамически, этих полей больше нет, поэтому выдает что не может найти FIO, когда запрашиваете MAX(ID)
Удалите все статические поля.
|
|
Мережников Андрей (статус: Абитуриент), 26 января 2015, 15:42 [#13]:
Цитата (ANBsoft):
возможно, у Вас статически добавлены поля в Query
Скорее всего, так оно и есть
|
|
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 (статус: Посетитель), 27 января 2015, 11:32 [#16]:
Спасибо! Вопрос решен!
|
27 января 2015, 11:32: Статус вопроса изменён на решённый (изменил автор вопроса — Raven_di)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|