Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с написанием формулы. 2003
 
 автор: pistachio   (22.07.2009 в 12:05)   личное сообщение
 
 

здравствуйте! Необходимо, чтобы из трех (4-х) столбцов дат по запросу выбиралась наибольшая или наименьшая дата. Когда пишу функцию max, то потом выдает не даты, а значения "1" или "-1".

  Ответить  
 
 автор: Анатолий (Киев)   (22.07.2009 в 14:26)   личное сообщение
 
 

ИМХО, проще всего написать в общем модуле функцию типа:

Public Function GetMaxDate(Date1,Date2,Date3,Date4)
Dim d
   d = Date1
 If Date2 > NZ(d, 0) Then d = Date2
 If Date3 > NZ(d, 0) Then d = Date3
 If Date4 > NZ(d, 0) Then d = Date4
   GetMaxDate = d
End Function

И использовать ее в запросе.
Аналогично и для минимальной даты (можно и все в одной функции с доп. апгументом).

  Ответить  
 
 автор: pistachio   (22.07.2009 в 14:56)   личное сообщение
 
 

Анатолий, мне приятно, что вы используете модули, но, не знаю, прочитали вы или нет,в моем профиле написано "ламер". Поэтому, если возможно, напишите все пошагово, для нубов типа меня, или дайте другой вариант, где можно использовать банальные функции access без всяких там модулей. Заранее благодарен

  Ответить  
 
 автор: Анатолий (Киев)   (22.07.2009 в 15:28)   личное сообщение
 
 


банальные функции access без всяких там модулей


В конструкторе запроса (имена полей - Date1, Date2, Date3, Date4):

Макс: IIF([Date4]>NZ([Date1];0) And [Date4]>NZ([Date2];0) And [Date4]>NZ([Date3];0); [Date4]; IIF([Date3]>NZ([Date1];0) And [Date3]>NZ([Date2];0); [Date3]; IIF([Date2]>NZ([Date1];0); [Date2]; [Date1])))

Или я неправильно понял вопрос? Может вам нужно Min и Max даты в каждом столбце? Тогда почему вы получаете "1" или "-1" (покажите свой запрос)? А если я понял правильно, то причем здесь Sum?


в моем профиле написано "ламер"


И вас это устраивает? Может пора осваивать VBA?

  Ответить  
 
 автор: pistachio   (22.07.2009 в 15:51)   личное сообщение
 
 

вся проблема в том, что мне надо из 4 столбцов с кучами дат выбрать максимальную. Если бы был один, то все понятно, легко. не очень хочется использовать IIF, т. к. этих столбцов может быть и 8.

Такой вопрос еще: можно ли функцией "мах" обзединить сразу несколько столбцов на подобие экселя? Я пытался сделать max([date 1] and [date 2]) , но тогда и выдавало единицы..

И очередная проблема в том, что файл скинуть не могу по объективным причинам

ну до VBA мне еще далеко... ) но, кстати, по сравнению с моим первым позоронейшим сообщением на этом форуме, я далеко ушел ))

  Ответить  
 
 автор: час   (22.07.2009 в 16:16)   личное сообщение
 
 

если написать функцию, то она будет естесно на VBA, но она очень медленная получиться ...
сколько строчек у Вас в таблице бывает??? и сколько столбцов максимум бывает???
=============================
придётся сночала бегать по всем столбцам и смотреть свойство столбца дата или нет потом пробежать по всему столбцу, либо запросом определить Max(value) и запомнить в переменную, затем след. столбец, затем из двух выбрать большую и так далее......
а имеются столбики, которые с датой но их смотреть не надо? Если да, то автоматизировать не выходит......... хотя это имхо или ихмо.......

  Ответить  
 
 автор: Анатолий (Киев)   (22.07.2009 в 16:17)   личное сообщение
 
 

А каково назначение вашей таблицы? Почему там 4 даты, а предполагается и 8? К каким событиям они относятся.
ИМХО, у вас неправильная структура БД.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 16:27)   личное сообщение
 
 

столбцов с датами пока 5, смотреть их нужно все. Строчек порядка 2000. Структура БД дибильная, но ничего поделать не могу, есть форма.... Появиться столбцы с датами могут, т. к. допродать можем и в следующем месяце.

  Ответить  
 
 автор: час   (22.07.2009 в 16:33)   личное сообщение
 
 

дык тада может в одной строке из пяти столбцов нада выбрать максимальную дату????? - не обращая внимание на прочие записи.
Или всё же вообще из всех возможных дат в таблице выбрать максимальную.........Проясните пожалыста

  Ответить  
 
 автор: Анатолий (Киев)   (22.07.2009 в 17:02)   личное сообщение
 
 


Появиться столбцы с датами могут, т. к. допродать можем и в следующем месяце.



Вот и я об этом - неправильная структура БД. Должна быть еще одна таблица с информацией о "допродажах" и единственным полем с датой, связанная с главной как многие-к-одному.
На фащей форме она должна быть представлена в виде субформы. Тогда и макс/мин дату можно легко получить, и дат может быть сколько угодно. И многие проблемы отпадут, и существующая и будущие (можете не сомневаться - они будут, если все оставить как есть).

  Ответить  
 
 автор: Denis V.   (22.07.2009 в 19:02)   личное сообщение
 
 

Так мысли вслух или риторика: "По-моему, ещё не далеко... всё там же, где-то рядом с Excel..."
Да, ладно, пусть так и останется... кризис, вдруг продаж больше не будет...
Короче, повторю, т.е. copy-paste:
Опять из Access пытаются Excel сделать! pistachio, бросьте. Вам же сказали, что Access - это не Excel. В Access данные хранятся по-другому. Так что Ваша табличка с тремя столбцами дат и тремя столбцами количества... в общем, не надо так делать.
Запись в таблице должна быть, как бы это сказать, атомарной. Т.е. представлять из себя что-то вроде описания какой-то одной операции, предмета и проч.
Что-то я сильно сомневаюсь, что три даты в одной строке - это описание чего-то одного.
Объясните, пожалуйста, что Вы делаете, а то потом много переделывать будете, когда всё затормозит. И будете потом на всех форумах плохо отзываться об Access.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 22:56)   личное сообщение
 
 

Очень жаль, что не могу скинуть файл.. Все дело в том, что не я пытаюсь сдеать из аксеса ексэль, а требования "начальства", которая просит соблюдать форму и при этом хочет порой от аксеса всего, что душа попросит (как сейчас, получается..). Я бы давно все в экселе сделал и выводилось бы всё куда проще. Ну да ладно, это все лирика. Постараюсь объяснить, может, это поможет..

Купили мы, например, 50 ценных бумаг А и 30 ценных бумаг Б 1.03.09, но продали мы их не в один день, а частями, скажем, бумаги А: 05.04.09 - 20 штук, 10.04.09 - 17 штук и 15.04.09 - 13 штук. А бымаги б мы продали, скажем в 2 дня: 09.04.09 -15 штук и 18.04.09 - 15 штук. Так вот есть такая несоклько необходимых формул доходности, и одна из них требует вычета из последней (!!!) даты продажи дату покупки. В случае с бумагами А - это 15.04, а с бумагами Б - 18.04. А теперь (внимание), самый дибилизм! выглядит в аксессе это все следующим образом
дата дата дата
продажи 1 продажи 2 продажи 3
А 05.04 10.04 15.04
Б 09.04 18.04

То есть, если бы столбцы, грубо говоря, были по датам, то мы бы тупо взяли последнюю. Но идет в реестре все именно так, как описано выше...

Я так понимаю, мне за 2 дня надо VBA освоить? ))

  Ответить  
 
 автор: Гоблин   (22.07.2009 в 23:07)   личное сообщение
 
 

Во блин Гоблин! Пока всрял писачо тему вскрыл.
Все же даты следует в один столбец делать. Основная форма - даты. Подчиненная - продажи.
затем крестовичок и все выйдет в столбцы. Я бы так делал.

Вопрос. Если дату в столбцах делать, то за год сколько получится? Акс вроде бы больше 40 не возьмет. (перекрестный запрос имеется в виду)

  Ответить  
 
 автор: Lukas   (22.07.2009 в 23:21)   личное сообщение
 
 


...Основная форма - даты. Подчиненная - продажи...


Дружище Гоблин,
Нет такой сущности "Дата" ни здесь, ни в каких других БД!!!
"Дата" это одна из возможных характеристик других сущностей.

