|
Можно как-то ускорить создание простенькой ТЗ? | ☑ | ||
---|---|---|---|---|
0
palpetrovich
29.11.15
✎
14:32
|
вот это ну не очень быстро работает:
Для Инд = 1000 По 99999 Цикл НоваяСтр = ТЗ.Добавить(); НоваяСтр.Артикул = Формат(Инд,"ЧГ=0"); КонецЦикла; зы: клиент хочет автоматом для новых элеменов получать уникальный артикул ззы: можно конечно создавать ТЗ приНачалеРаботыСистемы... |
|||
1
ДенисЧ
29.11.15
✎
14:33
|
Запросом из базы сразу бери
|
|||
2
palpetrovich
29.11.15
✎
14:33
|
+(0) далее получаю первый незанятый - это быстро
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ТЗ.Артикул |ПОМЕСТИТЬ ВТ |ИЗ | &ТЗ КАК ТЗ |; |ВЫБРАТЬ | ВТ.Артикул, | СпрНоменклатура.Ссылка КАК Номенклатура |ПОМЕСТИТЬ ВТ1 |ИЗ | ВТ КАК ВТ | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура | ПО ВТ.Артикул = СпрНоменклатура.Артикул |; |ВЫБРАТЬ первые 1 | ВТ1.Артикул |ИЗ | ВТ1 КАК ВТ1 |ГДЕ ЕСТЬNULL(ВТ1.Номенклатура, 0)=0 |"; |
|||
3
palpetrovich
29.11.15
✎
14:35
|
(1) нет их в базе, откуда им там взяться :)
это строки типа "1234", "1235", "99999" |
|||
4
Nuobu
29.11.15
✎
14:38
|
(3) Сортировать по максимуму пробовал?
|
|||
5
Записьдампа
29.11.15
✎
14:47
|
(0) У тебе всегда одновременно только один клиент в базе с этим функционалом работать будет?
|
|||
6
palpetrovich
29.11.15
✎
14:59
|
(4) часть номенклатуры занесена с арьикулами из другой базы, причем не "по порядку"
(5) пока да |
|||
7
Скай
29.11.15
✎
14:59
|
А тут не "Формат" большую часть времени отжирает? Он вроде не образец скорости работы
|
|||
8
Записьдампа
29.11.15
✎
15:10
|
(6) Уточняю. Один пользователь может начать два сеанса? Например на RDP.
|
|||
9
palpetrovich
29.11.15
✎
15:33
|
(7) мржет, но мне на выходе строку без "пробелов" надо
(8) нет |
|||
10
Записьдампа
29.11.15
✎
15:53
|
(9) Гм.. а как ты такого эффекта добился? Запретил пользователю несколько раз щелкать по ярлыку?
Самый тупой вариант ускорить твою хотелку, не меняя архитектуры - заменить в цикле Формат на СтрЗаменить с символом неразрывного пробела. Это даст процентов 10% выигрыша. Если тебе действительно надо быстро, то переосмысливай архитектуру. Надо хранить числа, оперировать числами, а "пробелы" убирать только в том месте, где данные показывается пользователю. И про "второго пользователя" я тебя не просто так спрашиваю. Сейчас окажется, что у тебя обмен данными еще есть. |
|||
11
Лефмихалыч
29.11.15
✎
16:01
|
(0) откуда потребность постоянно и ежедневно создавать новые номенклатурные позиции? Это нонсенс само по себе
|
|||
12
Лефмихалыч
29.11.15
✎
16:03
|
И это - в поле Код уникальный артикул уже и так автоматом появляется. На кой кол там второй?
Я подозреваю клюшки какие-то вонючие, которые хотят в v8 перетащить 1в1, не приходя в сознание |
|||
13
palpetrovich
29.11.15
✎
16:05
|
(10) показывать ничего не нужно, используется здесь:
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура | ПО ВТ.Артикул = СпрНоменклатура.Артикул (12) Код != артикул |
|||
14
Записьдампа
29.11.15
✎
16:08
|
(13) И зачем тебе артикул хранить строкой, если ты даже в (0) генерируешь его как число?
|
|||
15
palpetrovich
29.11.15
✎
16:20
|
(14) в конфигурации он строка, клиент использует как число
|
|||
16
palpetrovich
29.11.15
✎
16:24
|
короче, вижу 2 пути:
1 глобальная экспортная ТЗ 2 доп. справочник или РС |
|||
17
itlikbez
29.11.15
✎
16:26
|
(0) Получай таблицу номеров в запросе
выбрать 0 объединить выбрать 1 объединить выбрать 2 и т.д. |
|||
18
palpetrovich
29.11.15
✎
16:32
|
(17) Для Инд = 1000 По 99999 Цикл ...не жестоко-ли ? ?)
|
|||
19
Записьдампа
29.11.15
✎
16:36
|
(15)(16) Забудь про скорость. У тебя две проблемы - во-первых ты оперируешь несогласованными типами данных, и во-вторых не понимаешь что одна база обслуживает несколько сеансов. Следующая тема будет "как избавится от коллизий?" =)
Похоже (12) был прав. |
|||
20
itlikbez
29.11.15
✎
16:37
|
(18) Нет.
10*10*10*10*10=100000 Соедини 5 раз таблицу с номерами от 0 до 9 с самой собой, и получишь 100000 записей. |
|||
21
Записьдампа
29.11.15
✎
16:42
|
(20) А можно я за ТС спрошу? =)
Как привести в запросе число к строке, причём без пробелов? |
|||
22
palpetrovich
29.11.15
✎
16:44
|
(19) я-хе сказал, один чел будет этим заниматься
(20) поздно, я уже повесил одинэсину :) |
|||
23
itlikbez
29.11.15
✎
16:47
|
(21) Зачем приводить к строке? Пусть число использует.
|
|||
24
Записьдампа
29.11.15
✎
16:50
|
(23) - (14)+(15) =)
|
|||
25
PR третий
29.11.15
✎
16:52
|
(0) Задача бредовая. Не стоит так делать.
|
|||
26
palpetrovich
29.11.15
✎
16:55
|
(25)откуда такие глубокие выводы? - раз
мне пофик, платит - далаю! два :) |
|||
27
PR третий
29.11.15
✎
16:57
|
(26) Колбасить базу с целью найти пропущенные номера — бред. Раз.
Делай. Два. |
|||
28
palpetrovich
29.11.15
✎
17:05
|
(27) где Колбасить-то? основное время теряется на подготовку "заготовки" :) код в (2) отрабатывает достаточно шустро, хоть и наверняка неоптимаоен
зы а тебя не напрягает проверка на уникальность реквихитов типа ИНН? |
|||
29
Бертыш
29.11.15
✎
17:05
|
Самое быстрое в интерпретаторе 1С это когда вместо кода написанного на 1С и соответственно интерпретируемого интерпретатором ты используешь двоичный код по максимуму, то есть вместо написания функционала на языке 1С ты используешь функционал встроенный в платформу.
В твоём случае это связка поля артикул справочника номенклатуре с неким справочником артикулов в котором и будет по потребности заводится новый элемент с новым кодом артикула и по ссылке на который будет заполнятся текстовое поле. Уникальность кодов будет гарантировать платформа. Заведение новых кодов будет производится самой платформой. |
|||
30
palpetrovich
29.11.15
✎
17:11
|
(29) Тема конечно, я в (16) уже думал об этом! надо подумать...
|
|||
31
H A D G E H O G s
29.11.15
✎
17:30
|
(30) Сохрани ТЗ во ХранилищеСистемныхНастроек
|
|||
32
HeKrendel
29.11.15
✎
18:14
|
я конечно не программист, но нахрена перебирать все значения, если проще завести тот же регистр сведений и с него получать последний артикул и к нему добавлять единицу?
|
|||
33
Garykom
гуру
29.11.15
✎
18:20
|
(0) ТС самый правильный ответ (1), причем сразу дали его
Заводишь табличку со своими желаемыми артикулами, затем запрос между этой табличкой и "использованными артикулами" в номенклатуре Полученный список "свободных артикулов" как хочешь используй, но советую сразу после использования проверять на дубли... |
|||
34
Garykom
гуру
29.11.15
✎
19:37
|
(33)+ для тех кто не понял, в базе табличку в виде справочника или регистра
справочника лучше с числовым кодом и 1 раз ее заполняешь |
|||
35
Ildarovich
30.11.15
✎
12:42
|
Интересная задача. Я понял ее так, что дан массив "занятых" строковых артикулов, состоящих из 6-ти цифр. Требуется определить первый неиспользуемый (пропущенный) артикул.
Поскольку артикулы берутся из ИБ таблицу значений использовать нецелесообразно: на ее ввод в запрос потребуется много времени. Даже если ее где-то хранить. Можно было бы формировать эту таблицу в запросе, но без этого тоже можно обойтись. Достаточно преобразовать артикулы в числа, объединить эту таблицу с той же таблицей кандидатов, где числа увеличены на 1 и посчитать количество одних и тех же чисел в этой таблице. Там, где число встречается один раз и взято из таблицы кандидатов, и будет свободный артикул. Далее числовое значение артикула можно преобразовать в строку как в статье http://catalog.mista.ru/public/331805/ . Если в выборке артикулов написать "ДЛЯ ИЗМЕНЕНИЯ", можно ожидать, что таблица артикулов будет заблокирована для записи нового элемента. Вот получившийся запрос. Он кажется громоздким, но все операции там простые и он должен работать быстро. В принципе, его можно записать и покомпактнее на идеях из http://catalog.mista.ru/public/170336/ . Но там быстродействие будет ниже. Запрос: ВЫБРАТЬ "000001" КАК Артикул ПОМЕСТИТЬ Дано ОБЪЕДИНИТЬ ВЫБРАТЬ "000002" ОБЪЕДИНИТЬ ВЫБРАТЬ "000004" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВЫБОР ПОДСТРОКА(Дано.Артикул, 6, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ + ВЫБОР ПОДСТРОКА(Дано.Артикул, 5, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 4, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 100 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 3, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 1000 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 2, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10000 + ВЫБОР ПОДСТРОКА(Дано.Артикул, 1, 1) КОГДА "1" ТОГДА 1 КОГДА "2" ТОГДА 2 КОГДА "3" ТОГДА 3 КОГДА "4" ТОГДА 4 КОГДА "5" ТОГДА 5 КОГДА "6" ТОГДА 6 КОГДА "7" ТОГДА 7 КОГДА "8" ТОГДА 8 КОГДА "9" ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 100000 КАК Х ПОМЕСТИТЬ Числа ИЗ Дано КАК Дано ДЛЯ ИЗМЕНЕНИЯ ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Числа.Х, ЛОЖЬ КАК Свободен ПОМЕСТИТЬ ЧислаПлюс ИЗ Числа КАК Числа ОБЪЕДИНИТЬ ВЫБРАТЬ Числа.Х + 1, ИСТИНА ИЗ Числа КАК Числа ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПОДСТРОКА(ВЗ.Ц, ВЗ.Х / 100000 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.0006)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.006)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.06)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 0.6)) / 6 + 1, 1) + ПОДСТРОКА(ВЗ.Ц, СЕКУНДА(ДОБАВИТЬКДАТЕ(ВЗ.О, СЕКУНДА, ВЗ.Х * 6)) / 6 + 1, 1) КАК НовыйАртикул ИЗ (ВЫБРАТЬ ПЕРВЫЕ 1 ЧислаПлюс.Х КАК Х, "0123456789" КАК Ц, ДАТАВРЕМЯ(1, 1, 1) КАК О ИЗ ЧислаПлюс КАК ЧислаПлюс СГРУППИРОВАТЬ ПО ЧислаПлюс.Х ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = 1 И МАКСИМУМ(ЧислаПлюс.Свободен) = ИСТИНА) КАК ВЗ |
|||
36
Ildarovich
30.11.15
✎
12:50
|
+(35) Запрос можно еще отрефакторить. И условие в "имеющие" упростить. Или записать вообще без группировки через
Число + 1 НЕ В(ВЫБРАТЬ * ИЗ Числа) Но группировка надежнее, хотя и длиннее, так как нет риска попасть на сканирование таблицы "Числа". |
|||
37
RomanYS
30.11.15
✎
12:53
|
Создать регистр сведений "Свободные артикулы"
|
|||
38
H A D G E H O G s
30.11.15
✎
13:01
|
(35) Я бы постарался с человеком - написавшим такой код - не работать. Мог бы уволить - уволил бы.
|
|||
39
Ildarovich
30.11.15
✎
13:01
|
(37) В этом нет смысла: свободные артикулы ДОСТАТОЧНО БЫСТРО получаются запросом.
+(35) Сравнивая два подхода: с генерацией таблицы всех артикулов и получением следующего свободного артикула для занятых можно заметить, что если свободных артикулов немного, то победит первый подход, а если много (больше половины(?) возможных), то второй. На практике миллион занятых артикулов - маловероятная ситуация, поэтому запрос из (35) в большинстве случаев будет быстрее. |
|||
40
palpetrovich
30.11.15
✎
14:36
|
(35) спасибо за внимание, но ей-бо не стоило :)
Порешал новым справочником + ПодпискойНаСобытие с кодом Процедура ПередЗаписьюСправочникаНоменклатураПередЗаписью(Источник, Отказ) Экспорт Если ПустаяСтрока(Источник.Артикул) Тогда // создание Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 | НомераАртикулов.Код |ИЗ | Справочник.НомераАртикулов КАК НомераАртикулов | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК СпрНоменклатура | ПО НомераАртикулов.Код = СпрНоменклатура.Артикул |ГДЕ | ЕСТЬNULL(СпрНоменклатура.Ссылка, 0) = 0"; Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда Источник.Артикул = Выборка.Код; КонецЕсли; Иначе // проверка на дубли Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | СпрНоменклатура.Ссылка |ИЗ | Справочник.Номенклатура КАК СпрНоменклатура |ГДЕ | СпрНоменклатура.Артикул = &Артикул | И НЕ СпрНоменклатура.Ссылка = &Ссылка |"; Запрос.УстановитьПараметр("Артикул", Источник.Артикул); Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка); Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Сообщить("Обнаружен дубль артикула " + Источник.Артикул + " у " + Выборка.Ссылка); Отказ = ИСТИНА; КонецЦикла; КонецЕсли; КонецПроцедуры (38) извини, с ХранилищемСистемныхНастроек заморачиваться не стал, поленился :) |
|||
41
katc
30.11.15
✎
14:51
|
(40) - звание г**нокодера уже тебе присвоили?
добавить целый справочник , только что бы не думать. |
|||
42
Timon1405
30.11.15
✎
14:58
|
(41) >>добавить целый справочник , только что бы не думать.
а что в этом такого? не "не думать", а решить поставленную задачу, методом, который будет читабелен, прост и достаточно быстр, легко поддерживаемый как автором так и потомками. назовите плюсы отказаться от этого решения в угоду т.н. "негвнокодерству"? |
|||
43
asady
30.11.15
✎
15:04
|
(42) самый главный аргумент - "это не айс"
|
|||
44
viraboy
30.11.15
✎
15:25
|
Храните в регистре последний присвоенный артикул, ну или в константе.
|
|||
45
Garykom
гуру
30.11.15
✎
15:25
|
(43) если бы был простой способ запросом найти "пустые промежутки" в артикулах это был бы "айс"?
|
|||
46
palpetrovich
30.11.15
✎
15:35
|
(41) скорее уж г.конструктора, кодерство тут как-би и ни при чем
(45) мона я отвечу? был-бы "айс"! есть решение? зы кста, такой "вспомогательный" справочник вполне может быть использован для решение и других задач |
|||
47
Garykom
гуру
30.11.15
✎
15:36
|
||||
48
EugeniaK
30.11.15
✎
15:42
|
(40) Проще уже было добавить числовое поле АртикулЧислом и заполнять при записи как число от артикула. Потом тупо простым соединением артикул с артикул+1 получать минимальный незанятый артикул.
|
|||
49
palpetrovich
30.11.15
✎
16:03
|
(47) вот не поленился, почитал... поцитирую:
"Прочитал про «пул телефонных номеров» ещё раз, надо было просто создать все записи для номеров и колонку assigned(типа кому назначено, а там уже foreign key или что там нужно), если она NULL — номер пустой и выбирается тогда всё одним простым запросом." "Есть ещё один метод, который Вы не упомянули: держать отдельную таблицу с «пропущеными» номерами. Тогда INSERT будет предельно краток — берем минимальный номер из нашей таблицы, а если она пустая — то создаем новый номер. На большом кол-ве INSERT-ов это выльется в ощутимую экономию ресурсов. Обновлять таблицу тоже можно в удобное время когда есть запас по ресурсу." "Вообще, мне кажется, что держать пул всех номеров — это правильно в вашем случае. А, как уже ранее было сказано, иметь одно поле, типа client_id: либо пустое, либо с айдишником клиента. В таком случае ваша проблема не появляется." скромно так резюмирую: ничего нового я не изобрел :) (48) читать надо все-таки всю ветку :) |
|||
50
Ildarovich
30.11.15
✎
16:19
|
(46) Теперь мне непонятно: чем плохо решение из (45). Оно ПРОСТОЕ и быстрое! Не требует дополнительных структур данных. Вся "многобуквенность" решения из-за преобразования строки в число и числа в строку, которая записано громоздким для глаз, но не трудным для вычислений выражением. Его нужно воспринимать как единое целое. По сути там все так как в ссылке из (47). Получается, что нужно было всего лишь постараться записать решение понятнее. Видимо, проблема в этом.
|
|||
51
Записьдампа
30.11.15
✎
16:45
|
(50) Проблема в том, что это сферический конь в вакууме. Вместо простого решения конкретной задачи, решается непонятно что.
Представьте себе что, например, в компьютерных игрушках, для отображения огня начнут считать дифуры по сеткам и гордится этим. Вот у вас тоже самое. |
|||
52
palpetrovich
30.11.15
✎
16:49
|
(50) я может, ошибаюсь, но код в (35) ищет пропущенные в ряде, формируемом в:
ВЫБРАТЬ "000001" КАК Артикул ПОМЕСТИТЬ Дано ОБЪЕДИНИТЬ ВЫБРАТЬ "000002" ОБЪЕДИНИТЬ + Code ВЫБРАТЬ "000004" ...это мне что, 99999 раз ОБЪЕДИНИТЬ надо предварительно? |
|||
53
ejikbeznojek
30.11.15
✎
16:58
|
А чё, раз уж БыдлоКодить, создай запись в каком-нибудь мусорном регистре сведений или константу строковую,
И вбей туда обработкой 1 раз все пропущенные артикула. Получится строка "000001000005000007....0011223" и отщипывай от неё по 6 символов каждый раз как надо)) |
|||
54
Garykom
гуру
30.11.15
✎
16:58
|
Самый быстрый способ найти первое пустое, это запросом получить отсортированный список артикулов и далее в коде цикл по нему пока предыдущий артикул + 1 = текущий артикул
Все остальные методы намного медленне |
|||
55
palpetrovich
30.11.15
✎
17:06
|
(54) было-бы неплохо, однако есть одно но: Артикул - строка и владелец руками вполне может ввести нечто типа "МойСамыйЛюбимыйАрт" ...если длины строки хватит конечно :)
|
|||
56
Garykom
гуру
30.11.15
✎
17:08
|
(55) ыыы, тогда точно (54) потому что это действительно самый быстрый способ проконтролировать ввод "МойСамыйЛюбимыйАрт"
они в конце будут да и в середине на ять отлавливаются |
|||
57
Garykom
гуру
30.11.15
✎
17:09
|
(56)+ запросом быстрее когда список артикулов свободных нужен, причем полный
|
|||
58
Бубка Гоп
30.11.15
✎
17:11
|
(0) я за РС. Зачем изобретать велосипед?
|
|||
59
palpetrovich
30.11.15
✎
17:17
|
(57) не, вообще мысль в 54 здравая, но есть еще одно но, сортировка строк в 1с прикольная :)
100 1000 101 102 (58) сделал справочник без наименования и реквизитов |
|||
60
Записьдампа
30.11.15
✎
17:19
|
(54) Блд.
Самый быстрый способ найти первое пустое, это хранить в номенклатуре два значения артикула - текущий актуальный и заранее рассчитанный "следующий". И написать запрос попадающий в индексы. Скажите уже наконец, как называется ваш продукт, я уже не хочу им пользоваться =) |
|||
61
palpetrovich
30.11.15
✎
17:23
|
(60) "хранить в номенклатуре два значения артикула - текущий актуальный и заранее рассчитанный "следующий""
Блд. я уже не хочу вам его продавать :) |
|||
62
Garykom
гуру
30.11.15
✎
17:27
|
(59) в данном случае совершенно правильная сортировка строк
если работаем с символьными строками а не числами то просто функция итерации строк своя и все AAA -> AAB -> AAC |
|||
63
Garykom
гуру
30.11.15
✎
17:28
|
(62)+ а если у нас числа записанные как строки то предварительно привести к одному виду с нужным числом "0" впереди
|
|||
64
Ildarovich
30.11.15
✎
18:08
|
(52) Начало запроса для проверки его работы в консоли. Так все делают. Вам это не нужно. Вам нужно сразу со второго запроса пакета начинать. Где артикулы из базы читаются.
|
|||
65
Ildarovich
30.11.15
✎
18:11
|
(54) Какие все остальные? В (35) ГОТОВЫЙ ЗАПРОС. Скопируйте его в консоль и проверьте. Он работает. Работает быстро. Трудозатраты пропорциональны числу занятых артикулов.
|
|||
66
Ildarovich
30.11.15
✎
18:12
|
+(64) Вместо таблицы Дано свою таблицу подставьте.
|
|||
67
Записьдампа
30.11.15
✎
18:19
|
(61) Так те, кто такое пишет еще и самостоятельно это продают? =)
|
|||
68
palpetrovich
30.11.15
✎
18:36
|
(66) стоп, я наверное что-то не так понял, таблица "Дано" для кода в (35) это что уже заполненные артикулы?
|
|||
69
palpetrovich
30.11.15
✎
18:49
|
(68) проверил, для существующих Артикулов
1001, 1002, 1003, 1008.... 12345 запрос из (35) возвращает 100401 а код из (40) вполне ожидаемо возвращает 1004 вот спрашивается, нафига козе баян :) |
|||
70
Ildarovich
30.11.15
✎
20:12
|
(69) Да, я проявил невнимательность. Код, приведенный в (35) рассчитан на определение пропусков у артикулов "000000", "000001", "000002", "000003", "000004", ..., "100000", "100001" и так далее. То есть длина строки полагалась равной 6. Как у кодов справочника длиной 6.
С точки зрения приведения к длине 6 в ряду 1001, 1002, 1003, 1008.... 12345 свободным считается 100101. Нет проблем сделать длину равной 5, как у Вас, но вот сделать ее переменной? - Чтобы они шли как числа - без ведущих нулей? - Тут запрос придется переделать. Обязательно сделаю это. Чуть позже. |
|||
71
Drac0
30.11.15
✎
20:22
|
(40) А что там будет если два человека одновременно запишут новые элементы?
|
|||
72
Записьдампа
30.11.15
✎
22:29
|
(71) Не мешай дядькам расставлять восемь сферических ферзей на трёхсторонней шахматной доске!
|
|||
73
Ildarovich
01.12.15
✎
10:29
|
(69)
+(70) Преобразование в число чуть усложнится, если допустить разную длину артикулов на входе (от 1 до 5). С другой стороны запрос из (35) можно упростить. За счет того, что пропущенный артикул достаточно вернуть из запроса и в виде числа. Громоздкое преобразование из числа в строку в запросе делать вообще не нужно! Также можно пожертвовать усложнениями, необходимыми для стабильности скорости выполнения в файловом режиме и в разных СУБД, отказавшись от приема с группировкой. Тогда запрос станет совсем понятным: ВЫБРАТЬ "1001" КАК Артикул ПОМЕСТИТЬ Строки ОБЪЕДИНИТЬ ВЫБРАТЬ "1002" ОБЪЕДИНИТЬ ВЫБРАТЬ "1003" ОБЪЕДИНИТЬ ВЫБРАТЬ "12345" ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ( ВЫБОР ПОДСТРОКА(Артикул, 5, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ + ВЫБОР ПОДСТРОКА(Артикул, 4, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10 + ВЫБОР ПОДСТРОКА(Артикул, 3, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 100 + ВЫБОР ПОДСТРОКА(Артикул, 2, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 1000 + ВЫБОР ПОДСТРОКА(Артикул, 1, 1)КОГДА "1"ТОГДА 1 КОГДА "2"ТОГДА 2 КОГДА "3"ТОГДА 3 КОГДА "4"ТОГДА 4 КОГДА "5"ТОГДА 5 КОГДА "6"ТОГДА 6 КОГДА "7"ТОГДА 7 КОГДА "8"ТОГДА 8 КОГДА "9"ТОГДА 9 ИНАЧЕ 0 КОНЕЦ * 10000 ) / ВЫБОР ПОДСТРОКА(Артикул, 5, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ / ВЫБОР ПОДСТРОКА(Артикул, 4, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ / ВЫБОР ПОДСТРОКА(Артикул, 3, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ / ВЫБОР ПОДСТРОКА(Артикул, 2, 1)КОГДА ""ТОГДА 10 ИНАЧЕ 1 КОНЕЦ КАК Артикул ПОМЕСТИТЬ Числа ИЗ Строки ДЛЯ ИЗМЕНЕНИЯ ; ///////////////////////////////////////// ВЫБРАТЬ ПЕРВЫЕ 1 Артикул + 1 КАК НовыйАртикул ИЗ Числа ГДЕ Артикул + 1 НЕ В (ВЫБРАТЬ * ИЗ Числа) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |