2016-08-31 9 views
0

동일한 폼의 다른 컨트롤 (ctrl1)을 기반으로하는 선택 쿼리로 채워지는 양식의 목록 상자가 있습니다. 그것은 CTRL1의 갱신에 트리거 :SELECT의 조인이 null을 반환하는 경우에만 모든 레코드를 반환하는 방법

이 또한 table3.column3 필드에 값을 가지고 table3.column1의 값과 일치하는 형태로 매개 변수를 기초로 작동
PARAMETERS [Ctrl1 input] Long; 
SELECT table1.column1, table1.column2 
FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3 
WHERE (((table3.column1)=[Ctrl1 input])) 
ORDER BY table1.column2; 

. 현재 폼의 선택 항목에 일치하는 값이 table3.column3이 아니면 목록 상자가 비어 있습니다. 이 상황에서 모든 조인과 제약없이 SELECT table1.column1, table1.column2의 전체 목록을 반환하고 싶습니다. (목록은 매우 긴, 그래서 꼭 필요한 경우에만 전체 일을 사용하고 싶습니다.) SQL에서

, case 기능은, 내가 원하는이 비슷한 달성 할 것으로 보인다 :

PARAMETERS [Ctrl1 input] Long; 
CASE WHEN (SELECT table3.column3 WHERE (table3.column2 = [Ctrl1 Input]) IS NOT NULL) 
    THEN 
     SELECT table1.column1, table1.column2 
     FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3 
    ELSE 
     SELECT table1.column1, table1.column2 

그러나 Access 쿼리에서 case을 사용할 수 없습니다. 그것은 또한 작동하는 것처럼

IIf 문은

PARAMETERS [Ctrl1 input] Long; 
IIf(
    (SELECT table3.column3 WHERE (table3.column1 = [Ctrl1 input]) IS NOT NULL), 
    (SELECT table1.column1, table1.column2 FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3), 
    (SELECT table1.column1, table1.column2) 
    ) 

, 보이지만 액세스 그것이이 SELECT, INSERT는, DELETE는 등 또한, SELECT IIf 테스트, 내가 할 것으로 예상 말하는, 그것을 수락하지 않습니다 그것은 단지 하나의 가치를 되돌릴 수 있다는 것을 말하며, 그것은 나를 위해 작동하지 않습니다.

안녕하세요. VBA에서 caseIIf을 모두 사용하고 THAT를 쿼리에 사용하는 기사를 보았습니다. 그러나 필자는 자신의 상황을 어떻게 변환 할 것인지 이해할 수있는 명확한 예제를 찾을 수 없었습니다. 모듈을 호출 한 다음 호출하십시오. 나는 VBA와 함께 일하지 않고 간신히 SQL로 작업한다. VBA에 대해 알아보기 전에 알아 두어야 할 사항은 다음과 같습니다.

  1. VBA를 사용하여 내가 원하는 것을 성취 할 수 있습니까?
  2. case, IIf 또는 다른 접근 방식에 대한 인수가 있습니까?
  3. 함수에서 값으로 무엇을 전달합니까? 양식에있는 ctrl1의 데이터?
  4. 반환 할 함수를 묻는 질문과 대답은 무엇입니까? 이 기능을 myfunction = the code that produces the dataset I need으로 설정하면됩니까?

나는 함수에서 출력 형식을 이해하는 한 쿼리에서 함수를 사용하는 방법을 이해한다고 생각합니다.

통찰력과 정보에 미리 감사드립니다.

참고 : Access 2016을 사용하고 있지만 Google 자체 GIS 소프트웨어와 호환되는 파일이기 때문에 파일 자체는 2002-2003 형식입니다.

+0

IIF()는 잘못된 위치/순서에서 올바르게 수행됩니다. if 문은 전에 선택하지 않은 WHERE 조건에서 사용됩니다. 하지만 그 문제에 대해 SQL을 호출하기 전에 VBA에서도 테스트 할 수 있습니다. 솔직히 말해서 게시 한 코드가 너무 혼란 스럽습니다/저조한 형식으로 만들어서 더 해독하고 해독하고 싶지만 적어도 이것이 내 문제 1 개임을 알 수 있습니다. – Matt

+0

@Matt 나는 결과에 따라 'FROM'이 어떻게 변하는 지 어떻게 말합니까? 'FROM'이 그 전에 발생한다면'IIf'의 혼란에 사과드립니다. 내가 말했듯이, 나는 그 언어를 모른다. 일반 필드 및 테이블 이름을 사용하면 더 좋을까요? 각 함수에 대한 구문을 조회 할 때 예제는 매우 간단하며 일반적인 SQL 접근법을 알지 못하고 형식을 조정하는 방법을 알지 못합니다. – troubbble

+0

솔직히 값을 테스트하고 쿼리 문자열을 설정 한 다음 원하는 문자열을 전달할 논리가있는 경우 VBA를 사용해야합니다. 당신은 SQL에서 할 수 있지만 당신은 옵션 테이블에 가입 왼쪽으로 누른 다음 JOIN에서 IF() 문을 사용하여 조건이 충족되거나 충족되지 않을 때를 설명하기 위해 WHERE를 사용합니다. – Matt

답변

1

IIF 또는 VBA가 필요없는 컨트롤이 비어 있거나 (일치하는 항목이없는 경우) 액세스 필터를 사용하지 않는 방법이 있습니다. 입력에 null이 있으면 모든 것을 반환하도록 Access에 지시해야합니다. 상단의 검색어는 다음과 같습니다.

SELECT table1.column1, table1.column2 
    FROM 
     (SELECT table1.column1, table1.column2 
     FROM table1 
     INNER JOIN table2 
     ON table1.column2 = table2.column1) 
INNER JOIN table3 
ON table1.column2 = table3.column3 
    WHERE table3.column1 = [Ctrl1 input] 
    OR [Ctrl1 input] is null 
ORDER BY table1.column2; 

OR 라인은 "당신은 내가 무엇을 말할하지 않은 경우 단지 나에게 전체 테이블을주고, 무엇을 알고"액세스를 알 것입니다. 목록 상자가 채워지는 방식에 관계없이이 코드는 목록 상자에있는 내용에만 관심을 갖습니다. 이와 같은 코드는 Access 쿼리의 SQL보기로 이동할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 이것을 사용할 때 sq.column1 및 sq.column2에 대한 값을 묻는 메시지가 표시되고 컨트롤 상자에서 선택한 내용에 관계없이 최종 목록에 값이 표시되지 않습니다. 그것을 참조하기 전에 "sq"로 저장해야합니까? 또한 문법상의 문제가 있습니다. 또한이 솔루션은 전체적인 문제를 해결하지 못합니다. 상자와 표 3의 선택 사이에 일치 항목이 없으면 전체 옵션을 얻으려고합니다. 컨트롤 박스가 비어있을 때. – troubbble

+0

'sq'문제에 관해서는 Access가 SQL 별칭을 제대로 처리하지 못하는 문제가 있습니다. 이는 놀랍지 만 별칭을 사용하지 않도록 코드를 수정하여 수정되었습니다. 'OR table3.column1! = [Crt1 input]'을 추가하여 불일치로 돌아갈 수 있다고 생각합니다. 이러한 변경 사항을 해결하기 위해 내 답변을 수정하겠습니다. – Rominus

+0

'OR table3.column1! = [Ctrl1 input]'은 (Access가 구문을 전혀 실행하지 않을 경우) 입력 내용에 상관없이 모든 것을 반환합니다. 일치가 없을 때 모든 것을 보여줄 필요가 있다면'IIF'와 VBA가 필요할 것입니다. 어떻게해야할지 모르겠다. 디자인 변경을 권하고 싶습니다. 프로세스에 유효한 값 또는 null이 필요함을 나타내는 일치가 없으면 오류를 발생시킵니다. – Rominus