powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DefaultValue
46 сообщений из 46, показаны все 2 страниц
DefaultValue
    #32160351
Grechuhin Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как задать значение по умолчанию числовому полю равное значению этого же поля предыдущей записи + 1.
Есть таблица:
11 вапвап
12 варвр
13 авпва
14 авп
21 екн
22 аар
При добавлении новой записи надо, чтобы в 1 поле по умолчанию появилось значение 23.
...
Рейтинг: 0 / 0
DefaultValue
    #32160362
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
99%, что это невозможно. Таблица не знает, что такое предыдущая запись. Визуальный порядок записей на экране - это еще не все.
...
Рейтинг: 0 / 0
DefaultValue
    #32160368
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использвовать DMax(...)+1
Можно использовать временную таблицу для хранения последнего значения
Можно использовать счетчик, но тогда возможны пропуски
Ну, пока хватит...
...
Рейтинг: 0 / 0
DefaultValue
    #32160374
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опаньки.... я слова "предудущей" записи я не заметил.

Grechuhin Anton тебе это число для чего нжно-то?
...
Рейтинг: 0 / 0
DefaultValue
    #32160377
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Саныч
Через форму - можно. На BeforeUpdate смотреть в RecordsetClone.

2 Сенен Виктор
DMax+1 - не удовлетворяет. Надо не максимальное + 1, а последнее + 1.
...
Рейтинг: 0 / 0
DefaultValue
    #32160384
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
> Через форму - можно. На BeforeUpdate смотреть в RecordsetClone.

Да, я об этом подумал. Но наружу не вышло. :^)
...
Рейтинг: 0 / 0
DefaultValue
    #32160390
G&P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир Саныч, а если использовать формочку для ввода новой записи, то вполне даже можно...
Или я не прав?
...
Рейтинг: 0 / 0
DefaultValue
    #32160393
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Лоху
>Через форму - можно. На BeforeUpdate смотреть в RecordsetClone.

А если база в сети, и кто-нить в таблицы записей наставляет?
Пока набор не обновиться будет лажа.

И вообще это херня полная "последнее"+1 искать.
Grechuhin Anton ты бы нам объяснил че ты все-таки хочешь, а то у меня такое ощущение что это тебе нафиг не нужно, а нужен просто последовательный счетчик.
...
Рейтинг: 0 / 0
DefaultValue
    #32160407
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если база в сети, и кто-нить в таблицы записей наставляет?
Пока набор не обновиться будет лажа.

Ну и кто ж его знает тогда, какая из них последняя

По моему, автор топика нас испугался и убежал
...
Рейтинг: 0 / 0
DefaultValue
    #32160437
Grechuhin Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моему, автор топика нас испугался и убежал
Не думал, что так быстро ответите :)
Зачем мне это надо:
Есть куча анкет, информацию из которых надо поместить в бд. У каждой анкеты - свой номер, обычно номера идут по-порядку. В принципе номер можно вводить и ручками, но для облегчения работы хотелось бы чтобы это делалось автоматически...
...
Рейтинг: 0 / 0
DefaultValue
    #32160444
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Счетчик тебя спасет
Или, если не счетчик, то все равно значение по умолчанию тебе не нужно. Нужно автоматическое присвоение следующего номера. На BeforeInsert - номер присваивай DMax([Номер]) + 1
...
Рейтинг: 0 / 0
DefaultValue
    #32160467
Grechuhin Anton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.
Сделал через DMax() - не совсем то, что хотел, но и так неплохо.
...
Рейтинг: 0 / 0
DefaultValue
    #32160493
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
2 G&P

Ну так я и говорю...
...
Рейтинг: 0 / 0
DefaultValue
    #32160496
igol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a function DLast() +1
...
Рейтинг: 0 / 0
DefaultValue
    #32160498
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, кто, как делает. Мне пока не было нужды, но может появиться. Например, накладные. Нумерация начинается каждый год с начала года (значит не счетчик). Конечно, что первое приходит в голову - Recordset и DMax(). Но может есть интереснее варианты?
...
Рейтинг: 0 / 0
DefaultValue
    #32160507
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 igol
Цитата из хелпа
"Функции DFirst и DLast используют для возвращения значений из
Код: plaintext
случайно выбранных записей
определенного поля в таблице или запросе"
Мыслю я, что случайно выбранные записи - точно не нужны
...
Рейтинг: 0 / 0
DefaultValue
    #32160521
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У DMax можно указать критерий отбора.
Код: plaintext
1.
nz(Dmax( "МойСчетчик" ,  "МояТаблица" , "DatePole >=#"  Year(Date())), 0 )

Вернет максимальное значение счетчика (если его нет, то 0) за текущий год. Это, конечно, не готовое решение, просто один из вариантов...
...
Рейтинг: 0 / 0
DefaultValue
    #32160525
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Есть еще одно решение, но оно совершенно сумасшедшее.

1. Ctrl+' заносит в поле значение из предыдущей строки - эта штука встроенная.

2. Написать на KeyPress или KeyDown процедурку, которая при нажатии, скажем, Ctrl+L берет значение поля и добавляет к нему 1.

И нажимать каждый раз в этом поле подряд Ctrl+' и Ctrl+L.
...
Рейтинг: 0 / 0
DefaultValue
    #32160527
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опс, чего то намудрил, правильно будет

Код: plaintext
1.
2.
3.
4.
5.
nz(
Dmax(
 "МойСчетчик" ,  "МояТаблица" ,
 "ПолеДата >=#"  DateSerial(Year(Date()), 1 , 1 ) &  "#" ))

...
Рейтинг: 0 / 0
DefaultValue
    #32160537
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нумерация начинается каждый год с начала года - пережитки прошлого. Нет необходимости, не вручную же нумируются.
...
Рейтинг: 0 / 0
DefaultValue
    #32160558
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V. Motchulsky

"Если Вы не всилах остановить лавину - не пытайтесь ей противостоять". Иногда клиентам не интересно наше мнение о пережитках. Изживать их у себя, во всяком случае, пока "жареный петух не клюнет", они не собираются. Вместо сеанса психотерапии они ждут от нас нечто другое. Если за это нечто платят, чего бы его не сделать (желательно с наименьшими затратами времени и сил)?
...
Рейтинг: 0 / 0
DefaultValue
    #32160560
ХЪ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одной программе пришлось убрать нумерацию с начала года.
Заказчик потребовал: однажды он клиента потерял из-за этого. Тот увидел в феврале накладную с номером то ли 30 то ли 40, и подумал "На хрен мне такая фирма, у которой за месяц 40 продаж" и свалил...
А вот был бы номер 23423 - хрен бы он свалил - психология!
...
Рейтинг: 0 / 0
DefaultValue
    #32160597
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже все-таки DMax(). Хотя недавно столкнулся с такой фигней при использовании этой функции.
На форме две субформы: "Действия" и "Операции" - отображают данные соответствующих таблиц. 1 со 2 связаны отношением один-ко-многим по полю "КодДействия" . На событие текущая запись 1-й - Requery 2-й. В субформе "Операции" в свойстве "значение по умолчанию" поля "№" - функция Dmax("№", "Операции", "КодДействия = " & Forms!Задачи!Действия.Form.КодДействия)+1
Закономерность так и не уловил - иногда возвращает значение без +1 (устанавливал +2, тогда нормально), а иногда с +1. Тогда если было установлено +2 - значение было на 2 больше максимального.
Не стал ковыряться, перешел на Recordset, но интерес (почему?) так и остался.
...
Рейтинг: 0 / 0
DefaultValue
    #32160638
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иногда клиентам не интересно наше мнение о пережитках. Иногда да, но в большинстве случаев у них нет вообще полностью СФОРМИРОВАНОГО мнения. И если вы задаете им вопрос, надо ли нумеровать с нового года по новому, тем самим наталкиваете их на мысль а может надо. Лучше сказать "нет необходимости начинать нумерацию с каждого года по новому, так как компютер успешно с этим справляется и во всех продвинутых фирмах этого больше уже не делают."
...
Рейтинг: 0 / 0
DefaultValue
    #32160641
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, и еще клиенту сказать, что счета-фактуры все равно нумеруются с начала года, и по фиг, продвинутая у вас фирма или нет - законы у нас такие.
...
Рейтинг: 0 / 0
DefaultValue
    #32160654
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вовремя обсуждения, то согласен. А если: "Меня не интересует как в других. Хочу только так и не иначе?". Можно, конечно, сменить клиента... Но спорить с ним, почему ему так удобнее...
...
Рейтинг: 0 / 0
DefaultValue
    #32160906
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу только так и не иначе - то уж никуда не денишся. Можно как предложил Senin Viktor. Только в сети могут возникнуть проблемы - один пользователь считал значение, второй считал, первый записал, второй увы...
...
Рейтинг: 0 / 0
DefaultValue
    #32160915
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И при наличии уникального индекса один из пользователей будет послан и нажмет кнопку еще раз. Ничего страшного.
Или делать счетчик. Только не забыть, что от необходимости создания уникального индекса счетчик не избавляет.
...
Рейтинг: 0 / 0
DefaultValue
    #32160941
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Витал
"Закономерность так и не уловил - иногда возвращает значение без +1 (устанавливал +2, тогда нормально), а иногда с +1. Тогда если было установлено +2 - значение было на 2 больше максимального.
"

