2014-01-08 7 views
0

Я пытаюсь прочитать содержимое двух разных вкладок на листе и сравнить их с помощью ADODB и методов запросов VBA.VBA ADODB update recordset

Ниже вы можете найти свой код:

stCon = "Provider=Microsoft.Jet.OLEDB.4.0;" _ 
& "Data Source=" & wbBook.FullName & ";" _ 
& "Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;Readonly = False"";" 
' MsgBox (stCon) 
'here is SQL code to gather data including our calculation from two tables within the workbook 
'stSQL = "SELECT [Recon_Daily_Xml_report$].RECTYPEGLEDGER, [GL_Activity_totals$].TRXNTYPE, ([Recon_Daily_Xml_report$].Amount_Abs - [GL_Activity_totals$].BILLINGAMT) as Amount_Diff ," 
'stSQL = stSQL & " ([Recon_Daily_Xml_report$].NUMOFENTRIES - [GL_Activity_totals$].NUMOFTRXNS) as Count_Diff " 
'stSQL = stSQL & " FROM [Recon_Daily_Xml_report$], [GL_Activity_totals$]" 
'stSQL = stSQL & " WHERE Lower([Recon_Daily_Xml_report$].RECTYPEGLEDGER) = Lower([GL_Activity_totals$].TRXNTYPE)" 
'stSQL = stSQL & " ORDER BY [Recon_Daily_Xml_report$].RECTYPEGLEDGER ASC" 

stSQL = "SELECT LCASE([GL_Activity_totals$].TRXNTYPE),Sum(ABS([GL_Activity_totals$].BILLINGAMT)),Sum([GL_Activity_totals$].NUMOFTRXNS) " 
stSQL = stSQL & " FROM [GL_Activity_totals$] " 
stSQL = stSQL & " Group By [GL_Activity_totals$].TRXNTYPE " 
stSQL = stSQL & " ORDER BY [GL_Activity_totals$].TRXNTYPE ASC" 


'MsgBox (stSQL) 
Set cnt = New ADODB.Connection 
Set rst = New ADODB.Recordset 

cnt.Open stCon 
'rst.Open stSQL, cnt, 1, 3 
rst.Open stSQL, cnt, adOpenStatic, adLockOptimistic 
'rst.Open strSQL, cnt, adOpenStatic, adLockOptimistic 
With rst 


    Do While Not .EOF 
    If rst.Fields.Item(0).Value <> "" Then 
     strString = Replace(rst.Fields.Item(0).Value, " ", " ") 

     rst.Update 
     rst.Fields.Item(0) = strString 

    End If 
    .MoveNext 
    Loop 

End With 

Этот конкретный код дает мне обратно ошибку предполагая, что я не могу обновить поле в наборе записей Я хочу, чтобы обновить при чтении. Ошибка Сейчас я получаю:

Run-time error '-2147217911 Cannot update. Database or object is read-only. 

Пытался изменить способ я открыть набор записей, используя 1,3 вариант, но опять я получаю ту же ошибку.

Может ли кто-нибудь помочь в этом?

ответ

0

вопрос с

LCASE([GL_Activity_totals$].TRXNTYPE) 

и с GROUP BY. В этом случае значение rst.Fields.Item (0) является выражением, а не значением таблицы. Вы не можете обновлять выражения. Кроме того, поскольку вы используете GROUP BY, набор записей не связан с какой-либо конкретной записью для доступа к редактированию. Вы можете выполнить ту же задачу только в SQL

cnt.Execute("UPDATE [GL_Activity_totals$] " & _ 
" SET [GL_Activity_totals$].TRXNTYPE = Substitute([GL_Activity_totals$].TRXNTYPE,' ', ' ') " & _ 
" WHERE NOT [GL_Activity_totals$].TRXNTYPE IS NULL " & _ 
" AND [GL_Activity_totals$].TRXNTYPE <> '';") 
+0

Благодарим за отзыв. Заменить функциональность в Update для ADODB VBA не распознается. Таким образом, замена не выполняется. – user3122285

+0

Нужно ли мне делать какие-либо другие изменения для этого? конечный результат, который я хочу, - это заменить все лишние пробелы внутри строк trxntypes, которые находятся в наборе записей. – user3122285

+0

После того, как вы снова просмотрели свой вопрос, я задаюсь вопросом, было бы лучше просто открыть лист без использования ADODB, но в любом случае я думаю, что Substitute должен работать вместо Replace, поскольку он превосходит – serakfalcon

Смежные вопросы