![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Дни недели [D7, MSSQL]
Iddqd © (2004-07-06 11:27:00)Уважаемые мастера, помогите решить следующую задачу:
В таблице есть строковое поле 'DAYS' в формате : пвсчпсв (обозначающее соотвественно понедельник, вторник и т.д). Оно может принимать значения : п_сч_св или _____св и т.д. Пользователь в программе выбирает с помощью чекбоксов нужные дни недели и соотвественно должны отразиться те записи которые включают эти дни. Пока это решено на уровне самой программы. Т.е выбираются все записи а уж потом не нужные отсеиваются. Как сделать подобное в SQL запросе.
Ega23 (2004-07-06 13:44:00) [21]Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
Кто не поймёт? Автор вопроса? :о)
Fay (2004-07-06 13:32:00) [22]2Iddqd © (06.07.04 13:28) [24]
DAYS LIKE '[_]в[_][_]п[_]в'
Iddqd (2004-07-06 13:28:00) [23]2Fay
DAYS LIKE '_в__п_в' выводит только одну запись 'пвсчпсв' хотя
запись 'пвсчп__' тоже должна выводиться
Fay (2004-07-06 13:28:00) [24]2Ega23 © (06.07.04 13:25) [21]
Не, не поймут. Хорошо ещё речь идет не о числах месяца 8)
Курдль (2004-07-06 13:26:00) [25]
> Fay © (06.07.04 13:24) [20]
> 2Курдль © (06.07.04 13:17) [18]
> constraint CK_ТоФлаговоеПоле check(ТоФлаговоеПоле > 0)
Это о чем :( Я не понял, можно конкретнее?
Ega23 (2004-07-06 13:25:00) [26]Type
TWeekDay=(wdMon, wdTue, wdWed, wdThr, wdFri, wdSut, wdSun)
TDaysOfWeek=set of TWeekDay
function DaysOfWeekToInt(const Value: TDaysOfWeek): Integer;
begin
Result:=0;
if (wdMon in Value) then Result:=Result or 1;
if (wdTue in Value) then Result:=Result or 2;
if (wdWed in Value) then Result:=Result or 4;
if (wdThr in Value) then Result:=Result or 8;
if (wdFri in Value) then Result:=Result or 16;
if (wdSut in Value) then Result:=Result or 32;
if (wdSun in Value) then Result:=Result or 64;
end;
function IntToDaysOfWeek(const Value: integer): TDaysOfWeek;
begin
Result:=[];
if ((Value shr 0) and 1)=1 then Result:=Result+[wdMon];
if ((Value shr 1) and 1)=1 then Result:=Result+[wdTue];
if ((Value shr 2) and 1)=1 then Result:=Result+[wdWed];
if ((Value shr 3) and 1)=1 then Result:=Result+[wdThr];
if ((Value shr 4) and 1)=1 then Result:=Result+[wdFri];
if ((Value shr 5) and 1)=1 then Result:=Result+[wdSut];
if ((Value shr 6) and 1)=1 then Result:=Result+[wdSun];
end;
А в базе одно поле типа int.
И ВСЁ.
Fay (2004-07-06 13:24:00) [27]2Курдль © (06.07.04 13:17) [18]
constraint CK_ТоФлаговоеПоле check(ТоФлаговоеПоле > 0)
Соловьев (2004-07-06 13:19:00) [28]
> Для юзера - да
нет, для разработчика
Курдль (2004-07-06 13:17:00) [29]
> Соловьев © (06.07.04 13:13) [16]
> мне кажется для наглядности лучше 7 полей:)
А главное, что не требует никакой обработки ни при вводе, ни при выводе, ни для поддержания целостности (если, например, хоть один день недели должен быть выбран - решается простым constraint-ом БД).
Fay (2004-07-06 13:16:00) [30]2Соловьев © (06.07.04 13:13) [16]
Для юзера - да. Но ему не обязательно знать структуру базы.
Соловьев (2004-07-06 13:13:00) [31]
> терпимо, но в MSSQL есть битовые операции
мне кажется для наглядности лучше 7 полей:)
Fay (2004-07-06 13:11:00) [32]2Курдль © (06.07.04 13:05) [14]
Ошибся. Перепутал [1] с [2]. [2] - терпимо, но в MSSQL есть битовые операции (см. [8])
2Iddqd © (06.07.04 13:04) [13]
см. [1]
Курдль (2004-07-06 13:05:00) [33]
> Fay © (06.07.04 12:33) [8]
> .. пока не появятся 'с_в_пп_'. Не знаю как 8). Просто такие
> значения притиворечат 1нф
Как это?
Вот фрагмент таблицы:
DAY_MON logical Not Null;
DAY_TUE logical Not Null;
DAY_WED logical Not Null;
DAY_THU logical Not Null;
DAY_FRY logical Not Null;
DAY_SAT logical Not Null;
DAY_SUN logical Not Null;
Любое из полей может принимать любое значение (False, True).
И причем здесь 'с_в_пп_'?
Iddqd (2004-07-06 13:04:00) [34]Про LIKE читал. А что конкретно ты предлагаешь?
Fay (2004-07-06 12:59:00) [35]Что это за страсть!? Ты читал про LIKE в MSSQL?
Iddqd (2004-07-06 12:56:00) [36]Cпасибо Наташе. Делаю по ее совету. Допустим пользователь выбрал:
понед, вторн, четверг и субб. Тогда формируем строку t:="пв-ч-с-", умышленно меня символ "_" на "-". Получаем запрос
SELECT ... FROM ...
WHERE ...
AND SUBSTRING(DAYS,1,1)='+QuotedStr(t[1]));
OR SUBSTRING(DAYS,2,1)='+QuotedStr(t[2]));
OR SUBSTRING(DAYS,3,1)='+QuotedStr(t[3]));
OR SUBSTRING(DAYS,4,1)='+QuotedStr(t[4]));
OR SUBSTRING(DAYS,5,1)='+QuotedStr(t[5]));
OR SUBSTRING(DAYS,6,1)='+QuotedStr(t[6]));
OR SUBSTRING(DAYS,7,1)='+QuotedStr(t[7]));
PS. Спасибо всем. Извените за это извращение
Sandman25 (2004-07-06 12:50:00) [37][9] Iddqd © (06.07.04 12:48)
У Вас триггер есть или check constraint какой-нибудь?
Iddqd (2004-07-06 12:48:00) [38]// пока не появятся 'с_в_пп_'
Такое не может появиться.
Fay (2004-07-06 12:33:00) [39]2Курдль © (06.07.04 12:30) [7]
> Ответ [2] полностью решит Вашу проблему
.. пока не появятся 'с_в_пп_'. Не знаю как 8). Просто такие значения притиворечат 1нф
Курдль (2004-07-06 12:30:00) [40]
> Iddqd © (06.07.04 11:27)
> Уважаемые мастера, помогите решить следующую задачу:
> В таблице есть строковое поле 'DAYS' в формате : пвсчпсв
> (обозначающее соотвественно понедельник, вторник и т.д).
> Оно может принимать значения : п_сч_св или _____св и т.д.
> Пользователь в программе выбирает с помощью чекбоксов нужные
> дни недели и соотвественно должны отразиться те записи которые
> включают эти дни.
Это придумано из мазохистских соображений? :0)
Ответ [2] полностью решит Вашу проблему! Тогда на каждое поле можно навесить DBCheckBox, а в продвинутых гридах типа dxDBGrid или DBGridEh индицировать дни недели в виде колонок с CheckBox-ами.