2011-05-14 3 views
1

MS Access CREATE PROCEDURE 또는 .NET에서 Access Macro를 사용하십시오.

과 같은 쿼리를 실행할 수 있어야합니다.
SELECT * FROM atable WHERE MyFunc(afield) = "some text" 

VB 모듈에서 MyFunc를 작성했지만 "Undefined function 'MyFunc'in 식에 쿼리 결과가 나타납니다." .NET에서 실행될 때

지금까지 읽은 것부터 보안 문제로 인해 Access VB 모듈의 기능을 .NET에서 사용할 수 없습니다. 주제에 대한 정보는 많지 않지만이 길은 끝이 아닌 것처럼 보입니다.

또 다른 가능성은 CREAT PROCEDURE 문을 통해 얻는 것입니다. 또한 작은 문서도 있습니다. http://msdn.microsoft.com/en-us/library/bb177892%28v=office.12%29.aspx

다음 코드는 작동하며 Access에서 쿼리를 만듭니다.

CREATE PROCEDURE test AS SELECT * FROM atable 

그러나 그냥 간단한 select 문 - 나는 여러 줄의 VB 코드가 필요하다.

CREATE PROCEDURE 문을 사용하여 다음 코드를 실행했습니다. "잘못된 SQL 문, 예상 된 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' , 또는 'UPDATE'. "

이것은 SQL 'PROCEDURE'문이 있음을 나타냅니다. 따라서

CREATE PROCEDURE TEST AS PROCEDURE 

"PROCEDURE 절의 구문 오류"가 발생했습니다.

SQL 'PROCEDURE'문에 대한 정보를 찾을 수 없습니다. 아마도 오류 메시지를 잘못 읽었을 뿐이며 짐승 같은 것도 없습니다. 나는 성명서를 시험하는데 약간의 시간을 할애했지만 더 이상 얻을 수 없다.

값을 저장할 필드를 추가하라는 제안에 대한 응답으로 요구 사항을 확장합니다.

이 기능이 필요한 시나리오는 두 가지입니다.

첫 번째 시나리오에서는 사용자가 필드의 soundex를 검색 할 수 있어야하고 Access에 soundex SQL 함수가 없으므로 사용자가있는 모든 테이블의 모든 필드에 대해 soundex 값을 저장하는 필드를 추가했습니다 입력 된 값처럼 "소리가 나는"레코드를 검색 할 수 있기를 원합니다. 부모 필드 값이 변경 될 때마다 soundex 값을 업데이트합니다. 그것은 오버 헤드의 공정한 비트지만, 나는이 인스턴스에 필요한 것으로 간주.

두 번째 시나리오에서 필자는 필드 값의 공간 연결 간격을 표준화하고 선택적으로 사용자 정의 문자를 제거하려고합니다. 나는 TRIM과 REPLACE 기능의 조합으로 원하는 값을 얻는 것에 아주 가깝게 올 수 있습니다. 이 값은 필드 중 하나의 값에서 단어 사이에 3 개 이상의 공백이 나타나는 경우에만 다를 수 있습니다 (드문 시나리오). 이 기능이 필요한 모든 테이블의 모든 필드에서 추가 필드의 오버 헤드를 정당화하는 것은 어렵습니다. 여분의 공간 문제에 대한 사용자의 피드백을받지 못하면 TRIM & REPLACE 값을 계속 사용합니다.

내 응용 프로그램은 데이터베이스에 무관심합니다 (또는 매우 종교적이지는 않습니다 ... 저는 7). 필자는 공간 정규화와 문자 스트립 핑을 내장 데이터베이스 기능보다 훨씬 효율적으로 수행하는 다른 6 개의 데이터베이스 각각에 대해 UDF를 작성했습니다. VB 매크로로 Access에서 UDF를 작성하고 Access 내에서 해당 매크로를 사용할 수 있지만 .NET에서이 매크로를 사용할 수 없다는 사실에 정말 짜증이납니다.

값을 인덱싱 할 수 있어야하므로 .NET으로 전체 열을 가져온 다음 계산을 수행해도 작동하지 않습니다.

+0

