Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

이 사이트 검색

검색 태그: 'faq'.

  • 태그로 검색

    태그 사이를 쉼표(,)로 구분하세요.
  • 작성자로 검색

콘텐츠 유형


게시판

  • 엠바카데로 (Embarcadero) 개발도구: 델파이 (Delphi), C++빌더 (C++Builder), RAD 스튜디오 (RAD Studio)
    • [기술 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [설치/등록 Q&A 게시판] 델파이, C++빌더, RAD 스튜디오
    • [기술 기고 게시판] 델파이, C++빌더, RAD 스튜디오
    • [포트폴리오 게시판] 내가 참여한 프로젝트/프로그램 소개
    • [구인 게시판] 개발자 채용/프로젝트 의뢰
  • 엠바카데로 (Embarcadero) DBMS: 인터베이스 (InterBase)
    • [기술 Q&A 게시판] 인터베이스
    • [설치/등록 Q&A 게시판] 인터베이스
    • [기술 기고 게시판] 인터베이스
  • 비주얼 스튜디오 (Visual Studio) 관련 도구
    • [기술 Q&A 게시판] 비주얼 어시스트
    • [설치/등록 Q&A 게시판] 비주얼 어시스트
    • [기술 기고 게시판] 비주얼 어시스트
  • 구록 (Gurock) 테스트도구: 테스트레일 (TestRail)
    • [기술 Q&A 게시판] 테스트레일
    • [설치/등록 Q&A 게시판] 테스트레일
    • [기술 기고 게시판] 테스트레일
  • 아이데라 (Idera) 데이터 도구: 아쿠아 데이터 스튜디오 (Aqua Data Studio), ER/Studio 등
    • ER스튜디오 (ER/Studio)
    • 아쿠아 데이터 스튜디오 (Aqua Data Studio)
  • API레이어 (Apilayer) 개발 도구: API레이어 (Apilayer)
    • [Q&A 게시판] API레이어 (Apilayer)
  • 엠바카데로 (Embarcadero) 라이선스 서버: ELC (Enterprise License Center)
    • [게시판] ELC (Enterprise License Center) 라이선스 서버
  • 이 사이트 이용 관련
    • [게시판] 이 사이트 관련 이용 팁과 Q&A

Categories

  • 이달의 기술자료: 엠바카데로
  • 비디오 세미나
    • UX Summit
    • DelphiCon
    • CodeRage
    • 데브기어 세미나
    • Skill Sprint
  • 기술백서(PDF)

Categories

  • 시작하기
  • 설치/등록/라이선스
  • 튜토리얼
  • 도서

Categories

  • RAD 스튜디오 역사관
  • 11 알렉산드리아
  • 10.4 시드니
  • 10.3 리오
  • 10.2 도쿄
  • 10.1 베를린
  • 10.0 시애틀
  • XE8~XE
  • 2010~6.0

...에서 결과 찾기

검색어 일치 조건


최초 작성일

  • Start

    End


최종 변경일

  • Start

    End


개수로 필터링...

가입

  • Start

    End


Group


자주 쓰는 도구

  1. Docwiki에 있는 "GUI Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) FireDAC 사용자 화면 즉 GUI 관련 질문과 답변을 정리한 목록이다. Q1: 오래 걸리는 쿼리가 실행되는 동안 "Application is busy" 대화창을 표시하는 방법은? A: FDQuery.ResourceOptions.CmdExecMode에 amCancelDialog를 지정하고, 폼 위에 TFDGUIxAsyncExecuteDialog 대화창을 올려둔 다음, 오래 걸리는 쿼리를 준비하고 실행하여 테스트하라. 쿼리가 실행되는 동안, FireDAC은 "Wait" 레이블이 보이고 "Cancel" 버튼이 들어 있는 대화창을 표시한다. 사용자가 "Cancel" 버튼을 누르면 해당 쿼리 실행이 취소된다. Q2: FDGUIxLoginDialog 대화창을 현지화 하는 방법은? A: 코드 작성을 아래와 같이 하라: with FDGUIxLoginDialog1.VisibleItems do begin Clear; Add('User_Name=<local phrase>'); Add('Password=<local phrase>'); end; 또한, FireDAC.Stan.ResStrs 유닛을 열고, "Dialog captions" 섹션을 찾아서 항목을 번역을 할 수도 있다. Q3: TFDGUIxErrorDialog 대화창을 사용하여 에러를 다루는 방법은? A: 폼(form) 또는 데이터 모듈(data module) 위에 TFDGUIxErrorDialog 컴포넌트를 놓아 두어라. 그러면, 처리되지 않은(unhandled) EFDDBEngineException 예외를 다룰 수 있도록 FireDAC 에러 대화창이 표시된다. 이렇게 하기 위해, FireDAC은 TApplication.OnException 이벤트를 낚아챈다(hook). Q4: SQL 모래시계(hourglass)를 완전히 꺼버리는 방법은? A: a) 애플리케이션에서 기다림 커서 (wait cursor)를 완전히 비활성화 하려면, TFDGUIxWaitCursor에서 Provider = 'Console'로 지정하여 사용하라. 'Console' 프로바이더는 기다림 커서 (wait cursor) 구현이 비어있어서 FireDAC에서 기다림 커서 (wait cursor)를 표시하지 않는다. 만약 마우스 커거사 여전히 바뀐다면, uses 절에 오직 FireDAC.ConsoleUI.Wait 유닛 만 있는지 그리고 FireDAC.VCLUI.Wait 와 FireDAC.FMXUI.Wait가 잘 빠져있는 지를 확인하라. 이 방식에서는 당신이 기다림 커서 (wait cursor)를 다시 활성화 할 수는 없다는 점을 유의하라. b) 기다림 커서 (wait cursor)를 비활성화 한 후에, 언젠가 다시 활성화 할 필요가 있다면 코드를 다음과 같이 작성하라: FDWaitCursor1.ScreenCursor := gcrNone; 또는 FDManager.ResourceOptions.SilentMode := True; c) 기다림 커서 (wait cursor)와 FireDAC 대화창을 비활성화 한 후에, 언젠가 다시 그것들을 활성화 할 필요가 있다면, FDManager.SilentMode 프로퍼티에 True를 지정하라. 그러면 기다림 커서 (wait cursor)와 FireDAC 대화창을 비활성화이 모두 비활성화 된다. 여기에 해당되는 창은: 에러 대화창 비동기 실행(Async execution) 대화창 로그인 대화창 스크립트 진행 대화창 ResourceOptions.SilentMode에 True를 지정하면 오직 기다림 커서 (wait cursor)만 비활성화 된다. Q5: 데이터셋(dataset)에 필터(filter)를 적용했는데, 그리드(grid)의 스크롤 바가 변하지 않고 그대로 이다. 왜 그런가? Q: FDDataSet에 연결되 그리드(grid)가 있는데 아래와 같이 레코드를 필터링했다: Grid.DataSource.Dataset.Filter := 'id_virtual_channel in (1, 2, 3)' 모든 것이 잘 되었지만, 그리드의 스크롤 바가 변하지 않고 그대로 있어서 마치 필터가 적용되지 않고 여전히 전체 행(row) 있는 것처럼 보인다. 상당히 좋지 않은데, 예를 들면 그리드에 있는 행(row)의 전체 갯수가 500개 이고, 필터링을 하여 3개만 보여주는데도 그리드의 스크롤 바는 여전히500개 일때와 동일하게 매우 작아서 아주 조금만 움직일 수 있다 (마치 필터링 후에도 여전히 결과는 500개이고 단지 화면에서 3개만 보여주고 있는 것처럼 느끼게 된다). 해결책이 있나? A: 코드 작성을 아래와 같이 하라: FDQuery1.FetchOptions.RecordCountMode := cmVisible; Q6: 데이터셋(dataset)을 새로고침(refresh)하고 나면, DBGrid에서 선택되어 있던 행 여러개가 모두 선택 해제되어 버린다. 선택을 유지하는 방법은? A: Refresh가 호출되고 나면 FireDAC 북마크(bookmark)가 무효화된다. Refresh를 호출하기 전에 선택된 레코드들의 PK 값을 저장해 두었다가 Locate 메소드를 사용하여 해당 레코드들을 다시 선택되도록 하라.
  2. Docwiki에 있는 "SQL Scripts Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) SQL 스크립트 실행 관련 질문과 답변을 정리한 목록이다. Q1: 쿼리 끝에서 세미콜론(;)을 사용하지 못하는 이유는? 쿼리에서 이것을 제거했더니 작동한다. A: ';'는 많은 SQL 스크립트 사투리에서 SQL 명령(command)의 구분자(delimiter)일 뿐이고, SQL 언어가 아니다. 몇몇 DBMS에서는 SQL 명령(command)의 끝에 ';'을 허용하고, 어떤 것들은 허용하지 않는다. 다시 말하자면, 그냥 ';'를 제거하라. Q2: 몇몇 DBMS (PG, Oracle, FB)에서는 SQL 구문을 오직 하나만 실행할 수 있다. 하지만, SQLite 에서는 구문 여러 개를 한번에 실행할 수 있다. 왜 그런가? A: 그렇게 설계되어 있기 때문이다 – ExecSQL 메소드는 SQL 명령을 있는 그대로 DBMS API에게 전달한다. 만약 DBMS에서 "묶음(batch)" 쿼리를 지원한다면, 실행이 될 것이고, 그렇지 않다면 실패할 것이다. TFDScript를 사용하면 SQL 명령(command) 여러 개를 담은 SQL 스크립트들을 실행하고 명령을 제어할 수 있다. Q3: 스크립트가 1개 이상 있는데도, ExecuteAll는 오직 첫번째 스크립트만 실행한다. A: 첫번째 스크립트가 "근본(root)" 스크립트이다. 다른 스크립트들 실행하려면, "근본(root)" 스크립트에서 명시적으로 호출해야 한다. 예를 들면: with FDScript1.SQLScripts do begin with Add do begin Name := 'root'; SQL.Add('@first'); // 명시적으로 '첫번째' 스크립트 호출 SQL.Add('@second'); // 명시적으로 '두번째' 스크립트 호출 end; with Add do begin Name := 'first'; SQL.Add('create table t1 ...;'); SQL.Add('create table t2 ...;'); end; with Add do begin Name := 'second'; SQL.Add('create procedure p1 ...;'); SQL.Add('create procedure p2 ...;'); end; end; ExecuteStep은 TFDScript.Position 지점으로 부터 그 다음 스크립트 명령을 실행한다. ExecuteAll은 스크립트 전체를 실행한다. ValidateAll / ValidateStep 메소드도 있다. 이 메소드들은 스크립트를 진행하지만, SQL 스크립트를 실행하지는 않는다. ValidateAll을 호출하면 TFDScript.TotalJobSize에 값을 할당(assign)한다. 따라서 그 다음에 ExecuteAll을 호출하면 TFDScript.TotalPct10Done을 올바르게 업데이트 한다. 이것은 진행된 스크립트 명령의 10%에 해당된다. Q4: (1) 각 SQL 구문마다 FDConnection.ExecSQL 실행하기 (2) FDScript.ExecuteAll 실행하기는 성능 상 차이가 있는가? : A: 이 2개의 메소드 뒤에서 SQL을 실행하는 코드는 동일하다. 둘 다 IFDPhysCommand.Execute 메소드를 사용한다. TFDScript 파서(parser, 구문 분석기)는 고도로 최적화되어 있다. 이 파서는 Oracle PL/SQL (여기에서는 명령문 안에 ';'이 들어 있을 수 있다) 등 DBMS 마다 제각각인 많은 SQL 사투리를 인식하며 정밀하고 유연하게 제어한다. 따라서, 당신이 FDConnection.ExecSQL에 한번에 하나의 명령(command)을 제출한다면, 이런 명령들을 별도의 스크립트 하나로 뽑아 내거나 할 필요가 없다. FireDAC이 알아서 가장 빠른 방식을 사용할 것이다. 만약 SQL 스크립트가 파일 하나 안에 들어 있다면 FDScript.ExecuteAll이 가장 빠른 방식이다. Q5: 스크립드 작업이 실패했을 때 롤백(ollback)하는 방법은? A: 1) Use FireDAC 트랜젝션 제어를 사용한다: FDConnection1.StartTransaction; try FDScript1.ExecuteAll; FDConnection1.Commit; except FDConnection1.Rollback; raise; end; 2) Oracle인 경우 PL/SQL 블록을 사용하고, 다른 DBMS라면 이와 유사한 구조를 사용한다: begin insert into u_btk.t_test values (1, sysdate); insert into u_btk.t_test values (2, sysdate); insert into u_btk.t_test values (1, sysdate); commit; exception when others then rollback; raise; end; 3) TFDScript.OnError를 사용한다: procedure TForm1.FDScript1Error(ASender: TObject; const AInitiator: IFDStanObject; var AException: Exception); begin FDConnection1.Rollback; end; Q6: 아래 스크립트를 FB(파이어버드)에서 실행하면, “Unexpected end of command line 3” 에러가 난다. 어떻게 고치나? EXECUTE BLOCK AS DECLARE VARIABLE MYVAR VARCHAR(250); BEGIN ... END; A: block(블록)을 가진 SQL 스트립트를 실행하려면, block(블록) 앞에서 명령 구분자(command separator)를 변경해야 한다. 원한다면 블록 처리 뒤부터 다시 원래대로 돌려놓을 수도 있다. 예를 들면; SET TERM #; EXECUTE BLOCK ... END; # SET TERM ;#
  3. Docwiki에 있는 "Metadata Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 메타데이터(metadata) 추출 관련 질문과 답변을 정리한 목록이다. Q1: 데이터베이스 안에 테이블(table)이 존재하는 지를 확인하는 방법은? A: 기본 방식 2가지가 있다: 1) try FDQuery1.Open('select * from tab where 0 = 1'); Result := True; except on E: EFDDBEngineException do if E.Kind = ekObjNotExists then Result := False else raise; end; 2) var oList: TStrings; begin oList := TStringList.Create; try FDConnection1.GetTableNames('', '', ATableName, oList, [osMy, osOther, osSystem], [tkTable, tkTempTable, tkLocalTable]); Result := oList.Count > 0; finally oList.Free; end; end; 첫번째가 보다 최적화된 방식이다. Q2: Oracle에서, TFDMetaInfoQuery를 사용하여 패키지 프로시저(package procedure)를 받아낼 수 있나? A: 오라클 패키지인 PACKAGE_NAME의 프로시저(procedure) 목록을 반환하는 코드는 아래와 같다: FDMetaInfoQuery1.BaseObjectName := 'PACKAGE_NAME'; FDMetaInfoQuery1.MetaInfoKind := mkProcs; FDMetaInfoQuery1.Open; Q3: TFDMetaInfoQuery를 사용하여 인덱스(index) 이름을 얻는 방법은? A: MY_TAB 테이블용 인덱스(index) 목록을 반환하는 코드는 아래와 같다: FDMetaInfoQuery1.ObjectName := 'MY_TAB'; FDMetaInfoQuery1.MetaInfoKind := mkIndexes; FDMetaInfoQuery1.Open; Q4: 쿼리 빌더(Query Builder), 디자인-타임 에디터, 메타데이터 추출 함수 등은 현재의 스키마(schema)에 속해 있는, 즉 스키마(schema)/카탈로그(catalog)에 해당 접두사가 달려있는 오브젝트 이름들을 반환한다. 제외하는 방법은? A: 2가지 옵션이 있다: TFDConnection.GetXxxxName을 호출할 때 AFullName에 False를 지정한다; FireDAC에는 연결 정의(connection definition) 일반 파라미터가 2개 있다 - MetaCurCatalog와 MetaCurSchema이다. DBMS에 따라, 둘 중 하나 또는 둘 다 지원된다 (자세한 내용은 FireDAC Database Connectivity 참고). 만약 명시된 MetaDefCatalog 카탈로그(catalog)/MetaDefSchema 스키마(schema)에 속해 있는 오브젝트라면 오브젝트 이름에서 이 스키마(schema)/카탈로그(catalog)의 이름이 제외된다. 따라서 MetaDefCatalog/MetaDefSchema에 당신의 개발 스키마(schema)/카탈로그(catalog)의 이름을 지정하라. 그러면 애플리케이션을 다른 스키마(schema)/카탈로그(catalog)로 배포할 수 있다. Q5: Oracle 저장 프로시저(stored procedure)를 public synonym을 이용하여 호출한다, 그러나 FireDAC이 항상 해당 저장 프로시저 이름에 스키마(schema) 이를을 덛붙인다. 피하는 방법은? A: FireDAC에는 연결 정의(connection definition) 일반 파라미터가 2개 있다 - MetaCurCatalog와 MetaCurSchema이다. DBMS에 따라, 둘 중 하나 또는 둘 다 지원된다 (자세한 내용은 FireDAC Database Connectivity 참고). 여기에 '*'를 지정하면 오브젝트의 전체 이름 중 대응되는 이름 부분을 사용하지 않도록 할 수 있다.
  4. Docwiki에 있는 "Integration with 3rd Party Products Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 써드 파티 제품 통합 관련 질문과 답변을 정리한 목록이다. Q1: 패스트리포트(FastReport) 애드-온(add-on)이 제공되는가? 공식적으로 지원되는가? A: FastReport에 문의하기 바란다. Q2: 단방향(Unidirectional) 쿼리와 DevExpress 그리드. Query.FetchOptions.Unidirectional = True로 설정했는데, TDataset(Query)이 단방향으로 지정되지 않는다(TDataset(Qurey).IsUnidirectional = False). DevExpress 그리드와 문제가 있기어서 그렇다. A: 이 문제가 발생하는 이유. TDataset(Query).IsUnidirectional에 True를 지정하면 TFDDataSet 기능이 깨진다. 지금 당장은, 올바른 해결책이 없고 추가 조사가 필요하다. DevEx 소스를 수정하여 이 이슈를 피하도록 변경하기를 권한다. 그렇게 하려면: ExpressDataController\Sources\cxDBData.pas 유닛을 연다: TcxDBDataProvider.IsUniDirectional 부분을 찾아서 아래 코드로와 같이 교체한다: function TcxDBDataProvider.IsUniDirectional: Boolean; begin if Assigned(DataSet) then begin {$IFDEF DELPHI6} if DataSet.IsUniDirectional then Result := True else {$ENDIF} if DataSet is TFDRdbmsDataSet then Result := TFDRdbmsDataSet(DataSet).FetchOptions.Unidirectional else Result := False; end else Result := False; end;
  5. Docwiki에 있는 "Editing Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 데이터 편집하기 관련 질문과 답변을 정리한 목록이다. Q1: "[FireDAC][DApt]-400. Update command updated [0] instead of [1] record"는 무슨 뜻인가? A: 이 에러는 FireDAC 안에 float / double / single / date / datetime / time 또는 기타 이와 같은 테이블(table) 필드(field)가 있을 때 종종 발생한다. 이런 필드들은 WHERE 절에서 정확도 손실(precision loss)의 영향을 받는다. 정확도 손실은 애플리케이션에서 파라미터에 값을 할 때 할 때 생길 수 있다. 그 결과, WHERE 절에서 레코드를 하나로 반환하지 못하게 된다. FireDAC이 WHERE 안에 이런 필드를 넣는 방식은 UpdateOptions.UpdateMode에 따라 정해진다. 때때로 이 오류는 upWhereKeyOnly 일때 나타난다. 당신이 upWhereKeyOnly를 명시했더라도, FireDAC에서 여전히 upWhereAll을 사용할 수도 있는데 PK 필드가 정의되지 않았을 때 그럴 수 있다. 다음과 같은 경우에 PK 필드가 정의되지 않게 된다: FetchOptions.Items에서 fiMeta가 빠져있을 때; 또는 a table in SQL 안에 들어 있는 테이블에 프라이머리 키(primary key)를 정의되어 있지 않았을 때; 또는 UpdateOptions.KeyFields가 비어있을 때; 또는 TField 중 어느 것에도 ProviderFlags 프로퍼티 안에 pfInKey가 들어있지 않을 때. 또 다른 이유가 있는데, (SQL Server, PostgreSQL)과 같은 몇몇 DBMS에서 테이블에 데이터를 변경하는 트리거(trigger)가 걸려 있을 때 발생할 수 있다. SQL 서버인 경우라면 트리거 코드 맨 위에 SET NOCOUNT ON를 넣어라. PostgreSQL 인 경우라면 UpdateOptions.CountUpdatedRecords에 False를 지정하라. Q2: TFDUpdateSQL는 언제 사용하는 것인가? A: SQL 명령(command) 원본이 단순 SELECT 명령이거나 또는 조인(join) SELECT 명령이지만 프라이머리 키(primary key) 필드를 유지할 때, FireDAC은 업데이트하는 SQL 명령(command)을 자동으로 만들어 낸다. 따라서, TFDUpdateSQL 사용은 필수가 아니라 선택이다. TFDUpdateSQL가 필요한 경우는 다음과 같다: SQL 명령(command) 원본이 SELECT 명령이 아닐 때 (예를 들면, 결과 세트를 반환하는 저장 프로시저인 경우). SQL 명령(command) 원본에서 프라이머리 키(primary key)를 유지하지 않을 때 (예를 들면, 여러 테이블을 조인하는데, DISTINCT 또는 GROUP BY 절이 들어있는 경우). 표준이 아닌 업데이트 SQL 명령을 애플리케이션에서 사용해야 할 때 (예를 들면, 애플리케이션에서 저장 프로시저를 사용하여 업데이트를 전송 즉 post 할 때). Q3: FDUpdateSQL 안에 있는 SQL에서 매크로(macro)를 사용하는 것이 가능한가? A: 아래 코드를 사용하라: FDUpdateSQL1.Commands[arInsert].MacroByName('MacroName').Value := 'value'; Q4: 캐시된 업데이트(CachedUpdates) 모드에서, 삽입되는 레코드들을 다신 전송(post)하도록 ApplyUpdates를 한번 넘게 호출해야 하는 이유는 무엇인가? A: ApplyUpdate를 호출한 후에, CommitUpdates를 호출해야 한다. CommitUpdates가 호출되고 나면, 모든 변경이 내부 캐시(internal cache)에서 제거된다. Q5: 마스터-디테일 관계에서, 마스터 TFDQuery가 스크롤(scroll) 또는 전송(post)된 후에도 디테일 TFDQuery가 새로고침(refresh)되지 않도록 하는 방법은? A: 2가지 방법이 있다: 마스터-디테일 관계를 당신이 원하는 데로 구현한다. 그러려면, TDataSource.OnDataChange 이벤트 핸들러를 추가해야 한다. 이것이 "표준" 방식이다. 중앙집중식 캐시된 업데이트(centralized cached updates)를 사용한다. Q6: 데이터셋의 레코드를 제거할 때 데이터베이스에서 이 레코드가 지워지지 않도록 하는 방법은? A: 당신은 내부 데이터셋 데이터 저장소에서 직접 작업할 수 있다. TFDDataSet.Table 프로퍼티를 사용하여 여기에 접근할 수 있다. 예를 들면, 인덱스 3을 가진 행(row)을 삭제(delete)하려면 아래와 같이 한다: FDQuery1.UpdateCursorPos; FDQuery1.GetRow.Free; FDQuery1.UpdateCursorPos; FDQuery1.Resync([]); 그리고 결국에는 CachedUpdates 모드를 사용할 수 있다. 데이터셋을 캐시된 업데이트(cached updates) 모드로 지정하라. 그리고 레코드를 삭제(delete)하고, CommitUpdates를 호출하라. Q7: FireDAC을 사용하여, ATable.UpdateToDataset(BTable , 'mykey', [mtufEdit, mtufAppend])를 생성하는 방법은? A: TFDDataSet.CopyDataSet 메소드를 아래 옵션들과 함께 사용하라: [coAppend] - ASource (에 있던 그대로) 에서 모든 레코드를 가져와서 덛붙인다(append); [coEdit] - 기존의 키 값(key value)을 가진 레코드 만 편집(edit)한다; [coAppend, coEdit] - 기존의 키 값(key value)을 가진 레코드를 편집(edit)하고, 기존에 키가 없는 레코드는 덛붙인다(append). Q8: ftGUID 필드에 값을 할당(assign)하는 방법은? A: 아래 코드를 사용하라: (AMemTable.FieldByName('Field1') as TGUIDField).AsGuid := aGUID; Q9: 데이터셋(dataset) 필드(field)에 기본 값(default value)을 지정하는 방법은? A: TField.DefaultExpression 프로퍼티에 표현식(expression)을 할당하라. Q10: TField.DefaultExpression 프로퍼티는 TField.CustomConstraint와 같은 방식으로 지원되나? 이 기본 표현식(default expression)에 적힌 내용은 필드의 기본 값(default value)의 효력과 같은가? A: 그렇다, 단, 필드가 만약 일반(normal) 결과 세트(result set) 필드일 때 그렇다. 만약 필드가 fkInternalCalc 이라면, then the result of the DefaultExpression의 결과는 필드(field) 값(value)으로 사용되고 다른 계산된 필드(calculated field)와 마찬가지로 업데이트 될 것이다. Q11: {fn DAYOFMONTH({fn CURDATE()})} 은 올바른 표현식(expression)인가? A: 아니다. 당신은 지금 FireDAC의 이스케이프 함수(escape function)를 사용하고 있다. 이것은 오직 SQL 명령(command) 안에서만 작동한다. 제약조건(constraint)이나 기본 값(default value)과 같은 표현식(expression) 안에서는 작동하지 않는다. 당신은 FireDAC의 표현식 평가기(expression evaluator)가 지원하는 함수(function)와 구문(syntax) 만을 사용해야 한다: DAYOFMONTH(CURDATE()) 또한, 이와 같은 함수(function)를 사용하려면, uADStanExprFuncs 유닛을 당신의 애플리케이션에 포함(include)해야 한다. Q12: 데이터셋(dataset)의 불리언(Boolean) 필드(field)에 기본 값(default value)을 명시하는 방법은? A: 데이터셋(dataset)의 필드(field)에 기본 값(default value)을 명시하려면 TField.DefaultExpression 프로퍼티에 표현식(expression)을 할당(assign)하라. 불리언(Boolean) 필드(field)에 기본 값(default value)을 할당하려면, False를 할당하고 싶으면 문자열 F, FA, FAL, FALS, FALSE 중 하나를 넣어라. True 인 경우에도 마찬가지 방법으로 할 수 있다. Q13: TField.CustomConstraint 할당(assign)하기가 작동하지 않는다. 뭐가 잘못되었나? Q: 제약조건(constraint) 추가하기를 다음 방식으로 했다: FDQuery.FieldByName('FIELD_NAME').CustomConstraint := 'FIELD_NAME > 1'; FDQuery.UpdateConstraints; FDQuery.Table.Constraints.Check(FDQuery.GetRow(), rsModified, ctAtEditEnd); 작동하지 않는다. 그리고 예외(exception)가 생기지도 않는다. A: 괜찮다 (아래에서 설명). Q: 그러나: FDQuery.Constraints.Add.CustomConstraint := 'FIELD_NAME > 1'; FDQuery.UpdateConstraints; FDQuery.Table.Constraints.Check(FDQuery.GetRow(), rsModified, ctAtEditEnd); 작동한다! 왜 그런가? A: 역시 괜찮다. Q: ctAtEditEnd와 ctAtColumnChange은 정확히 무슨 뜻인가? A: 이 열거형(enum)은 FireDAC이 제약조건(constraint)을 점검하는 시점을 명시한다: ctAtEditEnd - Post가 호출 될 때 ctAtColumnChange - 필드(field)의 값(value)이 변경될 때 아래 설명을 보자: FDQuery.FieldByName('FIELD_NAME').CustomConstraint := 'FIELD_NAME > 1'; 위 코드는 필드(field)-수준 제약조건을 추가한다. 이것은 오직 ctAtColumnChange 이벤트에서만 점검할 수 있다. FDQuery.Constraints.Add.CustomConstraint := 'FIELD_NAME > 1'; 위 코드는 레코드(record)-수준 제약조건을 추가한다. 이것은 오직 ctAtEditEnd 이벤트에서만 점검할 수 있다.
  6. Docwiki에 있는 "Sorting, Searching, Locating, Filtering Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 정렬, 검색, 위치 찾기, 필터링 관련 질문과 답변을 정리한 목록이다. Q1: 데이터셋(dataset) 정렬이 영어가 아닌 문자열(string)에서 정확하지 않다. "[FireDAC][DatS]-2. Object [] is not found" 에러가 발생한다. 뭐가 잘못되었나? A: 이 이슈를 교정하는 방법은 다음과 같다: $(BDS)\source\data\firedac\FireDAC.inc 파일을 연다; 아래 줄을 찾는다: {$define FireDAC_NOLOCALE_DATA} // 바이너리 데이터(data) 비교를 사용하도록 정의(define) {$define FireDAC_NOLOCALE_META} // 바이너리 메타데이터(metadata) 비교를 사용하도록 정의(define) 주석처리하여 작동하지 않도록 한다; 변경한 파일을 저장하고 애플리케이션을 다시 컴파일한다. 주의: 만약 당신의 애플리케이션에서 영어 (ASCII) 텍스트만 취급한다면, 위 줄이 주석처리되지 않도록 분명히 하라. 위 코드 줄은 정렬과 위치 찾기 동작 속도를 현격하게 높여준다 Q2: 데이터를 정렬하려면 인덱스(index)를 생성해야 하나? A: 인덱스(index)를 정의할 필요가 없다. IndexFieldNames가 그 역할을 한다. 인덱스(index)를 사용하면 뷰(view)를 정의하여 필터링과 정렬을 혼합할 수 있다. indexes와 IndexDefs는 모든 FireDAC 데이터셋에서 서로 배타적이다. 즉, 당신은 indexes와 IndexDefs 중 하나만 채워야 하고 둘 다 채우면 안된다. Q3: 룩업 필드(lookup field)를 인덱스(index) 정의에 사용해도 되나? A: 안된다, 룩업 필드를 사용할 수 없다. 하지만, 인덱스(index)에 내부에서 계산되는 필드(internal calculated field)를 사용할 수 있다. 그렇게 하려면 영속 필드(persistent field)를 추가하고, fkInternalCalc 필드를 추가한 다음 OnCalcFields 이벤트 핸들러를 만들고 그 안에서 이 필드를 계산하도록 하라. 예를 들면, procedure TForm21.FDTable1CalcFields(DataSet: TDataSet); begin DataSet.FieldByName('f_calc').AsString := FDMemTable2.Lookup('code', DataSet.FieldByName('f_code').AsInteger, 'name'); end; Q4: 계산되는 필드(calculated field)를 인덱스(index) 정의에 사용해도 되나? A: FireDAC 현재 버전에서는 FieldKind = fkCalculated 인 필드를 위치 찾기(Locate), 룩업(Lookup), IndexFieldNames 등등에서 사용할 수 없다. 해결 방법(workaround)은 fkInternalCalc 필드를 사용하는 것이다. Q5: 실행 중에 FindNearest 메소드를 호출하면, 활성화된(active) 인덱스가 없다는 내용으로 시작하는 에러 메시지가 나온다. A: 인덱스(index)를 활성화(active) 해야할 뿐만 아니라 그 인덱스를 선택해야만 한다. 그렇게 하려면: Indexes[i].Selected := True로 지정한다. 또는 FDTable1.IndexFieldName := <당신의 인덱스 이름>으로 지정한다. Q6: TADDataset 인덱싱을 하기 위해 서로 다른 character collation(문자 비교 규칙 세트)을 정의하는 방법 A: 대체로, 3가지 선택이 있다: TFDMemTable.Table.Locale에 LCID를 할당(assign)한다. FireDAC은 CompareStringA와 CompareStringW를 SORT_STRINGSORT 플래그와 함께 사용한다. collation(문자 비교 규칙 세트)는 기본 설정에서 "DBMS 독립적"이다. 즉, LOCALE_USER_DEFAULT이다. 자세한 내용은 Win API 도움말 참고. FireDAC.DatS.pas 소스 코드를 변경한다. TFDDatSRow.CompareData를 찾아서 당신 만의 비교 알고리즘을 구현한다. 표현식 평가기(expression evaluator)를 가지는 맞춤 함수를 등록한다. 등록하는 자세한 방법은 FireDAC.Stan.Expr.pas 을 참고한다. 그리고 나서 이 함수를 TFDMemTable.Indexes[..].Expression에서 사용한다. 예를 들면: Expression := 'MySort(Name)'. 앞으로, 맞춤 collation을 구현하려고 한다. 그러면 당신처럼 SQLite 드라이버를 사용하는 경우 도움이 될 것이다. Q7: COL1 descending(내림차순), COL2 ascending(올림차순) 처럼 데이터를 정렬하는 방법은? A: IndexFieldNames := 'col_1:D;col_2'; Q8: FDQuery.Locate를 MS-SQL 서버에서 사용하는데 "Function sequence error" 에러가 난다. 뭐가 잘못되었나? A: 명시적인 트랜젝션이 시작된 후에 FDQuery가 오픈(open)된 것으로 보인다. 그 후에 트랜젝션이 커밋(commit)되고, 다시 그 후에 FDQuery.Locate를 호출하였는데 FDQuery가 모든 레코드를 가져오지 않았고 그 대신 Locate 메소드에 의해 암묵적으로 FetchAll이 호출되었을 것이다. 이상이 이 에러가 SQL 서버에서 발생하는 이유이다. 피하는 방법은 다음과 같다: 해당 FDQuery에서는 FDQuery.FetchOptions.Mode = fmAll 로 지정한다; Commit을 호출하기 전에 이 FDQuery에서 FetchAll을 호출한다. SQL 서버는 Commit/Rollback을 한 후에는 오픈(open)된 커서(cursor)를 무효화 한다. Q9: 룩업(Lookup) 테이블을 구현하는 가장 좋은 방법은 무엇인가? 오픈(open)/로드(load) 가 느린걸로 봐서 룩업 테이블이 너무 큰것 같다. A: 클라이언트에서 모든 레코드가 필요한 것이 아니라면 이 구문을 사용하라. TFDQuery with SELECT ... WHERE .... Q10: 최상의 성능을 낼 수 있도록 하려면 룩업(Lookup) 필드를 어떻게 다루면 좋은 지 힌트를 줄 수 있나? A: TFDQuery.IndexFieldNames에 LookupKeyFields를 지정하라, 그러면 FireDAC은 클라이언트 인덱스를 사용하여 룩업 데이터셋(Lookup dataset) 안에서 레코드의 위치를 찾는다. 만약, 고유(unique) 키 값이 너무 높지 않다면, LookupCache에 True를 지정하라. Q11: DateTime 값으로 필터링을 하려는데 잘 안된다. 뭐가 잘못되었나? Q: Delphi 2007에서 FireDAC 2.0.11.895을 사용하여 Postgres 데이터베이스를 다루고 있다. DateTime 필드를 기분으로 필터링을 하려고 하는데, 아래와 같은 값을 전달하면 정확히 일치하는 것을 가져오지 못하는 것 같다: created_date = '8/10/2009 14:42:14' // 또는 심지어... created_date = '8/10/2009 14:42:14.247' // ... 밀리초(millisec)까지 일치해야 하는 상황 그래서 결국 아래와 같이 작성해야 했다: created_date >= '8/10/2009 14:42:14' AND created_date < '8/10/2009 14:42:15' // 또는 created_date >= '8/10/2009 14:42:14.000' AND created_date <= '8/10/2009 14:42:14.999' A: 이 문제는 DBMS 또는 DBMS API 에서 시간 값을 반올림하기 때문일 것이다. 프로그래머는 소숫점 이하에 .247를 기대하지만, 이 값이 .246 이거나 다른 값일 수있다. 이것은 FireDAC이 실패한 것이 아니라 DBMS가 어떻게 작동하느냐에 따라 결정되는 것이다. 당신은 시간 값을 초단위로 반올림하고 그 값을 소숫점 이하가 없는 상수(constant) 값과 비교할 수 있다: uses FireDAC.Stan.ExprFuncs; ... FDQuery1.Filter = 'TimeStampDiff(''second'', created_date, convert(''timestamp'', ''8/10/2009 14:42:14'')) = 0';
  7. Docwiki에 있는 "Fetching and Populating Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 레코드(record) 가져오기 및 데이터셋(dataset) 채우기 관련 질문과 답변을 정리한 목록이다. Q1: FireDAC에서 결과 데이터셋(dataset)에 앞으로 이동-전용(forward-only), 읽기-전용(read-only)을 통한 빠른 접근을 할 수 있는가? A: FDQuery.FetchOptions를 설정하라: CursorKind = ckDefault 또는 ckForwardOnly Mode = fmOnDemand RowsetSize = 1000 Unidirectional = True 원한다면, fiMeta를 Items 에서 빼낸다. 단, 당신이 데이터셋(dataset)을 편집할 필요가 없을 때만. Q2: FDQuery 하나 또는 FDMemTable 하나에 결과 세트(result set) 여러개를 붙여 넣는 방법은? A: 클라이언트 데이터셋(client dataset)을 사용하려 결과 세트 여러 개를 유지하는 방법이 있다: begin loop // 새 params를 사용하는 SqlQuery를 실행한다 ... ClientDataset.AppendData(SqlQuery.Data) ... end loop 아마 단일 TFDQuery로 교체할 수도 있다. 예를 들면: // 최초로 열기(open)와 가져오기(fetch) FDQuery1.Params[0].AsInteger := 1; FDQuery1.Open; // 명령(command)을 다시 실행, 행(row)을 다시 가져온 후 기존 행(row) 뒤에 덛붙이기 FDQuery1.Command.Close; FDQuery1.Params[0].AsInteger := 2; FDQuery1.Command.Open; FDQuery1.FetchAgain; FDQuery1.FetchAll; // 다른 파라미터 값을 사용하여 계속해서 명령(command)을 다시 실행 FDQuery1.Command.Close; FDQuery1.Params[0].AsInteger := 3; FDQuery1.Command.Open; FDQuery1.FetchAgain; FDQuery1.FetchAll; Q3: 쿼리 하나를 실행하여 가져온 결과 세트를 기존 데이터셋에 덛붙일 때 가져온 레코드를을 삽입하지 않고 수행할 수 있는 방법은? A: TFDDataSet.FetchAgain 메소드의 설명을 참고하라. 그 외에도 대안으로, SQL 명령(command)을 실행하여 추가 레코드를 가져와서 기존 데이터셋에 담아 넣을 수 있다.: FDCommand1.CommandText := 'select ... from ... where id= :id'; FDCommand1.Open; FDCommand1.Fetch(ADQuery1.Table); FDCommand1.Close; Q4: 내 쿼리는 레코드를 800개 반환하는데, RecordCount는 50을 반환한다. 뭐가 잘못되었나? A: 기본 설정에서는, RecordCount는 데이터셋(dataset)의 레코드 캐시(cache)에 있는 레코드 갯수를 보여준다. 레코드 카운팅 모드에 대한 더 자세한 내용은 FetchOptions.RecordCountMode 프로퍼티를 참고하라. 50은 기본 설정된 rowset의 크기이다. 이 숫자는 FireDAC이 한번 요청할 때 가져오는 갯수이다. 따라서 오픈(open)을 한 직후에, 데이터셋의 레코드는 the dataset <= 50 이다. 그 숫자를 RecordCount에서 제공한다. 데이터셋(dataset) 안에 있는 레코드 사이를 옮겨 다닐 때, FireDAC은 추가로 rowset을 더 가져오게 되고 그 결과 레코드 갯수가 증가하게 된다. 쿼리가 반환하는 레코드 총 갯수를 제시하려면, 다음 중 하나를 수행하라: ADQuery1.FetchAll을 수행한다. 그 결과, 모든 데이터를 가져오게 되고, RecordCount는 전체 갯수를 제시한다; FetchOptions.RecordCountMode를 cmTotal로 지정한다. 주의 할 점은 이 경우 성능 저하를 유발할 수 있다. 그 이유는 각 SELECT 쿼리 마다 FireDAC이 추가로 SELECT COUNT(*) 쿼리를 실행하기 때문이다.
  8. Docwiki에 있는 "TFDTable Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDTable 관련 질문과 답변을 정리한 목록이다. Q1: TFDTable 안에서 이동할 때 '[FireDAC][DatS]-15. Duplicate row found on unique index' 에러가 난다. 이 에러의 의미는? A: 이 경우 대부분은, 데이터베이스의 정렬 순서와 클라이언트에서의 정렬 순서가 서로 다르다는 것을 의미한다. 이 경우 끝나지 않는 무한 루프(loop) 또는 [FireDAC][DatS]-15 에러를 유발한다. 이 이슈를 해소하려면, FormatOptions.SortLocale와 SortOptions 프로퍼티를 설정하여 클라이언트 쪽의 정렬 순서가 데이터베이스의 정렬 순서와 일치하도록 만들어라. Q2: When navigating through TFDTable 안에 있는 레코드 사이를 옮겨 다닐 때, 애플리케이션이 교착(hang) 상태에 빠진다. 뭐가 잘못되었나? A: 위 Q1의 답변 참고
  9. Docwiki에 있는 "TFDQuery, TFDStoredProc and TFDUpdateSQL Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDQuery, TFDStoredProc, TFDUpdateSQL 관련 질문과 답변을 정리한 목록이다. Q: TFDQuery를 사용하여, 데이터셋 프로바이더에 연결하고 엠바카데로 클라이언트 데이터셋 안에 있는 데이터를 꺼내올 수 있나? A: TFDQuery에는 TFDMemTable과 TFDTableAdapter와 TFDCommand 몇 가지가 혼합되어 있다. 따라서 TFDQuery 안에는 SQL 명령(command) 실행, 파라미터 데이터 전달, 결과 세트(result set)를 받아서 저장, 결과 세트 안을 이동, 데이터 변경을 데이터베이스로 다시 전송(post) 등을 수행할 때 필요한 모든 것이 들어있다. TFDQuery + DSP(데이터셋 프로바이터) + CDS(클라이언트 데이터셋)을 함께 사용할 이유가 없다. TFDQuery를 쓰지 않고 대신에 TFDMemTable, TFDTableAdapter, TFDCommand 각각을 직접 따로 사용할 수도 있다. 그러면 더 유연하겠지만, 코딩은 더 많이 해야한다. 예를 들어 데이터셋들 전반에 걸쳐있는 동기화되는 캐시된 업데이트 상황를 생각해보라. 다시 말해, TFDQuery는 데이터 애플리케이션 프로그래밍을 매일 하는 개발자를 위해 최적화된 일종의 "지름길"이다. Q: 수작업으로 명시한 파라미터를 FDStoredProc에서 강제로 사용하도록 하려면 어떻게 하면 되나? A: FetchOptions.Items 프로퍼티에서 fiMeta를 빼라. 파라미터를 수작업으로 생성하려면, FetchOptions.Items 프로퍼티에 fiMeta가 없도록 빼는 것이 옳다. 이 옵션이 들어있으면, FireDA은 저장 프로시저(stored procedure)의 파라미터 정의를 데이터베이스에서 가져와서 Params 컬렉션 안에 넣을 것이다. 파라미터를 수작업으로 정의하기가 어렵다면, Params 컬렉션을 자동으로 채우면(populate) 파라미터들이 어떻게 정의되는 지를 볼 수 있다. 그리고 나서, 당신의 코드와 비교해보라. Q: '[FireDAC][Phys]-308. Cannot open / define command, which does not return result sets'와 '[FireDAC][Phys]-310. Cannot execute command returning results set' 예외는 어떤 의미인가? A: '[FireDAC][Phys]-308. Cannot open / define command, which does not return result sets' 예외는 결과 세트를 반환하지 "않는" SQL 명령(command)의 Open 메소드를 실행할 때 발생한다. 이 예외(exception)가 발생되는 시점은 해당 SQL 명령이 실행했는데 DBMS에서 결과 세트(result set)를 전혀 반환하지 않을 때이다. '[FireDAC][Phys]-310. Cannot execute command returning results set' exception 예외는 결과 세트를 "반환하는" SQL 명령(command)의 ExecSQL 메소드를 실행할 때 발생한다. 명령(command)이 결과 세트를 반환하는 지 아닌 지는 FireDAC의 SQL 명령(command) 전처리기에 의해서 결정된다. 만약 명령이 SELECT 또는 이와 같은 형식으로 인식된다면 결과 세트를 반환한다; 그렇지 않으면 반환하지 않는다. 이 예외(exception)가 발생되는 시점은 해당 SQL 명령이 실행했는데 DBMS에서 결과 세트(result set)를 전혀 반환하지 않을 때이다. 경우에 따라 FireDAC가 SQL 명령의 결과 집합 반환 여부 인식하지 못할 수 있다. 그리고 때때로 애드 혹(ad hoc) 애플리케이션은 반환하는 결과 집합의 수에 의존하지 않고 SQL 명령을 실행해야 한다. 그렇다면 이러한 경우에는 어떻게 해야 할까? 두 가지 기본 해결책이 있다. 1) FDQuery1.OpenOrExecute; 이 방식은 [FireDAC][Phys]-308 예외가 발생될 수 있지만, 그 예외가 OpenOrExecute 밖으로 전파되지는 않는다. 그리고 SQL 명령(command)은 잘 실행된다. 또한, 해당 명령이 결과 세트(result set)를 반환한다면 이 메소드는 True를 반환하여 알려준다. 2) FDQuery1.Command.CommandKind := skInsert; FDQuery1.ExecSQL; FireDAC에게 (INSERT 등등) 결과 세트를 반환하지 않는 명령(command) 유형을 지정하기만 하면 된다. Q: FDQuery.Execute(FDQuery.Params.ArraySize)를 호출하면 'Out of memory' 예외가 발생한다. ArraySize는 90,000이다. 뭐가 잘못되었나? A: 1) 90,000은 어떤 DBMS에도 너무 과도하다. 그 이유는 데이터가 몇번에 걸쳐 캐시(cache)되어야 하기 때문이다 (파라미터, DBMS API 버퍼, 네트워크 패킷 버퍼, 등등). 또한, 아마도 레코드 하나하나의 크기도 상당할 것이다. 또한 애플리케이션은 아마 DBMS API 한도 (예: 허용하는 최대 Array 크기, Oracle에서는 $7FFF까지만 허용하고, 다른 DBMS에서는 네트워크 패킷 크기 등에 따라 다르다)에 당면하게 될 수도 있다. 2) 90,000을 쪼개서 각 덩어리 당 500-5000 항목을 담도록 하라. AD03-ArrayDML 데모를 참고하라. 대개, 덩어리 크기 한도까지 array를 채우고 나서 Execute를 실행할 때 그 덩어리 크기(chunk size)를 전달한다. 그리고 나서 다시 채우기와 Execute를 반복한다. Firebird 데이터베이스에서, 나는 ArraySize = 1,000,000 (60 초)를 사용했었는데 문제가 없었다. 실험을 통해 얻어진 공식이 있어서 array 하나의 최대 크기를 결정할 수 있다. FireDAC은 자동으로 큰 array 하나를 작은 덩어리도 쪼갠다. 이와 유사한 값을 Oracle에서 찾기는 간단하지 않다. Oracle이 최대 $7FFF까지 지원하지만, 대용량 array에서는 여전히 AV 또는 기타 이슈에 부딪힐 수 있다. 어쨌든, 레코드 하나의 크기가 과도하게 크면, Execute를 호출하기도 전에 메모리가 소진될 수 있다. Q: FDQuery가 레코드를 "모두" 가져왔는 지를 어떻게 알 수 있나? A: SourceEOF 프로퍼티를 확인하라. Q: 나는 (단순 SQL 문을 통해) 레코드 하나를 삽입(insert)하고 새로 추가된 레코드의 IDENTITY / SEQUENCE 를 받고 싶다. 가장 효율적이고 여러 데이터베이스에서도 사용할 수 있는 방법은 무엇인가 A: 1) TFDConnection에는 GetLastAutoGenValue 메소드가 있다. DBMS에 따라 다르지만, 이 메소드는 가장 세션 하나 안에서 마지막에 자동-생성된 값을 반환한다. 예를 들면 Oracle에서는: SELECT <AName>.CURRVAL FROM dual MySQL에서는, SQL 쿼리를 사용하지 않고 MYSQL API를 접근하여 값을 받아온다. 또한, DBMS에서 sequences/generator를 지원하지 않는다면, AName 파라미터 값은 그저 무시된다. 2) 레코드를 IMSERT하고 자동-생성된 값을 받아오는 SQL 명령문을 작성하는 공통된 일반적인 방식은 없다. 예를 들면 Oracle에서는: INSERT ... INTO ... RETURNING ID INTO :ID PostgreSQL에서는, 명령(command) 두개를 나누어 실행한다: INSERT ... INTO .. SELECT CURRVAL(...) 당신이 TDataSet Insert/Post 메소드를 사용하여 데이터베이스에 INSERT를 하나 전송(post)하면, FireDAC은 DBMS kind를 보고 효율적이고 적절한 SQL 명령(command)을 생성한다. Q: 사용자가 amCancelDialog 모드에서 쿼리 실행을 취소한 후에 해당 트랜젝션을 롤백(rollback)하는 방법은? A: 2가지 선택이 있다: 1) FDTransaction1.StartTransaction; try FDQuery1.ExecSQL; FDTransaction1.Commit; except on E: EAbort do // 사용자가 해당 명령(command) 실행을 취소했다 ADTransaction1.Rollback; end; 2) TFDQuery.OnError 이벤트 핸들러를 생성하라. 명령 실행이 취소되면, 이 이벤트 핸들러가 호출되는데 이때 AException 파라미터를 이용하여 조건을 확인하여 맞춤 처리를 할 수 있다: EFDDBEngineException(AException).Kind = ekCmdAborted; Q: 내 쿼리 문장에 '&', '!' 문자가 있어서 올바로 실행되지 못한다. 뭐가 잘못되었나? A: 예를 들면, 다음과 같은 쿼리는 기본 옵션인 경우 실패하게 된다: FDQuery1.SQL.Text := 'select * from xy where Fieldname = ''xxx&n'''; FDQuery1.open; DBMS가 받는 SQL 명령에는 '&n'가 빠져있게 된다. 그 이유는 '&'는 매크로 변수의 시작점을 표시하기 때문이다. 기본 설정에서는, 모든 값에는 빈 값이 들어있다. 따라서 '&n'는 빈 문자열(string)로 교체된다. 만약 당신이 매크로를 사용하지 않는다면 ResourceOptions.MacroCreate와 ResourceOptions.MacroExpand를 False로 지정하라. Q: 저장프로시저(stored procedure) 파라미터에 접근할 때 'Parameter Xxx not found' 에러가 났다. 뭐가 잘못되었나? A: 예를 들면, 코드가 다음과 같다면: FDStoredProc1.StoredProcName := 'TestProc'; FDStoredProc1.Prepare; FDStoredProc1.ParamByName('Par').AsInteger := 100; 그 에러는 여러가지 다른 이유들 때문에 발생할 수 있다: 데이터베이스에 "TestProc" 저장프로시저가 없다. 해당 데이터베이스에서 이 저장 프로시저를 만들어야 한다.; DBMS따라 다르지만, "TestProc"가 유효하지 않은 상태일 수 있다. 이 저장프로시저는 반드시 유효한 상태이어야만 한다.; DBMS따라 다르지만, 이 저장프로시저의 이름에 대소문자가 섞여있다. 그대로 인용해야 한다; FetchOptions.Items 프로퍼티에서 fiMeta가 빠져있다; fiMeta가 반드시 들어있거나 또는 수작업으로 파라미터가 생성되어 있어야 한다.; 이 저장프로시저(stored procedure)에 Par라는 파라미터가 없다; 파라미터 이름을 정확하게 맞게 수정하거나 또는 데이터베이스에 Par 파라미터가 추가되어야 한다; DBMS따라 다르지만, 파라미터 이름 앞에 접두사 '@'가 있을 수도 있거나 또는 ResourceOptions.UnifyParamsset를 True로 지정할 수 있다.
  10. Docwiki에 있는 "TFDManager and TFDConnection Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) TFDManager와 TFDConnection 질문과 답변을 정리한 목록이다. Q: 나는 TFDManager가 있는 기반 데이터 모듈(base data module) 클래스가 있다. 자손(descendant) 클래스를 만들려고 하는데, 'Application must have only one FDManager' 에러가 발생한다. 뭐가 잘못되었나? A: 애플리케이션 안에 FDManager은 오직 하나만 있을 수 있다. 당신의 클래스 안에서 명시적으로 FDManager를 생성하지 말고, 싱글톤(singleton) 오브젝트로 참조하여 FDManager의 함수를 사용하라. Q: 내 프로젝트 그룹(project group) 안에는 델파이 프로젝트들(애플리케이션들)이 여러개 들어있다. 각 프로젝트 별로 저마다 데이터모듈(DataModule)과 FDManager가 있다.이 데이터모듈을 (복사하거나 비교하기 위해) 하나 이상 같이 열려고 하면, 애플리케이션에서는 FDManager를 오직 하나만 가질 수 있다는 에러가 발생하고 바로 데이터 모듈 하나가 제거된다. A: TFDManager가 정말 필요한가? 애플리케이션에서 TFDManager를 명시적으로 생성할 필요는 없다. TFDManager는 옵션과 구성 파일(configuration file)을 디자인-타임 즉 개발화면에서 설정하기 위해 필요한 것이다. Q: 내 FDManager들이 자꾸 사라져서 새로 만들어야 한다. 고칠 방법이 있나? A: 고칠 방법이 없다. 그이유는 TFDManager는 디자인-타임(개발 중)이나 런-타임(실행 중)에 오직 하나만 생성되기 때문이다. 만약 TFDManager가 여러개 있으면, FireDAC은 어느 TFDManager의 설정을 따라야 할 지를 알 수 없게 된다. 맨 위의 질문을 참고 Q: FireDAC은 연결 풀링(connection pooling)을 지원하나? A: 그렇다. FireDAC은 연결 풀링을 지원한다. 대개 연결 풀링이란 열려있는(open) "물리적" 연결들을 풀(pool)에 모아두고, TFDConnection.Connected가 True로 지정되면 FireDAC은 그 풀(pool) 안에서 "물리적" 연결 하나를 가져다 쓴다. TFDConnection.Connected가 False로 지정되면, 그 "물리적" 연결은 닫힘(close)이 되고, 풀(pool) 안으로 돌아간다. FireDAC에서 연결 풀링을 사용하려면, 연결 정의(connection definition)에서 Pooled=True를 추가하기만 하면 된다. 다른 조치는 필요없다. "멀티쓰레딩(Multithreading)"에 보다 자세히 설명되어 있다. Q: 연결 에디터(Connection Editor) 창은 FDPhysFBDriverLink1.VendorLib을 무시하는 것 같고 하드-코딩된 드라이버를 사용한다. A: 해당 드라이버를 사용하도록 VendorLib을 지정하기는 첫 연결을 하기 전에 해야 한다. 연결이 설정된(established) 다음에, 해당 DBMS 클라이언트가 로드된다. 디자인-타임에, TFDPhysXXXDriverLink의 프로퍼티들이 사용되도록 분명히 하려면, 데이터 모듈(data module) / 폼(form)을 생성하는 순서 상 TFDPhysXXXDriverLink가 가장 먼저인지를 확인하라. 그리고 원한다면 델파이 IDE를 다시 시작하라. 런-타임에, 해당 드라이버 링크의 Release 메소드를 사용하라. FDConnection1.Close; ... FDConnectionN.Close; FDPhysFBDriverLink.VendorLib := 'c:\fbclient.dll'; FDPhysFBDriverLink.Release; FDConnection1.Open; ... FDConnectionN.Open; 또한, 가상 드라이버(virtual driver)를 정의하는 방법도 있다. 자세한 내용은 "드라이버 구성하기(Configuring Drivers)"를 참고하라. 예를 들면, [FB_Embedded] BaseDriverID=FB VendorLib = C:\fb\fbembed.dll 디자인-타임에 DriverID로 FB_Embedded 드라이버를 사용한다. 런-타임에는 FDDrivers.ini를 사용하거나 또는 TFDPhysXXXDriverLink를 구성하라.
  11. Docwiki에 있는 "General Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일 위로 가기: [DocWiki 번역] FAQ (FireDAC) 일반적인 질문과 답변을 정리한 목록이다. Q: FireDAC용 '시작하기 가이드' (또는 '퀵 스타트 가이드')가 있나? A: 네, "FireDAC으로 데이터베이스 애플리케이션을 만들기 첫걸음" 참고 Q: 모바일(Mobile) 버전과 전체(full) 버전이 다른 점은? A: FireDAC 모바일(Mobile) 버전: FireDAC 라이브러리 소스 코드 파일이 들어있지 않다; iOSSimulator와 iOSDevice 바이너리 들만 들어있다. Q: FireDAC은 쓰레드 안전 (thread safe)이 보장되나? A: 네, 더 자세한 내용은 "Multithreading" 참고 Q: 예외(exception) 다루기 방법은? A: ["DocWiki 번역] 에러 핸들링하기 (FireDAC)"를 참고. 간단한 예제 코드: uses FireDAC.Phys.IBWrapper; try ...데이터베이스에 로그인... except { 로그인 정보가 정확하지 않으면 } on E: Exception do begin if (E is EIBNativeException) and (EIBNativeException(E).Errors[0].ErrorCode = 335544472) then ShowMessage(strUserUnkown) // 메시지 표시 else ShowMessage(E.Message); end; end; Q: 델파이 2009에서 파이어버드(Firebird) 2를 사용할 때 문자 세트 (character set)을 unicode_fss로 사용했다. 델파이 2009에서 왜 FireDAC이 TWideStringField를 생성하는 지 이해할 수 없다. 왜 그런가? A: 델파이 2009에서: TStringField는 1 바이트(byte) ANSI (SBCS) 스트링 필드이다; TWideStringField는 멀티-바이트 유니코드(Unicode) 스트링 필드이다. 따라서, 올바른 동작이다. 자세한 내용은 "Unicode Support" 참고.
  12. Docwiki에 있는 "FAQ (FireDAC)"를 번역한 글 (번역일: 2022년 4월 18일) 위로 가기: FireDAC FireDAC 데이터셋(dataset) 클래스들을 가지고 작업하는 방법을 설명한다. 여기에는 데이터셋(dataset)의 내용을 편집하는 것도 포함된다. 주제 설명 일반적인 질문 일반적인 질문과 답변을 정리한 목록 TFDManager와 TFDConnection 질문 TFDManager와 TFDConnection 질문과 답변을 정리한 목록 TFDQuery, TFDStoredProc, TFDUpdateSQL 질문 TFDQuery, TFDStoredProc, TFDUpdateSQL 관련 질문과 답변을 정리한 목록 TFDTable 질문 TFDTable 관련 질문과 답변을 정리한 목 TFDMemTable 질문 TFDMemTable과 관련된 질문과 답변을 정리한 목록 가져오기 채우기 질문 레코드(record) 가져오기 및 데이터셋(dataset) 채우기 관련 질문과 답변을 정리한 목록 정렬, 검색, 위치 찾기, 필터링 질문 정렬, 검색, 위치 찾기, 필터링 관련 질문과 답변을 정리한 목록 편집하기 질문 데이터 편집하기 관련 질문과 답변을 정리한 목록 사용자 화면 즉 GUI 관련 질문 FireDAC 사용자 화면 즉 GUI 관련 질문과 답변을 정리한 목록 SQL 스크립트 질문 SQL 스크립트 실행 관련 질문과 답변을 정리한 목록 메타데이터(metadata) 질문 메타데이터(metadata) 추출 관련 질문과 답변을 정리한 목록 디버깅 및 환경 리포트 질문 디버깅 및 환경 리포트와 관련된 질문과 답변을 정리한 목록 써드 파티 제품 통합 질문 써드 파티 제품 통합 관련 질문과 답변을 정리한 목록 Firebird and Interbase Servers Questions Firebird and Interbase 서버 관련 질문과 답변을 정리한 목록 MS SQL Server Questions MS SQL 서버 관련 질문과 답변을 정리한 목록 Oracle Server Questions Oracle 서버 관련 질문과 답변을 정리한 목록 SQLite Database Questions SQLite 데이터베이스 관련 질문과 답변을 정리한 목록 MySQL Server Questions MySQL 서버 관련 질문과 답변을 정리한 목록 MS Access Questions MS Access 관련 질문과 답변을 정리한 목록
  13. Docwiki에 있는 "Debugging and Reporting Environment Questions (FireDAC)"을 번역한 글: 번역일: 2022년 4월 18일) 위로 가기: [DocWiki 번역] FAQ (FireDAC) 디버깅 및 환경 리포트와 관련된 질문과 답변을 정리한 목록이다. Q: 나도 FDExplorer가 클라이언트(Client)/세션(Session) 정보를 가 가져오는 것과 비슷하게 기능을 구현하고 싶다. 어떻게 하면 되나? A: "DBMS 환경 리포트 (FireDAC)"을 참고 Q: 추적 기록(trace)/모니터링(monitor) 산출물을 생성하려면 어떻게 하면 되나? A: "추적 기록과 모니터링 (FireDAC)"을 참고 Q: 추적 기록(trace)/모니터링(monitor) 산출물을 생성을 일시적으로 켜거나(enable)/끄려면(disable) 어떻게 하면 되나? A: TFDMoniXxxxClientLink.Tracing을 사용하라. 특정 추적 유형(tracer kind)에 대해서 추적 결과물 생성 기능 켜기(enable)/끄기(disable)를 할 수 있다. 특정 연결에 대해서 추적 결과물 생성 기능 켜기(enable)/끄기(disable)를 하려면 FDConnection.ConnectionIntf.Tracing을 사용하라. Q: 이벤트유형(EventKind)은 무엇을 의미하나? A: 아래 목록 참고: LiveCycle: 오브젝트 생성(creation)/파괴(destruction). 예를 들면, IFDPhysConnection 이 생성된다. Error: DBMS 에러. ConnConnect: 연결(connection) 열기(open)/닫기(close). ConnTransact: 시작(Start)/커밋(Commit)/롤백(Rollback). ConnService: 특별한 이벤트 몇가지. CmdPrepare: IFDPhysCommand.Prepare 호출. CmdExecute: IFDPhysCommand.Execute 또는 Open 호출. CmdDataIn: 명령 파라미터 (Command parameter) 값. CmdDataOut: 결과 세트 (Result set) 행. AdaptUpdat: 업데이트 전송(posting updates) 관련 모든 것. Vendor: 로우-레벨 DBMS API 호출. Component: 하이-레벨 이벤트 몇가지. Q: 디버깅이 필요해서 SQL 구문을 보고 싶은데 어느 유닛의 어느 부분에서 볼 수 있나? A: 다음 중 한가지 방법을 사용: MonitorBy 연결 파라미터(connection parameter) 사용. FireDAC.Phys.pas를 열고, TFDPhysCommand.Prepare 메소드를 찾아 보면 그 안에서 InternalPrepare 메소드를 호출하고 있을 것이다. 여기에 중단점(breakpoint)을 놓고 FDbCommandText 필드의 값을 확인하라. 이 SQL 구문 그대로 DBMS로 전달된다. Q: 파라미터와 매크로 치환이 모두 반영된 최종 SQL 구문을 어떻게 볼 수 있나? A: TFDQuery.Text를 보라. FireDAC은 최종 SQL 구문 안에 파라미터 값을 넣지 않는다는 점을 유의하라. Q: 추적 결과물 생성 기능 켜기(enable)를 했더니 Access Violation이 계속 발생한다. 무엇이 잘못되었나? 버그인가? A: FireDAC에서는 ODBC 기반의 드라이버인 경우 마이크로소프트의 ODBC 드라이버 관리자 추적 기능을 사용한다. 이 관리자 기능은 추적 결과물을 생성하기 위해 내부적으로 C RTL 함수인 IsBadReadPtr/IsBadWritePtr를 사용하는데, 이것은 제어되는 AV를 내부에서 생성한다. 이 예외(exception)는 해당 관리자 밖으로 전파되지 않지만, IDE 디버거는 여기에서 멈춘다. 따라서 이 오류는 그냥 무시하면 된다.
  14. Docwiki에 있는 "TFDMemTable Questions"를 번역한 글: 번역일: 2022년 3월 29일) 위로 가기: FAQ (FireDAC) TFDMemTable과 관련된 질문과 답변을 정리한 목록이다. Q: TClientDataSet에서는 레코드를 추가, 삭제, 변경할 수 있고, 변경 사항을 TClientDataSet.Delta를 통해 처리할 수 있었다. TFDMemTable에서도 가능한가? A: TFDMemTable에도 비슷한 기능이 있다. 하지만, 캐시된 업데이트 모델을 사용한다. CachedUpdates 프로퍼티가 True이면, MemTable은 해당 업데이트 로그 안에 변경을 기록한다. 데이터베이스로 변경을 전달(post)하려면, ApplyUpdates를 사용한다. 변경 로그를 병합하려면, CommitUpdates를 호출해야 한다. 자세한 설명과 기타 메소드를 알려주는 FireDAC 도움말 파일과 예제는 FireDAC\Samples\Comp Layer\TFDMemTable에 있다. Q: 클라이언트 데이터셋에서 CloneCursor를 사용해왔다. TFDQuery에서는 어떻게 하면 되는가? A: 아래 코드를 사용한다. FDMemTable1.CloneCursor(FDQuery1, False, False); Q: FDMemTable을 생성하고 채우는(populate) 방법은? A: 1)인-메모리 데이터셋을 생성한다. with FDMemTable1.FieldDefs do begin with AddFieldDef do begin Name := 'f1'; DataType := ftInteger; end; with AddFieldDef do begin Name := 'f2'; DataType := ftString; Size := 50; end; end; with FDMemTable1 do begin Open; Append; Fields[0].AsInteger := ...; Fields[1].AsString := ...; Post; end; 2) 데이터를 추가하고, 조회/편집을 한다. Q: 다른 데이터셋으로부터 (구조를 포함하여) TFDMemTable을 적재하는 가장 빠른 방법은? A: TDataSet에서 TFDMemTable로 구조와 데이터를 복사하는 가장 간편한 방법은 CopyDataSet 메소드를 사용하는 것이다. FDMemTable1.CopyDataSet(DataSet1, [coStructure, coRestart, coAppend]); Q: FDQuery에 있는 모든 레코드를 FDMemTable로 복사하고 FDMemTable 안에서 레코드를 편집하는 방법은? A: 아래를 참고하여 작업하면 된다. // UniDirectional은 반드시 False로 지정한다. FDQuery1.FetchOptions.Undirectional := False; FDQuery1.Open; FDQuery1.FetchAll; FDMemTable1.Data := FDQuery1.Data; FDMemTable1.First; while not FDMemTable1.Eof do begin FDMemTable1.Edit; ....... FDMemTable1.Post; FDMemTable1.Next; end; Q: ftGUID 파입은 영속 필드(persistent field)를 만들지 못한다. 필드 크기 에러가 나는데, 필드 크기 조정은 비활성화되어 있다. 무엇이 잘못되었는다? A: 이 이슈가 해소되기 전까지는 런-타임, 즉 실행 중에 GUID 필드가 생성되도록 코드를 작성한다. Q: 메모리 테이블을 사용하는 것이 유리한 상황이 언제인지 일반적인 규칙이 있는가? A: FireDAC만 사용하고 있다면, FDMemTable은 데이터를 메모리에만 두려고 할 때에만 사용한다. 그 외에 특별한 경우들도 있다. 예를 들어, CSV 파일을 FDMemTable에 로딩하고 나서 CSV에서 가져온 데이터를 사용할 수 있도록 LocalSQL을 이용한다. 기타 다른 작업이라면, TFDQuery / TFDStoredProc을 사용하면 된다. 이것들에도 클라이언트 측 기능이 TFDMemTable과 마찬가지로 거의 모드 들어있기 때문이다. Q: TFDMemTable에서 대량 편집(추가, 변경, 삭제)을 할 때 성능을 최적화하는 방법은? A: LogChanges, FetchOptions, ResourceOptions, UpdateOptions 프로퍼티를 아래와 같이 설정한다. FDMemTable1.LogChanges := False; FDMemTable1.FetchOptions.RecsMax := 300000; // 예제 값 FDMemTable1.ResourceOptions.SilentMode := True; FDMemTable1.UpdateOptions.LockMode := lmNone; FDMemTable1.UpdateOptions.LockPoint := lpDeferred; FDMemTable1.UpdateOptions.FetchGeneratorsPoint := gpImmediate; 그리고 나서 대량 편집 작업을 BeginBatch / EndBatch 메소드 호출 사이에 놓는다. FDMemTable1.BeginBatch; try for i := 1 to 1000 do begin FDMemTable1.Append; // ... FDMemTable1.Post; end; finally FDMemTable1.EndBatch; end;
  15. Kori

    설치 / 등록 FAQ

    이 문서의 목적: RAD 스튜디오, 델파이, C++빌더 등 엠바카데로 제품 설치 / 등록 과정에 생기는 주요 의문을 해소합니다. 목차 설치/등록 일반 FAQ EDN 계정 관련 FAQ 설치/등록 횟수 관련 FAQ 설치/등록 일반 FAQ Q: 설치 파일이 필요합니다. 어디에 있나요? EDN 서비스를 이용하세요. Q: 나의 시리얼번호 또는 제품이 등록된 EDN 계정을 알 수 있나요? 네, EDN 서비스에 로그인한 후, My Registered Products를 열어서, 찾아보세요. Q: 인터넷에 연결되지 않은 컴퓨터에서도 RAD 스튜디오(델파이, C++빌더)를 설치/등록/사용할 수 있나요? 네, 인터넷에 연결되지 않은 컴퓨터에서 제품을 설치/등록/사용하려면 오프라인 설치를 참고하세요. Q: 사용자 1명이 라이선스 1개로 컴퓨터 여러대에 설치해도 되나요? ESD 이메일로 전달된 라이선스가 Named User 라고 명시되어 있는 라이선스 (예: Delphi Enterprise Named User)라면, 본인만 사용하는 컴퓨터에 한하여 해당 라이선스를 여러번 등록하여 사용할 수 있습니다. 주의하실 점은, 불법 소프트웨어 감사 시에는 일단 컴퓨터에 설치된 수와 사용자 수로 간주되므로, 해당 컴퓨터 여러 대를 1명의 사용자만 사용한 다는 것을 사용자 (또는 해당 회사)에서 직접 증명해야합니다. (예를 들어, 1인 회사라면 증명이 쉬울 수도 있겠지만, 일반적으로 쉽지 않습니다) 특히 개발자 수가 보유한 라이선스 보다 많으면 더 엄격하게 판단되는 경향이 있습니다. Q: 제품 설치/등록 횟수에 제한이 있나요? 네, 설치/등록 횟수 관련 FAQ를 참고하세요. Q: 제품을 당장 사용하지 않아서 설치 예정이 없습니다. 하지만 구입한 시리얼번호를 EDN 계정에 미리 등록해 두고 싶습니다. 제품 설치를 하지 않아도 정품 등록 파일을 생성하는 웹페이지를 이용하여 미리 등록할 수 있습니다. Q: 이전 버전이 필요한데 엠바카데로는 최신 버전만 판매합니다. 이전 버전은 어떻게 구입하나요? 최신 버전 구입 후, 필요한 이전 버전의 라이선스를 무상으로 확보할 수 있습니다. EDN 계정 관련 FAQ Q: EDN 계정이 무엇인가요? 꼭 필요한가요? 엠바카데로는 EDN 서비스를 통해서 자사 제품의 사용자와 각 사용자에게 허용된 제품 라이선스를 관리합니다. 구입한 Named User (기명 사용자) 라이선스를 사용하려면, EDN 계정이 꼭 필요합니다. Q: EDN 계정을 어떻게 생성하나요? 새 EDN 계정 생성하기를 따라 진행하세요. Q: EDN 서비스의 로그인 계정(EDN 계정)이 기억나지 않습니다. 어떻게 하나요? EDN 계정으로 EDN 서비스에 로그인하기에 설명되어 있습니다. Q: 관리자 퇴사 등의 사유로 라이선스의 시리얼번호를 다른 EDN 계정으로 변경하고 싶습니다. 저작권사인 엠바카데로의 지원팀에게 라이선스 이전(Transfer)을 요청하세요. 설치/등록 횟수 관련 FAQ 엠바카데로는 무단 사용 방지를 위해 제품 설치 시의 등록 횟수가 제한되어 있습니다. (일반적으로 라이선스 하나당 최대 3회) 주의! 엠바카데로 Named User 라이선스를 시리얼번호 1개를 2명 이상이 사용하거나, 지정된 사용자가 아닌 사람이 사용할 경우, 라이선스 위반으로 법적 책임이 따를 수 있습니다. Q: 등록 횟수 한도에 도달했다는 메시지가 나오고, 제품도 사용하지 못하고 있습니다. "The registration limit for this serial number has been reached." 라는 메시지라면, 엠바카데로의 지원팀에게 제품 등록 한도 증가를 요청하세요. Q: 등록 횟수를 0으로 초기화 할 수는 없나요? 등록 횟수는 0으로 초기화하는 절차는 없습니다. 다만, 등록 횟수 한도에 도달한 경우 증가 요청을 하면 한도 증가 절차를 진행합니다. (한번에 한도를 1회 늘려줍니다) Q: 몇번 더 설치/등록을 할 수 있는지 미리 알아볼 수 있나요? 네, 정품 등록 파일을 생성하는 웹페이지를 이용하여 미리 파악할 수 있습니다. Q: 등록 횟수 한도에 도달하기 전에 미리 한도 증가를 요청하면 한도를 늘려주나요? 아닙니다. "아직 횟수가 다 차지 않아 처리해줄 수 없다. 등록 한도에 도달한 경우에만 한도 증가 절차가 진행된다"라는 답변이 메일로 전달됩니다. Q: 재설치 시 등록 횟수가 증가되지 않도록 할 수 있는 방법이 있나요? 컴퓨터에서 윈도우를 재설치하고 RAD 스튜디오도 재설치하는 경우에는, 사전에 정품 등록 파일(reg*.txt / *.slip)을 복사해 두었다가 재사용하면 등록 과정이 생략되므로 등록 횟수가 증가되지 않습니다. Q: 고객 지원, 테스트 등으로 인해 다수의 컴퓨터에 설치하는 경우가 많습니다. 동일한 환경이 아니므로 slip 파일 재사용도 안되는데, 어떻게 해야 하나요? 등록 한도에 도달할 때마다 엠바카데로의 지원팀에게 제품 등록 한도 증가를 요청하는 수 밖에 없습니다. 원격 테스트나 디버깅이 목적이라면, 사용 중인 RAD 스튜디오 (델파이, C++빌더)에서 해당 클라이언트를 원격으로 디버깅하세요.
  16. Kori

    설치 방법

    이 문서의 목적: RAD 스튜디오 설치, 업그레이드, 제거 방법을 설명한다. (Docwiki에 있는 10.4 버전 설치 문서를 기반으로 작성됨. 다른 버전은 원문(영문)을 참고) 목차 1 설치하기 1.1 설치 전 확인 사항 1.2 설치 파일 고르기 1.3 선택한 설치파일을 실행하여 설치하기 1.4 RAD 스튜디오 설치 후 (필요 시) 추가 조치 1.4.1 이전 버전의 설정 사항 임포트하기 1.4.2 새 PA (Platform Assistant) 설치하기 1.4.3 템플릿 파일 업데이트하기 2 설치 후에 기능을 추가 또는 변경하기 3 RAD 스튜디오 제거하기 3.1 네트워크 라이선스를 사용중인 RAD 스튜디오 제거하기 3.2 구성 파일 (Configuration Files) 제거 4 RAD 스튜디오를 업그레이드하기 5 관련 주제 1 설치하기 1.1 설치 전 확인 사항 시스템 요구사항은 Installation Note 참고. RAD 스튜디오는 이전 버전이 설치된 컴퓨터에도 새 버전을 함께 설치할 수 있다. 이때, 컴퓨터의 PATH 환경 변수에 해당 버전이 추가된다. 환경 변수는 최대 1830자까지만 들어갈 수 있으므로 (그럴리는 거의 없지만) 넘지 않도록 유의하기 바람 1.2 설치 파일 고르기 일반 설치파일 또는 오프라인 설치파일 중 하나를 선택한다. 일반 설치파일을 사용하는 것이 일반적인 상황에서 최고의 선택이다. 그 이유는, 설치 시 소요 시간이 훨씬 짧다. 설치 후 설치 요소를 다시 변경할 때도 훨씬 짧다. 설치 요소 선택이 더 유연하다. 타겟 플랫폼과 프로그래밍 언어를 조합하여 구성 가능 (오프라인 Installer는 타겟 플랫폼과 프로그래밍 언어를 별도로 지정함) 설치된 프로그래밍 언어를 설치 후에도 제거 가능 설치 파일 용량이 훨씬 작다. 0.2GB (설치 중 선택에 맞게 필요한 파일을 자동으로 다운로드하며 설치) ESD 이메일 안에는 시리얼번호 뿐만 아니라 일반 설치파일 링크도 함께 들어있다. 설치파일을 보관할 필요가 없으며, 일단 설치되고 나면 이후에는 개발도구 안에서 설치 요소를 변경 가능하다. 설치 과정이 더 쉽고 명확함 (설치 단계가 훨씬 직관적임) 오프라인 설치파일을 사용해야 하는 특별한 경우도 있다. 즉, 인터넷에 연결되지 않은 컴퓨터에 설치해야 하는 경우 설치되는 드라이브에 공간이 부족하여 설치 과정에 필요한 임시 파일들을 받아들이지 못하는 경우 (오프라인 설치파일로는 설치를 위한 임시 파일 저장 폴더를 다른 곳으로 지정 가능) [오프라인 설치파일 사용 시 주의 사항] 기능 매니저 (Tools > Manage Platform) 사용 안됨 겟잇 패키지 매니저를 사용하려면, 수작업으로 "online mode"를 켜야 함 방법:GetItCmd.exe 도구를 사용하여 다음 명령어 실행 GetItCmd.exe -c=useonline BDS 환경 변수를 설정해 주어야 GetItCmd.exe를 사용할 수 있음 명령창에서 다음 명령어 실행: set BDS=C:\Program Files (x86)\Embarcadero\Studio\21.0 또는 [BDS설치 폴더]\bin\rsvars.bat 명령 파일을 찾아서 실행 1.3 선택한 설치파일을 실행하여 설치하기 일반 설치파일: 일반 설치파일 사용하기 문서 참조 오프라인 설치파일: 오프라인 설치파일 사용하기 문서 참조 1.4 RAD 스튜디오 설치 후 (필요 시) 추가 조치 1.4.1 이전 버전의 설정 사항 임포트하기 이미 이전 버전이 설치되어 있는 컴퓨터라면 설정 마이그레이션 도구를 사용하여 새 버전에도 동일한 설정을 반영한다. 1.4.2 새 PA (Platform Assistant) 설치하기 맥OS 또는 iOS 용 애플리케이션을 배포할 계획이 있거나, 64비트 윈도우 애플리케이션을 원격에 배포할 계획이 있다면, 맥 또는 원격의 64비트 윈도우 시스템에 PA (Platform Assistant)를 설치해야 한다. 이때 반드시 새 버전에서 제공하는 새 PA를 설치해야 한다 (이전 버전에서 제공된 PA를 재사용할 수 없음). 팁! 하나의 시스템에서 버전이 다른 PA (Platform Assistant)를 동시에 실행할 수 있다. 단, 각 PA 인스턴스는 서로 다른 포트 번호를 사용해야 한다. 1.4.3 템플릿 파일 업데이트하기 맥OS, iOS, 또는 안드로이드 용 프로젝트에는 각 플랫폼별로 사용자 지정 사항을 반영할 수 있도록 템플릿 파일이 들어있다. RAD 스튜디오를 이전 버전에서 새 버전으로 마이그레이션 하려면 반드시, 사용자 지정이 반영된 템플릿 파일을 백업하여 향후 변경 내용 점검을 준비한다. 프로젝트 폴더 안에 있는 템플릿 파일을 모두 제거한다. 각 플랫폼 별로 만든 애플리케이션을 (안드로이드는) 빌드, (맥OS, iOS)는 배포한다. 그러면 RAD 스튜디오가 각 템플릿 파일을 최신 버전으로 자동 생성한다. (사용자 지정 사항이 기존에 있었다면) 새 템플릿 파일을 편집하여 해당 변경 즉 사용자 지정 사항을 반영한다. 보다 자세한 내용은: AndroidManifest.template.xml 템플릿 파일 새로 만들기 info.plist 템플릿 파일 새로 만들기 (info.plist.TemplateOSX.xml, info.plist.TemplateiOS.xml) iOS, 맥OS 용 Entitlement List(자격 목록)을 사용자 지정하기 (Entitlement.TemplateOSX.xml, Entitlement.TemplateiOS.xml) 2 설치 후에 기능을 추가 또는 변경하기 (사용할 프로그래밍 언어, 사용할 타겟 플랫폼, 언어팩 등) 주요 기능 요소를 RAD 스튜디오 설치 중 뿐만 아니라 설치 후에도 활성화 또는 비활성화 할 수 있다. 일반 설치파일을 사용을 사용하여 설치했다면 기능 매니저(Feature Manager)를 사용하여 기능 추가 / 제거하기 의 내용을 따른다. 오프라인 설치파일을 사용하여 설치했다면 오프라인 설치파일을 사용하여 기능 추가 / 제거하기 의 내용을 따른다. 3 RAD 스튜디오 제거하기 관리자(Administrator) 권한이 있는 사용자는 자신이 설치했던 RAD 스튜디오를 제거할 수 있다. 윈도우10에서 프로그램 변경/제거하기 참고. 3.1 네트워크 라이선스를 사용중인 RAD 스튜디오 제거하기 RAD 스튜디오가 제거되고나면, 관리자(Administrator)가 아닌 모든 사용자는 윈도우 레지스트리에 있는 사용자의 고유 데이터를 반드시 제거해야 한다. 해당 사용자 계정으로 윈도우 로그인한다. 레지스트리 백업한다. Regedit 또는 기타 레지스트리 편집 도구를 실행한다. 해당 레지스트리 키를 삭제한다. (10.4 버전 기준): HKEY_CURRENT_USER\Software\Embarcadero\BDS\21.0 3.2 구성 파일 (Configuration Files) 제거 RAD 스튜디오가 제거되고나도, 디펄트 프로젝트 설정 등 사용자 고유 데이터가 구성 파일에 남는다. 따라서 아래 폴더에서 수작업으로 제거해야 한다(10.4 버전 기준). All Users\Application Data\Embarcadero\BDS\21.0 All Users\Shared Documents\Embarcadero\BDS\21.0 4 RAD 스튜디오를 업그레이드하기 주의! RAD 스튜디오의 다른 버전을 설치하려면 아래 단계를 따를 필요가 없다. 버전이 다르다면 RAD 스튜디오는 동시에 같은 컴퓨터에 공존할 수 있다. 메이저 버전이 같은 RAD 스튜디오를 기능이 더 좋은 상위 에디션 또는 최신 업데이트 버전으로 (예를 들어 같은 10.4.x 버전에서 10.4.y 버전으로) 교체하려면 먼저 RAD 스튜디오를 제거하고 나서 새 에디션이나 새 업데이트를 설치해야 한다. (업데이트 시에는 해당 업데이트 설치 방법 안내가 있다면 그 내용을 따르는 것이 우선이다) 5 관련 주제 겟잇 패키지 매니저를 사용하여 패키지 설치하기
  17. 이 문서의 목적: RAD 스튜디오, 델파이, C++빌더 등 엠바카데로 제품 설치 / 등록 과정에 생기는 주요 의문을 해소합니다. 목차 설치/등록 일반 FAQ EDN 계정 관련 FAQ 설치/등록 횟수 관련 FAQ 설치/등록 일반 FAQ Q: 설치 파일이 필요합니다. 어디에 있나요? EDN 서비스를 이용하세요. Q: 나의 시리얼번호 또는 제품이 등록된 EDN 계정을 알 수 있나요? 네, EDN 서비스에 로그인한 후, My Registered Products를 열어서, 찾아보세요. Q: 인터넷에 연결되지 않은 컴퓨터에서도 RAD 스튜디오(델파이, C++빌더)를 설치/등록/사용할 수 있나요? 네, 인터넷에 연결되지 않은 컴퓨터에서 제품을 설치/등록/사용하려면 오프라인 설치를 참고하세요. Q: 사용자 1명이 라이선스 1개로 컴퓨터 여러대에 설치해도 되나요? ESD 이메일로 전달된 라이선스가 Named User 라고 명시되어 있는 라이선스 (예: Delphi Enterprise Named User)라면, 본인만 사용하는 컴퓨터에 한하여 해당 라이선스를 여러번 등록하여 사용할 수 있습니다. 주의하실 점은, 불법 소프트웨어 감사 시에는 일단 컴퓨터에 설치된 수와 사용자 수로 간주되므로, 해당 컴퓨터 여러 대를 1명의 사용자만 사용한 다는 것을 사용자 (또는 해당 회사)에서 직접 증명해야합니다. (예를 들어, 1인 회사라면 증명이 쉬울 수도 있겠지만, 일반적으로 쉽지 않습니다) 특히 개발자 수가 보유한 라이선스 보다 많으면 더 엄격하게 판단되는 경향이 있습니다. Q: 제품 설치/등록 횟수에 제한이 있나요? 네, 설치/등록 횟수 관련 FAQ를 참고하세요. Q: 제품을 당장 사용하지 않아서 설치 예정이 없습니다. 하지만 구입한 시리얼번호를 EDN 계정에 미리 등록해 두고 싶습니다. 제품 설치를 하지 않아도 정품 등록 파일을 생성하는 웹페이지를 이용하여 미리 등록할 수 있습니다. Q: 이전 버전이 필요한데 엠바카데로는 최신 버전만 판매합니다. 이전 버전은 어떻게 구입하나요? 최신 버전 구입 후, 필요한 이전 버전의 라이선스를 무상으로 확보할 수 있습니다. EDN 계정 관련 FAQ Q: EDN 계정이 무엇인가요? 꼭 필요한가요? 엠바카데로는 EDN 서비스를 통해서 자사 제품의 사용자와 각 사용자에게 허용된 제품 라이선스를 관리합니다. 구입한 Named User (기명 사용자) 라이선스를 사용하려면, EDN 계정이 꼭 필요합니다. Q: EDN 계정을 어떻게 생성하나요? 새 EDN 계정 생성하기를 따라 진행하세요. Q: EDN 서비스의 로그인 계정(EDN 계정)이 기억나지 않습니다. 어떻게 하나요? EDN 계정으로 EDN 서비스에 로그인하기에 설명되어 있습니다. Q: 관리자 퇴사 등의 사유로 라이선스의 시리얼번호를 다른 EDN 계정으로 변경하고 싶습니다. 저작권사인 엠바카데로의 지원팀에게 라이선스 이전(Transfer)을 요청하세요. 설치/등록 횟수 관련 FAQ 엠바카데로는 무단 사용 방지를 위해 제품 설치 시의 등록 횟수가 제한되어 있습니다. (일반적으로 라이선스 하나당 최대 3회) 주의! 엠바카데로 Named User 라이선스를 시리얼번호 1개를 2명 이상이 사용하거나, 지정된 사용자가 아닌 사람이 사용할 경우, 라이선스 위반으로 법적 책임이 따를 수 있습니다. Q: 등록 횟수 한도에 도달했다는 메시지가 나오고, 제품도 사용하지 못하고 있습니다. "The registration limit for this serial number has been reached." 라는 메시지라면, 엠바카데로의 지원팀에게 제품 등록 한도 증가를 요청하세요. Q: 등록 횟수를 0으로 초기화 할 수는 없나요? 등록 횟수는 0으로 초기화하는 절차는 없습니다. 다만, 등록 횟수 한도에 도달한 경우 증가 요청을 하면 한도 증가 절차를 진행합니다. (한번에 한도를 1회 늘려줍니다) Q: 몇번 더 설치/등록을 할 수 있는지 미리 알아볼 수 있나요? 네, 정품 등록 파일을 생성하는 웹페이지를 이용하여 미리 파악할 수 있습니다. Q: 등록 횟수 한도에 도달하기 전에 미리 한도 증가를 요청하면 한도를 늘려주나요? 아닙니다. "아직 횟수가 다 차지 않아 처리해줄 수 없다. 등록 한도에 도달한 경우에만 한도 증가 절차가 진행된다"라는 답변이 메일로 전달됩니다. Q: 재설치 시 등록 횟수가 증가되지 않도록 할 수 있는 방법이 있나요? 컴퓨터에서 윈도우를 재설치하고 RAD 스튜디오도 재설치하는 경우에는, 사전에 정품 등록 파일(reg*.txt / *.slip)을 복사해 두었다가 재사용하면 등록 과정이 생략되므로 등록 횟수가 증가되지 않습니다. Q: 고객 지원, 테스트 등으로 인해 다수의 컴퓨터에 설치하는 경우가 많습니다. 동일한 환경이 아니므로 slip 파일 재사용도 안되는데, 어떻게 해야 하나요? 등록 한도에 도달할 때마다 엠바카데로의 지원팀에게 제품 등록 한도 증가를 요청하는 수 밖에 없습니다. 원격 테스트나 디버깅이 목적이라면, 사용 중인 RAD 스튜디오 (델파이, C++빌더)에서 해당 클라이언트를 원격으로 디버깅하세요. View full 엠바카데로 개발도구 가이드
  18. 이 문서의 목적: RAD 스튜디오 설치, 업그레이드, 제거 방법을 설명한다. (Docwiki에 있는 10.4 버전 설치 문서를 기반으로 작성됨. 다른 버전은 원문(영문)을 참고) 목차 1 설치하기 1.1 설치 전 확인 사항 1.2 설치 파일 고르기 1.3 선택한 설치파일을 실행하여 설치하기 1.4 RAD 스튜디오 설치 후 (필요 시) 추가 조치 1.4.1 이전 버전의 설정 사항 임포트하기 1.4.2 새 PA (Platform Assistant) 설치하기 1.4.3 템플릿 파일 업데이트하기 2 설치 후에 기능을 추가 또는 변경하기 3 RAD 스튜디오 제거하기 3.1 네트워크 라이선스를 사용중인 RAD 스튜디오 제거하기 3.2 구성 파일 (Configuration Files) 제거 4 RAD 스튜디오를 업그레이드하기 5 관련 주제 1 설치하기 1.1 설치 전 확인 사항 시스템 요구사항은 Installation Note 참고. RAD 스튜디오는 이전 버전이 설치된 컴퓨터에도 새 버전을 함께 설치할 수 있다. 이때, 컴퓨터의 PATH 환경 변수에 해당 버전이 추가된다. 환경 변수는 최대 1830자까지만 들어갈 수 있으므로 (그럴리는 거의 없지만) 넘지 않도록 유의하기 바람 1.2 설치 파일 고르기 일반 설치파일 또는 오프라인 설치파일 중 하나를 선택한다. 일반 설치파일을 사용하는 것이 일반적인 상황에서 최고의 선택이다. 그 이유는, 설치 시 소요 시간이 훨씬 짧다. 설치 후 설치 요소를 다시 변경할 때도 훨씬 짧다. 설치 요소 선택이 더 유연하다. 타겟 플랫폼과 프로그래밍 언어를 조합하여 구성 가능 (오프라인 Installer는 타겟 플랫폼과 프로그래밍 언어를 별도로 지정함) 설치된 프로그래밍 언어를 설치 후에도 제거 가능 설치 파일 용량이 훨씬 작다. 0.2GB (설치 중 선택에 맞게 필요한 파일을 자동으로 다운로드하며 설치) ESD 이메일 안에는 시리얼번호 뿐만 아니라 일반 설치파일 링크도 함께 들어있다. 설치파일을 보관할 필요가 없으며, 일단 설치되고 나면 이후에는 개발도구 안에서 설치 요소를 변경 가능하다. 설치 과정이 더 쉽고 명확함 (설치 단계가 훨씬 직관적임) 오프라인 설치파일을 사용해야 하는 특별한 경우도 있다. 즉, 인터넷에 연결되지 않은 컴퓨터에 설치해야 하는 경우 설치되는 드라이브에 공간이 부족하여 설치 과정에 필요한 임시 파일들을 받아들이지 못하는 경우 (오프라인 설치파일로는 설치를 위한 임시 파일 저장 폴더를 다른 곳으로 지정 가능) [오프라인 설치파일 사용 시 주의 사항] 기능 매니저 (Tools > Manage Platform) 사용 안됨 겟잇 패키지 매니저를 사용하려면, 수작업으로 "online mode"를 켜야 함 방법:GetItCmd.exe 도구를 사용하여 다음 명령어 실행 GetItCmd.exe -c=useonline BDS 환경 변수를 설정해 주어야 GetItCmd.exe를 사용할 수 있음 명령창에서 다음 명령어 실행: set BDS=C:\Program Files (x86)\Embarcadero\Studio\21.0 또는 [BDS설치 폴더]\bin\rsvars.bat 명령 파일을 찾아서 실행 1.3 선택한 설치파일을 실행하여 설치하기 일반 설치파일: 일반 설치파일 사용하기 문서 참조 오프라인 설치파일: 오프라인 설치파일 사용하기 문서 참조 1.4 RAD 스튜디오 설치 후 (필요 시) 추가 조치 1.4.1 이전 버전의 설정 사항 임포트하기 이미 이전 버전이 설치되어 있는 컴퓨터라면 설정 마이그레이션 도구를 사용하여 새 버전에도 동일한 설정을 반영한다. 1.4.2 새 PA (Platform Assistant) 설치하기 맥OS 또는 iOS 용 애플리케이션을 배포할 계획이 있거나, 64비트 윈도우 애플리케이션을 원격에 배포할 계획이 있다면, 맥 또는 원격의 64비트 윈도우 시스템에 PA (Platform Assistant)를 설치해야 한다. 이때 반드시 새 버전에서 제공하는 새 PA를 설치해야 한다 (이전 버전에서 제공된 PA를 재사용할 수 없음). 팁! 하나의 시스템에서 버전이 다른 PA (Platform Assistant)를 동시에 실행할 수 있다. 단, 각 PA 인스턴스는 서로 다른 포트 번호를 사용해야 한다. 1.4.3 템플릿 파일 업데이트하기 맥OS, iOS, 또는 안드로이드 용 프로젝트에는 각 플랫폼별로 사용자 지정 사항을 반영할 수 있도록 템플릿 파일이 들어있다. RAD 스튜디오를 이전 버전에서 새 버전으로 마이그레이션 하려면 반드시, 사용자 지정이 반영된 템플릿 파일을 백업하여 향후 변경 내용 점검을 준비한다. 프로젝트 폴더 안에 있는 템플릿 파일을 모두 제거한다. 각 플랫폼 별로 만든 애플리케이션을 (안드로이드는) 빌드, (맥OS, iOS)는 배포한다. 그러면 RAD 스튜디오가 각 템플릿 파일을 최신 버전으로 자동 생성한다. (사용자 지정 사항이 기존에 있었다면) 새 템플릿 파일을 편집하여 해당 변경 즉 사용자 지정 사항을 반영한다. 보다 자세한 내용은: AndroidManifest.template.xml 템플릿 파일 새로 만들기 info.plist 템플릿 파일 새로 만들기 (info.plist.TemplateOSX.xml, info.plist.TemplateiOS.xml) iOS, 맥OS 용 Entitlement List(자격 목록)을 사용자 지정하기 (Entitlement.TemplateOSX.xml, Entitlement.TemplateiOS.xml) 2 설치 후에 기능을 추가 또는 변경하기 (사용할 프로그래밍 언어, 사용할 타겟 플랫폼, 언어팩 등) 주요 기능 요소를 RAD 스튜디오 설치 중 뿐만 아니라 설치 후에도 활성화 또는 비활성화 할 수 있다. 일반 설치파일을 사용을 사용하여 설치했다면 기능 매니저(Feature Manager)를 사용하여 기능 추가 / 제거하기 의 내용을 따른다. 오프라인 설치파일을 사용하여 설치했다면 오프라인 설치파일을 사용하여 기능 추가 / 제거하기 의 내용을 따른다. 3 RAD 스튜디오 제거하기 관리자(Administrator) 권한이 있는 사용자는 자신이 설치했던 RAD 스튜디오를 제거할 수 있다. 윈도우10에서 프로그램 변경/제거하기 참고. 3.1 네트워크 라이선스를 사용중인 RAD 스튜디오 제거하기 RAD 스튜디오가 제거되고나면, 관리자(Administrator)가 아닌 모든 사용자는 윈도우 레지스트리에 있는 사용자의 고유 데이터를 반드시 제거해야 한다. 해당 사용자 계정으로 윈도우 로그인한다. 레지스트리 백업한다. Regedit 또는 기타 레지스트리 편집 도구를 실행한다. 해당 레지스트리 키를 삭제한다. (10.4 버전 기준): HKEY_CURRENT_USER\Software\Embarcadero\BDS\21.0 3.2 구성 파일 (Configuration Files) 제거 RAD 스튜디오가 제거되고나도, 디펄트 프로젝트 설정 등 사용자 고유 데이터가 구성 파일에 남는다. 따라서 아래 폴더에서 수작업으로 제거해야 한다(10.4 버전 기준). All Users\Application Data\Embarcadero\BDS\21.0 All Users\Shared Documents\Embarcadero\BDS\21.0 4 RAD 스튜디오를 업그레이드하기 주의! RAD 스튜디오의 다른 버전을 설치하려면 아래 단계를 따를 필요가 없다. 버전이 다르다면 RAD 스튜디오는 동시에 같은 컴퓨터에 공존할 수 있다. 메이저 버전이 같은 RAD 스튜디오를 기능이 더 좋은 상위 에디션 또는 최신 업데이트 버전으로 (예를 들어 같은 10.4.x 버전에서 10.4.y 버전으로) 교체하려면 먼저 RAD 스튜디오를 제거하고 나서 새 에디션이나 새 업데이트를 설치해야 한다. (업데이트 시에는 해당 업데이트 설치 방법 안내가 있다면 그 내용을 따르는 것이 우선이다) 5 관련 주제 겟잇 패키지 매니저를 사용하여 패키지 설치하기 View full 엠바카데로 개발도구 가이드
×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.