Выгрузка реестра в файл

Добрый день! Помогите решить две проблемы. Создал запрос

SELECT
        [c].[ContractNumber] AS [ContractNumber],
        [tbl_Account].[OfficialAccountName] AS [OfficialAccountName],
        (SELECT SUM(Amount) FROM tbl_Invoice   i WHERE c.ID = i.ContractID GROUP BY i.ContractID) AS [AllInvoiceAmount],
        (SELECT SUM(Amount) FROM tbl_Cashflow cs  WHERE c.ID = cs.ContractID GROUP BY cs.ContractID) AS [AllCashflowAmount],
        ((SELECT SUM(Amount) FROM tbl_Cashflow cs  WHERE c.ID = cs.ContractID GROUP BY cs.ContractID)
-(SELECT SUM(Amount) FROM tbl_Invoice   i WHERE c.ID = i.ContractID GROUP BY i.ContractID)) AS [Ostatok],
        (SELECT Amount FROM tbl_Invoice i2
WHERE
InvoiceDate = (SELECT Max(InvoiceDate) FROM tbl_Invoice) AND i2.ContractID = c.ID) AS [LastInvoice],
        [tbl_Kladrs].[Name] AS [SubjectName],
        [tbl_Account].[Communication1] AS [Communication1],
        [tbl_Account].[Communication2] AS [Communication2]
FROM
        [dbo].[tbl_Contract] AS [c]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [c].[CustomerID]
LEFT OUTER JOIN
        [dbo].[tbl_Kladrs] AS [tbl_Kladrs] ON [tbl_Kladrs].[ID] = [tbl_Account].[SubjectsID]

В данном запросе выбираются все счета и оплаты по договору и разница между ними. Создал по данному запросу датасет в котором создал строковые колонки для числовых данных так как если счета есть а оплат нету по договору то разница получалось 0 что было некорректно для пользователя так как долг получался 0 и он терялся. Было все хорошо но при выгрузке данного реестра в Excel стандартной функцией выгрузки на значек "Дискеты" в полях Excel перед числом ставиться опостров что не позволяет работать с числами. Как можно решить данную проблему??? Есть вариант сделать свою выгрузку в Excel но возможно есть другой вариант?

Нравится

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

Иван, я так понимаю, Вы используете CustomSQL-колонку в запросе для подсчёта разницы?

А если попробовать применить для каждой суммы в колонке функцию ISNULL? В результате должно получиться примерно так:

SELECT
        [c].[ContractNumber] AS [ContractNumber],
        [tbl_Account].[OfficialAccountName] AS [OfficialAccountName],
        (SELECT SUM(Amount) FROM tbl_Invoice   i WHERE c.ID = i.ContractID GROUP BY i.ContractID) AS [AllInvoiceAmount],
        (SELECT SUM(Amount) FROM tbl_Cashflow cs  WHERE c.ID = cs.ContractID GROUP BY cs.ContractID) AS [AllCashflowAmount],
        ((SELECT ISNULL(SUM(Amount), 0) FROM tbl_Cashflow cs  WHERE c.ID = cs.ContractID GROUP BY cs.ContractID)
-(SELECT ISNULL(SUM(Amount), 0) FROM tbl_Invoice   i WHERE c.ID = i.ContractID GROUP BY i.ContractID)) AS [Ostatok],
        (SELECT Amount FROM tbl_Invoice i2
WHERE 
InvoiceDate = (SELECT Max(InvoiceDate) FROM tbl_Invoice) AND i2.ContractID = c.ID) AS [LastInvoice],
        [tbl_Kladrs].[Name] AS [SubjectName],
        [tbl_Account].[Communication1] AS [Communication1],
        [tbl_Account].[Communication2] AS [Communication2]
FROM
        [dbo].[tbl_Contract] AS [c]
LEFT OUTER JOIN
        [dbo].[tbl_Account] AS [tbl_Account] ON [tbl_Account].[ID] = [c].[CustomerID]
LEFT OUTER JOIN
        [dbo].[tbl_Kladrs] AS [tbl_Kladrs] ON [tbl_Kladrs].[ID] = [tbl_Account].[SubjectsID]

Потом в датасете заменить строковое поле на поле с дробным значением, и в Excel сразу будет экспортироваться числовое значение.

Спасибо Олег! Стыдно стало но я не знал что есть такая функция.:smile:

И еще вопрос к это же теме. Созданное для этого запроса окно почему то не сохраняет индивидуальные настройки колонок. То есть я убираю некоторые колонки закрываю окно вновь открываю и они сново появляются. Есть как я понял механизм сохранения настроек??

Вы установили этому окну свойство UseProfile равным true?

Олег что то функция IsNull не работает. Версия сервера MS SQL 2008 ?

А я понял надо перед select поставить

ISNULL((select SUM(AMOUNT) ....),0)- ISNULL(...)

Первая проблема решена. А по поводу сохранение окна установил свойство UseProfile равным true но это не помогло.

Иван, каким образом происходит вызов окна?

Вызов происходит вот так

function amiInvoiceInCashfloweOnExecute(ActionMenuItem, Sender) {
 
 var InvoiceInCashfloweWin = Services.GetNewItemByUSI('wnd_InvoiceInCashflowe');
     InvoiceInCashfloweWin.Prepare();
     InvoiceInCashfloweWin.Show()
}

Попробуйте заменить Services.GetNewItemByUSI('wnd_InvoiceInCashflowe') на GetSingleItemByCode('wnd_InvoiceInCashflowe'). Services.GetNewItemByUSI создаёт новый экземпляр объекта по шаблону из конфигурации, соответственно, набор колонок всегда будет таким, как его сохранили в Terrasoft Administrator.

Спасибо большое!) Буду знать.

Показать все комментарии