'MyFunc'는 실제로 무엇을합니까?단순하다면 사용 된 인터페이스에 관계없이 사용 가능한 SQL 함수로 대체 될 수 있습니다. –

답변

0

나는 Access가 할 수있는 것의 천장에 뛰어 들었다고 생각한다. Access는 실제로 시도하고있는 것처럼 복잡한 TSQL 문을 수행 할 권한이 없습니다. 그러나 찾고있는 것을 성취 할 수있는 몇 가지 방법이 있습니다.

첫 번째로 MyFunc의 결과가 자주 변경되지 않는 경우 각 레코드를 atable에 반복 실행하고 모듈에 대해 MyFunc을 실행하는 함수를 만들 수 있습니다. 테이블 자체 (새 열에)에 데이터를 저장하거나 원하는 용도로 사용하는 메모리 내 데이터 집합을 작성할 수 있습니다.

이렇게하는 두 번째 방법은 .NET에서 처리하는 것입니다. 그렇게 할 수있는 능력이있는 것 같습니다. SELECT 문을 수행하고 Access에서 원하는 데이터를 꺼냅니다 (MyFunc을 실행하지 않고). 그런 다음 데이터에 대해 원하는 로직을 실행하고 거기에서 사용하거나 다시 Access 데이터베이스에 저장하십시오.

+0

당신의 제안에 감사드립니다, Biggs. 새로운 원본 정보를 보려면 원래 게시물을 참조하십시오. – ic3b3rg

0

atable.afieldX = MyFunc (atable.afield) 인 atable에 추가 필드를 만들고 싶지 않은 이유는 무엇입니까? 필요한 모든 것 - UPDATE 명령을 한 번 실행하십시오.

+0

제안을 주셔서 감사합니다 ... 내 원래의 게시물에 추가 한 새로운 정보를 참조하십시오. – ic3b3rg

+0

@ ic3b3rg 나는 당신의 고통을 채우고 ... 몇 년 전에 같은 채움을 했었지 ... 당신은 Access 2010 (둘 다) 스토어드 프로 시저와 테이블 트리거를보고 싶을 것입니다. (http://stackoverflow.com/questions/3287545/in-make-a-stored-procedure-in-ms-access) – Nikiton

0

MyFunc SQL 함수를 작성해야합니다. 이렇게하면 SQLserver와 Access에서 동일한 쿼리를 실행할 수 있습니다. 당신을 위해

몇 가지 유용한 링크 그래서 당신은 시작할 수 있습니다 :

+0

SQL Server (SQL Server 클라이언트 용)로 작성된 함수가 있지만 액세스 클라이언트에 SQL Server가 설치되어 있지 않을 수 있습니다. – ic3b3rg

0

어떤 버전의 JET (현재 Ace라고 함)를 사용하고 있습니까?

나는 Access VBA 코드를 사용하려고하면 VBA 라이브러리와 MS Access 복사본이로드되어 실행되는 것이 놀랄 일이 아닙니다.

그러나 Access 2010에는 이제 테이블 트리거와 저장 프로 시저가 있습니다. 이러한 저장 프로시 저는 VBA를 필요로하지 않으며 실제로 엔진 수준에서 실행됩니다. 나는 테이블 트리거 여기 SOUNDEX 루틴이 작동하는 방법을 보여줍니다이 : ODBC 행을 수정을 통해

http://www.kallal.ca/searchw/WebSoundex.htm

위의 수단에 액세스하는 경우, 또는 VB.net, 또는 FoxPro에를, 테이블 트리거 코드가 실행됩니다 실행하고 soundex 값을 열에 저장합니다. 또한이 기능은 Access 2010에서 새로운 웹 게시 기능을 사용하는 경우에도 작동합니다. 위의 기사는 Access 웹 서비스 (Office 365 및 SharePoint에서 사용 가능)를 사용하는 관점에서 작성되었지만 위의 soundex 테이블 트리거는 또한 Access 및 JET (ACE) 응용 프로그램 만 단독으로 사용할 수 있습니다.

+0

제안에 감사하지만 "저장 프로 시저"는 테이블의 다른 필드 만 업데이트합니다. NET을 통해 그 일을하고 있습니다. – ic3b3rg