2012-06-05 2 views
3

배치 구성 요소를 사용하여 테이블 내의 일부 오래된 레코드를 보관하고 싶습니다. 에이스 구성 요소 사이트의 예제를 살펴 보았지만이를 사용하는 방법을 잘 모르겠습니다. 명령은 다음과 같습니다.절대 데이터베이스 일괄 이동

DestinationTable.BatchMove(SourceTable,TABSBatchMoveType(bmtAppend)); 

두 개의 datetimepickers를 사용하기위한 작업입니다. 따라서 쿼리는 매개 변수와 비슷하게됩니다.

SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSQuery.ExecSql; 

쿼리를 batchmove 명령과 통합하려면 어떻게합니까? 검색된 모든 레코드를 원본 테이블에서 대상 테이블로 옮기고 싶습니다.

+1

왜 이렇게 많은 델파이 버전이 태그되어 있습니까? –

답변

3

절대 데이터베이스의 BatchMove은 두 개의 TTable 구성 요소가 필요한 이전의 BDE TBatchMove을 모델링 한 것으로 보입니다. IIRC, TQuery과 작동하지 않았지만 잘못 기억하고있을 수 있습니다. (BDE는 10 년 이상 사용되지 않아 Delphi 1부터 사용하지 않았습니다.)

BatchMove은 필요하지 않습니다.

// Copy rows into destination 
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 + 
    '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2)'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSql; 
ABSTQuery1.Close; 

// Remove them from source (you said "move", after all) 
ABSTQuery1.SQL.Text := 'DELETE FROM MyTable'#32 + 
    `WHERE Date BETWEEN :a1 and :a2'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSql; 
ABSTQuery1.Close; 

첫 번째 SQL 문에서 대상 테이블의 이름으로 DestTable 교체 : 당신은 당신의 단일 쿼리 (간결함을 위해 생략 예외 처리) 모든 것을 할 수 있습니다.

더 나는 절대 데이터베이스를 사용하지 않은,하지만 자신의 SQL 지원, 스크립트가 포함 된 경우 (내가 당신까지 그 연구를 떠날거야 - 문서 위의 링크) on-line manual

절대 데이터베이스의 정보와 여러 문, 당신 한 번의 패스로 처리 할 수 ​​있습니다.

// Note addition of `;` at end of each SQL statement 
// and change in param names for second statement. 
// Some DBs will allow you to just use one pair, and 
// set the value for each once. Some require setting 
// each twice, and some require unique param names. 
// Check the documentation for Absolute DB. 
// 
ABSTQuery1.SQL.Text := 'INSERT INTO DestTable'#32 + 
    '(SELECT * from MYTABLE where DATE BETWEEN :a1 and :a2);' 
    'DELETE FROM MyTable WHERE Date BETWEEN :d1 and :d2;'; 
ABSTQuery1.Parameters.ParamByName ('a1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('a2').AsDate := DateTimePicker2.Date; 

// New param names for second pass 
ABSTQuery1.Parameters.ParamByName ('d1').AsDate := DateTimePicker1.Date; 
ABSTQuery1.Parameters.ParamByName ('d2').AsDate := DateTimePicker2.Date; 
ABSTQuery1.ExecSQL; 
ABSTQuery1.Close; 
+0

검색어의 # 32는 무엇입니까? – user763539

+0

죄송합니다. 공백 문자입니다. 공간을 넣는 것보다 사용하는 것이 더 쉽습니다. 공백은 문자열의 끝에서 놓치기가 너무 쉽습니다. 그리고 생략하면 구문 오류입니다. '# 32'는 공백이며, '# 9'는 탭이고, '# 13'은 캐리지 리턴 (CR)이고, '# 10'은 줄 바꿈입니다. 그들은 일반적으로 사용되는 문자들입니다 (당신이 유용하다고 생각하는 또 다른 문자는'# 34'입니다, 이중 따옴표입니다). 예를 들어'# 13 # 10'은 Windows 시스템의 줄 끝 문자이며 IDE 코드 편집기의 모든 소스 행 끝에 있습니다. 모든 ASCII 차트를 볼 수 있습니다. '# '는'문자'를 의미합니다. –

관련 문제