НЕ НАДО выделять под не нее ни отдельных таблиц, ни форм.

В данном случае, она должна быть характеристикой сущности "Транзакция" (операция с ЦБ).

pistachio,
"Выпрямить" имеющуюся таблицу продаж к нормальному виду можно запросами.
Если сейчас в таблице 5 полей с датами, значит это можно сделать 5 запросами.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 23:28)   личное сообщение
 
 

Извиняюсь, но вы уходите от темы.. Мне нужно в запросе написать формулу, где участвкет такое выражение, как разница между последней датой продажи, которая выбирается из 5 столбцов, и датой покупки. Если последнюю (максимальную) дату продажи невозможно выделить из нескольких столбцов, то так и скажите, буду искать другие варианты..

  Ответить  
 
 автор: Lukas   (22.07.2009 в 23:32)   личное сообщение
 
 

Вам ответ на вопрос был дан в 15:28.
Если вы не в состоянии его понять, откройте учебник, полистайте.


автор: Анатолий (Киев) (22.07.2009 в 15:28)

  Ответить  
 
 автор: Гоблин   (22.07.2009 в 22:58)   личное сообщение
 
 

Ну я встряну.
А как у вас меняется количество столбцов? Перекрестным запросом, входящим в запрос на создание таблицы???
Может на ту таблицу групповичок сварганить на 8 столбцов, а недостающие столбцы нулями заполнять. Или в исходном таблоиде искать сразу.

Вариант 2. Может все 8 столбцов в один зафигасить объединением, а на тот запрос групповичок на мах да и дело с концом.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 23:08)   личное сообщение
 
 

количество столбцов будет увеличиваться, когда уже не хватит места ) пока, грубо говоря, бумаги А мы продали 5 раз - это максимум. Не мсключено, что му будеи продавать бумаги С раз 10, при этом они будут занимать каждый овый столбец.

Не очень понял первый вариант с "групповичком", но мне чертовски понравился второй, особенно, если этот один столбец можно как-нибудь сделать не в ручную, то есть, не копируя-вставляя все 8 штук в один.

  Ответить  
 
 автор: Гоблин   (22.07.2009 в 23:29)   личное сообщение
11 Кб.
 
 

Можно. Но для этого надо знать сколько стобцов будет всего. Я так и не въехал как увеличивается количество стобцов. В таблице их должно быть фиксированное значение. Каждую продажу в новый столбец фигарить - это маразм в высшей степени. Мне не достать.

Если известно количество столбцов в таблице, то придется делать запрос на объединение.
Типа как вот.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 23:37)   личное сообщение
 
 

про маразм - согласен, но ничего не поделаешь...

Да, то, что вы прислали, очень похоже на истину, только непонятно, как вы сделали это "поле 1". Судя потому, что режим конструтора не открывается, то как-то хитро )

  Ответить  
 
 автор: Гоблин   (22.07.2009 в 23:38)   личное сообщение
 
 

Лукас. На счет сущности даты. Вечный вопрос. Примерчик бы.

  Ответить  
 
 автор: Гоблин   (22.07.2009 в 23:45)   личное сообщение
 
 

Писачо. Там запрос на объединение стоит. Открывается только в режиме sql.
Просто иными словами. Делаешь 8 запросов как Лукас говорил. 1 - на поле1, Второй - на поле 2 3 - на поле 3 и т.д. Затем каждый из этих запросов открываешь в режиме sql. После берешь запрос1, копируешь содержимое, переходишь в содержимое запроса 2, стираешь сзади ; и вместо нее пишешь слово union, после чего вставляешь в содержимое буфера обмена. Затем полученное копируешь и переходишь к запросу 3. Позади стираешь ; и вставляя union вставляешь содержимое буфера...

Можно и проще в данном случае. делаешь запрос на выборку на поле1, копируешь его в режиме sql, тут же стирая ; ставишь union и вставляешь из обменника. Там только скорректируй поле2 и далее в том же духе.

Прислушайся к Анатолию (Киев) и Лукасу. Это программеры. Я же любитель кроссвордов акса.

  Ответить  
 
 автор: pistachio   (22.07.2009 в 23:50)   личное сообщение
 
 

Так, все, кажется, понял ). Lukas, Гоблин, Анатолий(Киев), час, Denis V. огромное спасибо за помощь и терпение

И насчет учебника: полистаю, полистаю... :)

  Ответить  
 
 автор: Denis V.   (23.07.2009 в 11:33)   личное сообщение
 
 

Мне ещё рано спасибо говорить. Я с Вами не закончил. Требования начальства - это конечно, закон. Но нельзя воспринимать эти требования буквально. Данные должны быть организованы так, чтобы работать с ними было удобно. Структура данных создаётся один раз, потом её не меняют (случаи, когда меняют, не рассматриваем ;-)) Поэтому, если на каждую новую продажу - суть операцию - менять структуру таблицы - так делать не надо. Потому что при этом Вам придётся поменять все формулы, все процедуры ввода, вывода и проч.
Рассмотрим Ваши бумаги. Вы их покупаете и продаёте, хотите это дело учитывать. Начальство обычно хочет красивый отчёт в виде нескольких столбцов, где по строке показана история бумаг одного типа, но отчёт - это последнее, что я делаю при создании системы. Сначала структура. Итак, бумаги - это вещь, следовательно будет одна таблица, в которой будем хранить описание этих вещей. Бумаги бывают одинаковых типов - тогда ещё одна таблица, в которой будут храниться типы бумаг. Операции купли/продажи - это может быть одна таблица или две по одной на покупку и продажу. Столбцы таблиц - это свойства того, что в них будет храниться. Так, например, покупка имеет свойства: дата покупки, что купили, сколько и по какой цене, у кого и т.д. и т.п.
В общем копайте в сторону реляционных баз данных.
Когда со структурой разберётесь, переходите к интерфейсу. Вот тогда потребуются подчинённые формы и запросы (поменьше бы всяких IIF, лучше вообще без них).
Если начальству надо было вчера, посылайте его на... поиски готовой программы за XXXX у.е., где X (икс) - это целое больше нуля. Хочет сэкономить, придётся пока пользоваться счётами или Excel.
Удачи!

  Ответить  
 
 автор: pistachio   (23.07.2009 в 12:11)   личное сообщение
 
 

вот именно об этом сегодня и подумал! Просто дали задание в такой форме, что "не обсуждается", так что угрохал еще кучу времени на то, чтобы забить это все вручную.. по-хорошему надо делать как минимум, 2 таблицы по покупке и продаже, как вы и говорите. И ьам, используя запросы или формы можно будет с таким же успехом, только легче, находить остатки, суммы и т.д. Но тогда их, по идее надо связывать по названию эмитента..

спасибо! :)

  Ответить  
 
 автор: Анатолий (Киев)   (23.07.2009 в 12:46)   личное сообщение
 
 


не я пытаюсь сдеать из аксеса ексэль, а требования "начальства", которая просит соблюдать форму и при этом хочет порой от аксеса всего, что душа попросит

Просто дали задание в такой форме, что "не обсуждается"


У вас "начальство" - дама? Да уж...

  Ответить  
 
 автор: pistachio   (23.07.2009 в 12:52)   личное сообщение
 
 

и притом очень капризная барышня ))

  Ответить  
 
 автор: Гоблин   (23.07.2009 в 22:54)   личное сообщение
 
 

Да еще и блондинка.
этак на каждую продажу новую таблицу заводить придется.

Я бы уволился, пока жив.

  Ответить  
 
 автор: час   (24.07.2009 в 16:26)   личное сообщение
 
 

  Ответить  
 
 автор: Denis V.   (23.07.2009 в 21:10)   личное сообщение
 
 


Но тогда их, по идее надо связывать по названию эмитента..


"Правильной дорогой идёте, товарисч!"

  Ответить  
 
 автор: Lukas   (22.07.2009 в 23:55)   личное сообщение
 
 

Примерчик, был.

  Ответить  
 
 автор: Гоблин   (23.07.2009 в 00:05)   личное сообщение
 
 

Спасибо за примерчик. Раньше бы такой. Вечная проблема с подчиненной формой - не хочет вводить новую запись без привязки к таблице основной формы. Приходилось хоть в одну строку таблицу создавать, что бы хоть как-то с места сдвинуть.
Бум разбираться.

Даты - это календарь.
А я примерчик скачал.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList