Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Торможу: Рекордсет возвращает в 2 раза меньшую величину
 
 автор: Pioner   (11.12.2008 в 04:13)   личное сообщение
 
 

Какой-то дебилизм, сижу, смотрю во все глаза и не понимаю, где ошибка.

Вот такой код:


    Select Case intQ
        Case 1
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF " _
                & "WHERE A2 <= #10/25/2008# "
            Debug.Print strSQL
            
        Case 2
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF " _
                & "WHERE A2 BETWEEN #10/26/2008# AND #01/24/2009# "
            Debug.Print strSQL
        
        Case 3
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF " _
                & "WHERE A2 BETWEEN #01/25/2009# AND #04/25/2009# "
            'Debug.Print strSQL
        
        Case 4
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF " _
                & "WHERE A2 BETWEEN #04/26/2009# AND #07/25/2009# "
            'Debug.Print strSQL
                
        Case Else
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF "
            rst.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
            'Debug.Print strSQL
    End Select
    
    rst.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
    
    If rst.EOF Then
        TotalSpiff = 0
    Else
        TotalSpiff = rst!Total
    End If



когда смотрю величину сгенерированную в SQL строке, получается правильная величина Х.

rst!Total выдает величину Х/2, то есть, ровно в 2 раза меньшую. Ничего не понимаю.

  Ответить  
 
 автор: osmor   (11.12.2008 в 08:58)   личное сообщение
 
 

даже при Case Else ?

  Ответить  
 
 автор: Pioner   (11.12.2008 в 10:12)   личное сообщение
 
 

ага

  Ответить  
 
 автор: Анатолий (Киев)   (11.12.2008 в 10:22)   личное сообщение
 
 

У вас источник - запрос qryAboveBucketSPIFF. Какие там критерии отбора? Если есть LIKE или проверка на Null, то в ADO синтаксис отличается от запросов Access и DAO.

  Ответить  
 
 автор: Pioner   (11.12.2008 в 10:29)   личное сообщение
 
 

Нет, LIKE и Null там не проверяются. Просто сводятся данные из таблицы и запроса (запрос тоже без LIKE). Отбор ведется только по одному полю, True/False (к делу не относится).

Да, это поле, что вычисляется по Sum, там перемножаются значения двух других полей.

Но дело то как раз в том, если использовать строку debug.print strSQL в качестве запроса, то значение выдается верное. А rst!Total выдает ровно половину.

  Ответить  
 
 автор: Кабан   (11.12.2008 в 10:31)   личное сообщение
 
 

а ето так и должно быть?


 Case Else 
            strSQL = "SELECT Sum(SumOfCommission) AS Total FROM qryAboveBucketSPIFF " 
1)------->            rst.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly 
            'Debug.Print strSQL 
    End Select 
     
2)------->    rst.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly 

  Ответить  
 
 автор: Pioner   (11.12.2008 в 10:38)   личное сообщение
 
 

нет, это остаток от ранего переделанного кода, спасибо что заметил, странно что не генерил ошибку.

  Ответить  
 
 автор: Кабан   (11.12.2008 в 10:29)   личное сообщение
 
 

так умножай на 2

  Ответить  
 
 автор: Pioner   (11.12.2008 в 10:39)   личное сообщение
 
 

ага, щас...

не люблю я такие непонятности, как начнет работать нормально... подумать страшно.

  Ответить  
 
 автор: Анатолий (Киев)   (11.12.2008 в 11:01)   личное сообщение
 
 

У вас MDB или ADP? Если MDB, то что вернет DAO.Recordset?

  Ответить  
 
 автор: Pioner   (11.12.2008 в 21:50)   личное сообщение
 
 

Абалдеть.

DAO возвращает правильный результат. Ничего не понимаю. Но спасибо, оставлю пока так.

Да, это mdb, Access 2003, извиняюсь что сразу не написал.

  Ответить  
 
 автор: Анатолий (Киев)   (12.12.2008 в 10:24)   личное сообщение
 
 

>оставлю пока так
Вот этого не надо... Давайте добьем до конца. ИМХО, это важно.

