3 Replies Latest reply on Mar 4, 2017 8:53 PM by Jesse Kim

    스크립에서 ExcuteSQL 사용하기

    chs0615

      SQL Quary에 대해 알고 있지만

       

      파일메이커에서 사용하는 ExcuteSQL 스크립의 개념이 없어 질문과 도움을 구합니다.

       

      제가 "고객자료"라는 파일에 Contact이라는 테이블에1000여명의 고객이 있다고 가정하고

       

      ExecuteSQL 스크립을 사용해서 약 100여명의 서울에 살고 있는 고객을 찾아

       

      브라우저 모드에서 리스트로 보고 싶습니다.

       

      우선 그로발 필드인  gCity라는 필들에 "서울"이라는 값을 입력하여

       

      버튼을 눌렸을때 서울에 사는 고객을 찾아 리스트로 보기를 원합니다. 

       

      나중에 이것을 엑셀파일로도 추출하려고 합니다.

       

      어떻게 스크립을 만들어야 하는지요... 도움요청을 드립니다.

        • 1. Re: 스크립에서 ExcuteSQL 사용하기
          Jesse Kim

          ExecuteSQL은 보통 커스텀 펑션에서 Let과 함께 쓸 수가 있는데요.

           

           

          언급하신 예에서 도시 이름을 저장하는 글로벌 필드가 있다면 커스텀 펑션을 호출할 때 그걸 파라미터로 넘기고요,

           

           

          커스텀 펑션 내부에서 도시 이름 파라미터의 이름이 whichCity이라고 가정하면

           

           

           

           

          Let(

            [

              $query="

                SELECT first_name, last_name, phone

                FROM contacts

                WHERE city='"&whichCity&"'

                ORDER BY last_name

              ";

              $result=ExecuteSQL(

                $query; ""; ""

              )

            ];

            $result

          )

           

           

           

           

          이렇게 해주면 $result라는 변수에 SELECT 퀴어리에서 가져온 레코드들이 세트로 저장이 됩니다. ExecuteSQL()의 두 번째와 세 번째 파라미터는 각각 필드를 나누는 캐릭터, 레코드를 나누는 캐릭터인데요. 둘 다 ""로 했을 경우에는 각각 기본값인 콤마와 리턴으로 처리됩니다. 즉,

           

           

          John, Smith, 555-1234

          Jane, Doe, 234-5678

          Joe, Bloggs, 999-7890

           

           

           

           

          이런 식으로 $result에 저장이 되고요, 커스텀 펑션이 내놓는 이 결과물을 리스트 레이아웃에 이용을 하면 됩니다.

           

           

          ExecuteSQL()은 데이터를 읽는 것만 가능하다는 것 아시죠? SELECT만 가능합니다.

           

           

          참고로 ExecuteSQL()은 여러 레코드들을 가져오는 것 뿐만 아니라 SELECT COUNT(...) 또는 SELECT SUM(...)와 같은 계산 결과, 또는 특정한 레코드의 특정한 필드를 갖고 오는데 유용하게 쓸 수 있고요, 일반 스크립트의 Perform Find와 비교해서 퍼포먼스 상의 이득이 크다고 합니다.

          • 2. Re: 스크립에서 ExcuteSQL 사용하기
            chs0615

            자세한 내용으로 정리해 주셔서 감사합니다.

            마지막 부분인  $result에 저장된 결과물을

            어떻게 해야 각각의 자료 (record)로 만들어 리스트 레이아웃에서 볼 수 있는지요?

            • 3. Re: 스크립에서 ExcuteSQL 사용하기
              Jesse Kim

              ExecuteSQL()의 결과물을 레이아웃으로 가져오는 건 (제가 아는 방법으로는) 레이아웃 상에서 실행되는 스크립트에서 글로벌 필드 또는 글로벌 변수에 값을 넣어주는 겁니다.

               

              Set Field 또는 Set Variable 에서 커스텀 펑션의 이름과 파라미터를 넣어주면 그 결과가 필드 또는 변수에 저장이 되고요. 그렇게 저장된 필드 또는 변수를 레이아웃에다가 뿌려주면 되는데요.

               

               

               

              커스텀 펑션 (ExecuteSQL을 이용한 레코드 읽어오기 또는 계산) ---> 스크립트 (필드/변수에 저장) ---> 레이아웃 (필드/변수를 출력)

               

               

               

              이런 개념으로 이해하시면 되겠고,

               

              질문하신 내용을 다시 읽어보니 ExecuteSQL()을 이용해서 여러 개의 레코드를 불러온 후 그것들을 리스트 레이아웃에 출력하고 싶으신 것 같은데요, 이 경우 굳이 ExecuteSQL()을 써서 득이 되는 건 별로 없지 않나 생각됩니다. 리스트 레이아웃 자체가 타겟 테이블의 레코드를 하나씩 화면에 뿌려주는 게 목적이기 때문입니다. ExecuteSQL()의 도움 없이 하나의 레코드를 한 줄에 출력하는 게 리스트 레이아웃이니까요.

               

              제 경험으로는 ExecuteSQL()은 테이블에서 읽어온 데이터를 계산에 활용하기 위한 목적이 큽니다. 커스텀 펑션 안에서, 스크립트에서, 그리고 Calculated 필드의 포뮬러 안에서 활용하기 위한 것이고요. ExecuteSQL()의 결과물은 그 자체로 하나의 스트링이거든요. 결과가 단순한 하나의 값이라면 그 자체로 다른 변수/필드에 넣으면 되는 것이고, 여러 개의 레코드를 가져온 결과물이라면 그게 결국 하나의 array이기 때문에 루프를 돌려서 어떤 연산을 하는게 일반적이라고 할 수 있겠습니다.

               

              잘 설명이 됐는지는 모르겠습니다. 결론적으로는 언급하신 고객 리스트 시나리오에서는 ExecuteSQL()의 활용도가 크지 않다고 봅니다. 브라우즈 모드에서 하나씩 화면에 출력하는 것이 아닌, 데이터를 읽어온 결과물을 갖고 하는 다른 목적의 계산에 더 적합하다는 의미입니다.