Спасибо, ясно.
К сожалению, я не очень представляю себе, как сие можно разумно сделать:
1. В «Значении по умолчанию»/«Условии на значение» для поля автор не даёт возможности использовать такой обычный и типичнейший для Microsoft Access механизм, как вызов пользовательской функции VBA.
2. Вызов скрипта по различным триггерам: триггер срабатывает после смены текущей записи (даже при триггере на изменение поля!).
3. Вызов по кнопке: само поле в форме заполнить нельзя, только таблицу/запрос (и, как тут принято говорить, через жёппу). Форма обновляется когда захочет и если захочет. А может и вовсе не обновиться. Вот так.
Запрет на 1) выглядит очень и очень странным. Либо я «не умею его готовить». Невозможность вызова скрипта в стандартном для WSH варианте «/Поле:[Поле]», а только и исключительно в нелепом виде «/[Поле]» выглядит и вовсе полной ахинеей.
В общем, наименьшее из зол таково:
Option Explicit
Const adOpenStatic = 3
Const adLockOptimistic = 3
Dim strDatabase
Dim lngID
Dim objFSO
Dim objConnection
Dim objRecordset
Dim dtStartDate
Dim dtEndDate
Dim lngCount
Dim prevLocale
If WScript.Arguments.Count = 2 Then
strDatabase = Mid(WScript.Arguments.Item(0), 2)
lngID = Mid(WScript.Arguments.Item(1), 2)
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objConnection = WScript.CreateObject("ADODB.Connection")
Set objRecordset = WScript.CreateObject("ADODB.Recordset")
If objFSO.FileExists(strDatabase) Then
objConnection.Open "Provider = Microsoft.Jet.OLEDB.4.0; " & _
"Data Source = '" & strDatabase & "'"
With objRecordset
.Open "SELECT * FROM qdfOrders WHERE ID = " & CStr(lngID) & "", objConnection, adOpenStatic, adLockOptimistic
dtStartDate = CDate(.Fields.Item("OrderDate").Value)
.Close
.Open "SELECT * FROM tblHolidays", objConnection, adOpenStatic, adLockOptimistic
dtEndDate = dtStartDate
lngCount = 0
Do Until lngCount >= 21
dtEndDate = DateAdd("d", 1, dtEndDate)
Select Case WeekdayName(Weekday(dtEndDate))
Case "суббота", "воскресенье"
Case Else
prevLocale = SetLocale("en-us")
.Filter = "HolidayDate = #" & dtEndDate & "#"
SetLocale(prevLocale)
If .RecordCount = 0 Then
lngCount = lngCount + 1
End If
End Select
Loop
.Close
End With
prevLocale = SetLocale("en-us")
objConnection.Execute "UPDATE qdfOrders SET DoneDate = #" & dtEndDate & "# WHERE ID = " & CStr(lngID) & ""
SetLocale(prevLocale)
objConnection.Close
Else
WScript.Echo "Database file [" & strDatabase & "] not found"
End If
Set objRecordset = Nothing
Set objConnection = Nothing
Set objFSO = Nothing
Else
WScript.Echo "Usage from toolbar on [Склад и торговля]:"
WScript.Echo "" & WScript.ScriptName & " /[CurrentDB] /[ID]"
End If
WScript.Quit 0
Вызов скрипта вешаете на кнопку на панели инструментов для формы «Заказы» в виде:
<Путь>\Имя скрипта.vbs /[CurrentDB] /[ID]
где «<Путь>\Имя скрипта» — путь и имя к сохранённому скрипту. Задали «Дату заказа» — нажали кнопку. И молитесь, чтобы форма обновилась.
Таблица «tblHolidays» аналогична по формату выше описанной. Создаёте её в базе данных «.mdb» «Склад и торговля» и заполняете ручками. Алгоритм, по-хорошему, надо менять: сейчас никак не учитывается возможный перенос выходных дней с субботы и воскресенья на будние дни по решению «больших голов». Может быть, сделать так:
1. Заполняем «tblHolidays» списком суббот, воскресений, известных праздников N-ного года.
2. Посему из алгоритма выкидываем проверку на субботы и воскресенья.
3. Выправление заполненного списка до реальности (перенос выходных дней с субботы и воскресенья на будние дни) оставляем на совести оператора.