Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перерасчет нумерации, перерасчет нумерации при удалении записи 
:(
    Опции темы
Свят86
Дата 31.1.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



Здравствуйте.
появилась потребность организовать пересчет нумерации после удаления записи, столкнулся с двумя проблемами:
1. Как вызвать событие пересчета после удаления записи? (не критично можно вызвать по получению фокуса и т.д.)
2. Нумерация имеет текстовый вид и выглядит таким образом:

1
2
2.1
2.2
3
4
4.1
4.2.1
4.2.2
4.2.3
5
6

после удаления 3, должно получиться  

1
2
2.1
2.2
3
3.1
3.2.1
3.2.2
3.2.3
4
5

после удаления 3.2.1 должно получиться

1
2
2.1
2.2
3
3.1
3.2.1
3.2.2
4
5

вот в таком духе...
пока в мыслях вытаскивать из таблицы нумерацию, расчленять номер на составляющие и уже проверять правильный ли номер и менять его при необходимости.

PM MAIL   Вверх
Akina
Дата 31.1.2012, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Свят86 @  31.1.2012,  16:46 Найти цитируемый пост)
Как вызвать событие пересчета после удаления записи?

Зависит от того, как именно удаляется запись. Триггеров в Аксессе нет.

Цитата(Свят86 @  31.1.2012,  16:46 Найти цитируемый пост)
Нумерация имеет текстовый вид и выглядит таким образом:

Застрелитесь. Или измените способ хранения данных.
Или пишите свою функцию пересчёта. Hint - новый номер однозначно и очень просто определяется старым номером и номером удаляемой записи.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
bopoha
Дата 31.1.2012, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

Репутация: 21
Всего: 21



Пересчитывать "руками" и в функции удаления. В принцепе ничего сложного!
PM MAIL WWW ICQ Skype GTalk   Вверх
Свят86
Дата 1.2.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



чет я не нашел вызова на удаление записи (2010 access) , но да ладно.

Akina,   к сожалению структуру менять нельзя... а вариант застрелиться нужно рассмотреть поподробнее! smile

пока мысли такие:
сделать трехмерный массив, в который загнать номера в итоге получиться:

100
200
210
220
300
400
410
421
422
423
500
600

вот сижу и думаю как сделать проверку на удаление и перерасчет...
PM MAIL   Вверх
Akina
Дата 1.2.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Свят86 @  1.2.2012,  11:04 Найти цитируемый пост)
пока мысли такие:
сделать трехмерный массив, в который загнать номера в итоге получиться:

Хреново...

Повторю:
Цитата(Akina @  31.1.2012,  22:06 Найти цитируемый пост)
пишите свою функцию пересчёта. Hint - новый номер однозначно и очень просто определяется старым номером и номером удаляемой записи. 

Составьте чёткое правило - что и как пересчитывается. Оно настолько простое, что даже подсказывать не буду.
А когда будет правило - напишите функцию в модуле и используйте её в запросе на обновление после выполнения удаления.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 1.2.2012, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



походу я туплю но что за Hint? поиск в справке результата не дал, на форуме как-то тоже... можно поподробнее или ссылку?
PM MAIL   Вверх
Akina
Дата 1.2.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Hint (англ.) - намек, подсказка, совет.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Свят86
Дата 1.2.2012, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



smile))
в общем решил не трехмерным массивом сделать а тремя одномерными чтоб проще было соображать.
разбивку на составляющие сделал, проверку на порядок нумерации тоже, но есть косяк и вот уже час сижу не могу догнать как его убрать...

вот код:
Код

for j=1 to 100
if ((a(j) <> a(j-1)+1) And (a(j) <> a(j-1)) And (a(j) <> 0)) then a(j) = a(j-1) + 1
if ((b(j) <> b(j-1)+1) And (b(j) <> b(j-1)) And (b(j) <> 0)) then b(j) = b(j-1) + 1
if ((c(j) <> c(j-1)+1) And (c(j) <> c(j-1)) And (c(j) <> 0)) then c(j) = c(j-1) + 1
next j


где a,b,c - массивы содержимого колонок.
косяк получается в такой ситуации 

1
2
2.1
2.2
2.2.1
2.3
2.4
2.4.1
2.4.2
3
4

после удаления 2.3
получается
1
2
2.1
2.2
2.2.1
2.3
2.4.1    тут должно быть 2.3.1
2.4.2                                 2.3.2
3
4

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

PM MAIL   Вверх
Свят86
Дата 1.2.2012, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.12.2008

Репутация: нет
Всего: нет



в общем пока нашел такое решение, вроде все работает:

Код

for j=1 to 100
if (b(j) <> 0) then a(j) = a(j-1)
if ((a(j) <> a(j-1)+1) And (a(j) <> a(j-1)) And (a(j) <> 0)) then a(j) = a(j-1) + 1
if (c(j) <> 0) then b(j) = b(j-1)
if ((b(j) <> b(j-1)+1) And (b(j) <> b(j-1)) And (b(j) <> 0)) then b(j) = b(j-1) + 1
if ((c(j) <> c(j-1)+1) And (c(j) <> c(j-1)) And (c(j) <> 0)) then c(j) = c(j-1) + 1
next j

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0522 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.