Search results for '분류 전체보기'

  1. 2015.04.15 -- [XE8] 새로운 기능외의 개선사항
  2. 2015.04.14 -- [XE8] 버전관리 시스템 IDE 통합(Mercurial 지원)
  3. 2015.04.14 -- [XE8] 근거리 위치기반 서비스를 개발할 수 있는 비콘(Beacon) 연동하기 (1)
  4. 2015.04.14 -- 파이어몽키에서 외부 라이브러리 연동하기(jar, so, a) (3)
  5. 2015.04.13 -- [XE8] 네이티브 iOS 컨트롤 지원 (1)
  6. 2015.04.13 -- [XE8] iOS 64bit 앱개발과 유니버설(armv7 + arm64) 앱개발
  7. 2015.04.06 -- [FireDAC Skill Sprints] 8. TFDMemTable: 메모리 기반 데이터셋 사용하기
  8. 2015.03.31 -- [FireDAC Skill Sprints] 9. LocalSQL: DB에서 가져온 데이터(데이터셋)를 대상으로 다시 SQL쿼리 실행하기
  9. 2015.03.24 -- [FireDAC Skill Sprints] 1. FireDAC 동영상과 샘플로 고급기능 활용하기
  10. 2015.03.24 -- 델파이/C++빌더에 TServerSocket, TClientSocket 등록하기
  11. 2015.03.23 -- [따라하기] FireDAC으로 오라클 연결하기
  12. 2015.03.12 -- [FireDAC Skill Sprints] 6. 전처리: SQL문을 유연하게 작성할 수 있는 Param와 Macro 사용하기
  13. 2015.03.11 -- [FireDAC Skill Sprints] 5. Cascading Options: 고급기능을 활용 할 수 있는 FireDAC 옵션
  14. 2015.03.10 -- [FireDAC Skill Sprints] 4. ArrayDML로 30배 빠르게 데이터 입력하기
  15. 2015.03.06 -- 웹사이트의 인증서 오류를 무시하고 http 결과 조회하기(WinInet 이용)
  16. 2015.03.05 -- [FireDAC Skill Sprints] 3. 캐쉬를 이용한 업데이트와 자동증가필드(Identity) 적용
  17. 2015.03.04 -- [FMX] ListBox 전체체크 기능 구현하기
  18. 2015.03.03 -- RAD Studio 2015년 로드맵
  19. 2015.03.02 -- [VCL] 에디트에 숫자만 입력, 콤마찍기
  20. 2015.02.24 -- [XE7] iOS 시뮬레이터 배포 시 'Please specify exact device preset UUID.' 오류 대응

[XE8] 새로운 기능외의 개선사항

2015. 4. 15. 16:48
일주일 전인 4월 8일 RAD Studio XE8이 출시되었습니다.

비콘 컴포넌트, 멀티-디바이스 미리보기 창, 앱분석 컴포넌트 등의 새로운 기능이 추가되었습니다.(RAD Studio XE8 자세히보기)
새로운 기능에 대해서는 저도 계속 학습하며 소개하는 글을 올리고 있습니다.(XE8 새로운 기능 소개 글 목록보기)

이 글은 기술소개자료와 기술문서에서 새로운 기능에 가려져 잘 보이지 않는 몇가지 개선사항을 소개하려 개인적인 의견을 적습니다.

첫번째, 앱의 스크롤 성능향상입니다. 
XE8로 앱을 만들어 보신 분들은 느끼셨겠지만 전반적인 스크롤 성능이 상당히 개선되었습니다. 대표적으로 ListBox, ScrollBox는 이전 버전에 비해 개선된 것으로 확인했습니다.
이제 XE8로 컴파일만 다시하면 여러분의 앱의 성능을 향상할 수 있습니다.

두번째는 플랫폼 기능 강화입니다. 
이전 버전인 XE7 부터 시작된 플랫폼 친화기능은 XE8에서 더욱 강화됐습니다. 
대표적인 기능으로는 iOS 네이티브 컨트롤 지원과 안드로이드 라이브러리 관리입니다.

iOS 네이티브 컨트롤 지원

TEdit, TSwitch, TMemo 등 일부 UI 컨트롤의 ControlType 속성으로 Styled(파이어몽키 스타일 기반 컨트롤)과 Platform(플랫폼 네이티브 컨트롤) 중 선택 해 컨트롤을 표시할 수 있습니다.


예를 들어 TEdit의 ControlType을 Platform으로 설정하고 실행하면 에디트박스에 글자 입력 시 오른쪽 그림과 같은 "단어추천" 기능과 에디트 박스의 단어를 선택했을 때 "복사하기, 붙여넣기, 전체선택" 기능 외에 "대치..., 정의"와 같은 iOS 플랫폼에서 제공하는 플랫폼의 컨트롤 기능을 온전히 사용할 수 있습니다.



안드로이드 라이브러리 관리는 

XE7 버전에서 프로젝트 매니저에서 안드로이드 커스텀 라이브러리 추가 기능에 이어 XE8에서는 앱에서 기본으로 사용하는 안드로이드 라이브러리의 사용여부를 직접 선택할 수 있게 되었습니다.


오른쪽 그림과 같이 사용하지 않는 안드로이드 라이브러리 비활성화 후 앱을 배포하면 앱의 용량이 줄어들고, 라이브러리 로딩 시간이 줄기 때문에 전반적인 앱의 구동시간도 단축될 것으로 예상됩니다.


마지막 세번째는 개발편의 기능 추가입니다.
엠바카데로에서 TwoDesk를 인수해 Castalia(코딩 생산성도구)가 XE8 IDE에 기본 내장되어 개발자의 개발 생산성을 높여주고 개발편의를 제공합니다. 또한 부가기능으로 클립보드 목록을 제공하는 Clipboard History, 붙여넣기 앞뒤에 문자를 추가할 수 있는 Multi-Paste를 제공하고 리팩토링 기능이 더욱 다양해 졌습니다.


겟잇(Getit)은 델파이 환경설정의 대부분을 차지하는 컴포넌트 설치를 델파이 메뉴에서 검색 후 간편하게 설치할 수 있도록 지원해 주는 기능입니다.

현재는 TurboPack(델파이 오픈소스 컴포넌트)와  Boost 등 일부만 지원하지만 향후 지속적인 추가가 예상되는 기능입니다.


이글에서는 기술문서에서 소개하지 않거나 강조되지 않은 부분을 중점적으로 작성했습니다. XE8의 자세한 기능과 기술소개는 아래 링크를 통해 확인하실 수 있습니다.


험프리 험프리.김현수 RAD Studio 정보

[XE8] 버전관리 시스템 IDE 통합(Mercurial 지원)

2015. 4. 14. 18:39

RAD Studio XE8 IDE에서 SubVersion(XE 이후), Git(XE7 이후), Mercurial(XE8 이후) 3종의 버전 컨트롤 시스템이 통합되었습니다.


이제 SVN, Git, Mercurial으로 관리하는 프로젝트를 별도의 클라이언트 도구 없이 IDE에서 직접 체크아웃하고 커밋할 수 있습니다.

버전관리 시스템 IDE 통합

❑ 체크아웃

메인메뉴에서 File -> Open From Version Control... 메뉴를 선택합니다.


버전 컨트롤 시스템을 선택하면 체크아웃 대화상자가 나오고, 저장소의 주소와 소스코드를 저장할 경로 지정 후 OK 버튼을 누르면 체크아웃이 실행됩니다. 완료되면 바로 프로젝트를 열수 있습니다.

❑ 커밋, 업데이트

체크아웃된 프로젝트는 프로젝트 매니저의 팝업메뉴를 통해 커밋(Commit), 업데이트, 되돌리기(Revert)기능을 사용할 수 있습니다.


다음링크는 RAD Studio 최신 데모 소스코드를 위 기능으로 다운로드 받는 방법을 설명합니다. 실습겸 IDE에서 최신 데모 소스코드를 받아보세요.


한번에 윈도우, 맥, iOS, 안드로이드, 사물인터넷(IoT)을 개발할 수 있는


관련 글

험프리 험프리.김현수 RAD Studio 정보 git, Mercurial, Subversion, Version Control System, XE8

[XE8] 근거리 위치기반 서비스를 개발할 수 있는 비콘(Beacon) 연동하기

2015. 4. 14. 13:03

RAD Studio XE8에서는 비콘(Beacon)과 연동할 수 있는 TBeacon 컴포넌트가 추가되었습니다.


이제 비콘 컴포넌트를 이용해 근거리 위치기반 서비스를 개발할 수 있습니다.

비콘(Beacon)은?

비콘은 일정 주기로 작은 데이터(일명 광고 데이터)를 주변으로 송출하는 장비입니다. 비콘이 제공하는 광고 데이터에는 "Manufacturer Specific Data(기업 고유 데이터)"를 포함합니다. 이 정보를 통해 주변의 블루투스 LE 장비는 페어링 및 접속 없이 비콘을 식별하고 거리를 계산할 수 있습니다.


이제 여러분은 비콘을 이용해 다음의 예시에서 볼 수 있는 근거리 위치기반 서비스를 개발할 수 있습니다.

  • 환자가 병원 방문 시 환자의 모바일기기가 비콘을 인식하고 접수대에 자동으로 방문을 알려줍니다.
  • 공장내의 위험지역에 작업자가 들어오면 작업자의 모바일기기에 위험을 통지하는 알람을 울리고, 방문로그를 남겨 시설관리자가 작업동선을 조정할 수 있어 사고를 사전에 방지할 수 있습니다.
  • 진열상품 근처에 고객이 다가오면 고객의 모바일 기기에 상품정보 또는 할인쿠폰 등을 전달하는 앱을 만들 수 있습니다.
비콘(iBeacon)에 대해서는 아래 링크에서 잘 설명하고 있습니다. 비콘을 좀 더 이해할 수 있는 자료여서 공유합니다.

비콘 컴포넌트(TBeacon)

❑ 비콘타입

비콘은 iBeacon과 AltBeacon 2종류의 신호 형식이 있습니다.

  • iBeacon : Apple 사에서 정의된 형식입니다. iBeacon은 표준 모드로 간주됩니다.
  • AltBeacon : 대체 비콘이라고도 하는 오픈형식입니다. 사양은 http://altbeacon.org에 공개되어 있습니다.
TBeacon에서는 Mode 속성을 통해 Standard(iBeacon), Alternative(AltBeacon)을 선택할 수 있습니다.

❑ 업체정보

광고 모드 블루투스 LE 장치는 다양한 광고 데이터(AD) 타입 구조의 광고 데이터를 무선으로 반복해 전송합니다. 광고 데이터 종류 중 하나가 비콘에 이용되는 "기업 고유 데이터"입니다. "기업 고유 데이터"에는 다음 정보가 포함 되어있습니다.

  • UUID : 비콘의 그룹을 식별할 수 있는 고유 식별자, 특정 회사의 비콘.
  • MajorID, MinorID : 특정 UUID로 지정되는 지역 내부 영역을 식별합니다. MajorID는 UUID로 정의되는 지역의 부분영역을 식별합니다. MinorID는 MajorID 영역의 더 작은 부분을 식별합니다.
  • TxPower : 1m 떨어진 위치에서 측정되는 송신 전력입니다. TxPower와 RSSI(수신신호강도)를 이용해 비콘과의 거리를 계산합니다.

❑ 비콘 컴포넌트 이벤트

다음 이벤트를 통해 비콘의 동작을 알 수 있습니다.

  • OnBeaconEnter : 새로운 신호 영역에 들어갈 때마다 발생합니다.
  • OnBeaconExit : 비콘 지역에서 나올 때마다 발생합니다.
  • OnBeaconProximity : 근접 ( Proximity )의 값이 변경 될 때마다 발생합니다.
    레벨설명
    Inmediate10.5 m 미만
    Near20.5 m 이상 1.5 m 이하
    Far31.5 m보다 먼
    Away4판정 불능
  • OnCalcDistance : 거리 ( Distance )가 계산되기 직전에 발생합니다.
  • OnEnterRegion : 등록 된 지역에서 비콘에 처음 도달 가능하게 될 때 발생합니다.
  • OnExitRegion : 지역에 등록 된 모든 신호가 도달 불능이되었을 때 발생합니다.

❑ 플랫폼 지원

플랫폼지원 상황

Windows

Mac OS X

YesC + 11Feature.png

iOS

YesC + 11Feature.png

Android

YesC + 11Feature.png

Windows 플랫폼에서는 광고 데이터에 엑세스 할 수 없기 때문에 비콘 API를 사용할 수 없습니다.


한번에 윈도우, 맥, iOS, 안드로이드, 사물인터넷(IoT)을 개발할 수 있는


관련 글


험프리 험프리.김현수 RAD Studio 정보

  1. 비콘이 전송하는 정보들중에 기업 고유 데이터 말고도 임의로 지정한 데이터를 전송시킬수 있나요?

파이어몽키에서 외부 라이브러리 연동하기(jar, so, a)

2015. 4. 14. 09:58

안드로이드 라이브러리 연동하기

JAR 라이브러리 연동하기

안드로이드 커스텀 라이브러리 연동하는 방법은 엠바카데로 기술문서를 통해 확인할 수 있습니다.

위 페이지에서 제공하는 링크를 따라가며 상세 내용을 익히시기 바랍니다.

libXXX.so 라이브러리 연동하기

엠바카데로 팀 제팬 블로그(http://blogs.embarcadero.com/teamj/)의 글을 링크합니다.

아래 글에서 이클립스로 so 라이브러리를 만들고 델파이에서 dlopen 함수를 이용해 로드해 오는 내용을 참고할 수 있습니다.

(델파이 XE5에서 작성된 글이지만 사용방식은 최신버전에서도 동일합니다.)

iOS 라이브러리 연동하기

정적 라이브러리(*.a) 연동하기

iOS에서는 동적 라이브러리(*.dylib)를 사용하면 앱을 앱스토어에 등록 시 거절 사유가 되기 때문에 정적 라이브러리(*.a)만 사용 가능합니다.


iOS에서 정적 라이브러리 연동하는 방법은 최원식옹(http://blog.naver.com/simonsayz)님의 블로그 글을 링크합니다.

(델파이 XE4에서 작성된 글이지만 사용방식은 최신버전에서도 동일합니다.)

    델파이(파이어몽키)에서 Objective-C 라이브러리를 사용하기 위한 로더를 만드는 내용을 샘플로 소개합니다.

    델파이(파이어몽키)에서 Objective-C 라이브러리와 컨트롤 연동하는 방법을 샘플로 소개합니다.

      실무에서 사용하는 라이브러리(ZBar)를 델파이에서 연동하는 내용을 샘플을 통해 소개합니다.



      험프리 험프리.김현수 파이어몽키

      1. Blog Icon
        윤수아

        이제 막 XE7으로 안드로이드 개발을 시작하려고 하는데
        안드로이드 SDK, JAVA, 브릿지파일, 자바임포트, Java2OP
        이런 개념들이 뒤죽박죽 섞여서 개념 잡기가 힘이 드네요..

        그러다가 아래와 같은 컴포넌트 판매 페이지를 보게 되었는데...
        저 둘의 구분이 뭔지도 모르겠고.. JAVA2OP.exe 가 저 역활 아닌가.. 하면서 다시 혼란스럽네요..
        http://www.winsoft.sk/jbridge.htm
        http://www.winsoft.sk/jimport.htm

      2. Blog Icon
        김윤태

        위 주제에 반대로 하고 싶은데요. 파이어몽키에서 정적 또는 동적 라이브러리를 만들어서 외부 프로그램 (XCode, JAVA)에 연동하는 것은 어떻게 되는지 궁금합니다. 인터넷에서 찾아 봤는데 자료가 없더군요. 꼭 답변 부탁드립니다. ^^

      3. 델파이에서 아직 파이어몽키 라이브러리 개발을 지원하지 않습니다.

      [XE8] 네이티브 iOS 컨트롤 지원

      2015. 4. 13. 10:22

      RAD Studio XE8에서 iOS의 네이티브 컨트롤을 사용할 수 있습니다.


      이제 네이티브 iOS 컨트롤을 이용해 iOS에서 제공하는 플랫폼 고유의 컨트롤 기능을 사용할 수 있습니다.

      네이티브 iOS 컨트롤

      일부 UI 컨트롤에서는 ControlType 속성을 이용해 플랫폼(네이티브 컨트롤)과 스타일(파이어몽키 컨트롤) 중 선택해서 사용할 수 있습니다.


      ControlType 속성이 적용도는 컴포넌트는 다음과 같습니다.

      ControlType 속성은 iOS이외의 플랫폼에서는 무시(파이어몽키 컨트롤로 표시)됩니다.

      네이티브 iOS 컨트롤 디자인 타임 화면
      디자인 시에는 Styled와 Platform의 차이가 없습니다. Platform 선택하면 컨트롤의 오른쪽에 아이콘이 표시됩니다.


      파이어몽키 스타일

      플랫폼(네이티브 스타일)


      네이티브 iOS 컨트롤 런-타임 화면


      파이어몽키 스타일과 플랫폼(네이티브 컨트롤)은 화면에 보여지는 부분과 사용성에 미묘한 차이가 있습니다.

      에디트 컴포넌트(TEdit, TMemo 등)의 경우 오른쪽 그림과 같이 글자 입력 시 "단어추천" 기능과 단어 선택 시 "복사하기, 붙여넣기, 전체선택" 외에 "대치..., 정의"와 같은 iOS 플랫폼에서 제공하는 플랫폼의 컨트롤 기능을 온전하게 사용할 수 있습니다.(사진을 클릭하면 크게 볼 수 있습니다.)


      또다른 장점으로는 캘린더의 경우 파이어몽키 스타일과 플랫폼에서 다르게 표현되므로 여러분이 원하는 방식으로 캘린더를 선택해 사용할 수 있다는 장점이 있습니다.


      ☞ 네이티브 iOS 컨트롤에 대한 자세한 내용은 엠바카데로 기술문서: FireMonkey Native iOS Controls를 참고하기 바랍니다.


      한번에 윈도우, 맥, iOS, 안드로이드, 사물인터넷(IoT)을 개발할 수 있는


      관련 글



      험프리 험프리.김현수 RAD Studio 정보

      1. Blog Icon
        기다려

        네이티브 컨트롤로 하면 기본 컴파일 파일 크기가 좀 얼마나 작아지나요?
        컴파일 크기하고, 안드 sdk 나올때마다 xe버전도 같이 업글이 되는 너무 잦은 문제점만 해결되면
        좀 어케 해볼텐데..정말 답이 안나와요...
        아무것도 없이 빈폼을 해도 20메가가 넘어가는 문제하고,,
        xe버전 출시이후에 일정기간까지는(최소한 1~2번 정도라도) sdk업을 해도 좀 지원돼야 하는거 아닌가요?

      [XE8] iOS 64bit 앱개발과 유니버설(armv7 + arm64) 앱개발

      2015. 4. 13. 09:37

      RAD Studio XE8에서 iOS 64-bit 컴파일러가 오브젝트 파스칼과 C++ 모두 추가되었습니다.


      이제 프로젝트 매니저에서 iOS Device-64 bit 타겟 플랫폼 선택 > 빌드하는 것만으로 iOS 64-bit 앱을 갖게됩니다.

      iOS 64-bit 앱개발

      프로젝트 매니저에 iOS Device - 64 bit 타겟 플랫폼이 새롭게 추가되었습니다. 이미 개발한 소스코드가 있다면, XE8에서 소스코드를 열고 iOS Device - 64 bit 타겟플랫폼 선택 후 빌드하면 iOS 64 bit 앱을 만들 수 있습니다.


      이제 iOS 64-bit 플랫폼에서는 LongInt와 LongWord가 32-bit(and 64-bit 윈도우) 플랫폼 대비 2배의 크기로 사용됩니다.

      Size
      32-bit platforms and 64-bit Windows platforms64-bit iOS platforms
      LongInt32-bits (4 bytes)64-bits (8 bytes)

      LongWord

      32-bits (4 bytes)64-bits (8 bytes)

      iOS 유니버설(armv7 + arm64) 앱개발

      RAD Studio에서는 프로젝트 옵션 설정만으로 iOS 32-bit와 64-bit를 모두 지원하는 유니버설 앱을 만들 수 있습니다.

      Generate iOS universal binary file (armv7 + arm64)

      Project > Options > Delphi Compiler > Compiling > Other options (Delphi)

      Project > Options > C++ Compiler > Advanced > Other options (C++)


      한번에 윈도우, 맥, iOS, 안드로이드, 사물인터넷(IoT)을 개발할 수 있는


      관련 글



      험프리 험프리.김현수 RAD Studio 정보

      [FireDAC Skill Sprints] 8. TFDMemTable: 메모리 기반 데이터셋 사용하기

      2015. 4. 6. 11:33

      엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


      이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


      8회차에서는 메모리 기반 데이터셋인 TFDMemTable에 대해 알아봅니다.

      TFDMemTable(메모리테이블) 은?

      TFDMemTable은 메모리 기반 데이터셋입니다. 즉, 데이터베이스 연결 없이 파일 데이터나 코드로 추가한 데이터를 메모리에 올려 데이터셋의 기능(필터링, 정렬 등)을 사용할 수 있습니다.


      TFDMemTable은 아래 기능을 할 수 있습니다.

      • 디자인타임과 런타임 시 파일 불러오기(Load File), 파일로 내보내기(Save File), 다른 데이터셋의 데이터가져오기(Assign Data) 기능 사용
      • 런타임 시 파일과 스트림으로 데이터 내보내기, 불러오기 기능을 사용할 수 있으며, JSON, XML, Binary 포맷 선택 가능
      • 멀티티어 애플리케이션(REST 클라이언트, 데이터스냅 등)에서 수신 데이터를 보관하는 데이터셋 역할
      • 내부에서 데이터 보관할 시 컬랙션객체(TList, TStringList) 대신 메모리테이블 사용 시 데이터셋의 기능(UI 컨트롤에 데이터바인딩, Local SQL, 필터링, 정렬 등)을 사용해 다양한 기능 손쉽게 구현가능
      • Local SQL을 이용해 메모리테이블(데이터셋)에서 쿼리 실행
      • ETL 기능으로 다른 데이터소스(텍스트, CSV 등)에서 가져온 데이터 보관

      파일 내보내기, 불러오기 기능 구현하기


      메모리테이블의 데이터를 파일로 내보내거나 불러오기 위해서는 아래와 같이 메소드를 호출할 때 인자로 Stream File Formt을 지정합니다.
      // 파일로 내보내기

      FDMemTable1.SaveToFile(Path, sfJSON); // 파일에서 불러오기 FDMemTable1.SaveToFile(FilePath, sfJSON);

      파일포맷을 사용하기 위해서는 아래 컴포넌트를 추가하거나 Uses절에 필요 유닛을 추가합니다.

      • Bin : TFDStanStorageBinLink 컴포넌트 추가 또는 Uses절에 FireDAC.Stan.StorageBin 추가

      • JSON : TFDStanStorageJSONLink 컴포넌트 추가 또는 Uses절에 FireDAC.Stan.StorageJSON 추가

      • XML : TFDStanStorageXMLLink 컴포넌트 추가 또는 Uses절에 FireDAC.Stan.StorageXML 추가

      코드로 테이블 정의, 데이터 추가 하기

      코드로 메모리 테이블을 정의하고 추가하는 코드는 아래와 같습니다.
      델파이 / Object Pascal
      // Create Field Definitions
      FDMemTable1.FieldDefs.Add('ID', ftInteger, 0, False);
      FDMemTable1.FieldDefs.Add('Name', ftString, 20, False);
      FDMemTable1.CreateDataSet;
       
      // Append data
      FDMemTable1.Open;
      FDMemTable1.AppendRecord([1, 'Jim']);
       
      // Load from another DataSet
      FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]);


      C++ 

      // Create Field Definitions
      FDMemTable1->FieldDefs->Add("ID", ftInteger, 0, False);
      FDMemTable1->FieldDefs->Add("Name", ftString, 20, False);
      FDMemTable1->CreateDataSet();
       
      // Append Data
      FDMemTable1->Open();
      FDMemTable1->Append();
      FDMemTable1->FieldByName("ID")->AsInteger = 1;
      FDMemTable1->FieldByName("Name")->AsString = "Jim";
      FDMemTable1->Post();
       
      // Load from another DataSet
      FDMemTable1->CopyDataSet(DataSet1, TFDCopyDataSetOptions() << coStructure << coRestart << coAppend);

      TFDMemTable 샘플 프로그램

      이 샘플에서는 TFDMemTable의 데이터를 디자인 타임 시 로드해 JSON 포맷으로 변경하고 다시 JSON 포맷을 TFDMemTable에 로드하는 기능을 구현했습니다.

      [샘플코드 받기 - 데브기어 github 페이지]


      메모리테이블 데이터를 JSON으로 내보내기, JSON 데이터를 메모리테이블로 불러오기

      procedure TForm1.Button1Click(Sender: TObject);
      var
        StrStream: TStringStream;
      begin
        StrStream := TStringStream.Create;
        try
          DM.FDMemTable1.SaveToStream(StrStream, sfJSON); // uses FireDAC.Stan.Intf
      //    DM.FDMemTable1.SaveToFile(FilePath, sfJSON);
          DM.FDMemTable1.EmptyDataSet;
          Memo1.Lines.Text := StrStream.DataString;
        finally
          StrStream.Free;
        end;
      end;
      
      procedure TForm1.Button2Click(Sender: TObject);
      var
        StrStream: TStringStream;
      begin
        StrStream := TStringStream.Create(Memo1.Lines.Text);
        try
          DM.FDMemTable1.LoadFromStream(StrStream, sfJSON); // uses FireDAC.Stan.Intf
      //    DM.FDMemTable1.SaveToFile(FilePath, sfJSON);
        finally
          StrStream.Free;
        end;
      end;



      험프리 험프리.김현수 데이터 엑세스

      [FireDAC Skill Sprints] 9. LocalSQL: DB에서 가져온 데이터(데이터셋)를 대상으로 다시 SQL쿼리 실행하기

      2015. 3. 31. 16:13

      엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


      이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


      9회차에서는 쿼리 결과에서 검색하고, 조인할 수 있는 Local SQL에 대해 알아봅니다.


      Local SQL이란?

      Local SQL은 DB로부터 애플리케이션의 메모리 상으로 가져온 데이터(데이터셋: TDataSet을 상속받은 객체)를 대상으로 다시 SQL 쿼리를 할 수 있는 기능입니다.


      Local SQL은 아래와 같이 사용할 수 있습니다.

      • 여러 이기종 DB들에 대한 쿼리 : 다양한 DB에서 가져온 여러 데이터셋을 대상으로 원하는 데이터 쿼리(조인 가능)
      • 인 메모리 데이터베이스 : TFDMemTable은 메모리상에 있는 데이터셋의 역할
      • 오프라인 모드 쿼리 : 원격 DB에 연결할 수 없는 경우에도, 이미 가져온 데이터셋을 대상으로 쿼리 실행
      • 데이터스냅 클라이언트 쿼리 : 데이터스냅 서버(미들웨어)에서 받아온 데이터셋을 대상으로 쿼리 실행
      • 간편한 마이그레이션 : 애플리케이션 내에서 써드파티를 통해 가져온 데이터셋 객체를 대상으로 쿼리 실행

      용어> 데이터셋(DataSet) = 애플리케이션의 메모리 상에 있는 데이터 집합


      Local SQL 사용을 위한 FireDAC 컴포넌트 구성

      • TFDConnection의 DriverName을 SQLite로 설정합니다.(FireDAC의 Local SQL 엔진으로 SQLite 드라이버를 사용합니다.)
      • TFDLocalSQL과 TFDQuery 컴포넌트의 Connection을 위의 TFDConnection으로 설정
      • TFDLocalSQL 컴포넌트의 DataSets 컬랙션(속성)에 조회할 데이터셋(TDataSet을 상속받은 객체)을 등록

      Local SQL의 설정의 자세한 내용은 엠바카데로 기술문서 - Local SQL (FireDAC) 페이지를 참고하시기 바랍니다.


      Local SQL 샘플 프로그램

      샘플 프로그램에서는 TFDLocalSQL 컴포넌트를 이용해 5가지의 서로 다른 유형의 데이터셋에서 필요한 데이터만 조회해 그리드에 표시합니다.

      [샘플코드는 http://delphi.org/2015/03/firedac-local-sql/에서 받을 수 있습니다.]


      샘플에서 중점적으로 확인할 내용

        • 총 5 종류의 서로다른 데이터를 대상으로 쿼리
          • dbExpress : dbExpress를 이용해 데이터베이스에서 가져온 데이터
          • REST CDS : REST Client를 이용해 웹서비스에서 가져온 데이터
          • IBX : IBX를 이용해 인터베이스 DB에서 가져온 데이터
          • MemTable from Code : 코드로 직접 만든 로컬 데이터
          • ADO & Access : ADO 기술을 이용해 엑세스 DB에서 가져온 데이터
        • FDLocalSQL1의 DataSets 컬랙션에는 5개의 데이터셋을 검색 대상으로 등록
        • FDQuery1에서는 FDLocalSQL1.DataSets에 등록된 데이터셋 대상으로 SQL 쿼리를 작성해 검색할 수 있습니다.
        SELECT 
          sales.order_status, 
          customers.customer,
          regions.RegionDescription, 
          rest.name as REP
        FROM rest 
        
        INNER JOIN RestSalesReps 
        ON rest.id = RestSalesReps.RestID
        
        INNER JOIN Sales
        ON RestSalesReps.Sales_Rep = Sales.Sales_REP
        
        INNER JOIN customers
        ON sales.cust_no = customers.cust_no
        
        LEFT OUTER JOIN regions
        ON regions.RegionID = RestSalesReps.RestID


        험프리 험프리.김현수 데이터 엑세스 FireDAC, FireDAC Skill Sprints, LocalSQL

        [FireDAC Skill Sprints] 1. FireDAC 동영상과 샘플로 고급기능 활용하기

        2015. 3. 24. 16:47

        엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


        이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


        1회차에서는 FireDAC을 소개하고 연결하는 과정으로 진행합니다.

        FireDAC 소개

        FireDAC은 델파이와 C++빌더에서 멀티-디바이스 데이터베이스 애플리케이션을 개발할 수 있는 범용(Universal) 데이터 엑세스 컴포넌트입니다. 


        FireDAC은 통합 API를 사용해 다양한 데이터베이스를 동일한 코드로 제어할 수 있습니다. 그렇기 때문에 개발자는 데이터베이스를 신경쓰지 않고 애플리케이션 개발에 집중할 수 있고, DBMS 변경 시 대부분의 코드를 재사용할 수 있습니다. 그 뿐아니라 FireDAC은 데이터베이스 별 고유기능을 사용하고, 최적의 성능을 발휘할 수 있도록 데이터베이스 별 네이티브 드라이버를 지원합니다.


        또한 기술적으로 아래의 장점을 제공합니다.

        • 30배 빠른 데이터 입력이 가능한 Array DML
        • DBMS의 사용내역을 추적하고 모니터링
        • 엑셀형식으로 내보내고, 가져오기 기능을 개발할 수 있는 Batch Move
        • DB에서 가져온 메모리상의 데이터를 대상으로 쿼리할 수 있는 Local SQL
        • 이 외의 기술적인 장점은 아래의 FireDAC Skill Sprints 동영상과 샘플로 고급기능 활용하기 시리즈로 직접 확인하시기 바랍니다. 


        FireDAC의 자세한 소개는 데브기어 FireDAC 소개페이지와 FireDAC 기술문서 - Overview를 참고할 수 있습니다.

        FireDAC Skill Sprints 동영상과 샘플로 고급기능 활용하기

        2. FireDAC으로 DBMS 사용 내역 추적, 모니터링 하기

        FireDAC 추적기능을 이용하면 애플리케이션과 데이터베이스 사이의 통신내용을 상세하게 보거나 기록할 수 있습니다. 이 추적 정보에는 이벤트 발생시간, API 호출내역, DB로 전송된 SQL 문, 파라메터와 필드 값, 오류와 경고 등이 기록되어 여러분의 DB 애플리케이션의 문제점을 디버깅하고 해결하는데 유용하게 사용할 수 있습니다.


        샘플에서는 데이터 조회(테이블 오픈) 시 애플리케이션과 DBMS의 통신내용을 모니터링 유틸리티(FireDAC Monitor)로 확인하고, DB 애플리케이션 디버깅 시 유용한 메터데이터(DBMS 객체 정보)를 이용해 테이블, 필드, 제너레이터, 스토어드 프로시저 목록을 조회해 봅니다.

        3. 캐쉬를 이용한 업데이트와 자동증가필드(Identity) 적용

        캐쉬 업데이트는 애플리케이션의 메모리 영역(즉, 데이터셋)에 업데이트 내역을 기록하고, DBMS에 한번에 업데이트(또는 일괄취소) 할 수 있는 기능입니다. 

        캐쉬 업데이트를 사용하면 작업내용을 로컬에서 관리하므로 DBMS와의 트래픽을 줄일 수 있고, 사용자는 통신속도와 관계없이 빠른 작업이 가능합니다. 그리고 작업이력을 확인(변경된 레코드 조회, 변경된 항목의 이전 값 확인 등)하고, 작업 변경취소(마지막 작업 변경취소, 선택한 레코드 변경취소 등)을 FireDAC에서 제공하는 메소드를 이용해 손쉽게 구현할 수 있습니다.


        샘플에서는 캐쉬 업데이트를 이용해 조회한 데이터를 메모리 상에서 편집(입력, 수정, 삭제) 후 업데이트 목록 표시, 변경취소, 일괄적용/취소 기능을 구현해 봅니다.

        Array DML은 DBMS에 업데이트할 데이터를 배열 형태의 파라메터로 한번에 전송해 아주 빠르게 데이터를 입력할 수 있는 기능입니다.

        Array DML을 사용하면 DBMS와 애플리케이션 사이의 통신비용을 줄이고 DBMS에 전송하는 요청 횟수를 현격히 줄입니다. 그 결과 실행 속도를 대폭 향상시킬 수 있습니다.

        예를 들면, 1만건의 데이터 입력 시 반복 입력 작업을 트랜젝션으로 묶으면 20배 빨라지고, Array DML을 사용하면 다시 10배가 더 빨라집니다. 샘플을 통해 결과를 직접 확인해 보기 바랍니다.

        FireDAC에는 검색옵션, 형식옵션, 업데이트옵션, 리소스옵션, 트랜젝션옵션 등의 수많은 옵션을 제공합니다.

        이 글에서는 주요 옵션을 살펴봅니다. 주요 옵션을 살펴보고 필요한 옵션은 상세확인 해 여러분의 애플리케이션을 향상해 보기 바랍니다.


        샘플에서는 데이터 지연 조회(DetailDelay), 데이터 페이징 단위 조회(RecsSkip, RecsMax)과 같은 고급 기능을 FireDAC 옵션을 이용해 손쉽게 구현해 봅니다.

        커맨드 텍스트 전처리는 SQL 명령을 데이터베이스에 전달하기 전 파라메터를 치환하고, FireDAC 매크로 함수를 DBMS에 맞도록 치환하는 기능입니다.

        전처리 기능은 아래 3 종류의 매크로 명령을 제공합니다.

        • 매개변수를 확장할 수 있는 대체변수
        • 한번 작성 후 다양한 DBMS에서 사용할 수 있는 SQL문 작성하는 이스케이프 시퀀스
        • 연결된 DBMS에 따라 조건부로 실행되는 SQL문을 작성하는 조건부 대체 

        샘플에서는 매크로 대체변수를 이용해 데이터 탐색기를 만들고, 이스케이프 시퀀스로 작성된 통합 SQL문이 실제 DBMS에 전달 시 어떻게 변환되는지 확인해 봅니다.

        FireDAC의 ETL은 Extract, Transform, Load의 약자로 아래의 역할을 의미합니다. 

        • Extract(추출) : 같은 종 또는 이기종 데이터 소스로부터 데이터를 추출 
        • Transform(변환) : 추출한 데이터를 분석용 데이터 형식 또는 입력쿼리로 변환
        • Load(로드) : 최종 목적(데이터베이스, 운용 데이터 저장소, 데이터 마트, 또는 데이터 창고)으로 로드 

        FireDAC ETL로 아래의 기능을 구현할 수 있습니다.(몇가지 예시입니다.) 

        • Query문으로 조회한 데이터를 엑셀에서 사용할 수 있는 CSV 파일로 내보내기
        • 텍스트파일의 데이터를 데이터베이스 테이블로 가져오기
        • 데이터베이스에서 다른 데이터베이스로 데이터 이동하기

        샘플에서는 위 3가지 기능을 직접구현해 봅니다. 컴포넌트 구성과 컴포넌트 속성을 참고할 수 있습니다.

        8. TFDMemTable: 메모리 기반 데이터셋 사용하기

        TFDMemTable은 메모리 기반 데이터셋입니다. 즉, 데이터베이스 연결 없이 파일 데이터나 코드로 추가한 데이터를 메모리에 올려 데이터셋의 기능(필터링, 정렬 등)을 사용할 수 있습니다.


        TFDMemTable은 아래 기능을 할 수 있습니다.

        • 디자인타임과 런타임 시 파일 불러오기(Load File), 파일로 내보내기(Save File), 다른 데이터셋의 데이터가져오기(Assign Data) 기능 사용
        • 런타임 시 파일과 스트림으로 데이터 내보내기, 불러오기 기능을 사용할 수 있으며, JSON, XML, Binary 포맷 선택 가능
        • 멀티티어 애플리케이션(REST 클라이언트, 데이터스냅 등)에서 수신 데이터를 보관하는 데이터셋 역할
        • 내부에서 데이터 보관할 시 컬랙션객체(TList, TStringList) 대신 메모리테이블 사용 시 데이터셋의 기능(UI 컨트롤에 데이터바인딩, Local SQL, 필터링, 정렬 등)을 사용해 다양한 기능 손쉽게 구현가능
        • Local SQL을 이용해 메모리테이블(데이터셋)에서 쿼리 실행
        • ETL 기능으로 다른 데이터소스(텍스트, CSV 등)에서 가져온 데이터 보관

        Local SQL은 DB로부터 애플리케이션의 메모리 상으로 가져온 데이터(데이터셋: TDataSet을 상속받은 객체)를 대상으로 다시 SQL 쿼리를 할 수 있는 기능입니다. Local SQL은 아래와 같이 사용할 수 있습니다. 

        • 여러 이기종 DB들에 대한 쿼리 : 다양한 DB에서 가져온 여러 데이터셋을 대상으로 원하는 데이터 쿼리(조인 가능) 
        • 인 메모리 데이터베이스 : TFDMemTable은 메모리상에 있는 데이터셋의 역할 
        • 오프라인 모드 쿼리 : 원격 DB에 연결할 수 없는 경우에도, 이미 가져온 데이터셋을 대상으로 쿼리 실행 
        • 데이터스냅 클라이언트 쿼리 : 데이터스냅 서버(미들웨어)에서 받아온 데이터셋을 대상으로 쿼리 실행 
        • 간편한 마이그레이션 : 애플리케이션 내에서 써드파티를 통해 가져온 데이터셋 객체를 대상으로 쿼리 실행
        샘플에서는 Local SQL을 이용해 dbExpress, REST Client, 메모리테이블 등 총 5종류의 이기종의 데이터셋을 조인한 데이터를 그리드에 출력합니다.

        10. BDE 프로젝트를 FireDAC으로 마이그레이션 하기

        (준비 중)


        관련링크



        험프리 험프리.김현수 데이터 엑세스 FireDAC, Skill Sprints

        델파이/C++빌더에 TServerSocket, TClientSocket 등록하기

        2015. 3. 24. 10:40

        TServerSocket과 TClientSocket은 기본적으로 감춰져 있어 패키지 등록 후 사용할 수 있습니다.

        1. RAD Studio > Component > Install Packages
        2. [Add] 버튼 클릭
        3. (RAD Studio 설치 경로)\bin 으로 이동 후 dclsockets(버전숫자).bpl 선택
          • XE7 기준 경로 : C:\Program Files (x86)\Embarcadero\Studio\15.0\bin
          • XE7 기준 파일명 : dclsockets210.bpl
        4. [OK] 버튼 클릭

        컴포넌트 팔랫트의 Internet 카테고리에 TServerSocket, TClientSocket이 등록됩니다.


        험프리 험프리.김현수 Delphi/C++Builder

        [따라하기] FireDAC으로 오라클 연결하기

        2015. 3. 23. 18:21

        여러분의 FireDAC 애플리케이션에서 DBMS와 접속하기 위해서는 DBMS 제조사에서 제공하는 네이티브 클라이언트 드라이버를 설치해야 합니다. 네이티브 클라이언트 드라이버는 각 제조사 홈페이지를 통해 다운로드 받아 설치할 수 있습니다.


        오라클 서버에 접속하기 위해서는 오라클 클라이언트 소프트웨어를 설치해야 합니다.

        오라클 클라이언트 소프트웨어

        오라클 클라이언트 소프트웨어는 아래 2가지 방식으로 제공합니다.

        • "Fat" 오라클 클라이언트 - 설치형 오라클 클라이언트 프로그램. 기본 오라클 홈경로에 설치된 오라클 드라이버 이용합니다.
        • "Thin" 오라클 클라이언트 - 파일형 오라클 클라이언트 프로그램. 윈도우 PATH 또는 실행파일과 동일한 경로에 아래 라이브러리 복사해 사용합니다.
          • oci.dll

          • oraocci11.dll

          • oraociei11.dll

          • orasql11.dll

        [따라하기] FireDAC을 이용해 오라클 서버와 연결하기

        1, 오라클 클라이언트 소프트웨어 설치(Thin 오라클 클라이언트)

        오라클 다운로드 페이지(http://www.oracle.com/technetwork/indexes/downloads/index.html)에서 Database > Instant Client 메뉴를 선택합니다.


        델파이 개발환경에 맞는 Instant Client for Microsoft Windows (32-bit)를 선택합니다.


        상단의 라이선스에 동의 하고 


        본인의 오라클 서버 버전의 파일을 찾아 다운로드 합니다.(저는 11.2.0.2 버전의 오라클 서버와 연결합니다.) 

        (로그인이 필요하니 오라클 계정이 없는 경우 계정 생성 후 로그인하여 진행합니다.)


        zip 파일 다운로드 완료 후 압축을 해제합니다.


        아래 4개 파일을 복사 후 RAD Studio 실행파일 경로(XE7 기준 기본경로: C:\Program Files (x86)\Embarcadero\Studio\15.0\bin)에 복사합니다.

        (오라클에 접속할 애플리케이션의 실행파일 경로 또는 윈도우 PATH에 등록된 경로에 오라클 클라이언트 라이브러리가 있어야 합니다.)

        • oci.dll

        • oraocci11.dll

        • oraociei11.dll

        • orasql11.dll

        2, 화면 개발

        화면구성과 필요 컴포넌트 추가

        새로운 프로젝트를 생성합니다.(File > New > VCL Form Application - Delphi)


        아래의 화면과 표를 참고해 폼에 컴포넌트를 추가합니다.


         상위 오브젝트

        오브젝트 

        속성 

         값(또는 설명)

         Form1 DGGrid1Width, Height 적당한 크기로 조정 
         FDConnection1  

         FDTable1

         

         

         DataSource1

        DataSet

        FDTable1 

         FDPhysOracleDriverLink1

         

         

         FDGUIxWaitCursor1

         

         

        3, 오라클 서버 연결

        사전 준비사항

        개발PC에서 오라클서버와 접속 가능해야 합니다. 오라클에서 제공하는 SQL Plus 툴(다운로드: 오라클 서버 버전과 맞는 SQLPlus 다운로드)을 이용해 오라클 서버와 접속을 확인합니다.

        오라클 서버 연결 설정

        폼(또는 데이터모듈) 위에 TFDConnection 컴포넌트를 추가하고 추가한 컴포넌트를 더블클릭 해 "FireDAC Connection Editor" 대화상자를 표시하고 아래 정보를 입력합니다.

        • Driver ID : Ora
        • Database : 오라클서버의 주소(형식: IP주소:Port/ServiceName, 예> 192.0.0.1:1521/orcl)
        • User_Name : 오라클 계정
        • Password : 오라클 계정의 비밀번호

        테스트 버튼을 눌러 입력한 정보가 정확한지 확인합니다.(로그인 창이 나오면 OK 버튼을 누릅니다.)

        Connection Editor 창의 OK 버튼을 눌러 설정을 저장합니다.


        TFDConnection 컴포넌트의 LoginPromt 속성을 False로 설정 후 Connected 속성을 True로 설정해 연결합니다.

        4, 테이블 조회

        오라클 서버에서 조회할 테이블 선택

        테이블 컴포넌트(FDTable1) 선택 후 TableName 속성에서 조회할 테이블을 선택합니다.

        FDTable1의 Active 속성을 True로 설정합니다.


        DBGrid1의 DataSource를 DataSourc1으로 설정 해 테이블의 데이터가 DBGrid에 표시되는지 확인합니다.

        5, 배포, 테스트

        애플리케이션 배포 시 오라클 클라이언트 드라이버의 라이브러리 4종을 실행파일과 같은 경로로 함께 배포합니다.

        위 파일을 복사해 개발환경이 아닌 PC에서 동작을 확인합니다.


        참고



        험프리 험프리.김현수 데이터 엑세스

        [FireDAC Skill Sprints] 6. 전처리: SQL문을 유연하게 작성할 수 있는 Param와 Macro 사용하기

        2015. 3. 12. 17:55

        엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


        이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


        6회차에서는 커맨드 텍스트 전처리에 관한 내용으로 진행합니다.


        커맨드 텍스트 전처리란?

        커맨드 텍스트 전처리는 SQL 명령을 데이터베이스에 전달하기 전 파라메터를 치환하고, FireDAC 매크로 함수를 DBMS에 맞도록 치환하는 기능입니다.


        FireDAC 은 커맨드 텍스트 전처리 작업할 수 있는 3가지의 매크로 명령을 지원합니다.

        • 대체변수(Substitution variables) : 파라메터 확장을 위해 SQL 문의 일부를 치환. 예를 들면 FROM절의 테이블이름과 SELECT 절의 필드명을 파라메터화 하려면 대체변수를 사용해야 함
        • 이스케이프 시퀀스(Escape sequences) : 한번 작성하면 서로 다른 DBMS에서 그대로 사용할 수 있는 DBMS에 의존적이지 않은 SQL문 생성
        • 조건부 대체(Conditional substitutions) : 연결된 DBMS에 따라 조건부로 실행되는 SQL 문 작성

        대체변수

        FDQuery1.SQL.Text := 'SELECT * FROM &TabName';
        FDQuery1.MacroByName('TabName').AsRaw := 'Orders';
        FDQuery1.Open;

        • 위와 같이 매크로 변수(&TabName)를 이용해 SQL 문 작성 후  MacroByName 메소드를 이용해 내용을 치환할 수 있습니다.

        이스케이프 시퀀스

        FireDAC은 다음 5가지 이스케이프 시퀀스가 있습니다.

        • 상수 치환
        • 식별자 치환
        • 조건부 대체
        • Like 연산자 이스케이프 시퀀스
        • 스칼라 함수

        그중 상수 치환 이스케이프 시퀀스를 사용하면 DBMS의 구문 및 지역설정과 관계없이 커맨드 텍스트 상수를 작성할 수 있습니다. 예를 들면 아래와 같습니다.

        • {d <날짜>} : {d 2014-08-30}은 Oracle에서 TO_DATE{'2014-08-30', 'yyyy-mm-dd'} 입니다.
        • {t <시간>} : {t 14:30:00}은 SQL Server에서 CONVERT (DATETIME, '14 : 30 : 00 ', 114) 입니다.(hh24:mi:ss 형식으로 작성해야 합니다.)
        • {id <식별자명>} : 식별자명이 DBMS의 고유 구문으로 치환됩니다.

        조건부 대체

        조건부 대체는 연결된 DBMS(또는 매크로 변수 값)에 따라 명령을 대체합니다. 예를 들면 아래와 같습니다.

        • {IF Oracle} TO_CHAR{fi} {IF MSSQL} CONVERT {fi} : 오라클인 경우 TO_CHAR, MSSQL인 경우 CONVERT 명령어로 실행됩니다.
        자세한 커맨드 텍스트 전처리 설명과 내용은 엠바카데로 기술문서 - Preprocessing Command Text (FireDAC)를 참고하시기 바랍니다.

        ❑ Preprocessing 샘플 프로그램 소개

        이 샘플에서는 총 2가지 기능을 소개합니다.

        • 테이블을 선택 후 해당 테이블의 필드를 (다중)선택 하면 매크로의 대체변수를 이용해 SQL 쿼리를 작성해 데이터를 조회합니다.

        • 이스케이프 시퀀스를 이용해 작성한 쿼리 수행 후 FireDAC 모니터를 통해 최종적으로 실행되는 SQL 쿼리와 비교합니다.

        [샘플코드 받기 - 데브기어 github 페이지]


        매크로 대체변수로 필드목록과 테이블명 선택 해 데이터 조회하기

        첫번째 탭에 구현된 기능으로 테이블 목록에서 테이블 선택 후 필드(다중선택) 목록에서 조회할 필드를 체크 후 "선택 데이터 표시" 버튼을 누르면 그리드에 데이터가 표시됩니다.

        쿼리컴포넌트에는 아래와 같이 필드목록(&FieldList)와 대상 테이블명(&TableName)을 매크로 대체변수로 작성했습니다.

        SELECT &FieldList FROM &TableName

        델파이에서는 아래 코드와 같이 Macro 값을 설정하고 쿼리를 실행하면 SQL 문이 실행되기 전 필드목록과 테이블명이 치환되어 SQL 문이 실행됩니다.

          DM.qrySelect.MacroByName('FieldList').AsRaw := FieldList;
          DM.qrySelect.MacroByName('TableName').AsRaw := ListBox1.Selected.Text;
          DM.qrySelect.Open;


        이스케이프 시퀀스로 DBMS 의존적이지 않은 SQL문 작성

        이스케이프 시퀀스는 

        1. FireDAC 매크로 함수를 이용해 DBMS에 의존적이지 않은 SQL문을 작성합니다.
        2. 매크로 함수가 포함된 SQL 문은 실행 전 DBMS에 맞는 DBMS 함수로 치환되어 SQL 문이 실행됩니다.


        쿼리 컴포넌트에는 아래와 같이 매크로 함수가 포함된 SQL문을 작성했습니다.

        SELECT {Current_Date()} as Today, c.*
          FROM &TabNam c
         WHERE {Extract(Year, c.SaleDate)} = {e 1988}

        애플리케이션을 실행하고 FireDAC 모니터링 기능을 이용해 처리된 SQL 문을 확인하면 아래와 같이 DBMS의 함수로 치환되어 SQL 문이 실행됩니다.


        매크로 함수는 아래와 같습니다.


        험프리 험프리.김현수 데이터 엑세스 FireDAC, preprocessing

        [FireDAC Skill Sprints] 5. Cascading Options: 고급기능을 활용 할 수 있는 FireDAC 옵션

        2015. 3. 11. 14:22

        엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


        이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


        5회차에서는 FireDAC의 캐스캐이딩 옵션에 대해 소개하고 살펴봅니다.

        FireDAC 캐스캐이딩 옵션

        FireDAC에는 5종류의 옵션 그룹을 제공합니다.

        • FetchOptions : DBMS에서 데이터를 어떻게 취득할지 제어하는 검색 옵션입니다.
        • FormatOptions : DBMS의 데이터형식을 FireDAC 데이터 형식으로 또는 반대로 매핑하는 방법을 제어하는 형식 옵션입니다.(자세한 내용은 "Data Type Mapping"을 참조하세요.)
        • UpdateOptions : DBMS에 업데이트 전송 방법을 제어하는 업데이트 옵션입니다. 업데이트 시 테이블의 모든 필드를 업데이트하거나 변경된 필드만 업데이트 할 수 있습니다.
        • ResourceOptions : 시스템 리소스 사용과 데이터셋의 지속성을 제어하는 자원 옵션입니다. 예를 들면 FireDAC Phys 레이어 명령을 비동기 적으로 실행 또는 차단할 수 있습니다.
        • TxOptions : 트랜젝션 실행방법을 제어하는 트랜젝션 옵션입니다. 


        위의 옵션은 Manager > Connection > DataSet/Command로 캐스캐이딩(위에서 아래로 적용) 됩니다. 즉, TFDConnection에 옵션을 설정하면 해당 연결을 사용하는 TFDQuery, TFDTable도 동일한 옵션이 적용됩니다.(일부 옵션 제외)

        FireDAC 카테고리 별 주요옵션

        다음은 FireDAC 주요옵션을 카테고리별로 나열한 것입니다. 각 옵션에 대한 자세한 내용은 항목 아래 기술문서 링크에 방문해 상세 설명을 보시기 바랍니다.


        검색옵션(FetchOptions)

        • 취득 방법 ( CursorKind , Mode , RowsetSize ). 예를 들어, 결과 세트의 모든 레코드를 한 번에 검색 할 수 주문형 레코드를 검색 할 수 있습니다. 
        • 자원 보존 방법 ( Unidirectional , AutoClose , Cache , AutoFetchAll ). 
        • BLOB 필드 중첩 된 레코드 메타 데이터 검색 및 캐시 방법 ( Items , Cache ). 
        • 마스터/디테일 데이터셋 관계의 처리 방법 ( DetailDelay , DetailOptimize , DetailCascade ). 
        • 행 집합 페이징 ( RecsMax , RecsSkip ). 
        • TFDTable 작동 모드 ( CursorKind , LiveWindowParanoic , LiveWindowFastFirst ). 
        • 데이터 집합의 레코드를 세는 방법 ( RecordCountMode ).

        TFDFetchOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDFetchOptions


        형식옵션(FormatOptions)

        • 문자열 데이터 형식 ( StrsEmpty2Null , StrsTrim , StrsTrim2Len , InlineDataSize , MaxStringSize ) 
        • 숫자 데이터 형식 ( MaxBcdPrecision , MaxBcdScale , Round2Scale ) 
        • 시간 데이터 형식 ( Round2Scale ) 
        • 일반적인 데이터 형식 매핑 ( MapRules , OwnMapRules , DefaultParamDataType ). 예를 들어 NUMERIC (9, 0)의 열을 ftInteger 컬럼에 맵핑 할 수 있습니다. 
        • 필드 형식 ( FmtDisplayDateTime , FmtDisplayDate , FmtDisplayTime , FmtDisplayNumeric , FmtEditNumeric ) 
        • 데이터 집합의 정렬 ( SortLocale , SortOptions ) 
        • 식별자 따옴표 ( QuoteIdentifiers )

        TFDFormatOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDFormatOptions


        업데이트옵션(UpdateOptions)

        • 데이터 편집 허용 ( EnableDelete , EnableInsert , EnableUpdate , ReadOnly , CheckRequired , CheckReadOnly , CheckUpdatable ). 여기에는 TField.ReadOnly 과 TField.Required 도 영향을줍니다. 
        • 데이터베이스 레코드 잠금 ( LockMode , LockPoint , LockWait ). 
        • 자동 증가 필드에 대한 데이터베이스 생성기와 시퀀스의 사용 ( FetchGeneratorsPoint , GeneratorName ). 여기에는 TField.AutoGenerateValue 도 영향을줍니다. 
        • 업데이트 사후 명령의 생성 ( UpdateChangedFields , UpdateNonBaseFields , UpdateMode , FastUpdates ). 여기에는 TField.ProviderFlags 과 TField.Origin 도 영향을줍니다. 
        • 데이터의 업데이트 ( RefreshMode , RefreshDelete ). 
        • 업데이트 포스트 결과 확인 ( CountUpdatedRecords ).

        TFDUpdateOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDUpdateOptions


        리소스옵션(ResourceOptions)

        • SQL 명령 텍스트 전처리 ( EscapeExpand , MacroCreate , MacroExpand , ParamCreate , ParamExpand , PreprocessCmdText , UnifyParams ). 
        • 명령의 준비 ( DirectExecute , DefaultParamType ). 
        • 명령 실행 ( CmdExecMode , CmdExecTimeout , ArrayDMLSize ). 
        • 자원 관리 ( SilentMode ). 
        • 데이터 집합 지속성 ( Persistent , Backup , BackupExt , BackupFolder , DefaultStoreExt , DefaultStoreFolder , DefaultStoreFormat , StoreVersion , StoreItems ).

        TFDResourceOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDResourceOptions


        트랜젝션옵션(TxOptions)

        • 독점적 수준 ( Isolation ) 
        • 업데이트 기능 ( ReadOnly ) 
        • 자동 커밋 ( AutoCommit , AutoStart , AutoStop , StopOptions ) 
        • DBMS 고유의 파라미터 ( Params ) 
        • 액션 연결 해제 ( DisconnectAction ) 중첩 ( EnableNested )

        TFDTxOptions 기술문서 - http://docwiki.embarcadero.com/Libraries/XE7/en/FireDAC.Stan.Option.TFDTxOptions

        FireDAC 옵션 샘플프로그램

        이 샘플에서는 FetchOptions을 이용해 아래 3가지 기능을 구현했습니다.

        • 테이블에 데이터가 많은 경우 신속하게 화면에 표시하기 위해 데이터를 나눠서 가져오기(FetchOptions.RowsetSize, FetchOptions.Mode 이용)
        • 데이터를 페이징 단위(중간의 데이터 만)로 조회(FetchOptions.RecsSkip, RecsMax 이용)
        • 마스터/디테일 형식의 화면에서 키보드로 목록을 빠르게 움직여도 마지막에 위치한 상세정보만 표시해 불필요한 데이터 조회 방지(FetchOptions.DetailDealy 이용)

        [샘플코드 받기 - 데브기어 github 페이지]


        데이터를 지정건수 만큼 나눠서 가져오는 기능
        데이터가 많은 경우 전체 데이터를 가져와 화면에 표시하는 것 보다 부분적으로 표시하고 추가로 데이터를 표시하는 것이 효과적일 수 있습니다.
        FireDAC에서는 FetchOption의 Mode와 RowsetSize를 설정해 해당 기능을 구현할 수 있습니다. 다음 데이터목록을 가져오려면 TFDQuery.FetchNext 메소드를 호출합니다.
          qryEmployee.Close;
          if TCheckBox(Sender).Checked then
          begin
            qryEmployee.FetchOptions.RowsetSize := 3;
            qryEmployee.FetchOptions.Mode := TFDFetchMode.fmManual;
          end
          else
          begin
            qryEmployee.FetchOptions.Mode := TFDFetchMode.fmOnDemand;
          end;
          qryEmployee.Open;
          btnFetchNext.Enabled := TCheckBox(Sender).Checked;

        데이터 페이징 단위로 조회 기능
        페이징 단위로 데이터를 조회할 수 있습니다. DBMS 자체에서 Top, Limit 명령을 통해 쿼리로 수행하던 기능을 FireDAC 컴포넌트로 구현할 수 있습니다.
          qryEmployee.Close;
          qryEmployee.FetchOptions.RecsSkip := 10;
          qryEmployee.FetchOptions.RecsMax := 10;
          qryEmployee.Open;

        상세 데이터 조회지연 기능 구현
        사원정보(qryEmployee)와 사원이 진행한 프로젝트(qryProject)로 목록/상세 기능 구현 후 체크박스(chkFetchRowsetSize) 체크 시 DetailDelay 옵션으로 지연 조회 하도록 설정
          if TCheckBox(Sender).Checked then
            qryProject.FetchOptions.DetailDelay := StrToIntDef(Edit1.Text, 300)
          else
            qryProject.FetchOptions.DetailDelay := 0;

        관련 링크



        험프리 험프리.김현수 데이터 엑세스 Cascading Options, FetchOption, FireDAC, Skill Sprints

        [FireDAC Skill Sprints] 4. ArrayDML로 30배 빠르게 데이터 입력하기

        2015. 3. 10. 16:22

        엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


        이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


        4회차에는 Array DML에 대한 내용으로 진행합니다.

        Array DML 이란?

        Array DML은 실행에 필요한 매개변수(Parameters) 배열을 이용한 한번에 DBMS 명령을 실행하는 기능입니다. 이 방법은 DBMS와 애플리케이션 사이의 통신비용을 줄이고 DBMS 명령 요청을 줄입니다. 그 결과 실행 속도가 향상됩니다.


        다음 그림에서 이 프로세스를 보여줍니다.


        동영상을 보셨다면 아시겠지만 1만건의 데이터를 DBMS에 입력 시

        • 트랜젝션으로 작업을 묶어주면 20배 빨라지고, 

        • Array DML을 사용하면 다시 10배가 더 빨라진다고 설명합니다.

        Array DML의 사용법 예시입니다.

          with FDQuery1 do begin
            SQL.Text := 'insert into Customers (ID, RegionID, Name, Note) values (:ID, :RegionID, :Name, :Note)';
            // Set up parameter types
            Params[0].DataType := ftInteger;
            Params[1].DataType := ftInteger;
            Params[2].DataType := ftString;
            Params[2].Size := 40;
            Params[3].DataSize := ftMemo;
            // Set up parameters' array size
            Params.ArraySize := 10000;
            // Set parameter values
            for i := 0 to 10000 - 1 do begin
              if i mod 100 = 0 then
                // force PK violation
                Params[0].AsIntegers[i] := i - 1
              else
                Params[0].AsIntegers[i] := i;
              Params[1].AsIntegers[i] := GetRegionIdForCustomer(i);
              Params[2].AsStrings[i] := 'Somebody ' + IntToStr(i);
              Params[3].Clear(i);
            end;
            // Execute batch
            Execute(10000, 0);
          end;

        • 위 코드 10번째 줄에서 배열크기(Params.ArraySize)를 지정합니다.
        • 13~20번 줄에서는 Params[0].AsStrings[i] 형태로 배열로 데이터를 입력합니다.(AsString 뒤에 s가 붙은 것을 유의하세요.)
        • 데이터 입력 후 23번째 줄에 Execute 메소드로 실행요청을 합니다. 이때 배열의 크기를 인자로 넘겨줍니다.

        Array DML 샘플 프로그램 소개

        이 샘플에서는 만건의 데이터를 3가지 방식으로 입력하고 실행 시간을 출력합니다. 

        • 아무 튜닝없이 반복하며 입력 - 13,244 ms 소요
        • 트랜젝션으로 작업을 묶어서 입력 - 1,062 ms 소요
        • Array DML으로 데이터 일괄 입력 - 160 ms 소요
        결과를 보면 Array DML의 결과가 매우 빠르다는 것을 볼수 있습니다. 
        또한 단순하게 트랜젝션 처리만 추가해도 10배 이상 속도가 개선된 결과도 인상적입니다.

        [샘플코드 받기 - 데브기어 github 페이지]


        Insert STD - 아무 튜닝없이 반복하며 입력

        var
          I: Integer;
          StopWatch: TStopwatch;
        begin
          FDConnection1.ExecSQL('DELETE FROM Test');
        
          StopWatch := TStopWatch.StartNew;
        
          for I := 0 to NUM_INSERTS - 1 do
          begin
            FDQuery1.ParamByName('Field1').AsInteger := I;
            FDQUery1.ParamByName('Field2').AsString := 'Str' + I.ToString;
            FDQuery1.ExecSQL;
          end;
        
          StopWatch.Stop;
          Memo1.Lines.Add('Insert STD : ' + StopWatch.ElapsedMilliseconds.ToString + ' ms');

        Insert STD(Transaction) - 위 작업에 트랜젝션만 추가
        var
          I: Integer;
          StopWatch: TStopwatch;
        begin
          FDConnection1.ExecSQL('DELETE FROM Test');
        
          StopWatch := TStopWatch.StartNew;
        
          // Transaction 추가
          FDConnection1.StartTransaction;
          try
            for I := 0 to NUM_INSERTS - 1 do
            begin
              FDQuery1.ParamByName('Field1').AsInteger := I;
              FDQUery1.ParamByName('Field2').AsString := 'Str' + I.ToString;
              FDQuery1.ExecSQL;
            end;
          finally
            FDConnection1.Commit;
          end;
        
          StopWatch.Stop;
          Memo1.Lines.Add('Insert STD(Transaction) : ' + StopWatch.ElapsedMilliseconds.ToString + ' ms');

        Insert Array DML - Array DML을 이용해 입력
        var
          I: Integer;
          StopWatch: TStopwatch;
        begin
          FDConnection1.ExecSQL('DELETE FROM Test');
        
          StopWatch := TStopWatch.StartNew;
        
          FDConnection1.StartTransaction;
          try
            FDQuery1.Params.ArraySize := NUM_INSERTS;
            for I := 0 to NUM_INSERTS - 1 do
            begin
              FDQuery1.ParamByName('Field1').AsIntegers[I] := I;
              FDQUery1.ParamByName('Field2').AsStrings[I] := 'Str' + I.ToString;
            end;
            FDQuery1.Execute(NUM_INSERTS);
          finally
            FDConnection1.Commit;
          end;
        
          StopWatch.Stop;
          Memo1.Lines.Add('Insert ArrayDML : ' + StopWatch.ElapsedMilliseconds.ToString + ' ms');


        험프리 험프리.김현수 데이터 엑세스

        웹사이트의 인증서 오류를 무시하고 http 결과 조회하기(WinInet 이용)

        2015. 3. 6. 13:37

        고객사에서 웹서비스 연동 시 아래와 같이 인증서가 잘못된 경우 무시할 수 있는 방법을 요청해 공유합니다.


        1, 서버 인증서 오류 내용 

        한글 : 이 웹 사이트의 보안 인증서에 문제가 있습니다 

        영문 : There is a problem with this website's security certificate - http://support.microsoft.com/kb/931850/ 


        2, 영문으로 검색 시 아래와 같은 키워드를 찾았습니다. 

        WINHTTP_OPTION_SECURITY_FLAGS 

        SECURITY_FLAG_IGNORE_UNKNOWN_CA 

        SECURITY_FLAG_IGNORE_CERT_CN_INVALID 

        SECURITY_FLAG_IGNORE_CERT_DATE_INVALID 

        (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384066(v=vs.85).aspx


        위의 플래그들이 잘못된 인증서를 무시하라는 옵션설정으로 보입니다. 


        3, 위 보안 플래그를 설정하는 데모 

        http://www.nldelphi.com/showthread.php?39901-Bad-cipher-melding 

        http://www.experts-exchange.com/Programming/Languages/Pascal/Delphi/Q_26824117.html

        위 링크를 참고해 첨부파일의 샘플을 만들어 보았습니다. 

        주요 코드는 아래와 같으며 WinInet을 이용하기 위해 uses 절에 "Winapi.WinInet"를 추가해야 합니다.

        ReqFlags := ReqFlags
                      or SECURITY_FLAG_IGNORE_UNKNOWN_CA
                      or SECURITY_FLAG_IGNORE_CERT_CN_INVALID
                      or SECURITY_FLAG_IGNORE_CERT_DATE_INVALID
                      or SECURITY_FLAG_IGNORE_REVOCATION;
          // Set new flags
          if not(InternetSetOption(hReq, INTERNET_OPTION_SECURITY_FLAGS, @ReqFlags, dwSize)) then begin
            // Get error code
            dwError := GetLastError;
            // Failure
            MessageBox(0, PChar(IntToStr(dwError)), PChar('Confirm'), MB_OK or MB_ICONINFORMATION);
          end;


        4, 테스트 & 결과

        DelphiIgnoreUnknownCA.zip


        첫번째 버튼은 TIdHttp 컴포넌트로 https를 호출하고 

        두번째 버튼은 WinInet을 이용했습니다. 


        아쉽게도 인증서 오류가 발생한 환경이 없어 고객에게 테스트 요청했습니다. 결과가 오거나 테스트 환경을 찾게되면 테스트 후 결과를 추가하겠습니다.(기본 동작만 https를 제공하는 facebook에서 확인한 상태입니다.)

        ===============================

        [테스트 결과 추가]

        고객사에서는 Release 모드인 경우 통과 Debug 모드인 경우 3회의 통신 오류 후 응답 수신되었다는 결과를 받았습니다.

        (하지만, 고객사의 내부보안이 강력해 보안 이슈도 고려해야하는 결과였습니다.)

        험프리 험프리.김현수 Delphi/C++Builder SSL, Wininet

        [FireDAC Skill Sprints] 3. 캐쉬를 이용한 업데이트와 자동증가필드(Identity) 적용

        2015. 3. 5. 14:59

        엠바카데로에서 FireDAC Skill Sprint 웨비나(1월 23일 ~ 3월 27일: 매주 금요일 10시)를 진행하고 있습니다.


        이 글에서는 웨비나 다시보기와 함께 웨비나 일부 내용을 샘플코드와 함께 소개합니다. 하단 온라인 기술 도움말 링크를 통해 더 자세한 내용을 추가학습하시기 바랍니다.


        3회차에서는 FireDAC의 Cached Updates와 Auto-Inc Fields에 대해 진행했습니다.

        캐쉬를 이용한 업데이트

        캐쉬 업데이트는 애플리케이션의 메모리 영역(즉, 데이터셋)에 업데이트 내역을 기록하고, DBMS에 한번에 업데이트하거나 일괄취소할 수 있는 기능입니다.

        캐쉬 업데이트를 사용하면 작업내용을 로컬에서 관리하므로 DBMS와의 트래픽을 줄일 수 있고, 사용자는 인터넷속도와 관계없이 빠르게 작업할 수 있습니다. 그리고 부가적으로 작업이력을 확인(변경된 레코드 조회, 변경된 값 확인 등)하고, 작업을 되돌리는 기능(최종작업 되돌리기, 선택 레코드 되돌리기 등)등을 제공되는 메소드를 이용해 손쉽게 구현할 수 있습니다.


        캐쉬 업데이트를 적용하려면 데이터셋(예> TFDQuery, TFDTable)의 CachedUpdates 속성을 True로 설정합니다.


        캐쉬 업데이트는 분산 캐쉬 업데이트 모드와 중앙 캐쉬 업데이트 모드를 제공합니다.

        • 분산 캐쉬 업데이트 모드 - 각 데이터셋이 다른 데이터셋과 관계없이 변경사항을 추적합니다.(기본 모드)
        • 중앙 캐쉬 업데이트 모드 - 여러 데이터셋을 단일 변경로그에 시간순으로 기록합니다.(중앙 캐쉬 업데이트 모드 자세히 보기)

        캐쉬 업데이트 주요 메소드

        다음은 캐쉬 업데이트에서 사용하는 주요 메소드입니다. 메소드에 대한 설명만 기록합니다. 메소드의 상세설명과 사용법은 FireDAC 기술문서 - Caching Updates(FireDAC) 를 참고하기 바랍니다.


        업데이트 내역 추적

        캐쉬 업데이트 사용 시 업데이트 내역을 추적할 수 있고, 변경을 취소할 수 있습니다.

        • UpdatesPending - 변경 로그가 있으면 True 를 반환합니다. 
        • ChangeCount - 변경된 레코드 수를 반환합니다.
        • UpdateStatus - 현재 레코드의 변경 유형을 반환합니다. 
        • FilterChanges - 레코드를 변경 유형으로 필터링 할 수 있도록합니다.
        업데이트 취소
        기존 변경을 취소하기 위한 프로퍼티와 메소드
        • SavePoint - 변경 로그의 현재 상태를 설정 / 가져옵니다. 
        • RevertRecord - 현재 레코드를 이전 상태로 되돌립니다. 
        • UndoLastChange - 마지막으로 수정 한 레코드로 이동하고 레코드를 이전 상태로 되돌립니다. 
        • CancelUpdates - 변경 로그에 포함 된 모든 레코드를 취소합니다.

        업데이트 적용

        캐쉬의 변경을 데이터베이스에 적용하려면 ApplyUpdates 메소드를 사용합니다. 레코드 적용 시 예외가 발생한 경우 그 예외는 레코드에 연결됩니다. 

        ApplyUpdates 메소드는 다음 특징이 있습니다.

        • ApplyUpdates 시 예외를 발생하지 않고 리턴값으로 예외 수 반환
        • 트랜젝션으로 업데이트가 적용되지 않는다. 애플리케이션에서 ApplyUpdates로 적용해야 한다.
        • 즉시 업데이트와 데이터셋 처리 방식은 동일하다.
        업데이트 이후 수정 된 레코드는 변경 로그가 남아 있어, 변경로그를 삭제하려면 CommitUpdates 메소드를 호출해야 합니다.

        FDQuery1.Append;
        ...
        FDQuery1.Post;
        FDConnection1.StartTransaction;
        iErrors := FDQuery1.ApplyUpdates;
        if iErrors = 0 then begin
          FDQuery1.CommitUpdates;
          FDConnection1.Commit;
        end
        else
          FDConnection1.Rollback;

        캐시를 이용한 업데이트에 대한 자세한 내용은 FireDAC 기술문서 - Caching_Updates를 참고하기 바랍니다.

        자동 증가 필드

        FireDAC은 새로운 레코드 추가 시 자동증가 컬럼에 새로운 값을 할당 할 수 있습니다.(즉시 업데이트와 캐쉬 업데이트 모두에서 동작) 

        DBMS의 자동 증가 필드는 다음과 같이 특수한 Identity(또는 유사한) 컬럼 데이터형식을 사용하거나 제너레이터(또는 시퀀스)와 테이블 트리거를 사용해 구현됩니다.

        FireDAC에는 DBMS 별로 자동 인식 방식과 수동 지정 방식으로 처리해야 합니다.

        DBMS 

        자동증가 컬럼 구현 

         인식

         InterBase

         Generator와 BEFORE INSERT 트리거

         자동인식 및 수동 지정

         Microsoft SQL Server

         IDENTITY 데이터타입

         자동증가 데이터 형식으로 자동 인식

         Oracle

         시퀀스와 BEFORE INSERT FOR EACH ROW 트리거

         수동 지정

         MySQL

         AUTO_INCREMENT 데이터 타입

         자동증가 데이터 형식으로 자동 인식

         SQLite INTEGER PRIMARY KEY AUTOINCREMENT 데이터 타입

         자동증가 데이터 형식으로 자동 인식

        - FireDAC 기술문서 참고 - http://docwiki.embarcadero.com/RADStudio/XE7/en/Auto-Incremental_Fields_(FireDAC)


        자동 인식

        FireDAC에서 자동 증가 데이터 형식 컬럼을 자동 인식하고 아래와 같이 설치됩니다.

        • TField.DataType = dtInt32 또는 dtUInt32의 경우 ftAutoInc (TFDAutoIncField), 그렇지 않은 경우는 수치 데이터 형 ftXxxx 중 하나 
        • TField.Required = False 
        • TField.ReadOnly = True 
        • TField.ProviderFlags = [pfInWhere] 또는 열이 기본 키 구성 요소의 경우 [pfInWhere, pfInKey]


        수동 지정

        다음 방법 중 하나를 사용해 자동 증가 모드를 수동으로 지정할 수 있습니다.
        • UpdateOptions.AutoIncFields 속성에서 자동 증가 컬럼을 설정
        • TFDAutoIncField를 직접 만듭니다.(컬럼이 ftAutoInc / ftInteger / ftLongWord 필드 형이여야 함)
        • TFieldAutoGenerateValue를 자동 증가 필드에 해당하는 arAutoInc로 설정(ProviderFlags, Required, ReadOnly 설정이 필요할 수 있음)
        자동 증가 필드 사용에 대한 자세한 내용은 FireDAC 기술문서 - Auto-Incremental Fields를 참고하기 바랍니다.

        캐쉬 업데이트 샘플 프로그램 소개

        이 샘플에서는 캐쉬 업데이트를 적용해 아래 기능이 구현되어 있습니다.

        • 변경내용 일괄적용 / 일괄취소
        • 변경이력(캐쉬) 보기 / 변경 전의 값 확인
        • 마지막 / 선택 레코드 변경 취소
        • 저장 지점 생성(등록) / 되돌리기
        그리고 인터베이스 DB에서 자동증가 설정(Generator & Trigger 이용) 되어 있는 SQL 컬럼을 사용할 수 있도록 설정되어 있습니다.

        [샘플코드 받기 - 데브기어 github 페이지]


        자동증가 설정(데이터모듈 생성 시)

        데이터베이스와 연결된 상태에서 데이터셋(TFDQuery, TFDTable)에서 필드를 추가합니다.

        (모든 필드 추가 : 데이터셋 컴포넌트 > 우측 마우스 메뉴 > Fields Editor > 우측 마우스 > Add all fields)

        자동 증가 컬럼(SEQ) 선택 후 AutoGenerateValue 속성을 arAutoInc로 설정합니다. 
        코드로 진행 시 아래와 같습니다.

        SEQ(자동증가 컬럼) 선택 후 AutoGenerateValue 속성을 arAutoInc로 설정합니다. 아래의 코드로 설정 가능합니다.

        procedure TDM.DataModuleCreate(Sender: TObject);
        begin
          // Auto-Inc 설정
          FDQuery1SEQ.AutoGenerateValue := arAutoInc;
          FDQuery1SEQ.Required := False;
          FDQuery1SEQ.ReadOnly := True;
        
          // CachedUpdates 설정
          FDQuery1.CachedUpdates := True;
        end;

        캐쉬 업데이트 - 일괄적용 / 일괄취소

        procedure TForm2.btnApplyUpdatesClick(Sender: TObject);
        var
          iErr: Integer;
        begin
          DM.FDConnection1.StartTransaction;
        
          // ApplyUpdates는 오류를 발생하지 않음
          iErr := DM.FDQuery1.ApplyUpdates(-1);
          if iErr = 0 then
          begin
            DM.FDQuery1.CommitUpdates; // 변경로그 지우기
            DM.FDConnection1.Commit;
          end
          else
            DM.FDConnection1.Rollback;
        
          DM.FDQuery1.Refresh;
        end;
        
        procedure TForm2.btnCancelUpdatesClick(Sender: TObject);
        begin
          DM.FDQuery1.CancelUpdates;
          DM.FDQuery1.Refresh;
        end;
        캐쉬 업데이트 - 업데이트 이력 추적
          // 캐쉬 보기
          if DM.FDQuery1.Active then
          begin
            DM.FDMemTable1.CloneCursor(DM.FDQuery1, True);
            DM.FDMemTable1.FilterChanges := [rtModified, rtInserted, rtDeleted];
          end;
        
          // 이전 값 확인
          ShowMessage(format('이전 값: %s  ->  새로운 값: %s', [
                              DM.FDQuery1.FieldByName('FIELD1').OldValue,
                              DM.FDQuery1.FieldByName('FIELD1').Value]));
        
          // 마지막 변경 취소
          DM.FDQuery1.UndoLastChange(True);
        
          // 선택 레코드 변경 취소
          DM.FDQuery1.RevertRecord;
        
          // 저장점 생성
          FSavePoint := DM.FDQuery1.SavePoint;
        
          // 저장점으로 되돌리기
          if FSavePoint > 0 then
            DM.FDQuery1.SavePoint := FSavePoint;

        관련 링크


        험프리 험프리.김현수 데이터 엑세스

        [FMX] ListBox 전체체크 기능 구현하기

        2015. 3. 4. 13:28

        리스트박스(TListBox)에 체크박스를 두고 버튼 클릭 시 전체체크하는 기능에 대한 문의가 있어 정리해 봤습니다.


        이 글에서는 아래 내용을 학습할 수 있습니다.

        • 리스트박스를 동적으로 생성하는 방법
        • 리스트박스 아이템에 체크박스를 표시하는 속성

        화면 구성

        컴포넌트 속성 설정

        주요 속성을 설정합니다.(Object Inspector에서 속성을 설정해도 됩니다.)

        procedure TForm2.FormCreate(Sender: TObject);
        begin
          Button1.StaysPressed := True; //버튼 눌림(IsPressed) 상태 유지
        
          ListBox1.DefaultItemStyles.ItemStyle := 'listboxitemrightdetail'; // 텍스트와 오른쪽에 상세정보가 표시되도록 기본속성 지정
          ListBox1.ShowCheckboxes := True; // 리스트박스 항목에 체크박스가 표시되도록 설정
        end;

        새로고침

        procedure TForm2.Button2Click(Sender: TObject);
        var
          I: Integer;
          Item: TListBoxItem;
        begin
          ListBox1.Items.Clear;
          ListBox1.BeginUpdate;
          try
            for I := 0 to 10 do
            begin
              Item := TListBoxItem.Create(ListBox1);
              Item.Parent := ListBox1;
              Item.Text := 'Item ' + I.ToString;
              Item.ItemData.Detail := 'Description';
            end;
          finally
            ListBox1.EndUpdate;
          end;
        end;

        전체선택

        procedure TForm2.Button1Click(Sender: TObject);
        var
          I, Idx: Integer;
        begin
          Idx := ListBox1.ItemIndex;
          ListBox1.BeginUpdate;
          try
            for I := 0 to ListBox1.Items.Count - 1 do
            begin
              ListBox1.ListItems[I].IsChecked := Button1.IsPressed;
            end;
          finally
            ListBox1.EndUpdate;
            ListBox1.ItemIndex := Idx;
          end;
        end;

        소스코드

        ProjectLBCheck.zip


        Tips>

        커스텀 스타일로 TListBoxItem 스타일을 만드는 경우 TCheckBox의 StyleName을 "check"로 지정하기 바랍니다.


        험프리 험프리.김현수 파이어몽키

        RAD Studio 2015년 로드맵

        2015. 3. 3. 09:37

        RAD Studio(델파이, C++빌더)의 2015년도 로드맵이 발표되었습니다.



        제가 본 주요 기능은

        • iOS 64bit 지원(델파이, C++빌더)
        • LLVM 기반 32bit C++ 컴파일러
        • 개발환경 - IDE 안정성, IDE에서 라이브러리 관리, 생산성 향상 등
        • Windows 10 지원(VCL, FireMonkey), 새로운 컴포넌트와 라이브러리 등
        • FireMonkey - 모바일 컴포넌트 추가(맵 등), iOS 컨트롤 강화(z-order관리 등), 성능최적화
        • 사물인터넷 - 비콘 기술 지원 기대, 이종 API를 사용하는 이기종 기기와 장치와 컴포넌트 기반 연결 등
        • 기업형, 멀티티어 - Change Views(Interbase XE7), NoSQL 지원, EMS: 푸쉬알림등 확장장, 데이터스냅 개선
        • 기타 플랫폼 기반 기술 - 2015년도 안드로이드, iOS 지원, 리눅스기반 웹서비스 어플리케이션(WebBroker, 데이터스냅, EMS) 등
        자세한 내용은 아래 링크를 통해 확인하시기 바랍니다.



        험프리 험프리.김현수 RAD Studio 정보 roadmap

        [VCL] 에디트에 숫자만 입력, 콤마찍기

        2015. 3. 2. 16:05

        VCL 에디트(TEdit)의 NumbersOnly 속성을 이용하면 컨트롤에 숫자만 입력받도록 구현할 수 있다는 것 잘 아실텐데요.이번 글에서는 숫자 입력 시 콤마를 자동추가할 수 있도록 구현한 내용 공유합니다.


        기능은 2가지입니다.

        • 키입력 시 3자리마다 콤마 추가(e.g. 123,456,789,012)
        • 에디트에서 순수 숫자만 읽고 쓰기(PlainText 속성 추가)

        구현은 여러폼에서 uses에 추가하기만 하면 동작하도록 별도의 유닛으로 만들었습니다.

        unit Vcl.EditExtends;
        
        interface
        
        uses
          Vcl.StdCtrls, Vcl.Controls, System.Classes;
        
        type
          TEdit = class(Vcl.StdCtrls.TEdit)
          private
            function GetPlainText: string;
            procedure SetPlainText(const Value: string);
          protected
            procedure KeyUp(var Key: Word; Shift: TShiftState); override;
          public
            property PlainText: string read GetPlainText write SetPlainText;
          end;
        
        implementation
        
        uses
          SysUtils;
        
        { TEditEx }
        
        procedure TEdit.KeyUp(var Key: Word; Shift: TShiftState);
        var
          S: string;
        begin
        
          inherited;
        
          S := Text;
          S := S.Replace(',', '').Replace('.', '');
          Text := FormatFloat('#.###,##', StrToFloatDef(S, 0));
          selStart := Length(Text) + 1;
        end;
        
        function TEdit.GetPlainText: string;
        var
          S: string;
        begin
          S := Text;
          Result := S.Replace(',', '').Replace('.', '');
        end;
        
        procedure TEdit.SetPlainText(const Value: string);
        var
          Key: Word;
        begin
          Text := Value;
          KeyUp(Key, []);
        end;
        
        end.

        NumbersOnly.zip


        사용법은 

        1. 폼에 Edit 컴포넌트를 추가하고 Vcl.EditExtends를 상단(interface) uses 절에 추가합니다.(Vcl.StdCtrls 뒤에 Vcl.EditExtends가 추가되야 합니다.)
        2. 키입력시 콤마 추가는 자동으로 동작합니다.
        3. 순수 숫자 넣고 읽기는 PlainText 메소드를 이용할 수 있습니다.
        기타 필요한 기능 추가해서 사용하시기 바랍니다.(알려주시면 기능을 추가해서 올리겠습니다.)


        험프리 험프리.김현수 Delphi/C++Builder

        [XE7] iOS 시뮬레이터 배포 시 'Please specify exact device preset UUID.' 오류 대응

        2015. 2. 24. 17:48

        iOS 시뮬레이터 실행 시 아래와 같은 오류 발생 시 대처사항입니다.



        결과적으로 원인은 RAD Studio XE7에서 iOS Simulator 8.1을 지원하지 않아서 입니다.

        (iOS Device에서는 8.1을 지원합니다.)

        Hotfix iPhone Simulator 7.1 지원

        RAD Studio XE7 출시 이후 나온 7.1에 대한 패치가 필요합니다. 아래 글의 2번째 Hotfix 설치하기 바랍니다.

        iPhone Simulator 7.1 설치 및 설정

        1. 맥에서 XCode(6.1) 실행 > XCode > Preferences... > Download 화면에서 iOS 7.1 Simulator 다운로드
        2. 델파이 Project Manager의 iOS Simulator에서 Property > SDK에서 iPhoneSimulator 7.1 선택(없으면 Add new... 선택)
        3. (PAServer가 연결된 상태에서)자동으로 iPhoneSimulator 7.1 관련 라이브러리 생성(만약 동작하지 않으면 PAServer 재시작)
        4. iOS Simulator로 다시 배포 및 테스트


        험프리 험프리.김현수 파이어몽키