2014-10-03 2 views
0

나는 만들고있는 VBA 스크립트에 몇 가지 문제가있어 여기서 물어 보는 것이 가장 좋을 것이라고 생각했습니다. 나는 약간 배경을 줄 것이다 :런타임 오류 3065 VBA SQL 문에서 "select query를 실행할 수 없습니다"

나는 나의 클라이언트의 많은 것이 나의 국가 세무서에서 일정한 발행 한 문서에 대하여 가고 손에서 현금을 지불하고, 저에 세금의 양을 산출하게 얻는 때 나는이 프로그램을 쓰고있다. 특정 금액. 수동으로 처리하는 것이 합당한 서류 작업이므로이 작업을 수행하는 애플리케이션과 상당한 금액을 더 쓰고 있습니다. 아래 스크립트는 수행해야 할 작업의 핵심입니다.

처음 사용하는 경우 Access에서 일회용 양식을 만들었습니다. 아무것도 쓰지 않았습니다. 임시 계산 용이며 프린터로 전송되어 휴일 수당을 계산합니다.

계산 된 셀에서 SQL 조회를 수행 할 수 없기 때문에 입력 된 3 개의 값을 인수로 전달하여 VBA 스크립트를 실행하고 있습니다.

그러나 런타임 오류 3075를 없애지 못하는 것 같아요. 내 인생에서 내가 어디에서 왔는지 알아낼 수 없습니다. SQL 문까지 추적했지만 연산자 오류가있는 위치를 찾을 수 없습니다. 내가 어디로 잘못 가고 있니? 내가 그들을 답변을 주위에있을 것입니다 추가 질문이 있으면 물론

Option Compare Database 

    Public Function DetermineTax(CurrentDate As Date, CurrWageType As String, CalcNetWages As Currency) 

    'Checks whether required fields are blank 

    If Not (IsDate(CurrentDate)) Then 
     Exit Function 
    End If 

    If (CurrWageType = "") Then 
     Exit Function 
    End If 

    If (CalcNetWages <= CCur(0#)) Then 
     Exit Function 
    End If 

    Dim strSQL As String 

    'Calculates tax based on (-((n-b)/(a-1))-n) formula, where all WHERE arguments have been met. 

    strSQL = 
    "SELECT FIRST (ROUND(((-(CalcNetWages-tblWageRate.CoefficientB)/(tblWageRate.CoefficientA-1))-CalcNetWages))) " & _ 
    "FROM tblWageType INNER JOIN tblWageRate " & _ 
    "ON tblWageType.WageTypeID = tblWageRate.fk_WageTypeID " & _ 
    "WHERE tblWageRate.TaxYearStart <= CurrentDate And " & _ 
    "tblWageRate.TaxYearEnd >= CurrentDate And " & _ 
    "tblWageType.WageType = CurrWageType And " & _ 
    "tblWageRate.Net >= CalcNetWages;" 

    CurrentDb.Execute Query:=strSQL, Options:=dbFailOnError + dbSeeChanges 

    'DoCmd.RunSQL strSQL 

    End Function 

: 여기

는 코드입니다.

감사합니다.

편집 : Urgh,이 코드를 너무 오랫동안보고 있습니다. ROUND 함수는 대괄호로 묶어야했습니다. 그 오류 3075 없애 버렸어. 위의 코드를 수정했습니다.

그러나 이제 오류 3065 "선택 쿼리를 실행할 수 없습니다."가 나타납니다. 일부 인터넷 검색을 사용하면 양식에서 SELECT 필드를 사용할 수없는 것 같지만 모듈로 호출 할 때 차이가 있어야한다고 생각하지 않습니다. 나는 잠자리에 들기 위해 내일 더 시도 할 것이다. 그러나 그 사이에 누군가는 어떤 생각을 가지고 있니?

+0

? 나는이 연산자를 보지 못했을 것입니다. 아마도 "SELECT TOP 1 ..."을 의미했을 것입니다. – Arvo

+0

SELECT FIRST는 반환 된 첫 번째 결과를 선택해야합니다. tblWageRate.Net이 CalcNetWages보다 큰 하나 이상의 결과가 거의 확실하기 때문에 정확한 계수를 반환하기 위해 첫 번째 것을 선택해야합니다. 방금 ​​SELECT TOP 1을 시도했는데 오류가 2342로 바뀌 었습니다 (RunSQL 작업에 SQL 문으로 구성된 인수가 필요함) –

+0

CurrentDate, CurrWageType 또는 CalcNetWages를 실제로 바꾸지 않았습니다. 그것들은 SQL 쿼리와 일치하는 것을 얻기 위해 전달되어야하는 사용자 입력 변수입니다. 결과는 텍스트 상자에 쓰여지 겠지만이 코드를 여러 가지 다른 형식으로 사용하려면 실제로 올바른 값을 먼저 반환해야합니다. –

답변

0

일주일 동안 문제가 해결되었습니다. 문제는 a) 날짜가 처리되는 방식과 b) 따옴표가 빠진 것입니다.

여기에는 a) 문제의 함수를 호출하고 b)이를 테이블에 추가 한 코드도 포함됩니다.

Option Compare Database 
Option Explicit 

Private Sub btnCalc_Click() 

Me.txtWeeklyTax = CalcNetTax(Me.txtWeeklyNet, Me.txtDatePaid, Me.cmbTaxType) 


End Sub 

