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

Форум: MS ACCESS

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

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

 
 

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

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

тема: Условие через VBA
 
 автор: Гоблин   (12.06.2009 в 15:58)   личное сообщение
79 Кб.
 
 

Привет все.
Есть форма с несколькими полями: Дата, Дата1, Дата2, Дата3... По двойному щелчку в любом поле этой формы открывается форма, в которой есть подчиненная.
В свойстве загрузка на подчиненной форме поставил:
Me.RecordSource = "SELECT Исследования.* FROM Исследования WHERE (((Исследования.Дата)=Forms![Рабочая неделя]!Дата) And ((Исследования.ОблИсследования) Is Null)) Or (((Исследования.КодПациента)=Forms![Запись пациентов ФИО отделение облИссл]!КодПациента) And ((Исследования.Дата)=Forms![Рабочая неделя]!Дата)) Or (((Исследования.КодПациента) Is Null) And ((Исследования.Дата)=Forms![Рабочая неделя]!Дата)) ORDER BY Исследования.Время; "
Все работает для поля Дата.
Для полей Дата1, Дата2, Дата3 пришлось лепить такие же формы с аналогичными условиями и выводить на экран нужную, в зависимости от выбранного поля. Но это действительно утюги.
Как сделать что бы значение соответствующего поля передавалось в условие указанного запроса.
Пробовал через переменную. На двойной щелчек в поле присваивал: d=[Дата] и это d вместо Forms![Рабочая неделя]!Дата но в открывающейся форме это теряется. Запрашивает при открытии это самое d. Попытки через if с присвоением некой переменной условного значения 1,2,3... так же результата не дали.
Максимум значение выбранного поля выводилось в свободное поле на открывающейся форме. Но использовать его в условии запроса не получается, даже если запрос делать источником не через VBA Эксперименты в тупике. Приходится работать утюгами из-за одного лишь значения дата в условии запроса. Как быть?
Кусок шедевра прикрутил. Можно ли как-то упростить это все?

  Ответить  
 
 автор: Анатолий (Киев)   (12.06.2009 в 19:08)   личное сообщение
 
 

Я бы сделал дополнительное свободное поле (скрытое) и в запросе ссылался на него.
А по DblClick каждого поля вносил его значение в новое поле.

  Ответить  
 
 автор: Гоблин   (12.06.2009 в 21:15)   личное сообщение
 
 

Пробовал. В открывающейся форме в скрытое поле вставлялась дата. В условии ссылка на него. Не пахает. Может неправильно с синтаксисом что. Даже перевод в формат пробовал. Даже в источник запроса вставлял. Не выходит.
Вобще это все из-за изменения уже действующей базы. Дата раньше заполнялась в таблице "Пациенты." Оказалось неудобно. Перенес в "Исследования" - подчиненная таблица для "Пациентов". Выходит, что сначала заполняется время в подчиненной таблице, потом вводится ФИО в основную таблицу, после чего ID пациента из основной падает в строку выбранного времени. По нему и связь 1:много. При этом в форме надо видеть свободное время на выбранный день. Кароче крюк еще тот. Вроде справился. Но лишние формы пришлось делать. Вот и прибегнул к VBA, может там в условиях запроса чего можно нахимичить. Не выходит самостоятельно. А так куча лишних форм. Хотелось бы одной обойтись. Может алгоритм не тот выбрал?

  Ответить  
 
 автор: Lukas   (12.06.2009 в 21:35)   личное сообщение
20 Кб.
 
 

Что то со структурой БД нездоровое. Надо-бы полечить.
А форму я бы сделал как-то так (вкратце):

  Ответить  
 
 автор: Гоблин   (12.06.2009 в 21:56)   личное сообщение
 
 

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

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

Как-то так:

Только после изменения в карточной форме нужно обновлять список в списочной форме.

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

Н-да. Подозревал, что не все так просто. Но что бы так.
За информацию к размышлению спасибо. Попробую разобраться. Полезно. И все же можно как-то условия менять для источников формы? Оно конечно более затратно, но как-то проще.
Да и кантингент для кого база таков, что потребуется между днями линии прочерчивать, субботу и воскресенье красить в красный, текущую дату выделять цветом. И все равно ошибки будут допускать.

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

