Axapta:防止用户使用搜索更改表单查询

Axapta:防止用户使用搜索更改表单查询,axapta,x++,Axapta,X++,我在Axapta 3.0中创建了一个自定义查找表单,用户可以在其中从ProdRoute数据源中选择OprId。在显示查找之前,ProdId已设置,用户不得更改。用户只能从生产订单的ProdRoute中选择具有有效ProdId的OprId。根据文档,可以通过锁定范围来防止用户更改查询。我是这样做的: qbrProdId.value(queryValue(_prodId)); qbrProdId.status(RangeStatus::Locked); 这里qbrProdId是QueryBuild

我在Axapta 3.0中创建了一个自定义查找表单,用户可以在其中从ProdRoute数据源中选择OprId。在显示查找之前,ProdId已设置,用户不得更改。用户只能从生产订单的ProdRoute中选择具有有效ProdId的OprId。根据文档,可以通过锁定范围来防止用户更改查询。我是这样做的:

qbrProdId.value(queryValue(_prodId));
qbrProdId.status(RangeStatus::Locked);
这里qbrProdId是QueryBuildRange类型的变量,_prodId指定prodId

当显示查找并且用户尝试更改过滤器时,ProdId被锁定。好。但是,当用户在查找的ProdId字段上按Ctrl+F时,或者如果用户单击工具栏上的搜索,则可以输入不同的ProdId

我怎样才能防止这种情况

我曾考虑将查找网格中的ProdId字段更改为“Display”类型,而不是数据源字段。但是没有更好的解决办法吗


(顺便说一句,查询不是自动创建的,而是在表单数据源的“init”方法中手动创建的)。

只需使用dynalink而不是range


HTH

只需使用动态链接而不是范围


HTH

好的,然后您可以重写task()方法。 这将禁用查找表单上的筛选器功能

public int task(int _taskId)
{
    int ret;

    switch(_taskId)
    {
        case 2855:
        case 2844:
        case 2837:
        case 799:
            return 0;
    }

    ret = super(_taskId);

    return ret;
}

好的,然后您可以重写task()方法。 这将禁用查找表单上的筛选器功能

public int task(int _taskId)
{
    int ret;

    switch(_taskId)
    {
        case 2855:
        case 2844:
        case 2837:
        case 799:
            return 0;
    }

    ret = super(_taskId);

    return ret;
}

如上所述,查询是手动创建的。这是findValue()方法正常工作所必需的。dynalink是不可能的。如上所述,查询是手动创建的。这是findValue()方法正常工作所必需的。dynalink是不可能的。谢谢你的回答。你的解决方案是正确的。但是,对于我的问题,唯一正确的taskid是779,这不在您的示例中。我通过调试器找到了这个值。taskid的2844、2837和799都出现在Task宏中,但779没有。这让我很惊讶。那么,该值记录在哪里?值2855也不是任务宏的一部分。因此,似乎有比任务宏中的有效taskid更多的有效taskid?解决方案的一个缺点是所有字段都被禁用。最后,我对特定字段使用了一种显示方法。是的,我认为宏中没有包含某些TaskID。我在AX4和AX5上尝试了这段代码,对我有效的值是2855。不幸的是,我不知道这方面的任何文档。谢谢你的回答。你的解决方案是正确的。但是,对于我的问题,唯一正确的taskid是779,这不在您的示例中。我通过调试器找到了这个值。taskid的2844、2837和799都出现在Task宏中,但779没有。这让我很惊讶。那么,该值记录在哪里?值2855也不是任务宏的一部分。因此,似乎有比任务宏中的有效taskid更多的有效taskid?解决方案的一个缺点是所有字段都被禁用。最后,我对特定字段使用了一种显示方法。是的,我认为宏中没有包含某些TaskID。我在AX4和AX5上尝试了这段代码,对我有效的值是2855。不幸的是,我不知道这方面的任何文档。