Дык Dmax по табличке ищет :). Т.ч. результат означает, что на момент поисков данное ("предыдущее") не сохранено - и плюсует к последнему сохраненному... А вот почему там бывает несохраненка - скорей всего, ежели вы принудительно не сохранялись, то и "значение по умолчанию" в форму проставилось, но в запись (так и не записанную) не попало, надо думать...
...
Рейтинг: 0 / 0
DefaultValue
    #32160966
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все может быть, все может статься... Закономерности и я не уловил. Может это глюк ХР? Бывает при открытии формы (еще ничего не делал) - значение по умолчанию DMax(), хотя в свойствах DMax()+1. Меняю на DMax()+2. При открытии получаю по умолчанию DMax()+1. Выбираю другую запись в субформе "Действие" - получаю в субформе "Операции" по полю № значение по умолчанию DMax()+2. Правда не помню ставил Recalc по этому полю в проце Form_Current?!!
...
Рейтинг: 0 / 0
DefaultValue
    #32160980
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нежелание сохранять - "глюк ХП", то "все может статься". :)
...
Рейтинг: 0 / 0
DefaultValue
    #32160981
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 V. Motchulsky

>. Только в сети могут возникнуть проблемы - один пользователь считал значение, второй считал, первый записал, второй увы...

Легко решаются эти "сетевые" проблемы. В случае возникновения ошибки, прога сама добавляет еще +1 и опять пытается сохранить. И так далее. Правда вставил ограничение не более 5 попыток (что-то побоялся в случае какой-либо заподлянки уйти в непрерывный цикл)

З.Ы.
Правда у меня не DMax работает - слишком, гад, меленный для сети - а его аналог, на основанный на DAO - работае в несколько раз быстрее.

З.Ы.Ы.
Хотя я и предлагал заказчику не использовать самодельный счетчик, а пользоваться встроенным, он отказался, сославшися, что пользователи должны сами управлять номерами документов, только после одной неразберихи (два юзера напеременяли так, что потом неделю разбирались), отказался - да поздно - убрать уже не получится - слишком много завязано ( бум. документов) на этот суррагатный счетчик. Заменить-то можно, я даже готов - только им почему-то моя цена не понравилась . так и живут...

Мораль: сами придумайте...
...
Рейтинг: 0 / 0
DefaultValue
    #32160996
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assa
Если нежелание сохранять - "глюк ХП", то "все может статься". :)

Что сохранять??? Еще ничего нового не вводил!!!
...
Рейтинг: 0 / 0
DefaultValue
    #32161010
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Витал
не думаю, что Recalc сохраняет запись...
...
Рейтинг: 0 / 0
DefaultValue
    #32161018
Хам трамвайный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, развели
разговор
на целый бор
dmax ставьте не
на значение по умолчанию
а на "до обновления" формы
(причем событие должно
срабатывать тока
для новой записи)
вот тогда она
действительно вернет
последнее
даже если одновременно
2 юзверя будут
вводить новую строку
давно уже обсуждавшаяся
тема
всплывает через
какое-то время
с завидным постоянством
...
Рейтинг: 0 / 0
DefaultValue
    #32161029
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Сенин Виктор
Я тоже счетчики не люблю. Слишком уж они криво в аксесе реализованы.

2 Зам Трамвайный
И с какой же стати на событии до обновления гарантировано вернет разные значения для двух юзеров? Те же яйца и получатся - два юзера одновременно выполнят один и тот же запрос, получат одинаковые значения и один обломается. Другое дело что вероятность этого уменьшается, т.к. длительность глюкоопасного куска мала.
...
Рейтинг: 0 / 0
DefaultValue
    #32161046
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Хаму трамвайному
"Ударим трамваем по бездорожью!!!" Если тема все время всплывает "...с завидным постоянством" значит она ... то, что не тонет... в молоке и завидовать ей не стоит. Совет про BeforeUpdate с удовольствием принимается. Так что просьба хамить дальше, больше, круче и чаще.

