Причина, по которой вы получаете ошибку при попытке открыть набор записей, заключается в том, что ваша форма не открыта, и когда вы пытаетесь получить доступ к [forms]![frmReportingMain]
, она равна нулю, тогда вы пытаетесь получить свойство на этой нулевой ссылке, и все в порядке , Функция OpenRecordset
не может открывать диалоговое окно, чтобы запрашивать пользовательские входы, такие как пользовательский интерфейс, если он получает эту ошибку.
Вы можете изменить свой запрос, чтобы использовать параметры, которые не привязаны к form
yourTableAllocStart >= pAllocStart
and yourTableAllocEnd <= pAllocEnd
Затем вы можете использовать эту функцию для получения набора записей этого запроса.
Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset
Dim db As DAO.Database
Dim qdef As DAO.QueryDef
Set db = CurrentDb
Set qdef = db.QueryDefs("qryAlloc_Debits")
qdef.Parameters.Refresh
qdef.Parameters("pAllocStart").Value = pAllocStart
qdef.Parameters("pAllocEnd").Value = pAllocEnd
Set GetQryAllocDebits = qdef.OpenRecordset
End Function
Недостатком этого является то, что когда вы вызываете это сейчас в форме, которая связан с ним, он не динамически «заполняет пробелы» для вас.
В этом случае вы можете связывать формы qryAlloc_debts
и иметь no where clause в сохраненной запроса, затем используйте формы Filter
, чтобы сделать предложение where. В этом случае вы можете использовать свое предложение where точно, как вы его написали.
Затем, если вы хотите открыть набор записей, вы можете сделать это следующим образом:
Function GetQryAllocDebits(pAllocStart As String, pAllocEnd As String) As DAO.Recordset
Dim qdef As DAO.QueryDef
Set qdef = New DAO.QueryDef
qdef.SQL = "Select * from qryAlloc_Debits where AllocStart >= pAllocStart and pAllocEnd <= pAllocEnd"
qdef.Parameters.Refresh
qdef.Parameters("pAllocStart").Value = pAllocStart
qdef.Parameters("pAllocEnd").Value = pAllocEnd
Set GetQryAllocDebits = qdef.OpenRecordset
End Function
То, что вы сейчас делаете, следующее:
lua A.lua
> lua process starts
> loading A.lua
> loading test.lua (because it is required by A.lua)
> set global "num" to value 2
> set global "num" to value 5
> lua process exits (A.lua finished)
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> print global "num" (which was set to 2 by test.lua)
> lua process exits (B.lua finished)
Чтобы напечатать значение 5, ваши сценарии должны выглядеть так:
-- test.lua
num = 2
-- A.lua
require("test")
num = 5
-- B.lua
require("test")
require("A")
print(num)
, которые приведут к:
lua B.lua
> lua process starts
> loading B.lua
> loading test.lua (because it is required by B.lua)
> set global "num" to value 2
> loading A.lua (because it is required by B.lua)
> skip loading test.lua (has already been loaded)
> set global "num" to value 5
> print global "num"
> lua process exits (B.lua finished)
РЕДАКТИРОВАТЬ: Я вижу, что вы используете C Api Lua, а не Lua для выполнения ваших скриптов. Используя программирование api, вы должны получить желаемый результат, выполнив A.lua и B.lua, используя одно и то же lua-состояние (чаще всего хранящееся в C-Variable "L").
Не существует специальной функции для запроса модулей Lua из C-API. [1] Поэтому я ориентировался на функцию dolibrary
в интерпретаторе Lua для реализации require
, которая просто вызывает функцию Lua require
из C.
NB: Я не рекомендую общаться с модулями путем обмена глобальными переменными, особенно когда порядок загрузки модулей имеет значение, как здесь. Лучше предоставить методы A.update_num(old)
и B.update_num(old)
, которые берут старое значение num
в качестве аргумента и возвращают обновленное значение.
#include <iostream>
#include <lua.hpp>
int require(lua_State *L, char const * modname) {
int const size = lua_gettop(L);
lua_getglobal(L, "require");
lua_pushstring(L, modname);
if (lua_pcall(L, 1, LUA_MULTRET, 0) != 0) {
std::cerr << "lua:" << lua_tostring(L, 1) << '\n';
lua_pop(L,1);
return 0; // Failed, nothing should be on the stack
}
return lua_gettop(L) - size;
}
int main() {
lua_State *L = luaL_newstate();
luaL_openlibs(L);
require(L, "A");
require(L, "B");
lua_close(L);
}
С помощью скриптов из вашего вопроса в том же каталоге мы получаем :
$ clang++ -Wall -Wextra -Wpedantic -I /usr/include/lua5.2/ test.cpp -llua5.2
$ ./a.out
5
[1] Для использования модулей Lua C из C-API существует lua_requiref
.
a.lua
a = 5
b.lua
require('a')
a = 2
test.lua
require('b')
print(a)
Вы должны получить 2, потому что требуется цепочка работает с верхнего уровня, если вы просто запускаете каждый файл, то время lua будет выполнять только это небольшое выполнение uniq, не существует acers difficent execances persicency, поэтому вам необходимо потребовать по мере необходимости
Using the programming api you should be able the get your required result by executing A.lua and B.lua using the same lua-state
? – Zack Lee 14 July 2018 в 01:37lua_State *L = luaL_newstate();
оба сценария, вы должны быть в порядке. – me-dev.io 16 July 2018 в 14:21