将以下 SQL 语句作为 Filter 属性应用于 ClientDataset:
'(((DORcode > ''00'') AND (DORcode < ''10'')) AND (((SiteNumber+'' ''+SiteStreet+SiteCity)<>(OwnerAddr1+OwnerCity)) AND ((SiteNumber+SiteStreet+SiteCity)<>(OwnerAddr1+OwnerCity))) AND (TaxStatus > ''!''))'
它给了我以下错误:")"预期但未找到,或者(对于>甚至更长的语句):类型不匹配。
潜入细节发现问题是由语句的长度引起的,其中的某些部分正在工作,例如:
'(((DORcode > ''00'') AND (DORcode < ''10'')) AND (((SiteNumber+'' ''+SiteStreet+SiteCity)<>(OwnerAddr1+OwnerCity))))';
或任何其他较短的部分。
所有字段名称都有效,数据集不为空,如果语句较短,则筛选器对于所有相关字段名称都正常工作。
因此,该错误不是语法错误,显然是由语句的内部修剪超过字符数限制(介于 111 和 196 之间)引起的。
我的问题是: 1. 有人注意到德尔福XE5上的这个错误吗? 2. 它是它的补丁吗? 3. 如何以其他方式解决初始(长)语句的过滤问题?
提前谢谢你。
我无法评论 XE5 是否有问题,但我注意到过滤器中有一大堆不必要的括号。 我认为以下内容是有效的,也许更清楚,尽管在不了解您的所有数据类型的情况下,我不能 100% 确定。
DORcode > '00' AND
DORcode < '10' AND
SiteNumber + ' ' + SiteStreet + SiteCity <> OwnerAddr1 + OwnerCity AND
SiteNumber + SiteStreet + SiteCity <> OwnerAddr1 + OwnerCity AND
TaxStatus > '!'
此外 - 我会考虑像这样构建过滤器,因为我认为它会更清晰
FilterString := 'DORcode > 0 AND DORcode < 10 AND ' +
'Trim(SiteNumber) + Trim(SiteStreet) + SiteCity <> ' +
' OwnerAddr1 + OwnerCity AND ' +
'TaxStatus > ''!''';
这有帮助吗?
请注意数据类型。在重新格式化的示例 1 中,DORcor 似乎是一个字符串,在示例 2 中,它被编码为数字。您还可以将Sitenumber(听起来像一个数字)与听起来更像字符串的Sitestreet结合起来。