Hej Sortera båda och loopa i båda på en gång Tyvärr fungerar inte det då nummer inte bara är nummer om man säger så. Det kan stå ex, 3ert45df333 eller dylikt. Något sådant här i en enda update sats istället för att jobba med datan i koden >Tyvärr fungerar inte det då nummer inte bara är nummer om man säger så. Det kan stå ex, 3ert45df333 eller dylikt. Varför öppnar/länkar excel arket i access? Det står: "PM, OLE eller hyperlänkobject (sRex.nummer=EXL.nummer) är inte tillåtet i kopplingar." Ja, det var ju bara att jag hade nummer som PM i databasen. Om du öppnar anslutningen i access, som jag visade, har du samma möjligheter att skriva sql frågor. Jag får det då f*n inte å fungera :) Tyvärr kan blir int frågan uppdaterbar om du joinar den med en icke uppdaterbar fråga. Vilket din summerande fråga är. Okej, aja, tror jag fått ordning på det mesta nu.Slippa öppna ett recordset så många gånger.
Koden nedanför har gått bra enstund, dock börjar databasarna bli så pass stora nu så nu går det jättesegt.
Do while RecSet.EOF
nummer = RecSet("nummer")
RecEXL.Open "Select * From [status$] where nummer='" & nummer & "'", ConnEXL
hej = RecEXL("hej")
strUpdate "Update sRex Set hej='" & hej & "' where nummer='" & nummer & "'"
Update.Open strUpdate, Conn, adOpenStatic, adLockOptimistic
RecSet.movenext
loop
Om vi säger att det finns 25000 poster i RecEXL och 10000 poster i RecSet så kanske ni förstår att det börjar gå segt :) RecEXL är ett Exceldokument kanske ska tilläggas.
Finns det något bättre sätt att göra det här på? Funderar på om man ska lägga allt i en sträng sen leta igenom den med hjälp utav instr() och mid().
Det är dock inte bara en parameter som jag ska skicka över utan ca 15st så det kan vara jobbigt och lägga allt i en sträng också.
Jag ska alltså föraöver information från exceldokumentet till Access-databasen där 'nummer' är lika
Sv: Slippa öppna ett recordset så många gånger.
(Är inte så bra på VB men du förstår principen)
<code=vb>
recexl.open "Select * From [status$] Sort By nummer"
recset.open "Select * From sRex Sort By nummer"
do while not recSet.eof
do while not recexl.eof and recexl("nummer") < recset("nummer")
recexl.movenext
loop
if recexl.eof then goto klart
if recexl("nummer) = recset("nummer") then
recset("hej") = recexl("hej")
...
recset.update
end if
recset.movenext
loop
</code>Sv:Slippa öppna ett recordset så många gånger.
Sv: Slippa öppna ett recordset så många gånger.
<code>update sRex SET hej = (select hej from [status$] where nummer='" & nummer & "') where nummer='" & nummer & "'"</code>Sv: Slippa öppna ett recordset så många gånger.
Det går väl att sortera på fältet iallafall?Sv: Slippa öppna ett recordset så många gånger.
Då kan du köra en fråga:
Dim strSQL As String
Dim RecordsAffected As Long
Dim con As ADODB.Connection
strSQL = "UPDATE (SELECT *" + vbCrLf + _
"FROM sRex INNER JOIN " + vbCrLf + _
" [Excel 5.0;" + vbCrLf + _
" HDR=YES;" + vbCrLf + _
" IMEX=2;" + vbCrLf + _
" DATABASE=D:\My documents\Book1.xls].[status$] As Exl ON sRex.nummer = Exl.nummer)" + vbCrLf + _
"SET sRex.hej = Exl.Hej;"
Set con = CurrentProject.Connection
con.Execute strSQL, RecordsAffected
MsgBox "Du har uppdaterat " & RecordsAffected & " poster!"
Sv:Slippa öppna ett recordset så många gånger.
Aha, nu förstår jag, tog ett tag där :)Sv:Slippa öppna ett recordset så många gånger.
Hittills har det fungera utmärkt. går snabbt och bra men, kan jag använda sum-funktionen samt group by på exceldokumentet nu? Hittar inga exempel på msdn om det.
[nummer], SUM([summa]) as skuld From [status$] GROUP BY [nummer]", Conn
Men, om inte annat borde det gå att vända på det så man öppnar exceldokumentet först sen databasen i inner join?
Sv: Slippa öppna ett recordset så många gånger.
strSQL = "SELECT [status$].[nummer], SUM([status$].[summa]) as skuld " + vbCrLf + _
"FROM [Excel 5.0;" + vbCrLf + _
" HDR=YES;" + vbCrLf + _
" IMEX=2;" + vbCrLf + _
" DATABASE=D:\My documents\Book1.xls].[status$]" + vbCrLf + _
"GROUP BY [status$].[nummer];"
Sv:Slippa öppna ett recordset så många gånger.
strSQL = "UPDATE (SELECT *" + vbCrLf + _
" FROM sRex INNER JOIN " + vbCrLf + _
" SELECT [status$].[nummer], SUM([status$].[nummer2]) as skuld " + vbCrLf + _
" FROM [Excel 5.0;" + vbCrLf + _
" HDR=YES;" + vbCrLf + _
" IMEX=2;" + vbCrLf + _
" DATABASE=" & App.Path & "" + vbCrLf + _
" /status.xls].[status$] as EXL" + vbCrLf + _
" ON sRex.personnummer = EXL.nummer)" + vbCrLf + _
" SET sRex.ihopskuld = Exl.nummer2;"
Nu klagar den på att det finns sytaxfel i From-instruktion istället :)
Sv: Slippa öppna ett recordset så många gånger.
Följande kod skiljer sig på den punkt att den uppdaterar samtliga personer. Inte endast de i exelfilen:
strSQL = "UPDATE sRex SET sRex.ihopskuld = (SELECT SUM([status$].[nummer2]) as skuld " + vbCrLf + _
" FROM [Excel 5.0;" + vbCrLf + _
" HDR=YES;" + vbCrLf + _
" IMEX=2;" + vbCrLf + _
" DATABASE=" & App.Path & "/status.xls].[status$]" + vbCrLf + _
" WHERE [status$].[nummer] = sRex.personnummer)" + vbCrLf
Det kan du ju lösa med att lägga till en IN. Mend då tycker jag frågan blir att för komplex.
Jag rekomenderar:
* Skapa en temporär tabell för summerade värden i din access databas.
* Importera värdena dit från excel.
* Uppdatera din riktiga tabbel med en join mot temporärtabellen.
Sv:Slippa öppna ett recordset så många gånger.
Tack Andreas!