Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2013, 09:16   #21
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Да, и

4. Через мою форму данные вносить будет нельзя, я сделал её только для удобства просмотра
(она так и называется - форма просмотра).
Я вас просил объяснить, что вы собираетесь со всем этим делать (я лично так и не понял, для чего такие замысловатые алгоритмы...), но ответа нет.
(Я так, напоминаю...)
Андрэич вне форума Ответить с цитированием
Старый 27.01.2013, 11:39   #22
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

В запросе изменились названия полей.

Код:
SELECT 
	IIf(IsNull(Поле1),"1",CCur(Format(Replace(Replace((Поле1),".",","),"?",","),"&&&&&&;1"))) AS Поле11,
	IIf(IsNull(Поле2),"1",CCur(Format(Replace(Replace((Поле2),".",","),"?",","),"&&&&&&;1"))) AS Поле22,
	IIf(IsNull(Поле3),"1",CCur(Format(Replace(Replace((Поле3),".",","),"?",","),"&&&&&&;1"))) AS Поле33,
CalcRec(
	IIf(IsNull(Поле1),"1",CCur(Format(Replace(Replace((Поле1),".",","),"?",","),"&&&&&&;1"))),
	IIf(IsNull(Поле2),"1",CCur(Format(Replace(Replace((Поле2),".",","),"?",","),"&&&&&&;1"))),
	IIf(IsNull(Поле3),"1",CCur(Format(Replace(Replace((Поле3),".",","),"?",","),"&&&&&&;1")))
		) AS Выражение
FROM Таблица
Код:
Public Function CalcRec( _
        ByVal str1 As Currency, _
        ByVal str2 As Currency, _
        ByVal str3 As Currency) As String
Dim i, Dic, arr, iMax, iMin
    On Error GoTo Err_Handle
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    .Add 1, str1
    .Add 2, str2
    .Add 3, str3
    arr = .Items
        For i = 0 To .Count - 1
            If arr(i) > iMax Then iMax = arr(i)
        Next
    iMin = iMax
        For i = 0 To .Count - 1
            If arr(i) < iMin Then iMin = arr(i)
        Next
End With
'    Debug.Print iMin & " - " & iMax
CalcRec = Format(-((iMin - iMax) / iMin * 100), "####.0 \%")
Err_End:
    Set Dic = Nothing
    Exit Function
Err_Handle:
    MsgBox Err.Number & " " & Err.Description
    Resume Err_End
End Function
Андрэич вне форума Ответить с цитированием
Старый 27.01.2013, 15:14   #23
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию

Да, вчера я незаметил что форма перестала разрешать вводить новые записи, это недопустимо.

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

Данные замеров пляшут от 0,0001 до 100, точность до 0,1% в полне достаточно, % указывать не стоит (это указывается в заголовке)

Да еще, форма является подчиненой, в четвертом уровне так-что предлагаю сдатся и оставить мой убогий вариант с 4 дополнительными полями. Тут я хоть понимаю что к чему и могу если что поправить, а твой VBA если что я уже не выличу.

Огромное спасибо что не прошли мимо
raytek вне форума Ответить с цитированием
Старый 28.01.2013, 10:13   #24
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Теперь понял.
Цитата:
Сообщение от raytek Посмотреть сообщение
каждое оборудование имеет свои виды и объемы испытаний а таблица у них одна, для каждого оборудования разработана своя специфическая форма ввода данных
Вот здесь заложена основная ошибка проекта базы, об этом уже сразу сказали. Базу создавал человек с "экселевским" мировоззрением. То, что мы сейчас делаем - это фактически "переворачиваем" некую эксель-таблицу на 90 градусов.

Цитата:
Сообщение от raytek Посмотреть сообщение
(она же и форма просмотра данных, на ней кнопка "протокол", при необходимости можно распечатать отчет-протокол).
Форма просмотра и(или) отчёт должна быть отдельной и вызываться отдельно, например, из той же формы просмотра.

