Сценарий вставки Azure не работает

У меня есть две таблицы в базе данных Azure, и я пытаюсь добавить сценарий, в котором пользователь может вставлять данные в одно поле таблицы каждый раз, когда что-то вводится в таблицу Transactions. Таблицы находятся в разных схемах, но в одной базе данных.

Когда строка вводится в транзакции базы данных, мне нужно проверить, находится ли учетная запись пользователя из строки в таблице «UserTable», получить запись из UserTable, а затем заменить данные в поле «Баланс».

Я пробовал следующий скрипт, но ничего не происходит. Любые идеи относительно того, что я делаю неправильно?

function insert(item, user, request) 
{

var userTable = tables.getTable('UserTable');
var total = item.Amount + userTable.Balance;
var data = {
        Balance: total,
    };

if(userTable.UserAccount === item.UserAccount)
{
userTable.insert(data);
}

request.execute();
}

person user861059    schedule 08.05.2013    source источник
comment
С какой структурой работает этот код? Не зная этого, помочь вам невозможно. Кроме того, пожалуйста, включите свой сценарий в свой вопрос, а не ссылку на него. Это повысит шансы на то, что кто-то поможет вам.   -  person Jaxidian    schedule 08.05.2013
comment
Я использую приложение Windows С# с мобильными службами для ввода данных в таблицу. Сценарий вставки находится в сценариях Azure. Хотя не уверен, что хорошо объясняю.   -  person user861059    schedule 08.05.2013
comment
Почему бы не использовать триггер для этой цели? Вы можете использовать триггер «Вместо» для замены значений перед их сохранением.   -  person Herve Roggero    schedule 08.05.2013
comment
Однако я хочу заменить значение в другой таблице, потому что сумма продажи будет введена в одну таблицу, а я хочу обновить общий объем продаж в другой таблице. Это еще можно сделать?   -  person user861059    schedule 09.05.2013


Ответы (1)


Объект userTable, который вы получаете от tables.getTable, дает вам ссылку на объект таблицы. У него нет свойства Balance или UserAccount, к которому вы пытаетесь получить доступ. Что вам нужно сделать, так это сначала запросить userTable, а затем сделать обновления с результатом. Сценарий ниже должен делать что-то похожее на то, что вам нужно.

function insert(item, user, request) 
{
    var userTable = tables.getTable('UserTable');
    userTable.where({ UserAccount: item.UserAccount }).read({
        success: function(results) {
            if (results.length === 0) {
                // new user. can either return an error, or add
                // new entry. Will add a new entry here.
                userTable.insert({ Balance: item.Amount }, {
                    success: function() {
                        // insert the transaction
                        request.execute();
                    }
                });
            } else if (results.length === 1) {
                // Found it. will update the result
                var userAccount = results[0];
                var total = userAccount.Balance + item.Amount;
                userAccount.Balance = total;
                userTable.update(userAccount, {
                    success: function() {
                        // insert the transaction
                        request.execute();
                    }
                });
            } else {
                // Something is wrong
                request.respond(
                    statusCodes.INTERNAL_SERVER_ERROR,
                    { error: 'multiple users with same account' });
            }
        }
    });
}
person carlosfigueira    schedule 08.05.2013
comment
Когда я использовал это, я получил эту ошибку: Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException было необработанным Сообщение: необработанное исключение типа «Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException» произошло в mscorlib.dll Дополнительная информация: Ошибка: внутренняя ошибка сервера - person user861059; 09.05.2013
comment
Пожалуйста, проверьте журналы на портале, возможно, там есть какая-то информация о том, что происходит. - person carlosfigueira; 09.05.2013
comment
Хорошо, у меня такая ошибка: Ошибка в скрипте '/table/UserTransactions.insert.js'. Ошибка: [Microsoft] [SQL Server Native Client 10.0] [SQL Server] Недопустимое имя объекта «tc.UserTable». Теперь таблица UserTable находится не в схеме tc, а в схеме dbo. Есть ли способ обратиться к таблице в другой схеме? Я попытался написать dbo.UserTable, но получил другую ошибку. - person user861059; 09.05.2013
comment
Если вы создали таблицу через портал мобильных сервисов (или через интерфейс командной строки), то она должна работать. Похоже это не ваш случай (ваша таблица создавалась прямо в базе). В этом случае вам нужно напрямую обращаться к базе данных (используя объект mssql (msdn.microsoft.com/en-us/library/windowsazure/jj554212.aspx), вместо глобального tables). Логика должна быть той же, но вы будете отправлять команды SQL вместо вызова табличных методов. - person carlosfigueira; 09.05.2013
comment
Хорошо, я изменил код, чтобы использовать объект mysql. Однако я не получаю эту ошибку: разрешение SELECT было отклонено для объекта «UserTable». Есть ли где-нибудь, где я могу изменить права выбора и вставки? - person user861059; 09.05.2013
comment
Хорошо, мне удалось добавить пользовательские разрешения с помощью SQL Management Studio и GRANT INSERT ON [dbo].[UserTable] TO guestUser. Теперь моя проблема связана с чтением значений в таблице. Значение, которое я хочу прочитать, было числом с плавающей запятой, но мне пришлось изменить его на nvarchar, чтобы иметь возможность вводить данные, используя этот код: var bal = results[0]; var total = bal.value + item.Amount; Это вводит значение следующим образом: [объект Объект]0,85. Теперь я хочу только 0,85. Кроме того, добавление не выполняется, возможно, поскольку считыватель не считывает значение как значение с плавающей запятой. Я попытался использовать parseFloat(bal.value), но получил ошибку - person user861059; 09.05.2013