Это вариант ответа, уже предоставленного haarrrgh, поэтому, если вы сочтете его полезным, обязательно проголосуйте и за него.
Существует еще один способ работы с заполнителями в вызовах функций, хранящихся в БД. Во-первых, измените ваши данные таким образом:
**Record 1 task Function call**
124567 Email customer Call function emailcus([TokenA],[TokenB])
434535 AddCost Call function addcost([TokenA],[TokenB])
Обратите внимание, что [SquareBrackets]
- это , а не , на самом деле требуется синтаксис в этом примере, просто то, что я склонен использовать в этой ситуации. Важная часть заключается в том, чтобы сделать маркеры параметров чем-то, чего нет в других местах строкового значения (включая другие токены). Вы можете использовать столько параметров, сколько вам нужно, просто убедитесь, что вызывающий код знает, сколько ожидается от каждой строки вызова функции (я сократил ее, чтобы сократить следующий код).
Затем, когда пришло время вызвать вашу функцию, сделайте следующее:
Dim ReturnValue As String 'or as appropriate for individual the function's return
Dim EvalString As String
EvalString = 'code to fetch from table
EvalString = Replace(EvalString, "[TokenA]", strValueA) 'strValueA passed in?
EvalString = Replace(EvalString, "[TokenB]", strValueB) 'strValueB passed in?
ReturnValue = Eval(EvalString)
В VB6, по крайней мере (поэтому я предполагаю, что это правда в VBA), Replace
быстрее, чем конкатенация. Я также нахожу это более читабельным, но это может быть потому, что я привык использовать аналогичную технику для построения команд SQL в коде (используя Const
декларации, а не хранилище БД, но это тоже будет работать).
EDIT
Когда я перечитал свой «готовый» пост сразу после его отправки, я понял, что там скрывается гоча. Поскольку вы делаете подстановку перед передачей строки в Eval
, это фактические значения, которые помещаются в строку, , а не переменные. Код, который я представил выше, работает нормально , если ваши параметры числовые, но если они строкового типа, вы должны включить кавычки, либо в ваши данные, либо в ваш вызов Replace
. Я предпочитаю первое, поэтому измените ваши данные на это:
**Record 1 task Function call**
124567 Email customer Call function emailcus('[TokenA]','[TokenB]')
434535 AddCost Call function addcost('[TokenA]','[TokenB]')
Это работает как проверено с Const
. Хранится в записи БД, вам может понадобиться это:
**Record 1 task Function call**
124567 Email customer Call function emailcus(""[TokenA]"",""[TokenB]"")
434535 AddCost Call function addcost(""[TokenA]"",""[TokenB]"")
(который также работает с Const
...).
Альтернатива - оставить данные такими, как они есть в моей первой части, и изменить Replace
вызовов:
EvalString = Replace(EvalString, "[TokenA]", """" & strValueA & """") 'strValueA passed in?
'or maybe
EvalString = Replace(EvalString, "[TokenB]", "'" & strValueB & "'") 'strValueA passed in?
Пара других потенциальных ошибок: эти должны быть функциями, а не подпрограммами, и они должны быть объявлены Public
в модуле , а не в Код формы.