2013-08-30 1 views
1

"마스터"원본 (로컬로 보관)과 "복사"데이터베이스 (배포 대상)의 두 데이터베이스가 있습니다. 어느 쪽도 한 번 배포 된 (로컬 또는 네트워크를 통해) 배포본을 볼 수 없으므로 배포 후 데이터베이스에서 쿼리를 수행 할 수 없습니다. 배포되기 전에 복사 데이터베이스에서 일부 내용을 제거해야하므로 배포 용 복사 데이터베이스를 생성하기 위해 VBA 스크립트를 작성하기로 결정했습니다.MS Access에서 한 데이터베이스에서 다른 데이터베이스로 행을 삭제하는 방법

테이블에 조회가 있으므로 마스터 원본에서 복사 한 템플릿 데이터베이스를 보유하기로 결정한 다음 테이블을 삭제하고 테이블을 삭제하고 적절한 순서.

이제 일부 데이터를 제거해야하므로 고생하고 있습니다. "공공"

은 일반적으로 내가 (psudocode에서) 할 것 :

arrDEV = SQL("SELECT ID, ClusterID FROM DeviceTable WHERE Distribution<>"Public"") 

DeviceTable: 
AutoNumber(ID) 
Text(DeviceName) 
Integer(ClusterID) 
Text(Distribution) 

ClusterTable: 
AutoNumber(ID) 
Text(ClusterName) 

VirtualSystemTable: 
AutoNumber(ID) 
Text(VirtualSystemName) 
Integer(ClusterID) 
Integer(DeviceID) 

InterfaceTable: 
AutoNumber(ID) 
Integer(VirtualSystemID) 
Integer(ClusterID) 
Integer(DeviceID) 
Text(Description) 

나는 분포로 표시되어 있지 아무것도 DeviceTable, ClusterTable, VirtualSystemTable 및 InterfaceTable에서 항목을 제거해야

그런 다음, 각 응답, 나는 내 문제는

arrVSYS = SQL("SELECT ID FROM VirtualSystemTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID") 
SQL("DELETE FROM InterfaceTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID OR VirtualSystemID=$arrVSYS.ID") 
SQL("DELETE FROM VirtualSystemTable WHERE DeviceID=$arrDEV.ID OR ClusterID=$arrDEV.ClusterID") 
SQL("DELETE FROM ClusterTable WHERE ID=$arrDEV.ClusterID") 

입니다 것 데이터베이스 링크에서 이러한 쿼리를 수행하는 방법을 배울 수는 없습니다. 나는 재미있는 ADODB. 나는 보통 PHP로 작성했기 때문에 이것은 나에게 조금 어려움이있다!

+0

구체적으로 어디에 붙어 있습니까? 대상 데이터베이스에 대한 유효한 ADO 연결을 만들 수 있습니까? – HansUp

+0

"마스터"데이터베이스에 DeviceTable이 있습니까? 서로 다른 데이터베이스를 통해 쿼리해야합니까, 아니면 하나의 데이터베이스 안에 포함 된 모든 데이터/테이블/레코드/행입니까? – HK1

+0

@HansUp adodb 연결이 작동 중입니다. 문제는 여러 쿼리를 수행해야 쿼리가 작동하는 데이터베이스 간 쿼리입니다. – JonTheNiceGuy

답변

1

당신은 올바른 생각을 가지고 있지만 VBA는 PHP와는 조금 다릅니다. 먼저 문자열을 종료하고 변수를 연결 한 다음 문자열을 다시 시작하여 문자열 내에서 변수를 사용할 수 없습니다.

일반적으로 arrDev 또는 arrVSys라는 배열을 사용하는 경우 MS Access에서 DAO 레코드 또는 ADO 레코드 개체를 사용합니다. 정보를 반영하기 위해

업데이트 대답은 당신이 준 :

Dim db As DAO.Database 
Dim sSQL as String 
Dim arrDEV As DAO.Recordset, Dim arrVSYS as DAO.Recordset 
Set db = OpenDatabase("C:\SomeDatabase.accdb") 
sSQL = "SELECT ID, ClusterID FROM DeviceTable WHERE Distribution <> 'Public'" 
Set arrDEV = db.Open(sSQL) 
If Not (arrDEV.EOF and arrDEV.BOF) Then 
    arrDEV.movefirst 
    Do Until arrDEV.eof = True 
     sSQL = "SELECT ID FROM VirtualSystemTable WHERE DeviceID = " & arrDEV("ID") & _ 
       " OR ClusterID = " & arrDEV("ClusterID") 
     Set arrVSYS = CurrentDb.Open(sSQl) 

     sSQL = "DELETE FROM InterfaceTable WHERE DeviceID = " & arrDEV("ID") & _ 
       " OR ClusterID = " & arrDEV("ClusterID") & " OR VirtualSystemID = " & arrVSYS("ID") 
     CurrentDb.Execute sSQl, dbFailOnError 

     sSQL = "DELETE FROM VirtualSystemTable WHERE DeviceID = " & arrDEV("ID") & " OR ClusterID = " & arrDEV("ClusterID") 
     CurrentDb.Execute sSQl, dbFailOnError 

     sSQL = "DELETE FROM ClusterTable WHERE ID = " & arrDEV("ClusterID") 
     CurrentDb.Execute sSQl, dbFailOnError 

     arrVSYS.Close 
     arrDEV.MoveNext 
    Loop 
End If 
'Cleanup 
Set arrVSYS = Nothing 
arrDEV.Close 
Set arrDEV = Nothing 
db.close 
Set db = Nothing 

코드는 안된과 약간의 오차가있을 수 있습니다. 내가 계획하지 않은 유일한 방법은 arrVSYS에 하나 이상의 레코드가 있어야한다는 것입니다. 해당 레코드 세트에 여러 레코드가 있으면 다른 루프가 필요할 것입니다.

보시다시피, 다른 Access 데이터베이스에 액세스하는 데 ADO를 사용할 필요가 없습니다. 그러나 "외부"데이터베이스가 Access가 아닌 다른 것 인 경우에는 ADO를 사용해야합니다.

+0

하나의 데이터베이스에서 DAO.Recordset을 사용할 수 있습니까? 아니면 ADO를 사용해야합니까? 그렇다면 같은 용어를 사용합니까? – JonTheNiceGuy

+0

Access 데이터베이스 인 경우 DAO를 사용하여 다른 데이터베이스에 액세스 할 수 있습니다. 내 업데이트 답변을 참조하십시오. – HK1

+0

이것은 정확하게 내가 한 것입니다.하나의 결함이 있습니다. 시스템에 문제가 있는지 모르겠지만 arrDEV ("ID") 대신 arrDEV.Fields ("ID") 값을 사용해야했습니다. 찾을 수 있습니다 http://stackoverflow.com/a/6015362/5738 – JonTheNiceGuy