Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft Access Новый топик    Ответить
 Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
Добрый день!
Есть запрос который формирует данные с двумя столбцами Name и M:
Name M
1
1
1
1
221
221
221
221
3234
3234
3234
434
434
434
и.т.д

Нужно в поле M записать значение от 1 до 3 по порядку и так до конца датасета, что бы получилось что то типа:
Name M
1 1
1 1
1 1
1 1
221 2
221 2
221 2
221 2
3234 3
3234 3
3234 3
434 1
434 1
434 1
и.т.д

Я так понимаю, что нужно сравнить значение по строкам по полю Name, и если значение поменялось, записать в поле M необходимое
число. Подскажите пожалуйста как это реализовать в запросе.

Заранее благодарен.
27 сен 17, 14:52    [20826866]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16295
Если исходный набор данных - запрос, то в рамках запроса MS Access решение этой задачи весьма проблематично. Тут нет ранжирующих функций.
27 сен 17, 15:03    [20826895]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Анатолий ( Киев )
Guest
Aziz, почему в вашем примере для трех групп нумерация идет с нарастанием, а для 434 снова 1, а не 4 ?
Подобные задачи решаются применением собственной функции, в которой полученное значение сравнивается с сохраненным предыдущим значением по результату оставляет или меняет предыдущее значение счетчика.
Для какой цели вам нужна такая экзотика?
27 сен 17, 15:44    [20827054]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
Akina,
А создать таблицу и записать датасет запроса в нее? Это может помочь?
27 сен 17, 15:44    [20827055]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
Анатолий ( Киев ),
Экзотика - это точное определение )).
Попытаюсь объяснить:
Есть запрос, который выдает датасет с полями (Объект, Наименование оборудования на объекте, январь, февраль, и т.д до декабря.)
В поле "Объект" - наименование объекта обслуживания
В поле "Наименование оборудования на объекте" - наименование оборудования по данному объекту подлежащее тех.обсл.
в полях "Январь". "Февраль" и т.д. - наименование вида проводимого тех.обслуживания (ТО-1, ТО-2, ТО-3).
Так получается, что по месяцам кол-во проводимого ТО по объекту сильно отличается (В январе например 0, а в марте может быть 30). А если объектов много, то в по некоторым месяцам ТО проводиться не будет (например январь), а по некоторым придется проводить ТО по всему перечню оборудования (например март). Особо загруженные месяцы - Март, Июнь, Сентябрь, Декабрь

Поэтому решил добавить еще одно поле "М", по которому буду использовать оператор MOD("Поле M", 3) и в зависимости от результата заносить нужное значение в поля "Январь". "Февраль" и т.д. и таким образом получиться распределить нагрузку по месяцам.

Вот как то так.
Надеюсь смог объясниить
27 сен 17, 16:16    [20827162]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16295
Aziz
А создать таблицу и записать датасет запроса в нее?

Статическую таблицу несложно открыть как рекордсет и перенумеровать VBA-кодом.

Но есть подвох - у Вас в примере данные явно сортированы, причём по некоему признаку, который в итоговый набор данных не попал. А потому нет никакой гарантии, что в рекордсете порядок выдачи записепй не будет изменён. Необходимо добавить в статическую таблицу признак, который соответствующим ORDER BY позволит сохранить порядок следования записей.
27 сен 17, 16:19    [20827170]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4670
Aziz
....В поле "Наименование оборудования на объекте" - наименование оборудования по данному объекту подлежащее тех.обсл...
Стесняюсь спросить:а как определяется подлежит или нет-ведь должны быть какие-то сроки,нормы,к-во циклов и т.п.(а вот об этом нет ни слова) Если же периодичность ТО определяется "когда хочется", то степень автоматизации учета ТО не может быть высокой (что Вы и пытаетесь делать)
27 сен 17, 17:50    [20827485]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
sdku,
Согласен с вами, есть и сроки и нормы. Не стал об этом писать. Суть вопроса та не в этом...
Попробую внести ясность.
Есть справочник ТО в котором указано оборудование и его периодичность ТО в год, где ТО-1 раз в месяц, ТО-2 раз в квартал, ТО-3 раз в год, например:
ТО электронного датчика ТО-1 8раз ТО-2 3раза ТО-3 1раз
ТО регулятора температуры ТО-1 2раза ТО-2 2раза
ТО электронного термопреобразователя. ТО-1 11раз ТО-2 1раз
ТО датчика температуры ТО-1 8раз ТО-2 3раза ТО-3 1раз

Кол-во ТО для оборудования определено справочником, и набор типа 8-3-1, 2-2, 11-2 и т.д. ограничен.
Я составил запрос и раскидал все возможные варианты по месяцам.

Max(Switch(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1")) AS Январь,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Февраль,

Max(Switch(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=4),"ТО-2")) AS Март,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=2) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Апрель,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Май,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",IIf(([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=2) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=4),"ТО-2",Null))) AS Июнь,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Июль,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Август,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",IIf(([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=3) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=4),"ТО-2",Null))) AS Сентябрь,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=2) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Октябрь,

