Вход | Регистрация
 

Выбрать Максимум (Строка) в запросе

Выбрать Максимум (Строка) в запросе
Я
   ArturDoo
 
08.06.21 - 09:42
Доброго утра. Нужно выбрать максимальное значение из списка номеров запросом, сейчас их 100. Номер выглядит 100/А, 99/А .... Я думаю, что "100/А">"99/А",тк в первой строке больше символов, а 1с думает иначе. Кто из нас тупит?
   brainguard
 
1 - 08.06.21 - 09:44
(0) Вы словарь когда-нибудь открывали?
   ДенисЧ
 
2 - 08.06.21 - 09:44
"1" < "9"
Это же первое правило сравнения строк во всех языках. Слева направо посимвольно.
   brainguard
 
3 - 08.06.21 - 09:48
(0) Если список меньше 10 000, тогда делайте цикл. Если больше, меняйте способ хранения номеров. Например 00098/А, 00099/А, 00100/А
   ArturDoo
 
4 - 08.06.21 - 09:56
(2) Выходит, что туплю я. И вы хотите сказать, что короткая строка может быть больше длиной?
   fisher
 
5 - 08.06.21 - 09:58
(4) Да. Строки сравниваются посимвольно. Результаты сравнения следующих символов лишь уточняют порядок, установленный сравнением предыдущих.
   ДенисЧ
 
6 - 08.06.21 - 09:58
(4) Строки добиваются пробелами до равной длины и дальше - читай выше

http://pics.rsh.ru/img/usl_jskuw3g6.png
   Kesim
 
7 - 08.06.21 - 10:00
(4) "абвгдеёж" или "я"   вот в чем вопрос
   fisher
 
8 - 08.06.21 - 10:00
Одинэсники чаще всего с этим сталкиваются в нумерациях документов ибо там работают те же правила. Если бух вбил руками для дока номер "9" - все, кирдык созданию новых документов.
   ArturDoo
 
9 - 08.06.21 - 10:00
(6) Так 111<22 == 111<22_
   fisher
 
10 - 08.06.21 - 10:03
(9) Ведущими нулями обычно добивают.
   fisher
 
11 - 08.06.21 - 10:07
Есть куча готовых обработок перенумерации. Проще всего перенумеровать все к виду 0099/А
   ArturDoo
 
12 - 08.06.21 - 10:07
(10) И я так думал, но тогда: 0111>0022 и идет посимвольное сравнение:
0 = 0
1 > 0 Лидирующее неравенство с-но 111 должно быть больше 
1 < 2
1 < 2
   ArturDoo
 
13 - 08.06.21 - 10:08
1с добивает строки лидирующими нулями?
   ДенисЧ
 
14 - 08.06.21 - 10:09
   ArturDoo
 
15 - 08.06.21 - 10:10
(14) Выходит, что 1с добивает равенство не лидирующими нулями?
   fisher
 
16 - 08.06.21 - 10:10
(12) Так и есть. 111 > 22, "0111" > "0022". Не понял вопроса.
(13) Сама - нет. С чего бы? Откуда она знает, что ты от строки хочешь? Но в функции Формат есть готовая опция для такого преобразования.
   fisher
 
17 - 08.06.21 - 10:12
Соврал. Формат не умеет строку добивать лидирующими нулями. Она может число преобразовать в строку с лидирующими нулями.
   fisher
 
18 - 08.06.21 - 10:14
Я обычно делал что-то типа такого:
Строка10 = Прав("0000000000" + СтрокаЧисло, 10);
   ArturDoo
 
19 - 08.06.21 - 10:14
В итоге. В запросе строки никак не добить. И самое просто добавить номерам пару-тройку нулей, чтоб не городить циклы?
   ArturDoo
 
20 - 08.06.21 - 10:15
(18) В запросе такого не напишешь
   fisher
 
21 - 08.06.21 - 10:16
(19) Именно так. Гораздо проще и правильнее унифицировать нумерацию под правильную "сортируемость".
   fisher
 
22 - 08.06.21 - 10:17
Только заложи ведущих нулей с учетом будущего роста.
   Said_We
 
23 - 08.06.21 - 11:41
(20) Запросом такое напишешь, даже на SQL языке от 1С, только это изврат. Перенумеруй сами документы и не занимайся глупостями.
   lodger
 
24 - 08.06.21 - 11:53
откуда у бухов такой фетиш на перенумерацию объектов? на вот эти всякие странные префиксы, суфиксы, постфиксы?
   Said_We
 
25 - 08.06.21 - 11:59
(24) Ну документооборот они так ведут. Что бы по номеру документа было видно какого вида это документ.
Зачем? Их так учат.
Зачем их так учат? Их учат, те кто так учился ране. А их тоже так учили т.д.
Когда не было электронного документооборота был поиск по каталогам и т.д как в библиотеке.

Обычный рудимент.
   fisher
 
26 - 08.06.21 - 12:05
Я еще успел попасть на курсы бухгалтеров, где учили бумажному бухучету.
Хотя не удивлюсь, если и до сих пор учат.
   Said_We
 
27 - 08.06.21 - 12:07
(24) Второе объяснение - это независимая нумерация разных видов документов одновременно. Пропуски в нумерации не допускаются, но разные виды документов вводят и отвечают за них разные люди. При этом все кадровые документы не должны повторять номер и быть пропуски. Поэтому и ввели префиксы, суфиксы и т.д.
   brainguard
 
