2016-01-14 29 views
0

每天我都需要爲推銷員做一個報告,我們有2個自動生成的dbf文件,我自動地想在Excel中生成報告。來自1個dbf文件的報告非常完美,但我不知道如何在VBA中加入2個dbf文件。Excel中的dbf文件與SQL

我有以下腳本:

顯式的選項

子ReadDBF()

Dim con   As Object 
Dim rs   As Object 
Dim DBFFolder As String 
Dim FileName As String 
Dim FileName1 As String 
Dim sql   As String 
Dim myValues() As String 
Dim i   As Integer 
Dim j   As Integer 

Application.ScreenUpdating = False 

DBFFolder = ThisWorkbook.Path & "\" 
FileName = "project1.dbf" 
FileName1 = "project2.dbf" 

On Error Resume Next 

Set con = CreateObject("ADODB.connection") 
If Err.Number <> 0 Then 
    MsgBox "Connection was not created!", vbCritical, "Connection error" 
    Exit Sub 
End If 
On Error GoTo 0 

con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & DBFFolder & ";Extended Properties=dBASE IV;" 

sql = "SELECT project_id, COUNT(*) AS total, salesman, MAX(date) AS max_date, projectname FROM " & FileName & FileName1 & " where DateValue(datumtijd) = Date() and FileName.project_id = FileName1.project_id " & "group by project_id, salesman" 


On Error Resume Next 
Set rs = CreateObject("ADODB.recordset") 
If Err.Number <> 0 Then 
    MsgBox "Connection was not created!", vbCritical, "Connection error" 
    Exit Sub 
End If 
On Error GoTo 0 

rs.CursorLocation = 3 
rs.CursorType = 1 

rs.Open sql, con 


ReDim myValues(rs.RecordCount, 20) 


i = 1 
If Not (rs.EOF And rs.BOF) Then 
    'Go to the first record. 
    rs.MoveFirst 
    Do Until rs.EOF = True 
     myValues(i, 1) = rs!project_id 
     myValues(i, 2) = rs!salesman 
     myValues(i, 3) = rs!Total 
     myValues(i, 4) = rs!max_date 
     myValues(i, 5) = rs!project 
     rs.MoveNext 
     i = i + 1 
    Loop 
Else 
    rs.Close 
    con.Close 
    Set rs = Nothing 
    Set con = Nothing 
    Application.ScreenUpdating = True 
    MsgBox "There are no records in the recordset!", vbCritical, "No Records" 
    Exit Sub 
End If 

Sheet1.Activate 
For i = 1 To UBound(myValues) 
    For j = 1 To 4 
    Cells(i + 1, j) = myValues(i, j) 
    Next j 
Next i 
rs.Close 
con.Close 

Set rs = Nothing 
Set con = Nothing 

Columns("A:D").EntireColumn.AutoFit 

Application.ScreenUpdating = True 

MsgBox "The values were read from recordset successfully!", vbInformation, "Done" 

末次

回答

0

查詢不只是通過將兩個表一起工作作爲來源。你試圖得到什麼?另外,你不應該連接字符串來構建查詢。他們應該始終參數化。

現在,這就是說,你的語法根本不正確。您的變量被稱爲「FileName」和「FileName1」,但您查詢的基礎表格分別是「Project1」和「Project2」。您應該瞭解別名以幫助簡化查詢,並學習正確的JOIN語法。

通過一個接一個地列出表格而不用逗號會導致它失敗。這是一個更準確的語法,併爲了可讀性而格式化。然後,我編輯了原始查詢以匹配上下文。您還應始終限定各表格中的字段名稱,以便其他人試圖幫助您知道事情是從哪裏來的。在下面的示例中,我只使用別名「P1」在哪個表中使用GUESSED。和「P2」。分別。您可能需要更改它們。此外,由於「日期」可以被解釋爲是一個保留字,我已經在[]包裹它,但可能需要改變,以剔字符(旁編號1)``

select 
     P1.Project_ID, 
     COUNT(*) as Total, 
     P1.SalesMan, 
     MAX(P2.[Date]) as Max_Date, 
     P1.ProjectName 
    from 
     Project1 P1 
     JOIN Project2 P2 
      on P1.Project_ID = P2.Project_ID 
    where 
     DateValue(P2.datumtijd) = date() 
    group by 
     P1.Project_ID, 
     P1.SalesMan 

JOIN子句識別兩列表之間的關係。 WHERE子句是您正在查找的其他條件。

sql = "SELECT project_id, COUNT(*) AS total, salesman, " & _ 
      "MAX(date) AS max_date, projectname " & _ 
     " FROM " & FileName & " P1 " & _ 
      " JOIN " & FileName1 & " P2 ON P1.Project_ID = P2.Project_ID" & _ 
     " where DateValue(datumtijd) = Date() " & _ 
     " group by project_id, salesman" 
+0

嗨,謝謝你的幫助。我收到組件FROM中的錯誤語法錯誤。它與JOIN的東西,如果我刪除加入沒有錯誤 – dave

+0

@Mdek,你有一個領先/跟蹤周圍的空間,所以它不會卡住旁邊的東西?如果需要的話,在這個sql語句中進行調試並執行一下步驟,並查看sql變量的值以確保它正確讀取。 – DRapp

+0

如果一個步驟OVER,它運行在「rs.Open sql,con」卡住並且不能繼續。 sql運行時,我刪除JOIN,直到其中 – dave