Здравствуйте, уважаемые специалисты. Есть БД 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