从 HTML 客户端更新 ApplicationData 记录

Updating ApplicationData record from the HTML client

HTML 客户端 Lightswitch:

在 ViewDetials 屏幕中,我有一个按钮,我想在其中更新我的 ApplicationData。但是,屏幕 Dataworkspace 不包含我想更新的 table。我当前的按钮执行代码如下所示:

var filter = "SerialNumber eq " + screen.Hardware.SerialNumber; // Filter to find the Hardware Serial number in the active details window.
myapp.activeDataWorkspace.ApplicationData.Scans.filter(filter).execute().then(function (result) {
    var scan = result.results[0];
    scan.NoSticker = false; // Set the property to false
    myapp.activeDataWorkspace.ApplicationData.saveChanges();
});      

我想做的是更新 NoSticker 属性 扫描 table 中与我的详细信息屏幕上的序列号相匹配的记录。如果我理解我一直在正确阅读的内容,因为记录不在屏幕 Dataworkspace 中,我必须在我的 ApplicationData 中查询 Scans table。我不记得曾经需要在 JS 中执行查询或使用过滤器进行查询,所以我不确定我是否正确地执行了此操作。当我点击按钮时,没有任何反应。任何指导将不胜感激。

乍一看,假设您的 SerialNumber 是字母数字,您的方法的唯一问题似乎是过滤器表达式的样式,它应该如下所示:

var filter = "SerialNumber eq " + msls._toODataString(screen.Hardware.SerialNumber, ":String");

这使用标准的 LightSwitch 库函数在过滤器表达式中正确标记您的序列号值。在这种情况下,它基本上将值用单引号括起来,如下所示:

"SerialNumber eq 'ABC123'"

_toODataString 函数还支持第二个 dataType 参数的以下附加选项(涵盖各种 LightSwitch 数据类型):

":Binary", ":Binary?"
":Date", ":DateTime", ":Date?", ":DateTime?"
":DateTimeOffset", ":DateTimeOffset?"
":Decimal", ":Decimal?"
":Guid", ":Guid?"
":Int64", ":Int64?"
":Single", ":Single?"
":String", ":String?"
":TimeSpan", ":TimeSpan?"
":Byte", ":Byte?", ":Boolean", ":Boolean?", ":Double", ":Double?", ":Int16", ":Int16?", ":Int32", ":Int32?", ":SByte", ":SByte?"

上面的每个组都使用相同的标记方法,例如“:十进制”和“:十进制?”都以 M 数据类型标识符为后缀。这些标记选项是 LightSwitch 使用的 oData v3 protocol's filter operation 的一项功能。

作为替代方案,您始终可以针对您的扫描 table 添加一个查询,它接受序列号作为参数,然后按如下方式调用它:

myapp.activeDataWorkspace.ApplicationData.ScanBySerialNumberQuery(screen.Hardware.SerialNumber).execute().then(function onComplete(result) {
    if (result && result.results && result.results.length !== 0) {
        var scan = result.results[0];
        if (scan) {
            scan.NoSticker = false; // Set the property to false
            myapp.activeDataWorkspace.ApplicationData.saveChanges();
        }
    }
});

如果您在尝试上述方法后仍然遇到问题,您可以检查的另一方面是您的 screen.Hardware.SerialNumber 属性 在您执行搜索时是否可用。如果没有,您可能需要执行以下操作:

screen.getHardware().then(function onComplete(hw) {
    if (hw) {
        myapp.activeDataWorkspace.ApplicationData.ScanBySerialNumber(hw.SerialNumber).execute().then(function onComplete(result) {
            if (result && result.results && result.results.length !== 0) {
                var scan = result.results[0];
                if (scan) {
                    scan.NoSticker = false; // Set the property to false
                    myapp.activeDataWorkspace.ApplicationData.saveChanges();
                }
            }
        });
    }
});