@abaplint/runtime
Version:
Transpiler - Runtime
78 lines • 2.82 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.select = select;
exports.rowsToTarget = rowsToTarget;
const types_1 = require("../types");
async function select(target, input, runtimeOptions, context) {
const { rows: rows } = await context.defaultDB().select(input);
if (target instanceof types_1.FieldSymbol) {
if (target.isAssigned() === false) {
throw new Error("GETWA_NOT_ASSIGNED");
}
target = target.getPointer();
}
if (rows.length === 0) {
abap.builtin.sy.get().dbcnt.set(0);
abap.builtin.sy.get().subrc.set(4);
return;
}
if (runtimeOptions?.appending !== true) {
if (Array.isArray(target)) {
target.forEach(f => f.clear());
}
else {
target?.clear();
}
}
rowsToTarget(target, rows);
if (target === undefined && rows.length === 1) {
abap.builtin.sy.get().dbcnt.set(Object.values(rows[0])[0]);
}
else {
abap.builtin.sy.get().dbcnt.set(rows.length);
}
abap.builtin.sy.get().subrc.set(0);
}
function rowsToTarget(target, rows) {
if (target instanceof types_1.Structure) {
const result = {};
for (const column in rows[0]) {
if (rows[0][column] === null || target.get()[column] === undefined) {
continue;
}
result[column] = target.get()[column].clone().set(rows[0][column]);
}
abap.statements.moveCorresponding(new types_1.Structure(result), target);
}
else if (target instanceof types_1.Table || target instanceof types_1.HashedTable) {
for (const row of rows) {
const targetRow = target.getRowType().clone();
if (targetRow instanceof types_1.Structure) {
for (let columnName in row) {
columnName = columnName.toLowerCase();
if (row[columnName] === null) {
targetRow.get()[columnName]?.clear();
continue;
}
targetRow.get()[columnName]?.set(row[columnName]);
}
}
else {
const columnName = Object.keys(row)[0];
targetRow.set(row[columnName]);
}
abap.statements.insertInternal({ table: target, data: targetRow, noClone: true });
}
}
else if (Array.isArray(target)) {
for (let index = 0; index < target.length; index++) {
const element = target[index];
element.set(rows[0][Object.keys(rows[0])[index]]);
}
}
else if (target !== undefined) {
// its a simple type
target.set(rows[0][Object.keys(rows[0])[0]]);
}
}
//# sourceMappingURL=select.js.map