Private Sub btnInsertRec_Click() 

Dim strSQL As String 

strSQL = "" 
strSQL = strSQL & "INSERT INTO tblPayment " 
strSQL = strSQL & "   ( " 
strSQL = strSQL & "      fk_EmployerID, " 
strSQL = strSQL & "      fk_EmployeeID, " 
strSQL = strSQL & "      PaymentDate , " 
strSQL = strSQL & "      fk_WageTypeID, " 
strSQL = strSQL & "      NetPayment , " 
strSQL = strSQL & "      TaxPayable " 
strSQL = strSQL & "   ) " 
strSQL = strSQL & "VALUES " 
strSQL = strSQL & "   ( " 
strSQL = strSQL & "      '" & Me.cmbEmployer & "', " 
strSQL = strSQL & "      '" & Me.cmbEmployee & "', " 
strSQL = strSQL & "      '" & Me.txtDatePaid & "', " 
strSQL = strSQL & "      '" & Me.cmbTaxType & "', " 
strSQL = strSQL & "      '" & Me.txtPropNet & "', " 
strSQL = strSQL & "      '" & Me.txtPropTax & "' " 
strSQL = strSQL & ");" 

'strSQL = strSQL & "VALUES " 
'strSQL = strSQL & "   ( " 
'strSQL = strSQL & "      '" & Me.[cmbEmployer] & "', " 
'strSQL = strSQL & "      '" & Me.[cmbEmployee] & "', " 
'strSQL = strSQL & "      '" & Me.[txtDatePaid] & "', " 
'strSQL = strSQL & "      '" & Me.[cmbTaxType] & "', " 
'strSQL = strSQL & "      '" & Me.[txtPropNet] & "', " 
'strSQL = strSQL & "      '" & Me.[txtPropTax] & "', " 
'strSQL = strSQL & ");" 

Debug.Print strSQL 

DoCmd.RunSQL (strSQL) 
Call cmdReset_Click 

End Sub 

Private Sub cmbEmployer_AfterUpdate() 
    Me.cmbEmployee.Requery 
End Sub 

Private Sub cmdReset_Click() 
On Error GoTo ResetError 
Dim Frm As Form, Ctl As Control 

Set Frm = Me 
For Each Ctl In Frm 
Ctl.Value = Null 
Next Ctl 

ResetError: 
If Err = 2119 Or Err = 438 Or Err = 2448 Then 
Resume Next 
ElseIf Err > 0 Then 
MsgBox Err & ": " & Err.Description 
End If 
End Sub 

실제 세금 기능 ... "FIRST SELECT ..."의미

Option Compare Database 
Option Explicit 

Public Function CalcNetTax(NetPay As Currency, PayDate As Date, TaxType As Integer) As Currency 

Dim db As DAO.Database 
Dim rs As DAO.Recordset 
Dim strSQL As String 

Set db = CurrentDb 

strSQL = "" 
strSQL = strSQL & "SELECT  FIRST (ROUND((-(" & [NetPay] & "-tblWageRate.[CoefficientB])/(tblWageRate.[CoefficientA]-1)-" & [NetPay] & "))) AS TaxPayable " 
strSQL = strSQL & "FROM  tblWageType " 
strSQL = strSQL & "   INNER JOIN tblWageRate " 
strSQL = strSQL & "   ON   tblWageType.[WageTypeID] = tblWageRate.[fk_WageTypeID] " 
strSQL = strSQL & "WHERE  ( " 
strSQL = strSQL & "      ( " 
strSQL = strSQL & "         ( " 
strSQL = strSQL & "           tblWageRate.[TaxYearStart] " 
strSQL = strSQL & "        ) " 
strSQL = strSQL & "         <= " & SQLDate([PayDate]) & " " 
strSQL = strSQL & "      ) " 
strSQL = strSQL & "   AND " 
strSQL = strSQL & "      ( " 
strSQL = strSQL & "         ( " 
strSQL = strSQL & "           tblWageRate.[TaxYearEnd] " 
strSQL = strSQL & "        ) " 
strSQL = strSQL & "         >= " & SQLDate([PayDate]) & " " 
strSQL = strSQL & "      ) " 
strSQL = strSQL & "   AND " 
strSQL = strSQL & "      ( " 
strSQL = strSQL & "         ( " 
strSQL = strSQL & "           tblWageType.[WageTypeID] " 
strSQL = strSQL & "        ) " 
strSQL = strSQL & "         = " & [TaxType] & " " 
strSQL = strSQL & "      ) " 
strSQL = strSQL & "   AND " 
strSQL = strSQL & "      ( " 
strSQL = strSQL & "         ( " 
strSQL = strSQL & "           tblWageRate.[Net] " 
strSQL = strSQL & "        ) " 
strSQL = strSQL & "         >= " & [NetPay] & " " 
strSQL = strSQL & "      ) " 
strSQL = strSQL & "   );" 

Debug.Print strSQL 
Set rs = db.OpenRecordset(strSQL) 
rs.MoveFirst 
CalcNetTax = CCur(rs.Fields(0)) 

rs.Close 
db.Close 

Set rs = Nothing 
Set db = Nothing 

End Function 

Private Function SQLDate(vDate As Variant) As String 
     If IsDate(vDate) Then 
      SQLDate = "#" & Format$(vDate, "mm\/dd\/yyyy") & "#" 
     End If 
End Function