这是一个丑陋的。我希望我不必问这个问题,但是项目已经构建完成,以便我们在数据库中处理大量的验证。本质上,我正在尝试构建一个将需要两个数据堆栈的函数,将它们与一组未知的操作或比较器编织在一起,并生成一个长字符串。
是的,那句话很差,所以我打算举个例子。我有一个可以有多次迭代的表单。出于某种原因,系统想要知道在这些表格中的任何表格上输入的开始日期是否等于在任何这些表格上输入的结束日期。不幸的是,由于系统的设计方式,所有内容都存储为字符串,因此我必须首先将其格式化为日期,然后再进行比较。下面是伪代码,所以请不要纠正我的语法
输入数据:
'logFormValidation("to_date(#) == to_date(^)"
, formname.control1name, formname.control2name)'
现在,正如我所提到的,这种形式有多次迭代,我需要循环构建一个完全递归的比较(注意:它可能并不总是典型的布尔比较,它也可以在内部调用函数,所以。在任何类似的东西都不会起作用。)最后,我需要将它变成如下所示的格式,以便验证解析器可以读取它。
OR(to_date(formname.control1name.1) == to_date(formname.control2name.1)
,to_date(formname.control1name.2) == to_date(formname.control2name.1)
,to_date(formname.control1name.3) == to_date(formname.control2name.1)
,to_date(formname.control1name.1) == to_date(formname.control2name.2)
:
:
,to_date(formname.control1name.n) == to_date(formname.control2name.n))
是的,它很丑......但鉴于我们的验证解析器的工作方式,我没有太多的选择。关于如何实现这一点的任何意见?我希望比双递归循环更有效,但除此之外没有任何想法
好的,看到我的问题显然非常不清楚,我将添加更多信息。我不知道我将对这些项目进行什么比较,我只是想将数据重新格式化为可用于任何给定函数的数据。如果我在数据库之外这样做,它看起来像这样。注意:伪代码。 '#'是vals1函数中的位置标记,'^'是vals2的位置标记。
function dynamicRecursiveValidation(string functionStr, strArray vals1, strArray vals2){
string finalFunction = "OR("
foreach(i in vals1){
foreach(j in vals2){
finalFunction += functionStr.replace('#', i).replace('^', j) + ",";
}
}
finalFunction.substring(0, finalFunction.length - 1); //to remove last comma
finalFunction += ")";
return finalFunction;
}
这就是我想要完成的一切。获取任何给定的比较器和两个数组,并创建一个包含所有可能组合的字符串。鉴于上面列出的替换字符,下面是可能添加的操作列表
# > ^
to_date(#) == to_date(^)
someFunction(#, ^)
# * 2 - 3 <= ^ / 4
我正在尝试做的就是生成我稍后将执行的字符串,而我正在尝试这样做,而不必在递归循环中杀死服务器
答案 0 :(得分:1)
我没有针对此的解决方案代码,但您可以通过算法执行以下操作
(start_date, end_date, formid)
并使用任何现有表单中的每个日期填充它从表单中获取start_date,只需:
SELECT end_date, form_id FROM temp_table WHERE end_date = <start date to check>
反向
SELECT start_date, form_id FROM temp_table WHERE start_date = <end date to check>
如果数据库可用,为什么不让它完成所有繁重的工作。
答案 1 :(得分:0)
我最终执行了数据的交叉产品,并循环查看结果。这不是我真正想要的解决方案,但它确实有用。