Как использовать глобальные переменные между сценариями Lua

Причина, по которой вы получаете ошибку при попытке открыть набор записей, заключается в том, что ваша форма не открыта, и когда вы пытаетесь получить доступ к [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
2
задан Zack Lee 13 July 2018 в 13:17
поделиться

3 ответа

То, что вы сейчас делаете, следующее:

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").

1
ответ дан me-dev.io 17 August 2018 в 12:45
поделиться
  • 1
    Эй, большое спасибо за подробное объяснение. Теперь я понимаю, как это работает. Не могли бы вы показать мне пример 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:37
  • 2
    Я никогда не работал с самим программированием api, но какой афаик, пока вы передаете те же lua_State *L = luaL_newstate(); оба сценария, вы должны быть в порядке. – me-dev.io 16 July 2018 в 14:21

Не существует специальной функции для запроса модулей 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 .

1
ответ дан Henri Menke 17 August 2018 в 12:45
поделиться
  • 1
    Спасибо, сэр. Хотя это очень полезно знать, я думаю, что он действительно не отвечает на проблему, которую я хочу решить. Я был бы признателен, если бы вы могли взглянуть на мой другой вопрос, который я опубликовал: stackoverflow.com/questions/51335428/… – Zack Lee 14 July 2018 в 05:13

a.lua

a = 5

b.lua

require('a')
a = 2

test.lua

require('b')
print(a)

Вы должны получить 2, потому что требуется цепочка работает с верхнего уровня, если вы просто запускаете каждый файл, то время lua будет выполнять только это небольшое выполнение uniq, не существует acers difficent execances persicency, поэтому вам необходимо потребовать по мере необходимости

1
ответ дан Quirinux 17 August 2018 в 12:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: