Обычно есть «номер договора» — который печатают в документах и в нём могут быть буквы, и id договора — целочисленное поле. Оба поля уникальны в таблице договоров (либо поле номер не уникально, если в таблице хранятся и те договора, номер которых формирует контрагент — тогда есть шанс что два разных контрагента одинаково назовут договор с вами). Это более-менее стандарт…
Дату нельзя использовать для определения порядка следования, я дважды написал, почему.
Если менеджер носит свой ноутбук и заключает договора в тех местах где не всегда ловит интернет, добавьте UID.
А причем, я извиняюсь, тут РР?! РР фиксирует результаты в виде записей КУ и ГРП.
Вот именно. По одной и раздельно. А у меня в примере — транзакция, с вложенной транзакцией внутри неё, и блоком TRY-EXCEPT. И этого он не может. И я описал негативные последствия.
ОК, редактируется вручную при первом вводе клиента, далее не редактируется. Всё равно договор привязан к клиенту не по RgKpt а по id. Да, при такой конфигурации в таблице два уникальных поля. Но вы же не будете ссылаться на эту таблицу из других таблиц через поле-текст?
Самое простое — Назначать клиенту с названием «ООО Рога и Копыта» буквенный номер договора, образованный транслитом по первым 5 согласным названия: Договор RgKpt-0001, договор RgKpt-0015…
Сокращение хранить в базе как атрибут клиента, который редактируется вручную и должен быть уникальным.
А там, по задаче. Если не всегда есть интернет — формировать UID, если делать примитивно — то xor 1234567, и так далее по обстоятельствам.
Если надо показать себя крутым — то *1000+rand(1000) :)
Представьте что функция упаковывает переданные в неё договора в email письмо и отсылает директору. Зачем ему 250 писем вместо одного письма? Если он попросил один договор прислать, то ему пришлют. При чём тут глобальные переменные…
Они не заключаются одновременно, а вводятся. Например при заливке выполненных работ в систему учёта рабочего времени.
Про даты: а если той же функцией надо обработать 1 договор?
>> Что если в одном из договоров ошибка, а в других все нормально?
Это не повод для delete. В серьёзных системах никогда ничего не delete. Выставляют состояние — ошибка, удалён, клиент передумал, менеджер выдумал договор который не заключался, и всё такое.
Кстати, а как вы без даты создания узнаете что диапазон договоров за эту дату начинается именно с 20115 и заканчивается на 20267?
Никак. Но мне не придётся передавать в функцию список id. Я передам два числа, от и до.
Показывать события в нужной последовательности можно и с помощью datetime_creation.
сказано выше:
время на компьютере меняется квантами (в винде в зависимости от настройки это от 10 до 55 милисекунд) то есть близкие по времени записи будут не в том порядке.
Например, менеджер заполнил форму о заключённых 5 договорах и нажал ОК. В системе они появились одновременно, но с порядком следования. Порядок следования будет потерян.
Чтобы договор номер 2 не создавался раньше договора номер 1?
Чтобы логировать и показывать события в правильной последовательности?
Чтобы 18 марта 2019 года фирма заключала договора от 20115 до 20267, а не перечислять их номера через запятые?
Поле datetime_creation всё равно делать, чтобы помнить дату и время. Но это не гарантирует правильный порядок, как я показал выше.
Я вам назвал 4 причины, вы вместо того чтобы ответить продолжаете навешивать ярлыки. Вы институтский преподаватель?
Имеющий дыры — промежутки праймари кей работает медленнее — это из практики, не теории. Что вы выигрываете своим методом? Скорость добавления в базу? Для закачки больших массивов данных используют BCP.
>> Гораздо лучше взять из базы значение последовательности, а идентификатор новой записи вычислять как S*1000+i, где i – номер вставляемой записи. Как тысячу записей вставили – взяли новый элемент последовательности.
Если так сделать, order by id не будет обеспечивать исторический порядок вставок в таблицу. Плюс проблемы со скоростью из-за дырок. Придётся делать order by datetime_creation, каковое поле может отсутствовать, это более ресурсоёмко, плюс учитывайте что время на компьютере меняется квантами (в винде в зависимости от настройки это от 10 до 55 милисекунд) то есть близкие по времени записи будут не в том порядке.
2. Так это всё равно все фирмы делают, но во всех проектах по-разному. Почему не встроить в БД? В одном городе снесли все ограды и дорожки, а затем по протоптанным людьми тропинкам положили новые. Вот, если все люди топают по одной и той же тропинке, почему её не проложить как надо, организованно и стандартно?
3. Не думаю, что создать запись и в той же команде узнать её id (создаваемый автоинкрементно, в случае оракла через сиквенс) это странный запрос. Это самый распространённый запрос. Который хочется написать в PL/SQL Developer в одну строку, без создания переменной, вывода её значения и прочих шаманских танцев.
Человек не может и не будет менять код сторонних библиотек, подключенных как исходники. Хотя бы потому, что после такого изменения он не сможет обновлять их версию. Желательно, чтобы это делал именно линковщик при сборке версий.
Основные точки возникновения нигде не вызваемых озёр кода — это именно стык разных систем от разных команд.
На свете очень мало ресурсоёмких задач, требующих именно последовательного выполнения одним процессором. Где стоит задача ресурсоёмкости, прекрасно справится облако из 100500 примитивных типа-компьютеров. Причём все эти мини-компьютеры ещё и ценят своё время и силы, выбирая себе задачи с учётом вознаграждения. Именно так работают нейроны человеческого мозга. Задача о перемножении матриц похожа на то как если бы кучу народа посадили на фабрику за одинаковые станки. Есть более интересные ресурсоёмкие задачи.
И все эти файлы (dll,dcu,bpl) — библиотеки. Словом библиотека назвают не только то, что идёт юзеру в неизменном виде. И то я перечислил только варианты без открытых исходников и только те с чем работаю.
Можно сконфигурировать проект, чтобы bpl хранились у конечного пользователя и подключались в рантайме. Это способ разгрузить ОЗУ и сократить время загрузки, если у пользователей разная специализация — не всем нужно всё. Именно так работает банковская система в крупнейшем негосударственном банке, где я работал.
Нет, я констатировал, что библиотеки dll поставляются с лишними функциями, но ведь существуют также и другие виды библиотек, при работе программиста с которыми, конечные пользователи лишних функций не получают. Это dcu и bpl. И я говорю только о вариантах, где не предоставляются исходники. И только то что хорошо знаю, наверняка есть уйма других типов файлов такого рода.
Как в случае рисования фигур, так и в случае распознавания символов, выбор нужного функционала из более обширного (для включения в проект) это отсечение лишних данных, а не программного кода.
Библиотека может быть скомпилирована в dcu, dll или bpl. Все три варианта есть компиляция. Но первый вариант затем проходит через отсечение лишнего и включается в exe, а dll нет. С библиотеками bpl можно и так и так.
Кстати, более широкий чем нужно набор вводимых рукописных символов не только утяжеляет код, но и приводит к ухудшению качества распознавания.
Дату нельзя использовать для определения порядка следования, я дважды написал, почему.
Если менеджер носит свой ноутбук и заключает договора в тех местах где не всегда ловит интернет, добавьте UID.
Сокращение хранить в базе как атрибут клиента, который редактируется вручную и должен быть уникальным.
А там, по задаче. Если не всегда есть интернет — формировать UID, если делать примитивно — то xor 1234567, и так далее по обстоятельствам.
Если надо показать себя крутым — то *1000+rand(1000) :)
Про даты: а если той же функцией надо обработать 1 договор?
>> Что если в одном из договоров ошибка, а в других все нормально?
Это не повод для delete. В серьёзных системах никогда ничего не delete. Выставляют состояние — ошибка, удалён, клиент передумал, менеджер выдумал договор который не заключался, и всё такое.
Чтобы логировать и показывать события в правильной последовательности?
Чтобы 18 марта 2019 года фирма заключала договора от 20115 до 20267, а не перечислять их номера через запятые?
Поле datetime_creation всё равно делать, чтобы помнить дату и время. Но это не гарантирует правильный порядок, как я показал выше.
Я не знаю точно, почему так.
Имеющий дыры — промежутки праймари кей работает медленнее — это из практики, не теории. Что вы выигрываете своим методом? Скорость добавления в базу? Для закачки больших массивов данных используют BCP.
Если так сделать, order by id не будет обеспечивать исторический порядок вставок в таблицу. Плюс проблемы со скоростью из-за дырок. Придётся делать order by datetime_creation, каковое поле может отсутствовать, это более ресурсоёмко, плюс учитывайте что время на компьютере меняется квантами (в винде в зависимости от настройки это от 10 до 55 милисекунд) то есть близкие по времени записи будут не в том порядке.
3. Не думаю, что создать запись и в той же команде узнать её id (создаваемый автоинкрементно, в случае оракла через сиквенс) это странный запрос. Это самый распространённый запрос. Который хочется написать в PL/SQL Developer в одну строку, без создания переменной, вывода её значения и прочих шаманских танцев.
Иногда нужен не именительный падеж. «Второго апреля», «Восьмого марта».
>> 3. Начиная с 11g точно есть, раньше – лень смотреть
Returning без into? Просто выдающий данные, как это делает Select? Можно пример?
У нас в текущей системе как раз 11g.
Основные точки возникновения нигде не вызваемых озёр кода — это именно стык разных систем от разных команд.
Можно сконфигурировать проект, чтобы bpl хранились у конечного пользователя и подключались в рантайме. Это способ разгрузить ОЗУ и сократить время загрузки, если у пользователей разная специализация — не всем нужно всё. Именно так работает банковская система в крупнейшем негосударственном банке, где я работал.
Библиотека может быть скомпилирована в dcu, dll или bpl. Все три варианта есть компиляция. Но первый вариант затем проходит через отсечение лишнего и включается в exe, а dll нет. С библиотеками bpl можно и так и так.
Кстати, более широкий чем нужно набор вводимых рукописных символов не только утяжеляет код, но и приводит к ухудшению качества распознавания.