|
|
|
| Форумы/
Сообщений: всего:53643, сегодня:0, за неделю:31, за месяц:46, за год:1617
|
|
Использование СУБД Ms Access, программирование на VB, VBA
Данный форум посвящен различным вопросам создания приложений баз данных на платформах - Microsoft Access, Microsoft Visual Basic.
|
|
|
|
|
|
В форме каждый день заносятся в поля числовые данные. В некоторых полях информация заносится с нарастающим итогом. Например: Дата Поле 1 01.01.2010 10000 02.01.2010 11000 и.т.д. Как в форме организовать поле, которое бы показывало прирост (разницу с предыдущей записью этого поля за прошлый день) Для примера, возле поля 1 вставить поле 2 Дата Поле 1 Поле 2 01.01.2010 10000 02.01.2010 11000 1000 |
| 31.01.2010 13:35 |
|
|
Вас устроит вариант, если для расчета вам нужно будет нажимать кнопку на форме,чтобы посмотреть разницу по выделенной и предыдущей записи ? Или вам статистику с этими значениями разницы надо вести в таблице тоже. Данные должны только на форме отображаться,или же в таблицу тоже заноситься другим словом? Скажите, соберем вам образец и приложим. |
| 31.01.2010 15:09 |
|
|
| Да, должны заносится в таблицу. |
| 31.01.2010 15:38 |
|
|
Какая-то обратная у Вас задача. Обычно в таблицу записываются данные, просто данные. Например, приход чего-то столько-то, дата такая-то. Потом возникает необходимость просмотреть историю нарастающим итогом. А у Вас нарастающим итогом данные заносятся... точно на каждый день одна запись? Можно составить запрос, в котором объединить таблицу саму с собой по условию, что даты отличаются на один день и расчитать разницу. |
| 31.01.2010 21:01 |
|
|
Каждый день заносятся показатели оборудования, они идут с нарастанием. Необходимо на форме видеть величину прироста, потом от него будут производится некоторые вычисления.
Как объединить таблицу саму с собой |
| 31.01.2010 21:28 |
|
|
Доброй ночи, я подумал тут пару минут, решение получилось немного сумбурным, но работает. Примерно как сказал Денис, только я разложил все на составляющие. В качестве объединенных таблиц наглядно на форме в главной вставил таблицу1,и в подчиненной ее же, только условием для связи/отбора сделал не чистое поле, а значение дата-1, для этого создал отдельное поле на форме,назвал его poledata. и привязал подчиненную именно на это поле. Создал второе поле,назвал его poleznachenie, источником данных у которого является поле значение из подчиненной формы(которое предварительно уже отфильтровано по предыдущей дате). Итак, значение предыдущей даты известно, осталось отнять текущее от предыдущего. Код простенький, повесил на кнопку:
Private Sub Кнопка37_Click() Dim P As Integer Dim D As Integer P = Me.predznachenie D = Me.значение Me.разница = D - P End Sub
Все, процесс пошел...образец приложил. Можно вместо подчиненной формы написать выборку SQL прямо в коде, по этому же принципу, присвоить переменную этому выбранному значению,и провернуть то же самое чисто в коде, но пора спать уже)). Образец БД прилагаю. |
| Присоединенный файл:Опыты.rar (Размер: 23478 байт, Скачиваний:51) |
| 01.02.2010 02:18 |
|
|
С Уважением, ЛАлов Сергей |
| 01.02.2010 02:19 |
|
|
Сергей думаю что решение немного не доработано. Что если в какой-то из дней поле не будет заполнено, например в субботу или воскресенье сотрудники наверняка отдыхают. Скорее надо ввести нумерацию записей в запросе (см. примеры на сайте) и создать запрос с двумя копиями полученной автонумерации, связав копии уже по значению этого поля автонумерации - 1. Соответственно в этом последнем запросе и вычислять разницу. |
| 03.02.2010 12:28 |
|
|
Да,согласен, решение недоработано по следующим моментам: во первых обработчик нулевых значений поля надо включить. Добавить условие if которое в случае выходных дней обращается например к пятнице. Вообще предварительно проверяет день недели. Организуется просто ,при помощи функции WeekDay(тра та та)если к примеру функция выдает значение тиекущего дня =1 понедельнику, то обращение идет к пятнице прошлой недели. В принципе задача несложная. Если актуально еще вопрос,доработаю в коде и пришлю.. |
| 03.02.2010 13:19 |
|
|
| актуально |
| 03.02.2010 21:49 |
|
|
Re:Вычисляемое поле Ol_Bak Да, должны заносится в таблицу.
Зачем хранить в таблицах то, что можно посчитать? Плохо это. |
| 04.02.2010 11:41 |
|
|
Все сделал, можно пойти следующим путем, все сделал в коде. Обработка на значение нулевого поля есть, если запись первая, то вопрос ошибки так же решается при помощи on error resume next- то есть курсор переходит на следующую запись и считает разницу второго и первого значения, то есть уворачивается от нулевого значения записи EOF.
Private Sub Кнопка18_Click()
On Error Resume Next
Dim A As Integer
Dim B As Integer
If IsNull(Me.значение) = True Then
MsgBox "Значение поля нулевое, заполните внесите необходимое значение," & _
"чтобы поле не оставалось нулевым, скорее всего вы находитесь на последней незаполненной записи"
Exit Sub
Else
DoCmd.GoToRecord , , acPrevious
A = Me.значение
DoCmd.GoToRecord , , acNext
B = (Me.значение - A)
Me.разница = B
Me.разница.Requery
End If
End Sub
Образец прилагаю,кушать подано!
|
| 04.02.2010 15:11 |
|
|
| Subj |
| Присоединенный файл:образец.rar (Размер: 24665 байт, Скачиваний:18) |
| 04.02.2010 15:13 |
|
|
Не знаю почему, но когда открываю форму образца в режиме конструктора, выкидывает ошибку "Microsoft Office ACCESS обнаружил ошибку, Приложение бедет закрыто и т.д и т.п......" |
| 04.02.2010 19:00 |
|
|
| Попробуйте еще,у меня стоит офис 2010, может были библиотеки,которых нет у вас. Сбросил еще раз. |
| Присоединенный файл:Опыты.rar (Размер: 24524 байт, Скачиваний:14) |
| 04.02.2010 19:14 |
|
|
| Ситуация аналогичная, у меня ACCESS 2003 |
| 04.02.2010 19:29 |
|
|
| Сохранил в формате 2000, пробуйте. |
| Присоединенный файл:Опыты1.rar (Размер: 20800 байт, Скачиваний:19) |
| 04.02.2010 20:04 |
|
|
| Какая то фигня получается, так все работает, но когда хочу сделать форму подчиненной - вставляю поле, выкидывает туже ошибку |
| 05.02.2010 16:05 |
|
|
| ну я не смогу сказать почему у тебя в твой родной базе не работает код)) Смотри выше на процедуру и пиши по образу ее. Перешли мне свою БД, опиши в какой форме надо написать,помогу чем смогу. |
| 05.02.2010 16:57 |
|
|
от образец с подчиненной табличной формой:
Private Sub Кнопка2_Click()
On Error Resume Next
Dim A As Integer
Dim B As Integer
Me.подчиненная_форма_Таблица1.SetFocus
If IsNull(Me.подчиненная_форма_Таблица1.Form.значение) = True Then
MsgBox "Значение поля нулевое, заполните внесите необходимое значение," & _
"чтобы поле не оставалось нулевым, скорее всего вы находитесь на последней незаполненной записи"
Exit Sub
Else
DoCmd.GoToRecord , , acPrevious
A = Me.подчиненная_форма_Таблица1.Form.значение
DoCmd.GoToRecord , , acNext
B = (Me.подчиненная_форма_Таблица1.Form![значение] - A)
Me.подчиненная_форма_Таблица1![разница] = B
Me.подчиненная_форма_Таблица1![разница].Requery
End If
End Sub
Образец БД с подчиненной также приложил |
| 08.02.2010 16:16 |
|
|
| Subj |
| Присоединенный файл:Опыты1.rar (Размер: 28835 байт, Скачиваний:11) |
| 08.02.2010 16:19 |
|
|
Сергей, я уже тебе наверное надоел, но когда в форму завожу свои значения, то при расчете в поле разница появляются нули.
Присылаю свою форму, на ней работают |
| Присоединенный файл:автотранспорт.zip (Размер: 16984 байт, Скачиваний:12) |
| 08.02.2010 17:56 |
|
|
Все, решил вашу задачу, в приложении твоем БД с кнопкой действующей. А так в чем заковыка была, значения у тебя большие и поэтому объявлять в коде надо не Dim integer а Dim Long.! Прилагаю БД с решением. |
| Присоединенный файл:автотранспорт.rar (Размер: 19641 байт, Скачиваний:17) |
| 08.02.2010 19:15 |
|
|
| Спасибо!!!!!!!!!!! |
| 08.02.2010 22:40 |
|
 
|
|