2016-06-24 1 views
1

나는 두 개의 액세스 getData_joingetData_static 조회 한 가정Access에서 하위 쿼리 SQL을 동적으로 수정하는 방법은 무엇입니까?</p> <p><code>getData_static</code> :

select * from someTable where someTable.property="value" 

getData_join :

select * from someTable inner join otherTable on someTable.property=otherTable.property 

데이터베이스는 getData_join 전화 쿼리, 예를 들어, items_getData 많이 있습니다

select * from items inner join getData_join on items.property=getData_join.property 

프런트 엔드에 스위치를 설정하여 사용자가 getData_static 또는 getData_join을 호출할지 여부를 선택할 수있게하려고합니다. 지금처럼 된 QueryDef를 사용하여 즉석에서 SQL을 정의하는 다음

select * from someTable [insertClause] 

과 :

을하기보다는 어쩌면 같은 더미 절 일반적인 getData 쿼리를하는 것에 대한 생각, 쿼리의 두 개의 세트를 만들
Function modify_getData(isJoin As Boolean) As QueryDef 

Dim qdf As QueryDef 

Set qdf = CurrentDb.QueryDefs("getData") 

If isJoin Then 
    qdf.sql = Replace(qdf.sql, "[insertClause]", "inner join otherTable on someTable.property=otherTable.property") 
Else 
    qdf.sql = Replace(qdf.sql, "[insertClause]", "where someTable.property=""value""") 
End If 

Set modify_getData = qdf 

End Function 

프런트 엔드에서 getData을 직접 호출하지 않으며 items_getData을 호출하므로 수정 된 getData QueryDef를 만드는 것이 여기에서 사용되지 않습니다. 수정 된 SQL을 호출하는 다른 쿼리에서 사용하도록 Access에서 하위 쿼리의 SQL을 동적으로 수정하는 방법이 있습니까?

+0

특히 다른 많은 쿼리가 양식/보고서조차도이를 사용하기 때문에 두 개의 별도 쿼리를 유지하는 것이 어떻습니까? 코드가 손상 될 수 있으며 쿼리를 사용하는 모든 개체가 실패합니다. 검색어는 비 데이터 응용 프로그램 항목이므로 너무 많은 공간을 차지하지 않습니다. Plus Access의 엔진은 VBA 스크립팅 된 쿼리가 아닌 저장된 쿼리를 컴파일하고 최적화합니다. – Parfait

+1

@ Parfait : 문제는 공간이 아닌 모든 검색어의 유지 관리라고 생각합니다. – Andre

+0

대체는 qdf.sql에'[insertClause]'가 더 이상 없으므로 replace가 한 번만 작동합니다. – Andre

답변

0

모든 쿼리에서 쿼리 이름을 바꾸어야합니다. Db.QueryDefs 이상의 루프를 사용하면 쉽게 수행 할 수 있습니다.

SELECT * FROM getData_static이라는 참조 쿼리 만 있습니다.

해당 .Sql을 읽고 쿼리의 현재 상태를 확인하십시오. '스위치'와 일치하지 않으면

Set Db = CurrentDb 
For Each qdf in Db.QueryDefs 
    qdf.Sql = Replace(qdf.Sql, "getData_static", "getData_join") 
Next qdf 

또는 그 반대로 실행하십시오.

"getData_static"및 "getData_join"은 쿼리에서 다른 문자열의 일부로 나타나지 않을 정도로 고유해야합니다.