Обновить таблицу, используя только переменные - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть таблица EmpTable примерно так: enter image description here

Если я хочу обновить зарплату Джона, я могу сделать это так:

static void UpdateSal(Args _args)
{
    EmpTable EmpTable;
    real sal=110000;
    int RowId = 1;

    ttsBegin;
    select forUpdate EmpTable where EmpTable.Id==RowId;
    EmpTable.Salary=sal;
    EmpTable.update();
    ttsCommit;


}

Я хочу помочь в реализации приведенного выше кода с использованием только переменных:

static void UpdateSal_WithStrValues(Args _args)
{

    str table = 'EmpTable'
    str field = 'Salary'
    int RowId = 1;
    real sal=110000;

    .....??
    .....??

}

Обновление:

Этот код работает:

static void Job1(Args _args)
{
    SysDictTable dictTable = new SysDictTable(tablename2id('EmpTable'));
    Common common = dictTable.makeRecord();

    ttsbegin;
    while select forupdate common
        where common.(fieldName2id(tableName2Id("EmpTable"),'Id')) == 1
    {
        common.(fieldName2id(tableName2Id("EmpTable"),'Salary')) = 110100;
        common.update();
    }
    ttscommit;

}

Но этот код не:

static void Job1(Args _args)
{

    str table = 'EmpTable';
    str fieldToUpdate= 'Salary';
    str fieldToSelect= 'Id';
    int RowId = 1;
    real sal=34536;

    SysDictTable dictTable = new SysDictTable(tablename2id(table));
    Common common = dictTable.makeRecord();


    ttsbegin;
    while select forupdate common
        where common.(fieldName2id(tableName2Id(table),fieldToSelect)) == RowId
    {
        common.(fieldName2id(tableName2Id(table),fieldToUpdate)) = sal;
        common.update();
    }
    ttscommit;

}

1 Ответ

0 голосов
/ 28 ноября 2018

Ограничение строки фиксированной длиной решило проблему:

Теперь работает следующий код:

static void Job1(Args _args)
{

    str 50 table = 'EmpTable';
    str 50 fieldToUpdate= 'Salary';
    str 50 fieldToSelect= 'Id';
    int RowId = 1;
    real sal=12213;

    SysDictTable dictTable = new SysDictTable(tablename2id(table));
    Common common = dictTable.makeRecord();


    ttsbegin;
    while select forupdate common
        where common.(fieldName2id(tableName2Id(table),fieldToSelect)) == RowId
    {
        common.(fieldName2id(tableName2Id(table),fieldToUpdate)) = sal;
        common.update();
    }
    ttscommit;

}

Даже лучшее решение от Martin Drab:

static void Job1(Args _args)
{

    TableName table = 'EmpTable';
    FieldName fieldToUpdate= 'Salary';
    FieldName fieldToSelect= 'Id';
    int rowId = 1;
    real sal = 6546456;

    SysDictTable dt = SysDictTable::newName(table);
    Common common = dt.makeRecord();

    ttsbegin;
    while select forUpdate common
        where common.(dt.fieldName2Id(fieldToSelect)) == rowId;
    {
        common.(dt.fieldName2Id(fieldToUpdate)) = sal;

        if (!common.validateWrite())
        {
            throw error("Nope");
        }
        common.update();
    }

    ttscommit;
}
...