Страница 1 из 1

Как вычислить значение поля?

Добавлено: 21 май 2013, 08:20
paa66
В таблице Access есть поля "выручка" и "расходы". Задача: сделать запрос, который бы выдал разность "выручка" минус "расходы". Учитывая, что расходы могут быть не каждый день, то в поле "расходы" будут иногда значения NULL. Тогда "выручка" (100 рублей) минус "расходы" (NULL) результат не выдаст. Можно использовать функцию Nz. В Акцессе запрос выглядит так:

SELECT выручка, расходы, Nz([выручка],0)-Nz([расходы],0) AS Выражение1
FROM таблица
GROUP BY таблица.выручка, таблица.расходы;

Если применяю функцию Nz при составлении запроса в Visual Studio, то компилятор ругается, говорит, что нет такой функции. Может, у меня неправильный синтаксис? Если такая функция неприменима, то как всё-таки составить запрос и, вообще, справиться с подобной задачей?

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 09:05
somewhere
Компилятор может ругаться только на синтаксис языка, а запрос - это текстовая строка, передаваемая провайдеру баз данных и ругаться на синтаксис запроса может только он.
Вы используете конструктор запросов в Visual Studio? или как?
Нужна более подробная информация

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 09:47
paa66
Составил запрос без конструктора Visual Studio, вручную. Запрос в коде выклядит так:

SqlQuery = "SELECT Dohod.Dates, Sum(Nz(Выручка,0)) AS Выручка, Sum(Nz(Расход,0)) AS Расходы, Sum(Nz(Касса,0)) AS" _
+ " [Снято по кассе], [Выручка]-[Расходы]-[Снято по кассе] AS [Кассовый остаток]" _
+ " FROM(Dohod) GROUP BY Dohod.Dates ORDER BY Dohod.Dates DESC"

При попытке выполнить запрос выдаёт сообщение: "Неопределенная функция 'Nz' в выражении".
Сейчас попробовал использовать функцию Nz в конструкторе, - то же самое :(

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 10:02
somewhere
Подключение к базе как выглядит? (строка инициализации)

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 13:39
paa66
Public Function GetDt(ByVal SqlQuery As String) As DataTable
Dim Con As New OleDb.OleDbConnection("Provider=Microsoft Office 12.0 Access Database Engine OLE DB Provider; Data Source=|DataDirectory|\Parik.ccdb") ' Переменная для подключения базы
Dim SqlCom As OleDb.OleDbCommand ' Переменная OleDb-команды
Dim DA As OleDb.OleDbDataAdapter ' Адаптер для заполнения таблицы после запроса
Dim dt As New DataTable
SqlCom = New OleDb.OleDbCommand(SqlQuery, Con) ' Указываем строку запроса и привязываем к соединению
Con.Open() ' Открываем соединение
SqlCom.ExecuteNonQuery() 'Выполняем запрос
DA = New OleDb.OleDbDataAdapter(SqlCom) 'Через адаптер получаем результаты запроса
DA.Fill(dt) ' Заполняем таблицу результатми
Con.Close()
Return dt
End Function

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 13:46
somewhere
paa66 писал(а):Provider=Microsoft Office 12.0 Access Database Engine OLE DB Provider;
Провайдер должен быть аксесовский, только он знает функцию Nz

Код: Выделить всё

Provider=Microsoft Access Driver (*.mdb, *.accdb)
или аналогичный ему, который реализован на IDODBC32.DLL

Re: Как вычислить значение поля?

Добавлено: 21 май 2013, 18:20
paa66
Понятно. Вот только оказалось, что вставкой строки "Provider=Microsoft Access Driver (*.mdb, *.accdb)" это дело не решить: надо добавить ссылку в проект. Я пробовал добавить ADODB, Microsoft.Office.Interop.Access, но всё равно компилятор выдаёт: Поставщик "Microsoft Access Driver (*.mdb, *.accdb)" не зарегистрирован на локальном компьютере. Какую ссылку я должен подключить? Потом я сделал так:

Imports System.Data.Odbc

Public Function GetDt(ByVal SqlQuery As String) As DataTable
Dim Con As New Odbc.OdbcConnection("Provider=Microsoft Access Driver (*.ccdb); Data Source=|DataDirectory|\Parik.ccdb")
Dim SqlCom As Odbc.OdbcCommand
Dim DA As Odbc.OdbcDataAdapter
Dim dt As New DataTable
SqlCom = New Odbc.OdbcCommand(SqlQuery, Con)
Con.Open()
SqlCom.ExecuteNonQuery()
DA = New Odbc.OdbcDataAdapter(SqlCom)
DA.Fill(dt)
Con.Close()
Return dt
End Function

Иными словами, в функции я заменил oledb на odbc. Код стал выполняться до места Con.Open() и здесь выдаёт: ERROR [IM002] [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию. Что у меня неправильно?