Max(IIf(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=8) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=10) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=11) Or ([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",Null)) AS Ноябрь,

Max(Switch(([Запрос ПП ТО].VidTO="ТО-1" And [Запрос ПП ТО].KolvoTO=12),"ТО-1",([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=1) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=2) Or ([Запрос ПП ТО].VidTO="ТО-2" And [Запрос ПП ТО].KolvoTO=4),"ТО-2",([Запрос ПП ТО].VidTO="ТО-3" And [Запрос ПП ТО].KolvoTO=1),"ТО-3")) AS Декабрь

И в принципе меня это устраивает, но по некоторым месяцам (март, июнь, сентябрь, декабрь) кол-во ТО которое нужно провести, вырастает в разы по отношению к другим месяцам. Поэтому и родилась идея добавить поле "М" которое будет состоять из значений от 1 до 3. А используя оператор MOD("Поле M", 3) я смогу заново сформировать и распределить нагрузку по месяцам.
Надеюсь смог все объяснить.
28 сен 17, 09:19    [20828188]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4670
Aziz,
А почему не прибавлять сроки(периоды)к дате ввода в эксплуатацию,а полученное значение будет, хошь-не хошь, жесткой,не подлежащей изменению, датой проведения ТО
28 сен 17, 11:39    [20828658]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
sdku,
как вариант. Но тогда придется добавлять в таблицу поле "дата ввода в эксплуатацию объекта", а хотелось бы все сделать на уровне запроса.
Я так понимаю, что задача как мне хотелось бы не реализуема. Поэтому вижу ее решение 1.Записать все в таблицу. 2. Всю задумку реализовать на VB.
Может еще есть мнения?
28 сен 17, 11:50    [20828701]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4670
вопрос: если ТО по периодичности 1 раз в год и я проведу его 30.12.10 и 10.01.11-будет ли верным утверждение что оно проведено в 10 и 11 году с соблюдением периодичности (именно это Вы пытаетесь сделать)
28 сен 17, 11:51    [20828703]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
sdku,
да, верно.
Но если мою идею получиться реализовать, то периодичность ТО будет соблюдена. Идея то банальна - разделить все объекты на три группы и сдвинуть начальную дату выполнение ТО по каждой группе объектов. Т.е.:
1 группа - все ТО которое изначально попало на (март, июнь, сентябрь, декабрь) месяц, я перевожу в январь, апрель, июль, сентябрь.
2 группа - все ТО которое изначально попало на (март, июнь, сентябрь, декабрь) месяц, я перевожу в февраль, май, август, ноябрь.
3 группа - все ТО которое изначально попало на (март, июнь, сентябрь, декабрь) месяц, остается в этом же месяце.
28 сен 17, 13:18    [20828905]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
sdku
Member

Откуда: Краснодар
Сообщений: 4670
интервал 11д. интервал почти 2 года
30.12.2010 10.01.11. 31.12.2012
так вот почему лифты падают
(может через год,а не раз в год?)
28 сен 17, 13:55    [20828999]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
982183
Member

Откуда:
Сообщений: 1349
А что мешает сгруппировать Name во временной таблице.
там же пронумеровать второй столбец 1-2-3
а потом из неё заполнить М в базовой таблице?

Вроде всё элементарно...
28 сен 17, 14:04    [20829017]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
982183,
А можете показать на примере?
28 сен 17, 14:12    [20829032]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
Aziz
Member

Откуда:
Сообщений: 39
982183,
Спасибо за подсказку. Все получилось.
28 сен 17, 17:00    [20829669]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
982183
Member

Откуда:
Сообщений: 1349
А как "пронумеровать" сделал?
Что-то через целочисленные остаток от деления recno() у меня не получается.
Только через case
29 сен 17, 02:14    [20830627]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4083
Aziz
А если объектов много, то в по некоторым месяцам ТО проводиться не будет (например январь), а по некоторым придется проводить ТО по всему перечню оборудования (например март). Особо загруженные месяцы - Март, Июнь, Сентябрь, Декабрь


я знакома с подобной задачей (сначала ППР, затем ТОиР)

я исходила из
--межремонтного периода(у меня были еще и КР и СР)
--структуры цикла цикла осмотров типа 1333323333233331
--даты и типа последнего осмотра/ремонта

находила в каком месте цикла находится данное оборудование и присваивала планируемые осмотры
поэтому так явно Март, Июнь, Сентябрь, Декабрь не выделялись
29 сен 17, 07:50    [20830698]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение текущей строки с предыдущей  [new]
ПЕНСИОНЕРКА
Member

Откуда: Владимирская обл
Сообщений: 4083
Aziz,

по правде говоря, я не поняла идеи прохождения по циклу осмотров
Max(Switch(
     (w.VidTO="ТО-1" And w.KolvoTO=8)
  Or (w.VidTO="ТО-1" And w.KolvoTO=10)
  Or (w.VidTO="ТО-1" And w.KolvoTO=11)
  Or (w.VidTO="ТО-1" And w.KolvoTO=12),"ТО-1")) AS Январь, 

Max(IIf((w.VidTO="ТО-1" And w.KolvoTO=8)
  Or (w.VidTO="ТО-1" And w.KolvoTO=10)
  Or (w.VidTO="ТО-1" And w.KolvoTO=11)
  Or (w.VidTO="ТО-1" And w.KolvoTO=12),"ТО-1",Null)) AS Февраль, 

Max(Switch((w.VidTO="ТО-1" And w.KolvoTO=3)
  Or (w.VidTO="ТО-1" And w.KolvoTO=10)
  Or (w.VidTO="ТО-1" And w.KolvoTO=11)
  Or (w.VidTO="ТО-1" And w.KolvoTO=12),"ТО-1",(w.VidTO="ТО-2" And w.KolvoTO=3)
  Or (w.VidTO="ТО-2" And w.KolvoTO=4),"ТО-2")) AS Март,


..... 
29 сен 17, 08:02    [20830719]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить