Здравствуйте!
Необходимо, чтобы сумма по Операциям попадала в поле Сумма в Документы. Причем, если Операция с типов Расход отнималась от Прихода и эта сумма попада в документы. Я создала запрос sq_SummCashflow
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 InvoiceID = Dataset.DataFields('ID');
SummCashflow(InvoiceID, Dataset)
Скрипт следующий:
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 все вроде верно, с типом поля. Не могу понять в чем может быть проблема?
Нравится
А всё ли в порядке с параметрами 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);