Мне кажется, что я немного расстроен, я написал приложение, которое позволяет моему клиенту выполнять инвентаризацию, но не может обновить запись инвентаризации новыми значениями счетчика для каждого элемента.
Я пытался обновить значение countquantity напрямую, но это игнорируется, сейчас я пытаюсь загрузить запись, указанную в countline, но, похоже, это тоже не работает.
Myкод выглядит следующим образом (написано на TypeScript):
/**
* Update a InventoryCount with a new set of counts
* @parameters
* {
* service: inventorycount,
* method: update,
* id: 12345,
* inventory: [{
* upccode: 98765,
* total: 543
* }]
* }
*/
public update() {
const rec = Record.load({
type: Record.Type.INVENTORY_COUNT,
id: this.parameters.id,
isDynamic: true
});
this.parameters.inventory.forEach(item => {
this.updateLine(rec, item);
});
return rec.save();
}
/**
* Update a single item within the sublist of an inventory count.
* We update the memo field and the try update the quantity counted.
*
* @param rec the inventorycount record loaded in update
* @param item the item object loaded from parameters
*/
private updateLine(rec, item) {
// fetch the internalid from the upccode
const internalId = this.upccodeToInternalid(item.upccode);
// fetch the line number by the given item internal id
const itemLine = rec.findSublistLineWithValue({
sublistId: "item",
fieldId: "item",
value: internalId
});
// select the line to make modifications on
rec.selectLine({
sublistId: "item",
line: itemLine
});
// get the current memo so we can append to it
const currentMemo = rec.getCurrentSublistValue({
sublistId: "item",
fieldId: "memo"
});
// update the memo field with our new string
rec.setCurrentSublistValue({
sublistId: "item",
fieldId: "memo",
value: this.mergeMemo(currentMemo, item.areas)
});
// get the current item count and append our new count
const currentQuantity = rec.getCurrentSublistValue({
sublistId: "item",
fieldId: "countquantity"
});
const newQuantity = currentQuantity + item.total;
rec.commitLine({sublistId: "item"});
this.setCount(rec, newQuantity, itemLine);
}
/**
* Set a new count value for the item provided
*
* @param rec the inventorycount record containing the item
* @param value the new value we would like to save for the item count
* @param iline the sublist item line for the item to be modified
*/
private setCount(rec, value, iline) {
// select the line to make modifications on
rec.selectLine({
sublistId: "item",
line: iline
});
// get the record with the count quantity
const countId = rec.getCurrentSublistValue({
sublistId: "item",
fieldId: "countline"
});
this.filters = [];
this.filters.push(
Search.createFilter({
name: "line",
operator: Search.Operator.EQUALTO,
values: countId.toString()
})
);
const srch = Search.create({
type: Search.Type.TRANSACTION,
filters: this.filters,
columns: [
"internalid",
"quantity",
"line"
]
});
let intid;
srch.run().each(r => {
intid = r.getValue('internalid');
return true;
});
const crec = Record.load({
type: Record.Type.INVENTORY_COUNT,
id: intid,
isDynamic: false
});
crec.setValue('quantity', value);
return crec.save();
}
Бонусная карма для всех, кто также может обновить статус инвентарного счета.