>assa
Для синхронизации субформ на событие Current формы подвешена процедурка SubForm.Requery, а Recalc - как сейчас думаю мог бы помочь (или не мог бы) обновить значение по умолчанию (пересчитать) в поле по аналогии со списками. И вообще-то не блокировал я сохранение записи при переходе к следующей.
...
Рейтинг: 0 / 0
DefaultValue
    #32161199
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему тут две проблемы
1 если использовать Dmax (mdb, база ~20-50m, слабые клиенты fsb=66Mz)
то есть вероятность что два клиента начнут искать максимум с небольшим промежутком времени и не известно который из них наудет первым и успеет записать измененный номер первым. и запишет новый и попадет ли новый в поиск другого. случаи редкие тно в практике встречались при 2 клиентах примерно раз в полгода при ~20 записях в день на двоих.
для бухгалтерии это сами понимаете...
2 пусть будет Dmax - отработал нормальна. первый клиент увеличил номер.
к нему (к ней ) приблизил() особь противоположного пола минут на 5. разговор за жизнь. в это время второй клиент ищет мах и находит такой-же номер увеличивает и бысто записывает. потом записывает 1 клиент.
опять 2 одинаковых.

надо искать бысто и сразу производить запись, что бы "застолбить новый номер" , а потом редактировать остальные поля в этой записи. а на время поиска мах и его записи блокировать табл.
...
Рейтинг: 0 / 0
DefaultValue
    #32161209
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Для тех, кто не против счетчиков в принципе, а только против поля типа счетчик в данной таблице, - предлагаю вашему вниманию:

1. Заводим таблицу с одним полем типа счетчик и без записей, назовем ее Cou. Ее надо поместить в отдельном mdb и никогда его не сжимать (а его размер увеличиваться и не будет).

2. В той таблице, которую мы заполняем, даем полю значение по умолчанию MyCou() и запираем его от редактирования.

3. И вот сама функция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Function MyCou() As Long
With CurrentDB.OpenRecordset( "Cou" )
    .AddNew
    MyCou = .Fields( 0 )
    ' главное, что тут никакого Update не нужно
    .Close
End With
End Function
...
Рейтинг: 0 / 0
DefaultValue
    #32161214
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Владимир Саныч
механизм вот этого
' главное, что тут никакого Update не нужно
.Close
почему? поподробнее плииззз.
...
Рейтинг: 0 / 0
DefaultValue
    #32161219
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Механизм следующий: при каждом AddNew увеличивается на единицу то значение, которое будет возвращено, однако благодаря отсутствию Update размер таблицы не растет. А файл запрещено сжимать потому, что при сжатии это очередное готовое к выдаче значение счетчика обнулится.
...
Рейтинг: 0 / 0
DefaultValue
    #32161237
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, мороки в этих MDB, в ADP все проще. Все равно как лучь света в темном царстве.
...
Рейтинг: 0 / 0
DefaultValue
    #32162196
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
V. Motchulsky
ну раз сказал....
так предложи вариант. все знют - проще...
а раз начал, так скажи почему проще.
раз разговор идет - значит грабли еще не убрали...
...
Рейтинг: 0 / 0
DefaultValue
    #32162244
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В ADP написал процедурку которая ведет счетчики и вызывай когда надо, где то я ее уже писал. Если надо еще раз напишу. Только тут разговор про ADP не идет.
...
Рейтинг: 0 / 0
DefaultValue
    #32162380
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2V. Motchulsky
ADP not ADP
все равно все начинают косить глаза в сторону ADP
так что выкладывай (не скромничай )
...
Рейтинг: 0 / 0
DefaultValue
    #32162571
V. Motchulsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну тут нефиг скромничать, тут не я придумал, из сайта М$
ALTER proc GetNextIdentity @ForTable sysname, @Value int OUTPUT
AS
set nocount on
begin tran
/* if this is the first value generated for this table, start with zero */
if not exists (select * from IdentityTable where ForTable = @ForTable)
insert IdentityTable (ForTable, Value) values (@ForTable, 0)
/* update must be before select to issue a lock and prevent duplicates */
update IdentityTable
set Value = Value + 1
where ForTable = @ForTable
select @Value = Value from IdentityTable
where ForTable = @ForTable
commit tran
return @value
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / DefaultValue
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]