-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


не работает сохранение записи в БД и выполнение запросов кодом VBA

Вторник, 16 Декабря 2014 г. 11:11 + в цитатник
Здравствуйте, уважаемые специалисты. Есть БД SQL Server 2008 R2+приложение на Аксесс 2013.
В БД есть таблицы:
1) ЕжедОтчет (НомерОтчета - счетчик, ключевое; ТабНомер - число, Подразделение - число;Дата - дата, краткий формат, ЧасовВОтчете - одинарное с плавающей точкой)
2)ЕжТрудозатрата(Код - счетчик, ключевое;Назначение - целое; Примечание - строка; ВремяНаДокумент - одинарное с плавающей точкой;Дата - дата, краткий формат;Отчет -целое,внешний ключ таблицы (1) )
Логика работы такая: есть форма заполнения отчета с подчиненной формой - записей таблиц (1) и (2), при этом записи таблицы (2) записываются в подчиненную форму. На главной форме есть кнопка "Отправить отчет",код которой должен сохранить записи в таблицах БД и произвести изменения данных с учетом отчета. Надо менять таблицу:
"НазначенияСотрудникам"(Код - счетчик, ключевое;Сотрудник-целое; ЧасовПлан -одинарное с плавающей точкой;ЧасовФакт-одинарное с плавающей точкой;ВремяНаДокумент - одинарное с плавающей точкой )
ВремяНаДокумент в этой таблице - это разница ЧасовПлан-ЧасовФакт.
Вот код на VBA, которым я пытаюсь сохранить введенные записи и поменять данные в таблице "НазначенияСотрудникам":
On Error GoTo ErrHandle
Dim Count As Integer
Count = 0
With Me.ЕжТрудоЗатратаОтчета.Form.RecordsetClone
  .MoveFirst
  Do Until .EOF
    If IsNull(![Объект]) Or IsNull(![ВремяНаДокумент]) Then
      Count = Count + 1
    End If
    .MoveNext
  Loop
End With
 Me.ЧасовВотчете = Forms![EzhetOtchet]![ЕжТрудоЗатратаОтчета].Form![ИтогЗаДень]
ErrHandle: If Count = 0 Then
'If (Count = 0) And ((Поле45 - RepItog) > 0) Then
 If MsgBox("Вы подтверждаете распределение часов по задачам?", vbYesNo) = vbYes Then
 If СуммаЗатратЗаДень <= 8 Then
 If СуммаЗатратЗаДень > 0 Then
 DoCmd.SetWarnings False
 DoCmd.OpenQuery "ОбновлениеОстатковВремени", , acEdit
DoCmd.OpenQuery "ОбновлениеОстатковЧасов", , acEdit
 MsgBox "Отчет принят.Спасибо Вам за работу!", vbOKOnly
  DoCmd.SetWarnings True
 ТекЗадачи.Requery
 DoCmd.Close acForm, "EzhetOtchet", acSaveYes
 Else
 MsgBox "Превышена длительность рабочего дня. Объем трудозатрат за день не должен превышать 8 часов. Отчет не может быть отправлен", vbOKOnly
 End If
 End If
End If
Else: MsgBox "Отчет заполнен не верно и не может быть отправлен.Проверьте заполнение отчета.Возможны ошибки:превышено допустимое время для распределения трудозатрат в отчете за день;" _
& "не выбраны работы из списка текущих задач;" _
& "введены трудозатраты в пустые строки отчета без выбора работ из списка;" _
& "необходимые работы выбраны из списка,введены в отчет,но по ним не заданы трудозатраты - не заполнено поле ЧасовФакт"
MsgBox "Нажмите кнопку ""Исправить ошибки заполнения отчета"",после чего проверьте заполнение отчета в результате исправления и повторите отправку,если считаете,что отчет заполнен корректно.Если некоторые позиции в результате исправления были удалены,повторите ввод данных позиций,соблюдая правила заполнения отчета"
Кнопка23.Enabled = False
End If
End Sub

Для обновления данных я в процедуре вызываю запросы,созданные в конструкторе запросов.
Запрос "ОбновлениеОстатковВремени":
UPDATE НазначенияСотрудникам INNER JOIN ЕжТрудоЗатрата ON НазначенияСотрудникам.Код = ЕжТрудоЗатрата.Назначение SET НазначенияСотрудникам.КолЧасовФакт = [НазначенияСотрудникам]![КолЧасовФакт]+[ЕжТрудоЗатрата]![ВремяНаДокумент]
WHERE (((ЕжТрудоЗатрата.Назначение)=[НазначенияСотрудникам]![Код]) AND ((ЕжТрудоЗатрата.Отчет)=[Forms]![EzhetOtchet]![НомерОтчета])); 
- увеличивает значение КолЧасовФакт на величину "ВремянаДокумент" из отчета
Запрос "ОбновлениеОстатковЧасов":
UPDATE НазначенияСотрудникам INNER JOIN ЕжТрудоЗатрата ON НазначенияСотрудникам.Код = ЕжТрудоЗатрата.Назначение SET НазначенияСотрудникам.ВремяНаДокумент = [НазначенияСотрудникам]![КолЧасовПлан]-[НазначенияСотрудникам]![КолЧасовФакт]
WHERE (((ЕжТрудоЗатрата.Назначение)=[НазначенияСотрудникам]![Код]) AND ((ЕжТрудоЗатрата.Отчет)=[Forms]![EzhetOtchet]![НомерОтчета]));
- уменьшает поле "ВремяНаДокумент" в таблице на соответствующуювеличину в отчете.
при выполнении кода возникают проблемы:
1)запись в главной таблице - ЕжедОтчет не сохраняется, в подчиненной таблице записи сохраняются и не выполняется ни один из запросов.
2)записи в обоих таблицах сохраняются, но запросы не выполняются...
Проблемы эти происходятрегулярно,но не у всех..из150 пользователей примерно у 15-20 человек, причем у разных... но ежедневно...все записи и запросы могут и сработать,но на N-й попытке,что конечно бесит пользователей и засоряет базу... Подключение юзеров к БД идет через файловый DSN. Аксесс юзеры9клиенты) запускают через Runtime. Помогите пожалуйста.Бьюсь давно над этим и ничего не выходит... Пробовал в запросах блокировки ставить - еще хуже...Акс ругается, что не может заблокировать данные...

http://www.sql.ru/forum/1132667/ne-rabotaet-sohranenie-zapisi-v-bd-i-vypolnenie-zaprosov-kodom-vba


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку