2013-08-14 2 views
0

SQL 문에서 매개 변수의 처음 30 개 레코드를 기반으로 테이블을 업데이트하려면 추가 쿼리를 실행하려고합니다. 모든 데이터는 Access 2010 데이터베이스에 있으며 양식의 단추를 기반으로 쿼리를 실행하고 싶습니다.Access 2010 VBA 날짜를 루프로 변경하십시오.

나는 vba를 처음 사용하며 게시물을 기반으로 다음 코드를 조합합니다.

Option Compare Database 

Private Sub Command3_Click() 
Dim sql As String 
Dim i As Integer 
Dim j As Integer 
Dim rst As DAO.Recordset 
Dim dbs As DAO.Database 
Dim strTerritory As String 

Set dbs = CurrentDb 

strTerritory = "Alex Hernandez" 
strSQL = "INSERT INTO tblWeather30DayMovingFinal (NEW, RptdDate, [Clm Nbr], WeatherLimit) SELECT TOP 30 tblWeather30DayMoving.[NEW], tblWeather30DayMoving.[RptdDate], tblWeather30DayMoving.[Clm Nbr], 1 AS WeatherLimit FROM tblWeather30DayMoving WHERE (((tblWeather30DayMoving.NEW)= strTerritory) AND ((tblWeather30DayMoving.RptdDate) Between #" & i & "/1/" & j & "# And #" & i & "/28/" & j & "#)); " 

Set rst = dbs.OpenRecordset("tblWeather30DayMoving", dbOpenTable) 

With rst 

For j = 2003 To 2013 
For i = 1 To 12 
If Not (rst.EOF And rst.BOF) Then 
    .MoveFirst 
    Do 
    CurrentDb.Execute strSQL 
    .MoveNext 
    Loop Until .EOF 
End If 
Next i 
Next j 

End With 

Set rst = Nothing 
End Sub 

다음과 같은 오류 메시지가 나타납니다. SQL에서 날짜 참조를 채우기 위해 루프를 가져 오는 방법을 알아 내려고 노력 중입니다.

런타임 오류 '3075':

쿼리 식 '(((tblWeather30DayMoving.NEW)에서 날짜

구문 오류 - # 0/1/0 # 사이 strTerritory) AND ((tblWeather30DayMoving.RptdDate) 그리고 # 0/28/0 #) '.

어떤 생각이 방법 대신 공의의 SQL 문 i와 j를 전달하는 당신은 루프의 외부 strSQL 문자열을 설정하는?

+0

아직 답을 테스트 해 보셨습니까? –

답변

0

현재 보여주고있다.

이 시점에서 ij 당신은 두 번째 루프의 내부 strSQL에 값을 할당해야

0입니다

내가 메모장이 아니라 그것을했다
For j = 2003 To 2013 
    For i = 1 To 12 
     strSQL = "INSERT INTO tblWeather30DayMovingFinal (NEW, RptdDate, [Clm Nbr], WeatherLimit) SELECT TOP 30 tblWeather30DayMoving.[NEW], tblWeather30DayMoving.[RptdDate], tblWeather30DayMoving.[Clm Nbr], 1 AS WeatherLimit FROM tblWeather30DayMoving WHERE (((tblWeather30DayMoving.NEW)= strTerritory) AND ((tblWeather30DayMoving.RptdDate) Between #" & i & "/1/" & j & "# And #" & i & "/28/" & j & "#)); " 

     If Not (rst.EOF And rst.BOF) Then 
      .MoveFirst 
      Do 
      CurrentDb.Execute strSQL 
      .MoveNext 
      Loop Until .EOF 
     End If 
    Next i 
Next j 
0

테스트,하지만 여기에 아이디어 :

Option Compare Database 
    option explicit 

    Private Sub Command3_Click() 
    Dim sql As String, sql2 as string 
    Dim i As Integer 
    Dim j As Integer 
    Dim rst As DAO.Recordset 
    Dim dbs As DAO.Database 
    Dim strTerritory As String 

    Set dbs = CurrentDb 

    strTerritory = "Alex Hernandez" 
    sql = "INSERT INTO tblWeather30DayMovingFinal (NEW, RptdDate, [Clm Nbr], WeatherLimit) " & _ 
     "SELECT TOP 30 tblWeather30DayMoving.[NEW], tblWeather30DayMoving.[RptdDate], tblWeather30DayMoving.[Clm Nbr], 1 AS WeatherLimit " & _ 
     "FROM tblWeather30DayMoving WHERE (((tblWeather30DayMoving.NEW)= strTerritory) AND ((tblWeather30DayMoving.RptdDate) Between #mm/01/yyyy# And #mm/28/yyyy#)); " 

    Set rst = dbs.OpenRecordset("tblWeather30DayMoving", dbOpenTable) 

    With rst 

    For j = 2003 To 2013 
    For i = 1 To 12 
    If Not (rst.EOF And rst.BOF) Then 
    .MoveFirst 
    Do 
     sql2 = replace(1, sql,"yyyy", cstr(j)) 'replace "jjjj" by year 
     sql2 = replace(1,sql2,"mm", format(i,"00")) 'replace "mm" by month 
     debug.print sql2 
     CurrentDb.Execute sql2 'this can be REM'd once it is all working 
     .MoveNext 
    Loop Until .EOF 
    End If 
    Next i 
    Next j 

    End With 

    Set rst = Nothing 
    End Sub 

또한 Option Explicit을 설정하지 않았으며 strSql과 Sql간에 변수 이름을 혼합합니다.

바보 같은 날짜를 사용하여 sql 문자열을 만든 다음 실행 직전 루프의 적절한 그림으로 대체했습니다. 가장 효율적인 것은 아니지만 쉽고 읽기 쉽습니다.