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

Форум: MS ACCESS

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

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

 
 

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

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

тема: количество знаков
 
 автор: Andrey410   (03.02.2011 в 16:03)   личное сообщение
15 Кб.
 
 

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

  Ответить  
 
 автор: Explorer   (03.02.2011 в 16:49)   личное сообщение
44 Кб.
 
 

FieldProperties -> Format -> Fixed ===>>>

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

Спасибо большое, я ставил свойства в таблице и думал, что в запрос они перейдут тоже
Если можно, подскажите пожалуйста по второму вопросу тоже

  Ответить  
 
 автор: Explorer   (03.02.2011 в 17:03)   личное сообщение
 
 

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

поясни задачу - т.е. необходимо:

выбрать самое маленькое во всей таблице значение из поля 1,
прибавить самое маленькое во всей таблице значение из поля 2
... из поля n

так?

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 17:34)   личное сообщение
 
 

Ну не совсем. Попробую расписать задачу подробно.
В таблице в полях 1,2,3 содержатся значения времени выполнения упражнения (1,2,3 номера попыток), это всегда секунды с точностью до сотых. В поля 4,5,6 заносятся штрафные очки набранные в процессе выполнения, (всегда целое число) в запросе они плюсуются к конкретной попытке. Результат упражнения это сумма двух лучших попыток (с самым маленьким временем). Задача сложить между собой время выполнения упражнения и штрафные очки, затем изо всех полученных результатов выбрать 2 самых маленьких и сложить их между собой. Попыток может быть не 3 а намного больше...

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 17:47)   личное сообщение
 
 

Чтобы совсем упростить:
1-Есть запрос содержащий 3 или 5 или 7 или сколько угодно выражений на сложение полей таблицы.
2 -Нужно сравнить между собой результаты выражений в запросе и выбрать 2 самых маленьких значения.
3 -Выбранные 2 значения нужно сложить между собой.

  Ответить  
 
 автор: Explorer   (03.02.2011 в 17:48)   личное сообщение
 
 

>>> или сколько угодно выражений на сложение полей таблицы.

да-да-да

  Ответить  
 
 автор: Explorer   (03.02.2011 в 17:48)   личное сообщение
 
 


Попыток может быть не 3 а намного больше...


тогда меняй схему БД

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

Хорошо остановимся на фиксированном количестве выражений в запросе. То есть условия всё те же, но полей в таблице всего 8 и соответственно в запросы мы имеем 4 выражения:
1) поле1+поле5
2) поле2+поле6
3) поле3+поле7
4) поле4+поле8
5) ??? тут должно быть выдающее конечный результат запроса.
Ну не выходит у меня

  Ответить  
 
 автор: Explorer   (03.02.2011 в 19:12)   личное сообщение
 
 

>> 5) ??? тут должно быть выдающее конечный результат запроса.

я бы вел сравнение во внешней функции вроде такой
Function fCalculate(a, b, c, d, e, f)
Dim x, y, z
x = a + d
y = b + e
z = c + f
If y < x Or z < x Then
If z < y Then
fCalculate = z
Else
fCalculate = y
End If
Else
fCalculate = x
End If
End Function

и возвращал результат в запрос...
SELECT fCalculate([знач 1],[знач 2],[знач 3],[знач 4],[знач 5],[знач 6]) AS Результат
FROM Таблица1

но можно и в самом запросе посчитать - просто очень неудобное и длинное выражение получится...

_______________________
вообще-то я бы переделал схему данных

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 19:57)   личное сообщение
 
 

Поскольку программку только начал писать изменить схему легко, но мне кажется что может быть проще: 1-я таблица содержит данные о людях( Ф.И.О. и т.п. ); 2-я содержит данные о результатах (дата выполнения, № упражнения, 4 поля для основного времени и 4 поля для штрафного времени ) больше и нет ничего, да и по большому счёту не нужно. Был бы весьма признателен если бы Вы подсказали как правильно сделать. Условия что нужно получить в итоге я писал.

  Ответить  
 
 автор: Explorer   (03.02.2011 в 20:04)   личное сообщение
 
 

>>> Был бы весьма признателен если бы Вы подсказали как правильно сделать

поскольку "зачетный" вариант выбирается один из трех-четырех, какой смысл хранить остальные?

при тестировании необходимо запоминать некоторое количество промежуточных результатов во временную таблицу (например)
выбирать из них один показательный, или рассчитывать его (это может быть не только лучший или худший, а средний, например)

и уже окончательный вариант оценки хранить в рабочей таблице

нет никакого разумного объяснения 8 полям - для четырех вариантов для основного и штрафного времени...
можно вообще промежуточные варианты не хранить, а сразу по ходу тестирования выбирать подходящий
(в зависимости от методики определения результата)

-------------------
вообще схема будет зависеть и от методики тестирования например по способу ответов:

сформулировать самостоятельно правильный ответ
или
выбрать правильный<е> вариант<ы> ответа

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 20:21)   личное сообщение
 
 

К сожаления так не получится.
Программка пишется для упрощения подсчёта результатов на соревнованиях и все исходные данные должны обязательно сохраняться. чтобы не могло возникнуть вопросов о ошибках в судейских подсчётах, через пару месяцев,а то и год после соревнования.
В принципе сложного тут ничего нет единственное действие которое действительно вызывает проблему это сравнение 4 цифр и выбор из них 2-х наименьших. Всё остальное пишется хоть и громоздко но несложно.

  Ответить  
 
 автор: Explorer   (03.02.2011 в 20:26)   личное сообщение
 
 

хорошо, можно и сохранять - все равно это должна быть простая таблица

Спортсмен
Соревнование
Попытка№
Результат

  Ответить  
 
 автор: Explorer   (03.02.2011 в 20:23)   личное сообщение
 
 

кактотак

тУченики
---------------------------
* КодУченика
ФИОУченика
ДРУченика
ПолУченика

тЭкзамены
---------------------------
*КодЭкзамена
*КодУченика
*КодВопроса
Результат

тВопросы
--------------------------
*КодВопроса
Вопрос
Ответ

  Ответить  
 
 автор: Дядя Федор   (03.02.2011 в 20:29)   личное сообщение
 
 

В массив это надо. (2,N). /Запросом не обязательно. Можно через рекордсет. Потом задача для 5 класса.

  Ответить  
 
 автор: Explorer   (03.02.2011 в 20:34)   личное сообщение
 
 

если нужно хранить результаты попыток то массив и не нужен :)
просто хранить все показанные результаты и выбирать нужные

SELECT TOP 2 [Результат]
FROM тРезультаты
ORDER BY [Результат]

(WHERE [Спортсмен] = "Иванов" AND [Соревнование] = "прыжки")

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

Jet-ом скучно решать такие задачи.
Толи дело VBA - процессор кипит, кулеры "на взлет", романтика!
:)

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 20:32)   личное сообщение
152 Кб.
 
 

посмотрите если можно исходник

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 20:35)   личное сообщение
 
 

тут запросов никаких нет только таблицы и проекты форм.
У меня очень низкая квалификация и многие вещи понятны только на примерах к сожалению...

  Ответить  
 
 автор: Explorer   (03.02.2011 в 20:38)   личное сообщение
 
 

дома посмотрю :)

---------------
подсчет для четырех варианов (выбор лучшего результата - наименьшего значения Время+Штраф

подойдет функция вида
Function fCalculate(a, b, c, d)
If b < a Or c < a Or d < a Then
If c < b Or d < b Then
If d < c Then
fCalculate = d
Else
fCalculate = c
End If
Else
fCalculate = b
End If
Else
fCalculate = a
End If
End Function


и запрос вида

SELECT [фамилия] & " " & Left([имя],1) & ". " & Left([отчество],1) & "." AS Gunner, fCalculate([1 этап время]+[1 этап штраф],[2 этап время]+[2 этап штраф],[3 этап время]+[3 этап штраф],[4 этап время]+[4 этап штраф]) AS BestResult
FROM Стрелки INNER JOIN Результат ON Стрелки.[ID стрелка] = Результат.[ID стрелка];

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 21:03)   личное сообщение
 
 

Не будет с мое стороны наглостью попросить это на примере?
Сделал модуль и запрос, но считает только самый лучший результат, а тот что на втором месте по значению, игнорирует. Вписывает в это поле копию лучшего значения.

  Ответить  
 
 автор: Дядя Федор   (03.02.2011 в 21:21)   личное сообщение
 
 

ТУПО НА ВСКИДКУ. К АЛГОРИТМУ ПОИСКА 2-х МИНИМАЛЬНЫХ НЕ ПРИДИРАТЬСЯ.
Не ДУМАЛ ВОВСЕ. ПЕРВОЕ ЧТО ПРИШЛО В ГОЛОВУ.
Но по большому счету я б другую структуру данных сделал

Option Compare Database
Option Explicit



Public Sub SUMMIN()
Dim rst As DAO.Recordset
Dim N As Integer 'количество пар
Dim i As Integer
Dim j As Integer
Dim m1 As Double
Dim m2 As Double
Dim Result As Double
Dim varmas
Set rst = CurrentDb.OpenRecordset("Таблица1")
With rst
 N = (rst.Fields.Count - 1) / 2
 ReDim varmas(N)
 
 .MoveFirst
 While Not .EOF ' на случай множества записей
 For j = 1 To N
  varmas(j) = rst.Fields(j) + rst.Fields(j + N)
 Next
 'вывод код, сумма двух минимальных
 Debug.Print .Fields(0), summin2(varmas, N)
 .MoveNext
 Wend
 
End With
End Sub


Public Function summin2(mas As Variant, ubm As Integer)
Dim m1 As Double
Dim m2 As Double
Dim i As Integer
Dim NomMin1 As Integer
m1 = 99999999
m2 = 99999999
NomMin1 = 1
For i = 1 To ubm
 If mas(i) < m1 Then
 m1 = mas(i)
 NomMin1 = i
 End If
