Исключающее “или” для да/нет поля таблицы

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Исключающее “или” для да/нет поля таблицы

Сообщение Avtopic » 15.03.2006 (Ср) 11:24

Имеются поля (названия условные) ID, f1 , f2, f3, f4, Date, Time

f1-название валюты
f2-символ валюты
f3-курс
f4-рабочая валюта (да / нет)
Date- дата последнего изменения
Time –время последнего изменения

В этой таблице записи не обновляются, а добавляются. Т.Е. если доллар изменился, старая запись остается и добавляется новая. Так же для других валют.
Выбрать нужно записи валют, которые встречаются в этой таблице, Канешно, не повторяя, и по последней дате обновления и по последнему времени.
Т.Е. записей может бить 1000, но валюты упомянутые могут бить всего три рубль, доллар, тугрики. Вот эти три и нужно выбрать, только последние обновленные.

Следующее работает:
Код: Выделить всё
Set R = db.OpenRecordset("SELECT  ID, f1 ,f2, f3, f4, DATE, time FROM Tab1 where time in (SELECT max (time) FROM (SELECT ID, f1 ,f2, f3, f4, date, time FROM Tab1  WHERE  date in (SELECT max (date) FROM Tab1 group by f1 order by max (date))) group by f1 order by max (time));")
Но, боясь так много вложенных запросов, мне интересно, как бы это короче и красивее написали знающие и уважающие себя люди? :)

И второй вопрос: в поле f4 - рабочая валюта (да / нет) галочка может стоять только у одной записи. Как контролировать, чтобы:
1. галочка била именно одна и при этом
2. чтобы хотя бы одна галочка обязательно была.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.03.2006 (Ср) 12:34

Код: Выделить всё
SELECT ID, f1, f2, f3, f4, MAX(DATE+time) FROM Tab1 GROUP BY ID, f1, f2, f3, f4


Кто догадался разделить дату и время, и главное зачем? :roll:


И по второму вопросу: а зачем это могло бы быть нужно?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.03.2006 (Ср) 13:26

Код: Выделить всё
SELECT ID, f1, f2, f3, f4, MAX(DATE+time) FROM Tab1 GROUP BY ID, f1, f2, f3, f4
Почемуто выводит вес список
Кто догадался разделить дату и время
Я догадался. 8) :)
и главное зачем?
Наверно неправильное решение для следующего:
order by DATE DESC, time ASC
order by DATE ASC, time DESC
И, по второму вопросу: а зачем это могло бы быть нужно?
:shock: Не нужно, исправлю

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.03.2006 (Ср) 14:50

Действительно, чё это я...

Код: Выделить всё
SELECT first(ID), first(f1), first(f2), first(f3), first(f4), MAX(DATE+time) FROM Tab1

Но это access, впрочем... База-то в чём?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.03.2006 (Ср) 15:13

База в Accesse.
И в конце group by f1 да? Иначе выводит одну запись

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 15.03.2006 (Ср) 15:27

Наверно неправильное решение для следующего:
order by DATE DESC, time ASC
order by DATE ASC, time DESC
Решение действительно того... не очень... :wink:
Код: Выделить всё
select format([DATE],"dd.mm.yyyy") as [time], format([DATE],"hh:mm:ss") as [day] from ... order by 1 asc, 2 desc

Кажется format в аксе должен работать.
Лучший способ понять что-то самому — объяснить это другому.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.03.2006 (Ср) 16:22

To Antonariy
Знание свет! Незнание тьма! :oops:
Спасибо!

Спасибо To GSerg

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.03.2006 (Ср) 17:55

Problem:
Код: Выделить всё
select format([DATE],"dd.mm.yyyy") as [time], format([DATE],"hh:mm:ss") as [day] from ... order by 1 asc, 2 desc
1 asc и desc работает только для dd а не даты dd.mm.yyyy
и как плачевный результат дата 12.09.2005 распознается как больше чем 02.03.2006 :(

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 15.03.2006 (Ср) 20:07

To Gserg
Как видно из количества обсуждении тем про Date/Time, это не самое совершенное из типов данных. Впрочем, это чувствуется и из того вида, в каком виде (чисто визуально) там хранятся данные. Что и подтолкнул меня как неопытного, разделить Date и Time на две разные поля.
Вышеприведенный пример с format по логике и не должен работать для правильной сортировки. Насколько я понимаю, format должен возвращать стринг и соответственно, результат сортировки дат будет неправильный.

фраза:
Кто догадался разделить дату и время, и главное зачем? :roll:

И этот rolling Eyes которому так и хочется выцарапать эти Eyes, содержит намек на то что это неправильное решение, разделить дату и время. Убедительная просьба, объясните, как можно сортировать в отдельности по дате и по времени, когда они в одном поле.
В моем частном случае, за день может бить около 300 корректировки курса, причем в большинстве случаев не корректной или неправильной (в долях копеек, но все же) и для их анализа такая сортировка обязательно нужно для пользователя.
Заранее благодарю!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.03.2006 (Чт) 4:33

Avtopic писал(а):Как видно из количества обсуждении тем про Date/Time, это не самое совершенное из типов данных

Количество обсуждений про date/time обусловлено тем, что никто не читает документацию по правильной передаче параметров, в результате чего день путается с месяцем.

Avtopic писал(а):которому так и хочется выцарапать эти Eyes

Рекомендую таки попробовать, особенно легко эффект достижим на LCD мониторах.

Avtopic писал(а):Убедительная просьба, объясните, как можно сортировать в отдельности по дате и по времени

Код: Выделить всё
SELECT d
FROM Table1
ORDER BY Fix(d) DESC, d-Fix(d) ASC
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 16.03.2006 (Чт) 10:37

Пардон, моя вина.
select cdate(format([DATE],"dd.mm.yyyy")) as [time], cdate(format([DATE],"hh:mm:ss")) as [day] from ... order by 1 asc, 2 desc
:scratch: Хотя и не проверял
А формат "yyyy.mm.dd" в любом случае отсортируется как надо.
Лучший способ понять что-то самому — объяснить это другому.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.03.2006 (Чт) 13:53

Спасибо всем! Все очень просто. :)
Я почему-то постоянно боялся преобразования типа даты, хотя сохранял с преобразованием Format(DATE, 'dd.mm.yy')

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2006 (Чт) 13:58

Не надо этого боятся.
Надо юзать параметрические запросы.
Или указывать дату в формате ISO (yyyy-mm-dd или yyyymmdd).
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.03.2006 (Чт) 14:00

?? :evil: Что это со мной? Извиняюсь! Сохраняю вот так Format(DATE, "mm.dd.yy")

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2006 (Чт) 14:06

alibek писал(а):yyyy-mm-dd или yyyymmdd
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.03.2006 (Чт) 14:41

Sorry пропустил ваш предыдущий ответ.
Microsoft JET SQL оперирует датами в формате… Месяц/День/Год

И там же близко
Подготовленное для передачи значение должно быть представлено
в формате ISO - 'yyyymmdd hh:mm:ss.mmm'


Как все же сохраняет Access Date/Time? В формате ISO?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.03.2006 (Чт) 14:45

Он понимает кучу формат, представленных строкой. Но лучше всего (и безошибочнее) он понимает ISO-формат.
Lasciate ogni speranza, voi ch'entrate.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.03.2006 (Чт) 14:59

Все! Уяснил для себя! Спасибо!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 59

    TopList