Hej! Hej Pelle!Metoden OnTime
Denna fråga har jag försökt hitta en lösning på länge.
Jag arbetar i en Excelfil där jag skall hämta värden från en Oracle databas. När jag skickar in en Sql fråga direkt till databasen tar det alldeles för lång tid att få svar, varför vet jag inte. Om jag däremot kör sqlFrågan via Ms Access, så tar det inte mer än upp till tio sekunder innan databasen returnerar värden som jag vill komma åt. Detta är helt ok.
Nu till det kinkiga:
När jag går via Access så poppar det upp en inloggningsruta (som inte kommer upp om jag skickar Sql frågan direkt till Oracle för då kan jag skicka med PW, UI och DNS direkt) som vill att jag skall fylla i PW, UI och DNS och trycka på OK knappen innan värden returneras. Eftersom det krävs många inloggningar så vill jag automatisera inloggningen. Jag har därför gjort en Klassmodul som via olika API-anrop hittar inloggningsrutan och fyller i PW, UI och DNS, och därefter trycker på returknappen. detta funkar bara om jag har två applikationer igång samtidigt: en excelapplication där jag har klassmodulen, och en där jag har själva datakopplningen. Varför? jo när exekveringen kommer till att att den skall öppna recordsetet då stannar exekveringen där och inloggnoingrutan visas.
Jag har försökt med följande kod:
Bry er inte om att sqlfrågan är så lång.
Public Sub ImportDataAccessQry()
Dim connection As ADODB.connection
Dim recordSet As ADODB.recordSet
Dim ws As Worksheet
Dim strDB As String
Dim strSql As String
Dim strConnect As String
Dim kst As String, indate As String, linemachine As String
Set connection = New ADODB.connection
Set recordSet = New ADODB.recordSet
Set ws = wsIndata
kst = "665"
indate = "2006201"
strDB = ThisWorkbook.Path & "\" & "qryProdData.mdb"
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strDB & ";" & "Jet OLEDB:Database Password=;"
strSql = "SELECT PODI01P_P345PRODORDER.P345_ARTNR, PODI01P_P346UPPDRAG.P346_KSTUTF, PODI01P_P345PRODORDER.P345_ARVECKADAG, PODI01P_P346UPPDRAG.P346_SLUTTIDPKT, PODI01P_P345PRODORDER.P345_LOPNR, Sum(PODI01P_P347UPPDRAGVECKADAG.P347_ANTALSLAG) AS SumOfP347_ANTALSLAG, Sum(PODI01P_P347UPPDRAGVECKADAG.P347_KALTIDPRODVERKL) AS SumOfP347_KALTIDPRODVERKL, Sum(PODI01P_P347UPPDRAGVECKADAG.P347_KALTIDSTALLVERKL) AS SumOfP347_KALTIDSTALLVERKL, Sum(PODI01P_P347UPPDRAGVECKADAG.P347_KALTIDAVBROTTVERKL) AS SumOfP347_KALTIDAVBROTTVERKL, PODI01P_P347UPPDRAGVECKADAG.P347_STALLTIDSTD, PODI01P_P347UPPDRAGVECKADAG.P347_TIMPERDETSTD" _
& " FROM (PODI01P_P345PRODORDER INNER JOIN PODI01P_P346UPPDRAG ON (PODI01P_P345PRODORDER.P345_LOPNR = PODI01P_P346UPPDRAG.P345_LOPNR) AND (PODI01P_P345PRODORDER.P345_ARVECKADAG = PODI01P_P346UPPDRAG.P345_ARVECKADAG) AND (PODI01P_P345PRODORDER.P345_ARTNRSTATUS = PODI01P_P346UPPDRAG.P345_ARTNRSTATUS) AND (PODI01P_P345PRODORDER.P345_ARTNR = PODI01P_P346UPPDRAG.P345_ARTNR)) INNER JOIN PODI01P_P347UPPDRAGVECKADAG ON (PODI01P_P346UPPDRAG.P346_UPPDRAGSNR = PODI01P_P347UPPDRAGVECKADAG.P346_UPPDRAGSNR) AND (PODI01P_P346UPPDRAG.P345_LOPNR = PODI01P_P347UPPDRAGVECKADAG.P345_LOPNR) AND (PODI01P_P346UPPDRAG.P345_ARVECKADAG = PODI01P_P347UPPDRAGVECKADAG.P345_ARVECKADAG) AND (PODI01P_P346UPPDRAG.P345_ARTNRSTATUS = PODI01P_P347UPPDRAGVECKADAG.P345_ARTNRSTATUS) AND (PODI01P_P346UPPDRAG.P345_ARTNR = PODI01P_P347UPPDRAGVECKADAG.P345_ARTNR)" _
& " WHERE (((PODI01P_P346UPPDRAG.P346_KSTUTF) = " & kst & ") AND ((PODI01P_P346UPPDRAG.P346_SLUTTIDPKT) >= " & indate & "))" _
& " GROUP BY PODI01P_P345PRODORDER.P345_ARTNR, PODI01P_P346UPPDRAG.P346_KSTUTF, PODI01P_P345PRODORDER.P345_ARVECKADAG, PODI01P_P346UPPDRAG.P346_SLUTTIDPKT, PODI01P_P345PRODORDER.P345_LOPNR, PODI01P_P347UPPDRAGVECKADAG.P347_STALLTIDSTD, PODI01P_P347UPPDRAGVECKADAG.P347_TIMPERDETSTD"
ws.Range(ws.Cells(2, 1), ws.Cells(45, 11)).ClearContents
connection.Open strConnect
Application.OnTime Now + TimeValue("00:00:10"), "Test"
recordSet.Open strSql, connection 'här stannar exekveringen"
ws.Cells(2, 1).CopyFromRecordset recordSet
recordSet.Close
Set recordSet = Nothing
connection.Close
Set connection = Nothing
End Sub
Public Sub Test()
Dim oLoginOracle As LoginOracle
Set oLoginOracle = New LoginOracle
oLoginOracle.PassWord = "pw"
oLoginOracle.ServerName = "dbData"
oLoginOracle.UserId = "ui"
oLoginOracle.SetLoginToOracle
End Sub
Hoppas på en lösning på detta problem
MVH Stefan HåkanssonSv:Metoden OnTime
Om jag skickar med PWD och UserID med conntionsträngen, så gäller det bara för inloggningen till Access(eller har jag fel???). Det är när access anropar Oracle som popuprutan med PWD och UserID dyker upp. Det blir i detta fallet två inlogningar. Till Access behövs det ingen inloggning eftersom det är jag som skapat Accessfilen lokalt på min workstation.
MVH/Stefan H