ВСЕ! Разобрался во всем. Спасибо Lukas на мыслю навел. Заменяю формы на списки. (Вопрос а чего это я списки раньше игнорил? Все как из формы)
Основной вопрос конечно остался, но по примеру соображу. Там есть нечто.
Лукас,

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

Да там сложного то вроде ничего нет. Класс в принципе не нужен, используется из него только одна функция приведения формата даты. (ну лень было выдергивать ее из класса).
А с источником списка пришлось слегка "потанцевать" для "наглядности".
Кстати можно и линии разделительные в список загнать, при желании.
А вот с выделением цветом в списке "ж".
Зато всего 2 формы (пока).

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 09:59)   личное сообщение
 
 

Да смешиваю частично свое и ваше что бы от форм избавиться. С источником списка действительно - отпугивает поначалу.
А про линии раделительные в списке - поподробнее пожалуста. Если можно.
Как разделить по дням.
К стати куда пример девался? Хорошо скачал сразу.

  Ответить  
 
 автор: Lukas   (13.06.2009 в 10:39)   личное сообщение
24 Кб.
 
 

Добавить в процедуру FillListEx:
Dim strLINE As String
strLINE = String(30, "-") & ";"
strLINE = "0;" & strLINE & strLINE & strLINE & strLINE
и после строчки:
If datOld <> .Fields(1) Then
добавить:
strItem = strItem & strLINE

Перенести строчку:
If Nz(Me.ListEx, 0) = 0 Then Exit Sub ' чтобы не пыталась линии открывать в форме-карточке
из процедуры btnEdit_Click в процедуру ListEx_DblClick сразу за объявлениями переменных.

Должно получиться так:

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 12:20)   личное сообщение
69 Кб.
 
 

Гуд! Строковая переменная с указанием количества черточек. Интересно использовать такое в отчетах разделители по изменению высоты строки данных. (в будущем)
Однако использование одного списка еще под вопросом. В разных списках при открытии все заводится от первой даты. А она сразу =Date(). И в разных списках это просто реализовать. Как в одном - ??. Подсвечивать текущий день и с него начинать список. Кароч бум дум.
Вропрос более земной. При наличии нескольких списков на форме. Как при обращении к одному из них убрать выделения во всех оставшихся. Что бы не было такого:
Переобновление формы результатов не дает. В отдельности списков тоже.
Да и в открывающейся форме по прежнему приходится оставлять лишние подчиненные формы на каждый день. Преимущества одного списка на лицо.

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 12:37)   личное сообщение
 
 

Выполнил иниструкции. Все сработало. И с датам тож. Подсветку бы. В форме с несколькими списками не удается выделения убрать из неиспользуемых.

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

++Подсветку бы. В форме с несколькими списками не удается выделения убрать из неиспользуемых.++
Чтобы убрать выделения листбокса(lst0) достаточно прописать

      lst0 = Null

однако это работает в случае если lst0.MultiSelect = 0

если же lst0.MultiSelect <> 0 тогда по другому надо


For i = 0 To lst0.ListCount - 1
    If lst0.Selected(i) = True Then lst0.Selected(i) = False
Next i


таким образом, напрашивается цикл по листбоксам с очищением (Null) неактивных контролов плюс корячится внутренний цикл( если lst0.MultiSelect <> 0)

вариант лукаса с одним списком симпатичней

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 20:42)   личное сообщение
 
 

Однозначно лучше. Не спорю. Однако не все так просто.
Список - хорош для того, что бы разгрузить базу от лишних форм. К тому же открылся еще ряд возможностей.
Но основной вопрос так и не закрыт. 2щеллчка по списку (или строке формы) открывает форму с подчиненной формой. Так вот эта подчиненная... Хотелось бы менять ее источник. Точнее условия в запросе. Всего лишь дату. Вот это и не получалось. Пришлось 6 форм делать и показывать соответствующую. Все в примере выставил. Там одна над другой просто, поэтому может и незаметно. А на самом деле разные 7 штук. Хотелось бы одной обойтись.

  Ответить  
 
 автор: Lukas   (13.06.2009 в 20:48)   личное сообщение
 
 

Вылечить структуру БД требуется.
Дата должна быть характеристикой сущности "График исследований".
Ни в каких других связанных сущностях ЭТОЙ даты быть не должно.
Пишите ТЗ (в смысле опишите что надо). Поможем со структурой.

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 23:37)   личное сообщение
52 Кб.
 
 

Спасибо за предложение. Трудность возникла в следующем. Есть расписание с возможностью его корректуры в процессе. (Таблицы День - время). Выбирается дата, на нее соответственно показывается время. На выбранное время записывается пациент и назначается исследование.
Однако есть паспартная часть пациента. Там несколько пунктов заполнять. Если на один день одному пациенту делается несколько исследований, то предусмотрел дублирование записи.
Однако в ходе эксплуатации выяснилось следующее. Пациенты записываются наперед и им назначаются сразу несколько исследований на одно время. Раньше это было некритично. А теперь, назначив 2 и более исследований записывают того же пациента на следующее время. (что бы видеть занятость). Решил перенести время из таблицы учета пациентов в таблицу исследования, что бы сразу назначали на разные времена и видели свободное время. Но это таблица подчиненная для таблицы "Пациенты", а время должно быть внесено заранее. (Запрос на добавление действует). Вот тут-то и началась алхимия. Сперва стреляем, а потом цель под пулю загояем. И попасть надо. Сюда пристегнул структуру. Связь пациент - исследования была 1:много. Теперь то же самое только правосторонняя, дабы после заполнения времени что-то показывала. Может вовсе создать отдельную таблицу дата время?

  Ответить  
 
 автор: Lukas   (14.06.2009 в 00:06)   личное сообщение
 
 

Имеем: рабочий день разбит на периоды по 45 минут (из первого примера).
То есть одно исследование длится около 45 минут?

Вопросы:
1. Могут ли за эти 45 минут одному пациенту делаться более одного исследования?
2. Могут ли за эти 45 минут нескольким разным пациентам делаться исследования?

  Ответить  
 
 автор: Гоблин   (13.06.2009 в 23:54)   личное сообщение
2 Кб.
 
 

Вот пристегнул файлик с типа полученным техзаданием на страничку. Если требуется, может пустую базу куда-нибудь слить?

  Ответить  
 
 автор: Lukas   (14.06.2009 в 00:18)   личное сообщение
 
 

Слей на slil.ru

  Ответить  
 
 автор: snipe   (14.06.2009 в 05:07)   личное сообщение
 
 

Посмотрел схему.......по моему мнению она должна вам столько головной боли доставить.......
Исходя из своего МЫШЬления сделал бы так.......
1. таблица Пациенты помимо установочных данных паспорт где живет скем и т.д. еще бы учитывал особенности ну типа аллергические реакции, наличие вставных челюстей, наличие металла в теле, хронические заболевания и т.д. вообщем все то что может помочь доктору принять правильное решение......
2. таблица История болезни - связь с пациентами 1 пациент много болезней .......
3. таблица назначенные процедуры - связь с историей 1 история много процедур в процедурах указать дату начала процедуры, время, собственно процедуру, врача который будет проводить.......
теперь имея эти три основных таблицы пристегивать к ним остальные .......

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

Хотя возможно есть нюансы которые я не увидел

  Ответить  
 
 автор: Гоблин   (14.06.2009 в 21:10)   личное сообщение
 
 

Спасибо за поддержку и помощь. Честно задолбался с переделкой.
Lukas.
1. Официально на исследование отводится 45 мин. Однако эта величина условная. На деле может быть 20 мин, а может и 2 часа.
2. Нескольким одновременно не ведут. Однако по записям такое не исключено.
(Записывали неделю назад одного, а пришло время привезли неотложного) Время - величина условная. +/- час - не важно.
Несколько лет использовалась база без учета времени вобще. Правда и записи наперед не было. Это желание заказчика. Только для упорядоченности, что бы не записывать 10 человек наперед на один день. А по факту нередко и 13 пациентов проводят и у половины по 2 исследования. Поэтому время первоначально установил в "Пациентах". 50% идут неплановые. Их вписывают на текущее время. Для этого у меня стоит Time() по умолчанию.

Snipe
Да собственно так и есть. Основные таблицы - пациенты, исследования, результат исслеодваний. Остальное обвеска.
1. В паспартной части учитывается только то, что заказано самими врачами. Все перечисленное вами исследуется или уже в карточке записано.
2. 1 Пациент - много болезней. Это предлагалось мною ранее заказчику. Пациента учитывать 1 раз, и далее на него в разные даты, время разные исследования. Отказано. (Не знаю почему. Не хотят).
3. В 1 истории может быть несколько исследований. Причем запланировано может быть одно, а в ходе исследований по выявлению могут добаляться еще. Тогда время естественно будет затягиваться, но это уже не важно. Врачей всего 2. Кто проведет исследование, тот и подпишется. Это заполняется в ходе исследования.

Именно по таблице процедуры, или как у меня названо "Исследования". Перенос даты и времени в эту таблицу из таблицы "Пациенты" не меняя структуры - вот задача Практически справился, только хотелось бы уменьшить количество форм. (менять их свойства, источники при открытии в подчиненных) Конкретно - заменить в календаре формы на списки. (получилось как лукас сказал, только обновлять их гемор оказался еще тот)
В форме, что вызывается из календаря в подчиненной форме по области исследования - обойтись одной формой, а не 7-ю как у меня. Все из-за даты.
Слил то что получилось (и как получилось. Похоже 2 раза). http://zalil.ru/upload/27757154 пароль 012358 фаил: КТ 2009-время в исследовании

  Ответить  
 
 автор: Lukas   (15.06.2009 в 00:08)   личное сообщение
 
 

То что бросилось в глаза сразу:
1. непонятные таблицы "День недели", "Время" и их связь с таблицей "Исследования".
2. Связь таблиц "Область исследования" и "Исследования" по текстовым полям, при наличии ключевого поля-счетчика в таблице "Область исследования".
3. Поля "Вид исследования" и "Отделение" в таблице "Пациенты". Это не характеристики пациента.
4. Не связанные с другими таблицы "Профиль" и "Отделение исследования"

По поводу форм: Почему открываем с фильтром по пациенту?
Есть-же ключевое поле "КодОблИссл" в таблице "Исследования" (неадкватное + повторяющееся в другой таблице название поля, необходимо изменить на "КодИсследования"). С фильтром по значению этого поля нужно и открывать форму-карточку для изменения записи таблицы "Исследования" безо всяких промежуточных форм-контейнеров. Вопрос с датами и подчиненными формами возник вследствии этой запутки.

Дополнительно: сменить "окраску" форм на значительно более мягкие тона, иначе пользователи без глаз останутся.

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

Спасибо за взгляд со стороны.
1. День недели и время образуют расписание, которое меняется из года в год. Свяжу 1:много.
Связь с таблицей "Исследования" мне и самому непонятна порой. (наверно что-то химичил да осталась)
2. Связь нужна только для расчета дозы. В одной - эталон, в другой количество сканов, входящее в формулу. Будет формула (которой пока нет). Связал в запросе для отчета. Да и во внешнюю вкатал. Пока не мешает.
3. Все поля предназначались для одной таблицы, которую заполняет другой человек. (паспартная часть) В ходе переноса времени с датой пришлось вклинить другую таблицу. Тут-то и проблема началась.
4.Согласен отделение связать бы надо, да боязно. Пока с админом да со структурой подразделений не определятся, в ходе оргштатов и прочего, организацией доступа кто может менять и удалять, пусть в воздухе висят. Уже был прецендент потерять 110 исследований хорошо не завязаны.

По поводу форм.
С фильтром по пациенту??? А это в каком месте? Везде stLinkCriteria = "[КодПациента]=" & Me![КодПациента] на открытие форм. Так и открывает. Пока сбоев ни разу не было. "Промежуточных форм контейнеров" - этого нет. По крайней мере в моей базе. А запутка действительно есть. Кстати распутал на 90%. Есть еще ряд вопросов. Все же при открытии формы с подчиненной, в условии запроса не удается условия менять. Типа
Me.RecordSource = "SELECT Исследования.*, FROM Исследования WHERE (((Исследования.Дата) = [Forms]![Рабочая неделя]![Дата6]) ...
в условие подставлять [Дата5...1], из которой вызывалась форма? Что бы обойтись одной формой.
Хотя нет худа без добра. Может расставлю формы по вкладкам. Ввод пациента и листай, куда его всадить. Где вкатят область исследования, на тот день и будет.
На счет окраса - бум дум.

  Ответить  
 
 автор: Lukas   (16.06.2009 в 01:09)   личное сообщение
71 Кб.
 
 

stLinkCriteria = "[КодПациента]=" & Me![КодПациента]
Вот это и есть фильтр по (коду)Пациента, поэтому и приходится дополнительно фильтровать по дню исследования.
Если открывать форму-карточку таблицы "Исследования" с фильтром по значению ключевого поля таблицы "Исследования", не придется фильтровать дату.
В моем примере так и сделано.
В вашем варианте из подчиненной формы-списка на таблице "Исследования", открывается одиночная форма, привязанная к таблице "Пациент", в которой подчиненная форма на таблице "Исследования", требующая дополнительной фильтрации по дате. Непонятно зачем такой обходной маневр? "Исследования" не являются подчиненной сущностью "Пациенту".
На примере трех верхних дней:

  Ответить  
 
 автор: Гоблин   (16.06.2009 в 21:52)   личное сообщение
 
 

Н-да. Спасибо за науку, только вы немного не поняли. В том то и дело, что форма "Рабочая неделя " предназначена для начальника ведущего запись. Ничего лишнего он там видеть не хочет. Да и не надо ему это. "Запись" - поле технологическое для условного форматирования времени. Все остальное вобще не для него. Один пациент и несколько областей назначаемых ему на разное время. Все остальное только при исследовании заполняется. +обвес для просмотра доп инфы.
Желтая форма - для медсестры. Паспартная часть и остальное что там есть.
Зеленая - выходящая из желтой, для врача. (проверив паспартную часть открывает конкретно для записи результатов) Эта структура уже давно отработана, утверждена и в ходу.
Вопрос-то в том, как открыв форму на выбранную дату (из календаря) и, записав в ней ФИО и отделение, видя в ней свободное время для назначения области исследования, (их может быть 2-3 на разное свободное время дня, потому и подчиненная форма) эту самую подчиненную форму сделать не каждую для своего дня по условию запроса, а одну. И в зависимости от того на какой день открываем, соответственно фильтруем по выбранной дате. Но раз уж это невозможно, пусть так и будет.
Им все равно какая структура базы, главное что все работает как заказывали.

  Ответить  
 
 автор: access_newb   (19.06.2009 в 10:48)   личное сообщение
 
 

Как сделать что бы значение соответствующего поля передавалось в условие указанного запроса.
Пробовал через переменную. На двойной щелчек в поле присваивал: d=[Дата] и это d вместо Forms![Рабочая неделя]!Дата но в открывающейся форме это теряется. Запрашивает при открытии это самое d. Попытки через if с присвоением некой переменной условного значения 1,2,3... так же результата не дали.


Может я чего-то не понял, но это делается просто. Запросы позволяют использовать в качестве условия функцию, но не переменную. Поэтому создаешь в VBA свой модуль. В нем должно быть написано:

Option Compare Database
Option Explicit

'объявляем глобальную переменную:
public MyField1Value As Long '(или указываешь свой тип данных)

'объявляем глобальную функцию:
Public Function GetMyField1Value()
GetMyField1 = MyField1Value
End Function

В теле запроса в качестве условия пишешь: GetMyField1Value()

И не забудь на событие клик по полю написать MyField1Value = MyField1, чтобы переменной присвивалось значение этого поля.

  Ответить  
 
 автор: Гоблин   (20.06.2009 в 10:01)   личное сообщение
 
 

Вот за это спасибо. Заработало. С этой так называемой глобальной переменной чего только не делал. Но все оказалось не так. Спасибо.

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