Здравствуйте!

Необходимо, чтобы сумма по Операциям попадала в поле Сумма в Документы. Причем, если Операция с типов Расход отнималась от Прихода и эта сумма попада в документы. Я создала запрос sq_SummCashflow

SELECT
        SUM([tbl_Cashflow].[Amount]) AS [Amount]
FROM
        [dbo].[tbl_Cashflow] AS [tbl_Cashflow]
WHERE([tbl_Cashflow].[TypeID] = :CashflowType AND
        EXISTS
        (SELECT
                [tbl_Invoice].[ID] AS [ID]
        FROM
                [dbo].[tbl_Invoice] AS [tbl_Invoice]
        WHERE([tbl_Cashflow].[Invoice] = [tbl_Invoice].[ID] AND
                [tbl_Invoice].[Path] LIKE '%' + :InvoiceID + '%')))

И ds_SummCashflow поле с дробным значение Amount.

Далее на событие btnOKOnClick для Документа, вызываю свой скрипт

 var Dataset = dlData.Dataset;
 var InvoiceID = Dataset.DataFields('ID');
        SummCashflow(InvoiceID, Dataset)

Скрипт следующий:

function SummCashflow(InvoiceID, InvoiceDataset){
        Finances = new Object();
        Finances.Cashflow = new Object();
        Finances.Cashflow.Income = new Object();
        Finances.Cashflow.Outcome = new Object();
        var Income = GetSystemParameterValueEx('Income');
        var Outcome = GetSystemParameterValueEx('Outgo');
       
        if (!Assigned(InvoiceDataset)) {
                InvoiceDataset = GetSingleItemByCode('ds_Invoice', 'CalculateSummCashflow');
                ApplyDatasetFilter(InvoiceDataset, 'ID', InvoiceID, true);
                RefreshDataset(InvoiceDataset);
        }
                Finances.Cashflow.Income.Estimated = CalculateInvoiceCashflow(InvoiceID, Income, true);
                Finances.Cashflow.Income.Actual = CalculateInvoiceCashflow(InvoiceID, Income, false);
                Finances.Cashflow.Outcome.Estimated = CalculateInvoiceCashflow(InvoiceID, Outcome, true);
                Finances.Cashflow.Outcome.Actual = CalculateInvoiceCashflow(InvoiceID, Outcome, false);
}

function CalculateInvoiceCashflow(InvoiceID, IsEstimated, Cashflow) {
        var Cashflow;
        var Dataset = GetSingleItemByCode('ds_SummCashflow', 'CalculateInvoiceCashflow');
        var Parameters = Dataset.SelectQuery.Parameters;
        ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true);     
        Dataset.Open(); //Ошибка
        try {
                Cashflow = Dataset.ValAsFloat('Amount');    
        } finally {
                Dataset.Close();
                ApplyDatasetFilter(Dataset, 'InvoiceID', null, false); 
        }
        return Cashflow;
}

Для начала я хотела чтобы он просто сумму мне подтягивал, без вычитания Приход-Расход. Но возникает ошибка, следующая Ошибка открытия источника данных "ds_SummCashflow". Could not convert variant of type (Dispatch) into type (OleStr). Я просмотрела поле Summa все вроде верно, с типом поля. Не могу понять в чем может быть проблема?

Нравится

8 комментариев

А всё ли в порядке с параметрами InvoiceID и CashflowType в sq_SummCashflow? Может, тип там перепутан?

кстати, если ИнвойсИД -- уникальный идентификатор, а он у Вас используется в Лайк-фильтре -- то, возможно, оно "ругается" именно на этот факт. либо сделайте этот параметр строкой, либо измените сам фильтр.

Валентина, у Вас в запросе sq_SummCashflow все фильтры включены. Вам достаточно передать значение для параметров и открыть датасет:

SetParameterValue(Parameters, 'InvoiceID', InvoiceID);
SetParameterValue(Parameters, 'CashflowType', CashflowType);

Обратите внимание, у Вас параметры CashflowType и InvoiceID созданы с типом "Строка".
В случае с фильтром сравнения CashflowType будет возникать ошибка, поэтому для параметра CashflowType необходимо установить тип "Глобальный уникальный идентификатор".

Подводя итог )
Выставите типы для параметр запроса CashflowType - "Уникальный идентификатор".

Не совсем понятно, для чего у Вас используется фильтр InvoiceID. Но Если вы его где-то сверху не приводили к строке вида

'многобукв'

, то приведите перед использованием. Терра хранит GUID в виде '{многобукв}', (а SQL в виде 'многобукв') в результате в like фильтре у Вас будет скорее всего:

... like '%{00000000-0000-0000-0000-000000000000}%'

с этим (имхо) тоже могут быть проблемы.

Функция ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true); включает фильтр, а они у Вас уже и так включены (галочки в сервисе). Либо выключите их в сервисе, либо не используйте эту функцию, а сделайте как написала Наталия.

И еще заметил (оффтоп)):

function CalculateInvoiceCashflow(InvoiceID, IsEstimated, Cashflow) {
        var Cashflow;

Вы предаете какой-то булевский параметр, но не используете его, а переопределяете.

Здравствуйте!
Спасибо за ответы, что я сделал:
1. Установила для параметра CashflowType - "Уникальный идентификатор".
2. Добавила передачу значений для параметров

SetParameterValue(Parameters, 'InvoiceID', InvoiceID);
SetParameterValue(Parameters, 'CashflowType', CashflowType);

Ошибка ('CashflowTypeID' is undefined) в данной стороке SetParameterValue(Parameters, 'CashflowType', CashflowType);
Параметр верно указан.
3. Убрала функцию ApplyDatasetFilter(Dataset, 'InvoiceID', InvoiceID, true), так как галочки включены (галочки в сервисе).
4. И ошибка все равно возникает в поле Dataset.Open();
Совет на счет, того чтобы перевести строку к данному виду. Пока думаю над тем как это сделать

 'многобукв' 

так Вы, наверно, не определили значение переменной CashflowType, которую Вы подставляете в SetParameterValue(Parameters, 'CashflowType', CashflowType)?

"Капустина Валентина" написал:Совет на счет, того чтобы перевести строку к данному виду. Пока думаю над тем как это сделать
 'многобукв'

сделать это можно так:
если InvoiceID - строка, то

var InvoiceIDStr = InvoiceID.substr(1, InvoiceID.length - 2);

если InvoiceID - объект типа DataField, то

var InvoiceIDStr = InvoiceID.Value.substr(1, InvoiceID.Value.length - 2);

Здравствуйте!
Да вы правы, нужно было определить значение переменной CashflowType, это сделано.

Когда начала прописывать условия для строки и для объекта, ничего не выходит:(...может просто я не до конца понимаю, как это сделать. Раньше таких проверок не делала.
Благодарю за помощь!

"Капустина Валентина" написал:Когда начала прописывать условия для строки и для объекта, ничего не выходит

Валентина, Вы не можете понять, какого типа у Вас переменная CashflowType?
если да, то Вы можете сразу определять ее как строку, когда "берете" из датасета. например, вот так:

var CashflowType= Dataset.ValAsStr('CashflowType');

(подробнее можно почитать в SDK), а потом, как написал Дмитрий, "убрать" фигурные скобки:

var CashflowTypeStr = CashflowType.substr(1, InvoiceID.length - 2);
Показать все комментарии