SQL SELECT MAX возвращает макс. значение но только до 10.

Sensor230
Дата: 29.08.2019 01:35:27
При вызове
Application.CreateForm(TForm2,Form2);

создается форма шаблона для заполнения бланка, бланк номерной, и чтоб полуавтоматизировать систему нумерации сделал так
begin
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT MAX(MyMaxNomer) AS Count_Max FROM MyTable1');
ADOQuery1.Open;
Edit1.Text:=IntToStr ((ADOQuery1['Count_Max'])+1);
end;

т.е. Ищется в таблице MyTable1 в столбце MyMaxNomer максимальное значение номера, при создании формы в Edit1.Text записывается его значение+1 (в случае необходимости значение Edit1.Text можно поменять).
Вопрос: Вся эта конструкция почему то работает от 1 до 10, после 10 счетчик останавливается и все последующие номера идут только с номером 10, даже если вставить вручную строку с номером 125, бланки все равно будут с номером 10. Где я накосячил?
DimaBr
Дата: 29.08.2019 01:44:57
В данном коде ошибка лишь одна. Если в MyTable1 строк нет то Count_Max = Null и Null+1 - неминуемая ошибка
_Vasilisk_
Дата: 29.08.2019 14:25:54
Sensor230
в таблице MyTable1 в столбце MyMaxNomer максимальное значение номера
Какой тип у поля MyMaxNomer?

DimaBr
В данном коде ошибка лишь одна
NULL должен кастануться в 0.

А ошибка в том, что нефиг колхозить автоинкремент на коленке
Sensor230
Дата: 29.08.2019 17:30:04
DimaBr
В данном коде ошибка лишь одна. Если в MyTable1 строк нет то Count_Max = Null и Null+1 - неминуемая ошибка

Хотя бы одна строка в таблице есть всегда.
Sensor230
Дата: 29.08.2019 17:41:47
_Vasilisk_,
Про "колхозить" это не совсем корректно )))), здесь спрашивают и просят помощи обычно чайники, любители и тождественные им категории, а профессионалы обычно им подсказывают, советуют и помогают. Пристыдить "колхозом" можно профессионала, но они как правило на форумах ответы не ищут.
А что касаемо моего вопроса, так таки да, поле было текстовым, изменил на числовой и начало колхозно инкементировать, Только возник еще вопрос, чисто из интереса, а почему до 10 считало, 1-9 это же тоже цифры.
И да, _Vasilisk_, Спасибо за помощь! )))
Gerasimenko
Дата: 29.08.2019 17:45:16
Sensor230,

существуют: явное приведение типов и НЕ явное приведение типов.
В случае неявного приведения типов: зависит от логики, заложенной разработчиком СУБД.
Sensor230
Дата: 29.08.2019 17:59:58
Gerasimenko,
Т.е. от 1 до 9 типы из строки в цифру приводятся автоматически, а с 10 и выше требуется явное приведение типов? Я думал, что числа это числа, а буквы-буквы, а оказалось что не все буквы числа и что среди чисел есть те которые буквы )))). Хотя и догадывался, что программисты..... ну не такие как все ))))))))
miksoft
Дата: 29.08.2019 18:08:15
Sensor230,

Что за СУБД?
И покажите DDL таблицы.
Gerasimenko
Дата: 29.08.2019 18:16:46
Sensor230
Gerasimenko,
Т.е. от 1 до 9 типы из строки в цифру приводятся автоматически, а с 10 и выше требуется явное приведение типов? Я думал, что числа это числа, а буквы-буквы, а оказалось что не все буквы числа и что среди чисел есть те которые буквы )))). Хотя и догадывался, что программисты..... ну не такие как все ))))))))

В приведенном вами примере, неявное преобразование проводится провайдером, а не в СУБД
В СУБД возможно и прокатило бы
create table #ddd(s varchar(6))
insert into #ddd select '1'
insert into #ddd select '111'
insert into #ddd select '111111'
insert into #ddd select '2'
insert into #ddd select '22'
insert into #ddd select '2222'
insert into #ddd select '3'
insert into #ddd select '333'
insert into #ddd select '33333'

select s from #ddd order by s
select max(s)+1 from #ddd 

drop table #ddd
Gerasimenko
Дата: 29.08.2019 18:26:37
Gerasimenko
Sensor230,

существуют: явное приведение типов и НЕ явное приведение типов.
В случае неявного приведения типов: зависит от логики, заложенной разработчиком СУБД.


create table #ddd(s varchar(2000))

insert into #ddd select '1'
insert into #ddd select '111'
insert into #ddd select '111111'
insert into #ddd select '2'
insert into #ddd select '22'
insert into #ddd select '33333'
insert into #ddd select '9'

select s from #ddd order by s
select max(s)+1 from #ddd --order by s

drop table #ddd


Я специально с сортировкой поставил.
Все, что начинается с 9, будет в конце. Сортировка по первому символу.
Вполне логично, что и в СУБД и на стороне провайдера сначала возвращается максимальная строка - это 9, затем к ней применяется НЕ явное приведение типов, а уже после прибавляется 1.
Все точно с точки зрения логики.