В таблице Access есть поля "выручка" и "расходы". Задача: сделать запрос, который бы выдал разность "выручка" минус "расходы". Учитывая, что расходы могут быть не каждый день, то в поле "расходы" будут иногда значения NULL. Тогда "выручка" (100 рублей) минус "расходы" (NULL) результат не выдаст. Можно использовать функцию Nz. В Акцессе запрос выглядит так:
SELECT выручка, расходы, Nz([выручка],0)-Nz([расходы],0) AS Выражение1
FROM таблица
GROUP BY таблица.выручка, таблица.расходы;
Если применяю функцию Nz при составлении запроса в Visual Studio, то компилятор ругается, говорит, что нет такой функции. Может, у меня неправильный синтаксис? Если такая функция неприменима, то как всё-таки составить запрос и, вообще, справиться с подобной задачей?
Как вычислить значение поля?
Модератор: Naeel Maqsudov
Компилятор может ругаться только на синтаксис языка, а запрос - это текстовая строка, передаваемая провайдеру баз данных и ругаться на синтаксис запроса может только он.
Вы используете конструктор запросов в Visual Studio? или как?
Нужна более подробная информация
Вы используете конструктор запросов в Visual Studio? или как?
Нужна более подробная информация
It's a long way to the top if you wanna rock'n'roll
Составил запрос без конструктора 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 в конструкторе, - то же самое
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 в конструкторе, - то же самое

Подключение к базе как выглядит? (строка инициализации)
It's a long way to the top if you wanna rock'n'roll
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
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
Провайдер должен быть аксесовский, только он знает функцию Nzpaa66 писал(а):Provider=Microsoft Office 12.0 Access Database Engine OLE DB Provider;
Код: Выделить всё
Provider=Microsoft Access Driver (*.mdb, *.accdb)
It's a long way to the top if you wanna rock'n'roll
Понятно. Вот только оказалось, что вставкой строки "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] Источник данных не найден и не указан драйвер, используемый по умолчанию. Что у меня неправильно?
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] Источник данных не найден и не указан драйвер, используемый по умолчанию. Что у меня неправильно?