Next
For i = 1 To ubm
If i <> NomMin1 Then
 If mas(i) < m2 Then
 m2 = mas(i)
 End If
End If
Next

summin2 = m1 + m2

End Function

  Ответить  
 
 автор: Explorer   (03.02.2011 в 21:28)   личное сообщение
 
 

все равно нужно делать "вертикальную" таблицу

и результат выбирать через SELECT TOP n - тогда и два лучших можно и три лучших и средний и ч*рта в ступе :)))

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 21:31)   личное сообщение
 
 

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

  Ответить  
 
 автор: Explorer   (03.02.2011 в 21:26)   личное сообщение
185 Кб.
 
 

:)

по первоначальному ТЗ нужен был только самый лучший результат

файл в приложении ===>>>

все остальное можно приточить напильником

------------
посмотрел - да, нужно было два самых маленьких :)))
ладно, что-то придумаем

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 22:01)   личное сообщение
 
 

Сейчас нашел ещё 1 засаду.
Если человек полностью сливает упражнение то и время у него не фиксируется соответственно для программы оно 0 и она его считает как лучшее В принципе конечно это можно обойти поставив значением по умолчанию в каждое поле какую нибудь безумную цифру, но как то некрасиво получится...

  Ответить  
 
 автор: Andrey410   (03.02.2011 в 23:25)   личное сообщение
 
 

Аууу... Все спят уже

  Ответить  
 
 автор: explorer   (04.02.2011 в 02:22)   личное сообщение
 
 

ты ищи пока и другие засады - там есть еще...

  Ответить  
 
 автор: kot_k_k   (04.02.2011 в 09:05)   личное сообщение
 
 

В каждом поле (Конструктор таблиц) есть параметр "Значение по умолчанию" - вот там ничего не ставь - будет NULL.

  Ответить  
 
 автор: Andrey410   (04.02.2011 в 10:03)   личное сообщение
 
 

Спасибо помогло, теперь пустое поле игнорирует. Если бы оно ещё и считало как нужно...

  Ответить  
 
 автор: Explorer   (04.02.2011 в 10:03)   личное сообщение
 
 

>>> вот там ничего не ставь - будет NULL.

это зависит от правил подсчета результатов.

  Ответить  
 
 автор: kot_k_k   (04.02.2011 в 10:58)   личное сообщение
 
 


это зависит от правил подсчета результатов.



нет все зависит от того мы продаем или покупаем

2 аффтар
в чем проблема подсчета 4-х несчастных цифирей

  Ответить  
 
 автор: kot_k_k   (04.02.2011 в 11:04)   личное сообщение
 
 

посмотрел на струкктуру - а если добавят 5-й и 6-й этапы - че все на фиг переделывать
да и соревнования могут перенести на другой день
может проще код, дата, спортсмен, кол-во мишеней, упражнение, Этап (вернее его Код из таблы Упражнение-Этапы), время, штраф.
и не надо морочить яйцы с нулем - нет записи - нет этапа
ни фига не надо сравнивать просто запрос по возрастанию по полю время+штраф*К

  Ответить  
 
 автор: Andrey410   (04.02.2011 в 12:33)   личное сообщение
 
 

Всё сделал как Вы написали, переделал структуру таблиц, но вот запрос что то не выходит. Можно пример запроса?

  Ответить  
 
 автор: Explorer   (04.02.2011 в 14:23)   личное сообщение
 
 

приложите пример вашей БД

да, и не используйте пробелы в именованиях объектов - дико бесит и отнимает кучу времени на соблюдение правил синтаксиса при написании запросов

  Ответить  
 
 автор: Andrey410   (04.02.2011 в 14:30)   личное сообщение
160 Кб.
 
 

вот пример

  Ответить  
 
 автор: Explorer   (04.02.2011 в 14:54)   личное сообщение
 
 

эта схема уже гораздо лучше - так держать

только с именованиями объектов надо разобраться.
за имена типа "кол-во мишеней" нужно ставить двойку

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

исправлюсь

  Ответить  
 
 автор: Andrey410   (04.02.2011 в 14:25)   личное сообщение
 
 

Проблема в том что нужно взять 4 цифры результатов этапов соответствующие номеру, выбрать из них 2 самые маленькие, сложить и выдать на выходе их сумму. Ключевая проблема выбрать 2 самых маленьких результата.

  Ответить  
 
 автор: Explorer   (04.02.2011 в 14:54)   личное сообщение
 
 

если все 4 одинаковые какие выбирать?

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

если все одинаковые то без разницы - любые 2

  Ответить  
 
 автор: kot_k_k   (04.02.2011 в 16:08)   личное сообщение
53 Кб.
 
 


SELECT TOP 2 Сводная.[ID стрелка], Сводная.этап, [время]+[штраф] AS Выражение1
FROM Сводная
ORDER BY [время]+[штраф];


выдает 2 самых маленьких записи, если добавить Where Id_Стрелка= получим для стрелка.

посмотри пример Стрелки

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