从HTML客户端更新ApplicationData记录

时间:2016-04-18 22:58:46

标签: c# visual-studio-lightswitch

HTML客户端Lightswitch:

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

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();
});      

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

1 个答案:

答案 0 :(得分:1)

乍一看,假设您的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的一个功能。

作为替代方案,您始终可以对Scans表添加查询,该表接受SerialNumber作为参数,然后按如下方式调用它:

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();
                }
            }
        });
    }
});