Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дни недели [D7, MSSQL]


Страницы:   1 2 3

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-ами.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо