2012-06-05 6 views
3

Я хотел бы использовать пакетный компонент для архивирования некоторых старых записей в таблице. Я посмотрел пример на сайте компонентов Ace, но я не уверен, как его использовать. Команда:абсолютное перемещение базы данных

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

Почему это связано с большим количеством версий Delphi? –

ответ

3

Абсолютная база данных BatchMove, по-видимому, смоделирована после старого BDE TBatchMove, что потребовало двух компонентов TTable; IIRC, он не работал с TQuery, но я мог вспомнить неправильно. (BDE устарел более десяти лет, и я не использовал его с 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; 

Replace DestTable с именем таблицы назначения в первом операторе SQL.

Более подробная информации в базе данных Абсолютного on-line manual

я не использовал Absolute Database, но если их SQL поддержка включает в себя сценарии (я оставлю это исследование до вас - документы ссылку выше) и нескольких операторов, вы может сделать это за один проход:

// 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; символ '#' означает 'символ'. –

Смежные вопросы