ADO: Recordcount и тому подобное...

Drunechka
Дата: 05.03.2008 05:45:20
Всем привет!
MS Access 2003 SP2; *.mdb
Столкнулся с такой вот вещью (работа со временной базой данных):
1. ADO: создаю таблицу;
2. Currentdb: Заливаю данные.

ADO: рекордсет по условию -> RecordCount = 0
Повторный рекордсет -> RecordCount=3

Как бороться с этим?
Часть кода:
...
Global connA As New ADODB.Connection
Global db As Database
...
Private rstA As New ADODB.Recordset
TempDBName = "c:\base\tempdb.mdb"
TableName = "uchet_Sborka": TempTabStr = TableName & " in '" & TempDBName & "'"
connA.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TempDBName
connA.ConnectionTimeout = 180: connA.Open
Set db = CurrentDb
...
SQL = "create table " & TableName & " (DELIVERYDATE Date, EMPLOYEE text(255), DELIVERYNOTE Long, DIMENSION6 Integer, WORKTYPE Text(50), " & _ 
  "ITEMNUMBER text(255), QTY Integer)" 'сборка запроса
Call ExecA(SQL) 'обработка запроса
SQL = "insert into " & TempTabStr & " SELECT DTRANS.DELIVERYDATE, WCALC.EMPLOYEE, DTRANS.DELIVERYNOTE, DTRANS.DIMENSION6, WCALC.WORKTYPE, " & _
  "DTRANS.ITEMNUMBER, DTRANS.QTY FROM XAL_SUPERVISOR_DEBDLVTRANS DTRANS, XAL_SUPERVISOR_DEBDLVJOUR DJOUR, XAL_SUPERVISOR__WORKCALCULATION " & _
  "WCALC, DTRANS INNER JOIN DJOUR ON DTRANS.DELIVERYNOTE = DJOUR.DELIVERYNOTE, WCALC INNER JOIN DJOUR ON WCALC.REFRECID = " & _
  "DJOUR.ROWNUMBER where DJOUR.salesproj=0 and WCALC.dataset ='dat' and DTRANS.dataset ='dat' and DJOUR.dataset='dat' and " & _
  "WCALC.employee <> '' and DTRANS.DELIVERYDATE between " & DatePeriod(0) & " and " & DatePeriod(1) 'Сборка запроса
Call Exec(db, SQL) 'обработка запроса
SQL = "SELECT worktype from " & TableName & " group by worktype ORDER BY worktype" 'сборка запроса
rstA.Open SQL, connA, adOpenStatic 'рекордсет запроса
'If (rst0.BOF And rst0.EOF) Then GoTo end_funct   'пробовал так ловить наличие записей
If rstA.RecordCount = 0 Then GoTo end_funct 'проверка на результативность
...

Функция Call ExecA(SQL)
Private Function BeginTransA() 'Функция начала транзакции
If BT_A = True Then Exit Function 'проверка на ранее начатую транзакцию
connA.BeginTrans 'начало транзакции
BT_A = True
End Function
Private Function CommitTransA() 'Функция завершения транзакции
If BT_A = False Then Exit Function 'проверка на ранее закрытую транзакцию
connA.CommitTrans 'завершение транзакции
BT_A = False
End Function

Public Function ExecA(str As String) 'Функция обработки запроса через транзакцию
On Error GoTo ErrRollback
If connA.State = 0 Or connA Is Nothing Then Call TempDBOpen 'проверка на наличие установленного соединения с временным файлом
Call BeginTransA 'Функция начала транзакции
connA.Execute (str), dbFailOnError 'обработка запроса
Call CommitTransA 'Функция завершения транзакции
Exit Function
ErrRollback:
BT_A = False
connA.Rollback 'откат
Call ExecRollBackA(str) 'Функция повторной обработки запроса через транзакцию
End Function

Функция Call Exec(db, SQL)
Public Function Exec(dbase As Database, str As String) 'Функция обработки запроса через транзакцию
On Error GoTo ErrRollback
WrkSpace.BeginTrans 'начало транзакции
dbase.Execute (str), dbFailOnError 'обработка запроса
WrkSpace.CommitTrans 'завершение транзакции
Exit Function
ErrRollback: WrkSpace.Rollback 'откат
Call ExecRollBack(dbase, str) 'Функция повторной обработки запроса через транзакцию
End Function

+ - + - + - + - + - + - +
Век живи, век учись!
Программист-Любитель
Дата: 05.03.2008 08:45:48
DCount
Drunechka
Дата: 05.03.2008 08:59:52
Программист-Любитель
DCount

А как Dcount прикрутить к временной базе данных?
debug.print Dcount("worktype",TempTabstr)
???
Программист-Любитель
Дата: 05.03.2008 09:01:59
connA.Excecute("SELECT COUNT(*) FROM " & TableName).Fields(0)
Drunechka
Дата: 05.03.2008 09:08:05
Программист-Любитель
connA.Excecute("SELECT COUNT(*) FROM " & TableName).Fields(0)

не понимаю :(
err...3001
Аргументы имеют не верный тип, выходят за пределы допустимого диапазона или вступаюи в конфликт друг с другом
Drunechka
Дата: 06.03.2008 06:10:15
UP
+ - + - + - + - + - + - +
Век живи, век учись!
Restavraciya
Дата: 06.03.2008 07:40:34
ХАП :-)
Сдается что имя таблицы с пробелом
Drunechka
Дата: 06.03.2008 08:45:38
Restavraciya
ХАП :-)
Сдается что имя таблицы с пробелом

не-а...
такую "мелочь" я давно у себя искоренил...
либо "_", ЛибоВместеПишуВсе:)
Drunechka
Дата: 06.03.2008 08:48:10
Сегодня заметил такую вещь:
Если делать так:
rstA.Open SQL, connA, adOpenStatic 'рекордсет запроса
debug.print rsta.Recordcount ' равно 0
rsta.Close
rstA.Open SQL, connA, adOpenStatic 'рекордсет запроса
debug.print rsta.Recordcount 'Равно 1
rsta.Close
Почему при повторном обращении количество записей возвращается?
Предположение (ИМХО...мож и не верно)...предыдущий запрос на добавление не упевает инсертить записи...поэтому первое обращение уходит в 0...
+ - + - + - + - + - + - +
Век живи, век учись!
Программист-Любитель
Дата: 06.03.2008 08:58:53
Совершенно надежный способ проверки что рекордкант > 0 это NOT .EOF AND NOT .BOF