Цитата:
Сообщение от raytek Посмотреть сообщение
Наша форма испытания трансформатора, у него 3 обмотки (Поле1, Поле2, Поле3) и от 1 до 19 положение (это записи). Приехал работник с замеров, открыл форму, вводит данные и видит процен расхождения в каждой записи (если больше 2% это брак, я условным форматированием подсвечиваю его красным). Открыл инженер через месяц эти замеры (в той хе форме) и сразу видит что в норме, где брак, при необходимости может распечатать протокол испытаний (там тоже проценты должны быть показаны. В общем красота да и только
Посмотрите вложенный файл, так должно быть? (Также проверьте точность расчётов на ваших актуальных данных.)

Форма и её источник данных остаются прежними. Результаты расчётов выводятся в отчёте (но вместо него можно сделать и форму), источником данных которого является мой запрос.

Ещё добавил обработку ошибки ввода - если какое-то поле окажется пустым или там будет ноль. Если в одном из трёх полей такое допускается, напишите, подправим код. Кроме того, возможны ошибки ввода (поле ведь текстовое): точка или мягкий знак вместо запятой в качестве разделителя.
Запрос - источник данных отчёта, - исправляющий неправильно введённые данные (кстати, вы так и не ответили на вопрос про точное количество знаков):
Код:
SELECT 
	IIf(IsNull(Поле1),"0",CCur(Format(Replace(Replace((Поле1),".",","),"?",","),"&&&&&&;0"))) AS Поле11,
	IIf(IsNull(Поле2),"0",CCur(Format(Replace(Replace((Поле2),".",","),"?",","),"&&&&&&;0"))) AS Поле22,
	IIf(IsNull(Поле3),"0",CCur(Format(Replace(Replace((Поле3),".",","),"?",","),"&&&&&&;0"))) AS Поле33,
CalcRec(
	IIf(IsNull(Поле1),"0",CCur(Format(Replace(Replace((Поле1),".",","),"?",","),"&&&&&&;0"))),
	IIf(IsNull(Поле2),"0",CCur(Format(Replace(Replace((Поле2),".",","),"?",","),"&&&&&&;0"))),
	IIf(IsNull(Поле3),"0",CCur(Format(Replace(Replace((Поле3),".",","),"?",","),"&&&&&&;0")))
		) AS Выражение
FROM Таблица
Функция теперь полная, с обработкой ошибок, в том числе в случае нуля во входящих данных:
Код:
Public Function CalcRec( _
        ByVal str1 As Currency, _
        ByVal str2 As Currency, _
        ByVal str3 As Currency) As String
Dim i, Dic, arr, iMax, iMin
    On Error GoTo Err_Handle
Set Dic = CreateObject("Scripting.Dictionary")
With Dic
    .Add 1, str1
    .Add 2, str2
    .Add 3, str3
    arr = .Items
        For i = 0 To .Count - 1
            If arr(i) > iMax Then iMax = arr(i)
        Next
    iMin = iMax
        For i = 0 To .Count - 1
            If arr(i) < iMin Then iMin = arr(i)
        Next
End With
'    Debug.Print iMin & " - " & iMax
'CalcRec = Format(-((iMin - iMax) / iMin * 100), "####.0 \%") 'Со знаком %
CalcRec = Format(-((iMin - iMax) / iMin * 100), "####.0") 'Без %
Err_End:
    Set Dic = Nothing
    Exit Function
Err_Handle:
    If Err.Number = 11 Then
        CalcRec = "Нет данных"
        Resume Next
    End If
    MsgBox Err.Number & " " & Err.Description
    Resume Err_End
End Function
Если что, пишите
Вложения
Тип файла: zip ПроцентРасхождения3.zip (22.3 Кб, 7 просмотров)
Андрэич вне форума Ответить с цитированием
Старый 28.01.2013, 17:42   #25
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию

Да, действительно, 10 лет все это творил в Excel, год назад сел за Access, и на нашем предприятии помощи от компьютерщиков ждать не приходится, хорошо что есть такой форум.

Все работает ОК, только когда проценты меньше 1 (например 0,5) показывает ,5

я по логике ошибку в модуле исправил:

заменил "####.0" на "###0.0"

я бы хотел показать вам свою базу, для оценки специалистом, если конечно есть время и желания....
raytek вне форума Ответить с цитированием
Старый 28.01.2013, 18:51   #26
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Цитата:
Сообщение от raytek Посмотреть сообщение

заменил "####.0" на "###0.0"

я бы хотел показать вам свою базу, для оценки специалистом, если конечно есть время и желания....
"###0.0"
Да, моя очепятка

Если только для оценки, то сразу видно, что она неправильно сделана... Менять надо всё, начиная со структуры (таблицы, поля и связи между таблицами) до таких "мелочей" как тип данных поля.
Другое дело, нужно ли это. Сейчас работает (пускай, что и посредством "танцев с бубнами")? Сломаться вроде не должна... :-)
Если предполагается её дальше расширять, увеличивать функционал, тогда, конечно, нужно её переделывать, чем раньше, тем лучше.
Тогда выкладывайте файл (вообще-то, почти все сразу так делают, а не объясняют на словах)
Андрэич вне форума Ответить с цитированием
Старый 28.01.2013, 23:17   #27
raytek
Пользователь
 
Регистрация: 07.11.2011
Сообщений: 67
По умолчанию

Не, переделывать базу уже нет не сил не времени, пусть работает как есть.

Показать не получится, база после архивации в максимальном сжатии весить 130 Мб, а ограничения на передачу 20 Мб.

Еще раз огромное спасибо!!!!
raytek вне форума Ответить с цитированием
Старый 28.01.2013, 23:43   #28
Андрэич
Форумчанин
 
Аватар для Андрэич
 
Регистрация: 20.05.2012
Сообщений: 311
По умолчанию

Цитата:
Сообщение от raytek Посмотреть сообщение
Показать не получится, база после архивации в максимальном сжатии весить 130 Мб
Попробуйте сжать базу. Не знаю, какой у вас Акс (вы так и написали), в А2003 это Меню-Служебные программы-Сжать и восстановить. В Параметрах можно поставить галочку: Сжимать при закрытии (как в моём файле, обратите внимание)...
Собственно говоря, если в базе не десятки форм, отчетов (Вложений - В А2007 и выше) - она не может, скорее всего, столько весить, если её периодически сжимать
Андрэич вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не идет паскаль (функция min and max). Тань"ка Паскаль, Turbo Pascal, PascalABC.NET 4 20.01.2013 20:21
Функция для преобразование символьной ASCIIZ-строки в ASCII-строкy dreamfactor Общие вопросы Delphi 2 21.10.2012 12:35
Функция для ввода строки в Python 2.7 или 3.2 Ibanez Wizard PHP 1 09.11.2011 22:35
определить значения выражения z=max (a,2b)*max(2a-b,b)(алгоритм функция) анжелка Паскаль, Turbo Pascal, PascalABC.NET 2 04.04.2011 08:53
функция нахождения max/min эл-та в массиве Zhenya-Pvl Паскаль, Turbo Pascal, PascalABC.NET 3 20.12.2010 14:31