Откройте DAO.Recordset и ADODB.Recordset на запросе qryAboveBucketSPIFF. Сколько записей в каждом? Значения полей, которые потом суммируются, совпадают?
Если отличий нет, то откройте итоговый (тот, что у вас в вопросе) ADODB.Recordset не как ForvardOnly, а KeySet, например. Каков результат?
Если отличия есть, то проделайте то же с запросами, входящими qryAboveBucketSPIFF.

  Ответить  
 
 автор: Pioner   (12.12.2008 в 23:42)   личное сообщение
 
 

Давай, я с удовольствием, самому очень любопытно. Да и на будущее, опасный баг (или фича?)

В общем, накатал процедурку, отрывает оба рекодсета с абсолютно одинаковым SQL, DAO все по умолчанию, АДА с ФорвардОнли

Пробегаю рекордсет и считаю строки и сумму по нужному полю.

Результат:

DAO rows = 79
DAO sum = 6666.25
ADO rows = 79
ADO sum = 3333.125

та же самая ситуация с KeySet, Static и Dynamic. На всякий случай с Dynamic пробежал с разными Локами, те же результаты.

  Ответить  
 
 автор: Pioner   (12.12.2008 в 23:45)   личное сообщение
 
 

проверил по первым полям результаты:
rstDAO!SumOfCommission = 108
rstADO!SumOfCommission = 54

и т.д.

на всякий случай даю содержимое запросов.
Запрос qryAboveBucketSPIFF:
SELECT tblAboveBucket.CEC_ID, qrySpiffSummary.[Email ID], qrySpiffSummary.A0, qrySpiffSummary.D0, qrySpiffSummary.A4, qrySpiffSummary.A2, qrySpiffSummary.CTS3200, qrySpiffSummary.CTS3000, qrySpiffSummary.CTS1000, qrySpiffSummary.CTS500, qrySpiffSummary.H4, tblAboveBucket.BonusPercent AS SumOfPercentAllocated, [H4]*[SumOfPercentAllocated]/100 AS SumOfCommission, qrySpiffSummary.Shipped, qrySpiffSummary.[Average Split]
FROM (tblAboveBucket INNER JOIN tblCC ON tblAboveBucket.CEC_ID = tblCC.CC) INNER JOIN qrySpiffSummary ON tblCC.Email = qrySpiffSummary.[Email ID]
WHERE (((tblAboveBucket.CEC_ID)='ctzortzi'));

Запрос: qrySpiffSummary
SELECT tblEmployee.[Email ID], tblTransactions.A0, tblTransactions.D0, tblTransactions.A4, tblTransactions.A2, tblTransactions.E0 AS CTS3200, tblTransactions.E1 AS CTS3000, tblTransactions.E2 AS CTS1000, tblTransactions.E3 AS CTS500, tblTransactions.H4, Sum(tblTotalAllocation.PercentAllocated) AS SumOfPercentAllocated, Sum(tblTotalAllocation.Commission) AS SumOfCommission, tblTransactions.OnHold, tblTransactions.Shipped, tblTransactions.SPIFF_Split AS [Average Split]
FROM tblTransactions INNER JOIN (tblEmployee INNER JOIN tblTotalAllocation ON tblEmployee.[Email ID] = tblTotalAllocation.PersonName) ON tblTransactions.TrID = tblTotalAllocation.TrID
GROUP BY tblEmployee.[Email ID], tblTransactions.A0, tblTransactions.D0, tblTransactions.A4, tblTransactions.A2, tblTransactions.E0, tblTransactions.E1, tblTransactions.E2, tblTransactions.E3, tblTransactions.H4, tblTransactions.OnHold, tblTransactions.Shipped, tblTransactions.SPIFF_Split
HAVING (((tblTransactions.OnHold)=False));

  Ответить  
 
 автор: Pioner   (12.12.2008 в 23:53)   личное сообщение
 
 

дополнительно проверил, при других результатах, разница таки не в 2 раза, другая, но тоже есть:

TestDAOvsADO
DAO rows = 17
DAO sum = 1427.625
ADO rows = 17
ADO sum = 951.75

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList