gpt4 book ai didi

dynamics-nav - 如何要求 NAV 页面上的字段是必填字段?

转载 作者:行者123 更新时间:2023-12-04 04:23:08 27 4
gpt4 key购买 nike

似乎 NAV 的潜在性质是抵制要求强制填充字段。对于我们的业务逻辑,必须填充某些字段才能使数据有效。例如,客户记录必须至少有姓名和电话号码。我搜索了很多地方,但没有找到合适的解决方案。那么如何做到这一点呢?

最佳答案

在努力寻找一种简洁的方法来要求填充卡片上的某些字段后,我想出了以下方法,它(到目前为止)对我有用。我开始意识到 NAV 并不意味着有必填字段,但我需要它们用于我们的业务逻辑。无论如何,我们开始......

第一步:
- 我们有一个用于各种验证逻辑的代码单元,其中我添加了读取自定义表的功能,其中列出了必填表及其字段。此函数采用表号、关键字段和“创建模式”。它返回一个文本“完成状态”值。我找到了我正在验证的记录的表格。我遍历必填字段,如果该字段未填充,则将其添加到不完整字段列表中。如果未完成字段列表为空,则完成状态为“完成”。如果填充了不完整的字段列表,则会显示一条消息,指示缺少的字段,并允许用户选择取消创建新记录或保留(新的或现有的)记录并输入缺少的数据,以及完成状态设置为“删除”以取消创建,或设置为“返回”以保留记录。逻辑如下:

CheckMadatoryFields(TableNumber : Integer;KeyField : Code[10];CreateMode : Boolean)   Completion Status : Text[30]

// Read the 'LockoutFields' table to find the manditory fields for the table passed in.
LockoutFields.RESET;
LockoutFields.SETRANGE("Table No.", TableNumber);
LockoutFields.SETFILTER("Filter ID", 'MANDITORY_FIELD');

// Get a record reference for the table passed in
RecRef.OPEN(TableNumber);
RecRef.SETVIEW('WHERE("No." = FILTER(' + KeyField + '))');

// Set this to done, i.e. data is complete (don't delete by mistake).
CompletionStatus := 'done';

IF RecRef.FINDFIRST THEN BEGIN

// Check the record's manditory field(s) listed in the 'LockoutFields' table to see if they're blank.
IF LockoutFields.FINDSET THEN BEGIN
REPEAT
FldRef := RecRef.FIELD(LockoutFields."Field No.");

IF FORMAT(FldRef.VALUE) = '' THEN
FldList := FldList + ' - ' + FldRef.CAPTION + '\';

UNTIL LockoutFields.NEXT = 0;

END;

IF FldList <> '' THEN BEGIN
// If creating the record, add the 'Cancel Create' message, otherwise don't.
IF CreateMode THEN
DeleteRecord := CONFIRM(Text_ManditoryField + '\' + FldList + '\' + Text_CancelCreate, FALSE)
ELSE BEGIN
DeleteRecord := FALSE;
MESSAGE(Text_ManditoryField + '\' + FldList, FALSE);
END;

// Return a 'delete' status when deleting, or a 'return' status to stay on the record.
IF DeleteRecord THEN
CompletionStatus := 'delete'
ELSE
CompletionStatus := 'return';
END;
END;

RecRef.CLOSE;`

第 2 步:
- 在您要检查必填字段的卡片上,在我的例子中是客户卡片,我添加了一个函数来调用上述代码单元中的验证函数。我还添加了逻辑
OnQueryClosePage 触发器来调用我的本地函数。这一切都很好,因为用户无法在未完成必填字段或取消客户创建的情况下关闭客户卡, 除了 如果用户使用 Ctrl+PgUp 或 Ctrl+PgDn,这会将他们从记录中删除。诀窍是在 OnNextRecord 触发器中放置正确的逻辑,以便执行验证并且 Ctrl+PgUp 或 Ctrl+PgDn 仍然起作用(注意:我在 mibuso 的某个地方找到了这个,非常感谢!)。逻辑如下:
OnNextRecord(...)
IF CheckManditoryFields = TRUE THEN BEGIN
Customer := Rec;
CurrentSteps := Customer.NEXT(Steps);
IF CurrentSteps <> 0 THEN
Rec := Customer;
EXIT(CurrentSteps);
END;

OnQueryClosePage(...)
EXIT(CheckManditoryFields);

CheckMandatoryFields() ExitValue : Boolean
// Check for manditory fields on this table. If there are missing manditory
// fields, the user can cancel this create, in which case, a 'TRUE' value is
// returned and we'll delete this record.

ExitValue := TRUE;

IF Rec."No." <> '' THEN BEGIN // This is blank if user quits immediately after page starts.
CompletionStatus := HHValidation.CheckManditoryFields(18,Rec."No.",CreateMode);

IF (CompletionStatus = 'delete')
AND (CreateMode = TRUE) THEN // User cancelled create (not edit), delete the record and exit.
Rec.DELETE(TRUE)
ELSE
IF CompletionStatus = 'done' THEN // User completed manditory fields, OK to exit.
ExitValue := TRUE
ELSE
ExitValue := FALSE; //User did not complete manditory fields and wants to return and add them.
END;

我想就是这样。自定义表的详细信息完全取决于您希望如何对其进行编码。验证代码单元可以是您想要的。使用表格可以在不改变任何逻辑的情况下添加或删除必填字段,并且这种“通用”验证逻辑可以放在任何页面上。关键是卡上的两个触发器和调用的通用验证例程。

关于dynamics-nav - 如何要求 NAV 页面上的字段是必填字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13955327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com