2014-04-25 4 views
1

FileMaker를 사용하고 (다른 데이터베이스로 점진적으로 시스템을 전환해야하는) 새로운 작업에 참여했습니다. 필자는 ~ 2 년 동안 MS SQL Server 데이터베이스의 DB 관리자였으며 PL/SQL과 T-SQL에 정통합니다. ExecuteSQL 기능을 사용하여 SQL 지식을 FMP로 옮기기 위해 노력하고 있으며, 많은 작은 고통을 겪고 있습니다. :)몇 가지 질문이있는 FMP12에서 ExecuteSQL을 학습하십시오.

나는 두 개의 테이블을 가지고 있습니다 : Movies and Genres. 관련 열은 다음과 같습니다

영화 (MovieId, moviename에는, GenreId, 평가) 나는 각각의 장르에서 가장 높은 등급의 영화를 발견하기 위해 노력하고있어

장르 (GenreId, GenreName) . 이에 대한 SQL 쿼리는 다음과 같습니다

SELECT M.MovieName 

    FROM Movies M INNER JOIN Genres G ON M.GenreId=G.GenreId 

    WHERE M.Rating= 

    (

     SELECT MAX(Rating) FROM Movies WHERE GenreId = M.GenreId 

    ) 

내가 최선 내가 할 수있는 등의 ExecuteSQL 쿼리에이 번역 :
ExecuteSQL (" 

SELECT M::MovieName FROM Movies M INNER JOIN Genres G ON M::GenreId=G::GenreId 

WHERE M::Rating = 

(SELECT MAX(M2::Rating) FROM Movies M2 WHERE M2::GenreId = M::GenreId) 

"; "" ; "") 

나는 텍스트로 필드 유형을 설정하고 또한 값이 저장되지 않습니다 보장. 하지만 내가 보는 모든 것은 '?' 점수.

내가 여기서 뭘 잘못하고 있니? 정말 어리석은 일이라면 유감이지만 FMP를 처음 접했을 때 어떤 제안이라도 환영받을 것입니다.

감사합니다.

- 램

UPDATE : 해결하고 거기에 도착하는 데 걸린 생각 과정 : 내가 문제를 해결 도움이 모든 사람에게

감사합니다. 여러분은 저에게 전통적인 SQL 생각 프로세스가 FMP로 정확히 이동하지 않는다는 사실을 깨닫게했습니다. 그리고 내가 탐색했을 때 FMP에서 SQL 지식을 가장 잘 사용하려면 각 열을 독립적으로 고려해야하며 전체 결과를 생각해서는 안됩니다. 쿼리를 작성할 때 설정됩니다. 이것은 나의 현재 기능을 위해, JOIN이 더 이상 필요 없다는 것을 의미합니다. JOIN은 FMP가 자동으로 매핑하는 다른 열인 GenreName을 가져와야했습니다. JOIN을 제거하기 만하면 완벽하게 작동합니다. TL : DR : 사고 프로세스 컨텍스트는 전체 예상 결과 집합이 아닌 현재 열이어야합니다. 다시 한번

, 당신에게 @MissJack, @Chuck (어떻게 당신도 그 이름을 얻었 는가?), @의 pft221을 감사 michael.hor257k

답변

2

@ 내가 파일 메이커 쿼리의 서식이 매우 특별한 것으로 나타났습니다 ExecuteSQL 함수를 사용하여. 대부분의 경우 표준 SQL 구문은 정상적으로 작동하지만 경우에 따라 약간의 (중요한) 조정을해야합니다.

나는 당신은 쿼리 내부 표준 FMP table::field 형식을 사용할 수 없습니다

ExecuteSQL (" 

SELECT M::MovieName FROM Movies M INNER JOIN Genres G ON 
M::GenreId=G::GenreId 

WHERE M::Rating = 

(SELECT MAX(M2::Rating) FROM Movies M2 WHERE M2::GenreId = M::GenreId) 

"; "" ; "") 
  1. 문제의 원인이 될 수있다 여기에 두 가지를 ... 볼 수 있습니다.

    ExecuteSQL 함수 안에있는 따옴표 안에 table.column의 SQL 형식을 따라야합니다. 따라서 M::MovieNameM.MovieName이어야합니다.

  2. 코드에 아무 곳이나 AS이 표시되지 않습니다.

    별칭을 만들려면 명시 적으로 지정해야합니다. 예를 들어 FROM의 경우 Movies AS M이어야합니다.

나는이 두 가지를 수정하면 효과가 있다고 생각합니다. 그러나, 나는 주 경험이 FMP와 관련되어 있기 때문에 JOINs에 약간의 문제가 있었고 SQL 구문에 익숙해지고 있습니다.

FMP에서 SQL을 디버깅하는 것이 매우 어렵 기 때문에 작은 시작으로으로 제공 할 수 있습니다. 매우 기본적인 쿼리로 시작하고, 그것이 작동한다고 확신하면, 두려워하는 ?이 발생할 때까지 점차적으로 복잡한 요소를 하나씩 추가하십시오.

모든 ExecuteSQL에 대한 FileMaker Hacks에 큰 게시물의 숫자가있다 :

  • 이미 SQL에 익숙하기 때문에, 나는이 일을 시작 것 : The Missing FM 12 ExecuteSQL Reference. 게시물 하단까지 스크롤하면 전체 기사의 PDF 링크가 나타납니다.

  • 필자는 몇 가지 특정 기사 (강력한 코딩, 동적 매개 변수에 대한 시리즈와 같은)를 추천 할 예정 이었지만 여기서는 처음이기 때문에 2 개 이상의 링크를 포함 할 수 없으므로 FileMaker로 이동하십시오. "ExecuteSQL"을 해킹하고 검색하십시오. 유용한 게시물이 많이 있습니다.

NB 당신이 FMP 고급을 사용하는 경우, 데이터 뷰어 테스트 SQL을위한 훌륭한 도구입니다. 그러나 대용량 데이터베이스의 복잡한 쿼리는 때로는 적합하게 보내고 프로그램을 고정시킵니다.

+1

SQL Sugar 모듈을 연결하는 주석으로, 쿼리 작성시 매우 유용합니다. http://www.modularfilemaker.org/2013/03/filemaker-sql-sugar/ – pft221

+0

Thanks @MissJack - 일단 FMP가 설치된 컴퓨터에 도착하면 이것들을 사용할 수 있습니다. FMP는 내가 다루었 던 모든 다른 데이터베이스와는 달리 진보적이지 않은 방식으로 근본적으로 다르며,이 점이 나를 괴롭힌다! –

+1

@RamRS Filemaker는 SQL 데이터베이스가 아닙니다. 제한된 SQL 명령 집합을 지원하지만 고유 기술을 사용하는 것이 가장 좋은 경우가 가장 많습니다. –

1

FileMaker와 ExecuteSQL()으로 작업 할 때 가장 먼저 기억해야 할 것은 테이블과 테이블 어커런스 사이의 차이입니다. 이 개념은 FileMaker에 고유 한 개념입니다. 간략하게, 테이블은 데이터를 저장하지만 테이블 어커런스는 해당 데이터의 컨텍스트를 정의합니다. 테이블 어커런스는 FileMaker의 관계 그래프에서 볼 수 있으며 ExecuteSQL() 함수는 해당 쿼리에서 테이블 어커런스를 참조해야합니다.

나는 SQL 문을 작성하고 FileMaker Pro Advanced에서 데이터 뷰어를 사용하는 것이 필요하다는 점에 대해 MissJack에 동의하지만, SeedCode'sSQL Explorer을 사용하는 것이 좋습니다. 기존 솔루션의 이름을 복제하기 위해 테이블 ​​어커런스와 필드를 추가해야하지만이 작업은 매우 쉽습니다. 제공하는 파일에는 SQL 쿼리를 작성하는 마법사가 포함되어 있습니다.