2017-12-11 1 views
0

기본적으로 세로 데이터를 가로 (예 : 탁월한 테이블)로 변환하려고합니다. 중첩 된 루프를 사용해야하지만 어떻게할지는 확실하지 않습니다! 여기에 작동하고 지금까지의 코드는하지만 싶지 방법 : 내가 원하는 Code result중첩 된 do.wof 루프 선택한 쿼리를 기반으로 액세스 vba

: Select query result

내 코드이 반환

strSQL = "SELECT * FROM tblTimeSheetData WHERE [WorkDate] BETWEEN #" & 
StartDate & "# AND #" & EndDate & "#" _ 
    & "ORDER BY [EmpID], [WorkDate] ;"  

Set rstTime = CurrentDb.OpenRecordset(strSQL) 

Do While Not rstTime.EOF  
    rstTemp.AddNew 
    lngEmpID = rstTime![EmpID] 
    rstTemp![EmpID] = lngEmpID 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

     Case 2 
      rstTemp![MondayWorkDate] = rstTime![WorkDate] 
      rstTemp![MondayWorkHours] = rstTime![WorkHours] 

     Case 3 
      rstTemp![TuesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![TuesdayWorkHours] = rstTime![WorkHours] 

     Case 4 
      rstTemp![WednesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![WednesdayWorkHours] = rstTime![WorkHours] 

     Case 5 
      rstTemp![ThursdayWorkDate] = rstTime![WorkDate] 
      rstTemp![ThursdayWorkHours] = rstTime![WorkHours] 

     Case 6 
      rstTemp![FridayWorkDate] = rstTime![WorkDate] 
      rstTemp![FridayWorkHours] = rstTime![WorkHours] 

    End Select 

    rstTemp.Update 
    rstTime.MoveNext 
    Loop 

내 선택 쿼리는 정확히 내가 원하는 반환 반환하는 방법 : Horizontal view

감사합니다. AG

직원 ID가 이전과 다른 경우
+0

'rstTemp.AddNew' 직원 ID가 이전 ID와 다른 경우에만 수행해야합니다. –

+0

대신 크로스 탭 쿼리 (PIVOT)를 사용하는 것이 좋습니다. 이것은 바로 그들이하는 일입니다. – Andre

답변

0

당신은 새 레코드를 추가해야한다는 :

Dim currEID As Long 'tracks the current employee id 

'... 


currEID = -1 

Do While Not rstTime.EOF 

    lngEmpID = rstTime![EmpID] 

    'new employee? If yes then add a new record 
    If currEID <> lngEmpID Then 
     rstTemp.AddNew 
     rstTemp![EmpID] = lngEmpID 
     currEID = lngEmpID 
    End If 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

    '....rest of select case here 

    End Select 

    rstTime.MoveNext 
Loop 

rstTemp.UpdateBatch 
+0

감사합니다. Tim! 좋은 생각이지만, 두 번째 날짜 집합에 도달하면 If 문 내부에 있으므로 addnew가 없으므로 오류가 발생합니다. If 문 앞에서 addnew를 사용하면 sth가 매우 유사하여 (2 행 대신 5 행을 다시 얻음) 이름이 반복되지 않습니다. 나는 꽤 다른 루프가되어야한다고 확신하지만 어떻게?! – Fusion53

+0

귀하의 의견을 따르기 어려운가요? 그러나 당신은 일반적인 접근법을 볼 수 있어야합니다. 또 다른 변경 사항은 루프의 업데이트 outsude를 이동하고 끝에 UpdateBatch를 사용하는 것입니다. –

0

나는 그것을 해결했습니다! 중첩 루프가 필요했습니다. 하나의 쿼리 대신 총 레코드 (5)를 가져 오는 대신 중첩 루프 내에서 두 개의 쿼리 (2, 3 및 2)를 수행하여 트릭을 수행했습니다. 감사.

Set rstTemp = CurrentDb.OpenRecordset("tblTimeSheetDataTemp") 
Set rstTime = CurrentDb.OpenRecordset("tblTimeSheetData") 

'this next query finds two distinct records John and Helen's EmpID 
strSqla = "SELECT DISTINCT tblTimeSheetData.EmpID FROM tblTimeSheetData 
WHERE [WorkDate] BETWEEN #" & StartDate & "# AND #" & EndDate & "#" 

Set rstCts = CurrentDb.OpenRecordset(strSqla, dbOpenDynaset) 

Do While Not rstCts.EOF 

    lngEmpID = rstCts![EmpID] 
    rstTemp.AddNew 

    'This next query finds the number of records with John's (or Helen's) 
    'EmpIDs between Start and End dates 
    strSql = "SELECT * FROM tblTimeSheetData WHERE [EmpID] = " & lngEmpID & " 
AND [WorkDate] BETWEEN #" & StartDate & "# AND #" & EndDate & "#" 
    Set rstTime = CurrentDb.OpenRecordset(strSql, dbOpenDynaset) 

    Do While Not rstTime.EOF 

    rstTemp![EmpID] = lngEmpID 

    intWeekday = Weekday(rstTime![WorkDate]) 

    Select Case intWeekday 

     Case 2 
      rstTemp![MondayWorkDate] = rstTime![WorkDate] 
      rstTemp![MondayWorkHours] = rstTime![WorkHours] 

     Case 3 
      rstTemp![TuesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![TuesdayWorkHours] = rstTime![WorkHours] 

     Case 4 
      rstTemp![WednesdayWorkDate] = rstTime![WorkDate] 
      rstTemp![WednesdayWorkHours] = rstTime![WorkHours] 

     Case 5 
      rstTemp![ThursdayWorkDate] = rstTime![WorkDate] 
      rstTemp![ThursdayWorkHours] = rstTime![WorkHours] 

     Case 6 
      rstTemp![FridayWorkDate] = rstTime![WorkDate] 
      rstTemp![FridayWorkHours] = rstTime![WorkHours] 

    End Select 
    rstTime.MoveNext 
    Loop 

rstTemp.Update 
rstCts.MoveNext 

Loop