Проблемы с источником данных для отчёта ( Access, Union, SP etc )

Night_Stalker
Дата: 01.09.2005 13:33:54
Добрый всем день.

Среда Access 2000 и MSSQL 2000, работа через ODBC
( да, я знаю, что через OLEDB было бы намного удобнее, но уже не поменять )

Проблема с формированием отчёта.
1. Первоначально предполагалось получить с сервера набор данных через представление. Потом из этого набора делалась дополнительная выбока на стороне Accessa ( суммирование и юнион ), все это оформлялось в виде запроса и подавалось на вход отчёта. Отчёт сказал, что это не переваривает и, что мол не может производить такие сложжные расчёты :(. В чём здесь могла порыться собака?

2. Как правильно можно обратиться к ХП, чтобы передать ей параметр, а результат использовать в отчёте ( проект mbd, соединение ODBC )?
Rivkin Dmitry
Дата: 01.09.2005 13:53:16
1. Без текста запроса, являющегося соурсои для отчета, трудно что-либо предположить. Скорее всего - ошибка в запросе.

2. Воспользоваться Pass-Rtough Query
AlTis
Дата: 01.09.2005 13:53:16
1. На клиенте не надо делать таких расчётов. Делайте через запросы к серверу
2. Изменять динамически запрос к серверу
Night_Stalker
Дата: 01.09.2005 14:02:24
С 1й проблемой разобрались...

запрос был следующим:

PARAMETERS [Дата сверки] DateTime;
SELECT R5.Car_ID, R5.Customer, R5.Number, R5.Model, R5.Case_ID, ( R5.Car_Cost - RS.Car_Sum ) AS Car_Debt, '0.0' AS Car_Sum
FROM r5View AS R5, qryReport5_Sum AS RS
WHERE (( RS.Car_ID = R5.Car_ID) AND (( R5.toStore <= [Дата сверки] ) AND (( R5.Car_Cost - RS.Car_Sum ) <> 0 )))
UNION SELECT R5.Car_ID, R5.Customer, R5.Number, R5.Model, R5.Case_ID, '0.0' AS Car_Debt, RS.Car_Sum AS Car_Sum
FROM r5View AS R5, qryReport5_Sum AS RS
WHERE (( RS.Car_ID = R5.Car_ID) AND (( R5.toStore IS NULL ) OR ( R5.toStore > [Дата сверки] )));

и ошибка была из-за несоблюдения типов данный - подставлял '0.0' в числовое поле. После изменения на 0.0 всё наладилось.


А по поводу второго вопрос - хотелось бы увидеть пример, ежели такое возможно
Rivkin Dmitry
Дата: 01.09.2005 16:38:51
Допустим, на серевере есть ХП:

CREATE PROCEDURA TEST
@Param AS VARCHAR(10)
AS

SELECT * FROM Tbl WHERE DateBuy = @Param
GO

В Аксе создаем Pass-Rtough Query. Я пользуюсь такой функцией:

Private Function DelCreateConnectedQuery(qName As String, cnt As String, Source As String) As Boolean
On Error GoTo err_DelCreateConnectedQuery
    Dim db As DAO.Database: Set db = CurrentDb
    Dim qd As DAO.QueryDef

    --проверить, что запрос не существует
        Set qd = db.CreateQueryDef(qName)
        qd.Connect = cnt
        qd.ODBCTimeout = 0
        qd.ReturnsRecords = True
        qd.SQL = Source
    
        db.QueryDefs.Refresh
    
    DelCreateConnectedQuery = True
    
exit_DelCreateConnectedQuery:
    Exit Function

err_DelCreateConnectedQuery:
    MsgBox Err.Description, vbExclamation, ApplName
    Resume exit_DelCreateConnectedQuery

End Function


Где
qName - name of query
cnt - connection string
Source - текст запроса, например:

Source = "Execute TEST " & Var1
Var1 - переменная задаваемая, например, с формы.

Построив однажды таким образом query, можно пользоваться им постоянно,
меняя только текст

Dim db As DAO.Database: Set db = CurrentDb
Dim qd As DAO.QueryDef: Set qd = db.QueryDefs("MyQuery")

qd.SQL = "Execute TEST '2005-09-01'"
DoCmd.OpenReport ...