28 - 08.06.21 - 12:20
(24) Скоросшиватель сшивает быстро, а расшивает еще быстрее. Вот отсюда ноги и растут
   VladZ
 
29 - 08.06.21 - 12:23
(0) Ты конечно. :)

Тут не нужно думать. Нужно знать, как будет сравнивать программа.
   Said_We
 
30 - 08.06.21 - 12:28
(28) Есть ещё одна причина.
Процедура нумерации подразумевает разделение бумаг с различными сроками хранения:
- Длительный: 50 или 75 лет.
- Краткосрочный: 1 или 5 лет.

Хранить весь этот хлам в архивах и дорогое и муторное занятие... Поэтому краткосрочные хранят отдельно и первой возможности утилизируют.
Но опять же это всё из библиотечного дела и хранения по каталогам.
 
 
   arsik
 
31 - 08.06.21 - 12:43
   Said_We
 
32 - 08.06.21 - 12:44
+ к (30) В остальных документах остается нумерация без пропусков, так как изначально и не было в них документо другого вида с другим сроком хранения.

т.е. основная проблема в том что требуют некую единую уникальную нумерацию по всем кадровым документам. А по факту её нет.

(31) НЕТ и в текущей версии напишешь.
   arsik
 
33 - 08.06.21 - 12:48
(32) Длина изначальной строки неизвестна.
   Said_We
 
34 - 08.06.21 - 13:12
(33) Главное что бы был известен формат строки на выходе.
(31) Пусть необходимо привести номер к виду: 99999999999999/ХХ, т.е. 14 цифр номера + разделитель "/" и один символ суффикса. А по факту дополнить нулями номер, так как разделитель и один символ суффикса уже есть. Если разделитель бывает разный, то дополнить разные разделители. Если суффикс бывает длинной более одного символа, то учесть и это.

Например есть следующие номера как в (0):  100/А, 99/А, 00251200/А, 3/А,... , где суффикс это всегда один символ.

Если кратко, то один алгоритм следующий.
1. Так как 14 + 1 + 1 = 16, то подготовить таблицу с цифрами от 1 до 16. Порождающий запрос на 16 - назовем это так.
2. Разбиваем строки с номерами на строки вида ниже. т.е. декартово перемножение на таблицу из 16-ти строк и беря только строку с 1 одну, с 2 одну и т.д.
Изначальный номер | НПП | символ
100/А | 1 | А
100/А | 2 | /
100/А | 3 | 0
100/А | 4 | 0
100/А | 5 | 1
100/А | 6 | 0
100/А | 7 | 0
100/А | 8 | 0
100/А | 9 | 0
100/А |10 | 0
100/А |11 | 0
100/А |12 | 0
100/А |13 | 0
100/А |14 | 0
100/А |15 | 0
100/А |16 | 0
99/А  | 1 | А
99/А  | 2 | /
99/А  | 3 | 9
99/А  | 4 | 9
99/А  | 6 | 0
99/А  | 5 | 0
99/А  | 7 | 0
99/А  | 8 | 0
99/А  | 9 | 0
99/А  |10 | 0
99/А  |11 | 0
99/А  |12 | 0
99/А  |13 | 0
99/А  |14 | 0
99/А  |15 | 0
99/А  |16 | 0
...

3. Собственно собираем обратно. Получаем на выходе для каждого номера его новый номер. Как собрать обратно у меня сразу два алгоритма в голове возникло. Так как всего 16-ть символов, то использовал бы первый:
Выбрать
    т.Номер
   ,МАКС(Выбор когда т.НПП = 1 Тогда т.Символ иначе " " конец) + МАКС(Выбор когда т.НПП = 2 Тогда т.Символ иначе " " конец)+...+МАКС(Выбор когда т.НПП = 16 Тогда т.Символ иначе " " конец) КАК НовыйНомер
ИЗ
...
Сгруппировать по т.Номер

Если много было бы, то использовал бы сложение соседних: 1+2; 3+4; 5+6; .... далее перенумерация и опять сложение соседних. Десять итераций позволяет сложить 2 в десятой = строка длиной 1024 символа.
   Said_We
 
35 - 08.06.21 - 13:13
А ну сложение в обратном порядке:
,МАКС(Выбор когда т.НПП = 16 Тогда т.Символ иначе " " конец) + МАКС(Выбор когда т.НПП = 15 Тогда т.Символ иначе " " конец)+...+МАКС(Выбор когда т.НПП = 1 Тогда т.Символ иначе " " конец) КАК НовыйНомер
   Said_We
 
36 - 08.06.21 - 13:42
(0) В общем вывод простой. Не занимайся ерундой и просто перенумеруй заранее документы. Не хочется в живых документах номер менять, создай доп реквизит, сделай его заполнение при записи и заполни у всех документов, у которых его нет. Далее ищи максимальный минимальный и т.д. Если будут префиксы - храни составляющие номера отдельно, т.е хранить отдельно префикс (включая разделитель), отдельно номер и отдельно суффикс (включай разделитель). Что бы не складывать каждый раз можно и весь номер целиком тоже хранить.
В общем - что хочешь....
   Said_We
 
37 - 09.06.21 - 12:20
(0) Ну что решил?


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.