|
|
|
| Какой-то дебилизм, сижу, смотрю во все глаза и не понимаю, где ошибка.
Вот такой код:
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 раза меньшую. Ничего не понимаю. | |
|
| |
|
|
|
|
| ага | |
|
| |
|
|
|
| У вас источник - запрос qryAboveBucketSPIFF. Какие там критерии отбора? Если есть LIKE или проверка на Null, то в ADO синтаксис отличается от запросов Access и DAO. | |
|
| |
|
|
|
| Нет, LIKE и Null там не проверяются. Просто сводятся данные из таблицы и запроса (запрос тоже без LIKE). Отбор ведется только по одному полю, True/False (к делу не относится).
Да, это поле, что вычисляется по Sum, там перемножаются значения двух других полей.
Но дело то как раз в том, если использовать строку debug.print strSQL в качестве запроса, то значение выдается верное. А rst!Total выдает ровно половину. | |
|
| |
|
|
|
| а ето так и должно быть?
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
|
| |
|
| |
|
|
|
| нет, это остаток от ранего переделанного кода, спасибо что заметил, странно что не генерил ошибку. | |
|
| |
|
|
|
| так умножай на 2 | |
|
| |
|
|
|
| ага, щас...
не люблю я такие непонятности, как начнет работать нормально... подумать страшно. | |
|
| |
|
|
|
| У вас MDB или ADP? Если MDB, то что вернет DAO.Recordset? | |
|
| |
|
|
|
| Абалдеть.
DAO возвращает правильный результат. Ничего не понимаю. Но спасибо, оставлю пока так.
Да, это mdb, Access 2003, извиняюсь что сразу не написал. | |
|
| |
|
|
|
| >оставлю пока так
Вот этого не надо... Давайте добьем до конца. ИМХО, это важно.
Откройте DAO.Recordset и ADODB.Recordset на запросе qryAboveBucketSPIFF. Сколько записей в каждом? Значения полей, которые потом суммируются, совпадают?
Если отличий нет, то откройте итоговый (тот, что у вас в вопросе) ADODB.Recordset не как ForvardOnly, а KeySet, например. Каков результат?
Если отличия есть, то проделайте то же с запросами, входящими qryAboveBucketSPIFF. | |
|
| |
|
|
|
| Давай, я с удовольствием, самому очень любопытно. Да и на будущее, опасный баг (или фича?)
В общем, накатал процедурку, отрывает оба рекодсета с абсолютно одинаковым SQL, DAO все по умолчанию, АДА с ФорвардОнли
Пробегаю рекордсет и считаю строки и сумму по нужному полю.
Результат:
DAO rows = 79
DAO sum = 6666.25
ADO rows = 79
ADO sum = 3333.125
та же самая ситуация с KeySet, Static и Dynamic. На всякий случай с Dynamic пробежал с разными Локами, те же результаты. | |
|
| |
|
|
|
| проверил по первым полям результаты:
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)); | |
|
| |
|
|
|
| дополнительно проверил, при других результатах, разница таки не в 2 раза, другая, но тоже есть:
TestDAOvsADO
DAO rows = 17
DAO sum = 1427.625
ADO rows = 17
ADO sum = 951.75 | |
|
| |