Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ] > Код на шару!
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.04.2013, 21:21
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию Диапазон номеров в одну строку

Добрый вечер. Есть неразрешимая для меня задача, прошу вашей помощи. Таблица в БД (Акцесс) содержит информацию о бланках строгой отчетности. Выглядит так:
Код:
ID      Num            Vid       Num_Reg
1      VBA0123       Бланк1        10
2      VBA0124       Бланк1        10
3      VBA0125       Бланк1        
4      VBA0126       Бланк1        10
5      VBA0127       Бланк1        10
6      VB0111        Бланк2        10
7      VB0112        Бланк2        10
8      VB0113        Бланк2        10
Дальше я делаю запрос на отбор всех строк где Num_Reg = 10. Нужно подготовить данные на вывод в Excel, в виде:
Бланк1 VBA0123 - VBA0124
Бланк1 VBA0126 - VBA0127
Бланк2 VB0111 - VB0113

например a:= Бланк1 VBA0123 - VBA0124
b:= Бланк1 VBA0126 - VBA0127
c:= Бланк2 VB0111 - VB0113

p.s. номер не обязательно состоит из 3 букв и цифр.

Последний раз редактировалось DOR, 11.04.2013 в 17:02.
Ответить с цитированием
  #2  
Старый 04.04.2013, 21:22
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Через Group By можно.
Или двойным подселектом.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 04.04.2013, 21:28
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Помогите пожалуйста кодом на данном примере. Как я написал, мне это никогда не написать.
Ответить с цитированием
  #4  
Старый 04.04.2013, 23:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, я бы попробовал так:
Код:
select vid, min(Num) || ' - ' || max(Num)
from Table
where Num_Reg = 10
group by vid

Конкатенация может сразу не пройти, тогда надо будет сделать view просто с min и max, а уже из нее простым селектом с конкатенацией.
Ответить с цитированием
  #5  
Старый 05.04.2013, 08:24
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Можно же без вьюхи, чисто подселект сделать.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 05.04.2013, 15:59
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

M.A.D.M.A.N., lmikle
Я понимаю что для Вас решение очевидно, но для меня это не разрешимо. Может быть кто нибудь может написать код под ключ, если не за спасибо, то умеренную плату (в ЛС).

з.ы. Если сообщение не уместно в танной теме прошу перенести в работу. Спасибо.

з.ы.
Код:
select vid, min(Num) || ' - ' || max(Num) 
from Table 
where Num_Reg = 10
group by vid 
Тут в промежуток попадет лишний номер. Теоретически.
Ответить с цитированием
  #7  
Старый 11.04.2013, 18:40
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Боюсь тут в лоб селектами не выйдет. И Min,Max тут как мертвому припарка. Тут скорее всего придется писать функцию возвращающую последний номер в последовательности начинающейся с заданного значения. (Во завернул ) А вот что является последовательностью вам и надо будет в функции описать. Для меня пока не очень ясно например какой номер будет следовать после VBA9999.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 11.04.2013, 19:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Страдалецъ
Боюсь тут в лоб селектами не выйдет. И Min,Max тут как мертвому припарка. Тут скорее всего придется писать функцию возвращающую последний номер в последовательности начинающейся с заданного значения. (Во завернул ) А вот что является последовательностью вам и надо будет в функции описать. Для меня пока не очень ясно например какой номер будет следовать после VBA9999.

По представленной схеме данных этот селект вернет ровно то, что ТС просит. Если это не так, то нужно более точное описание задачи.
Ответить с цитированием
  #9  
Старый 11.04.2013, 21:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Предложеный вариант будет работать правильно только с непрерывной последовательностью, а у автора есть разрыв в ней и потому Min(), Max() не катят. Этот запрос вернет 2 строчки т.к. не учитывает разрыва, а нужно вернуть 3.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #10  
Старый 11.04.2013, 22:31
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это да. Тогда проще кодом сделать.
Ответить с цитированием
  #11  
Старый 12.04.2013, 14:01
DOR DOR вне форума
Начинающий
 
Регистрация: 14.01.2011
Сообщения: 171
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Боюсь тут в лоб селектами не выйдет. И Min,Max тут как мертвому припарка. Тут скорее всего придется писать функцию возвращающую последний номер в последовательности начинающейся с заданного значения. (Во завернул ) А вот что является последовательностью вам и надо будет в функции описать. Для меня пока не очень ясно например какой номер будет следовать после VBA9999.

Номер состоит из серии (VBA) и номера (0001). VBA9999, это последний номер в "партии". Потом будет VBB0001 до VBB9999 и так далее. Соответственно договора с серией VBB будут следующей строкой. Но напрактике за 3 года не было еще случаев когда не хватало номера.

Думал тема безнадежно потеряна.

Последний раз редактировалось DOR, 12.04.2013 в 14:04.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter