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中使用过滤器进行查询或查询,所以我不确定我是否正确地执行此操作。当我点击按钮时,没有任何反应。任何指导都将不胜感激。
答案 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();
}
}
});
}
});