Topic: Импорт и журнал действий. Как связать?
Это запись кода импорта данных через файл CSV в моём проекте:
//============== ИМПОРТ_1 =================================================
procedure frmChoice_bImportNAF_OnClick (Sender: string; var Cancel: boolean);
var
OpenDialog: TOpenDialog;
sl: TStringList;
arrStr: array of string;
i,c: integer;
sid_sked: string; //опись
sid_type: string; //тип дела
sDocNum: string; //номер дела
sDocName: string; //название
sid_year: string; //год формирования
sBeginDate: string; //начато
sEndDate: string; //окончено
sid_period: string; //срок хранения
sPages: string; //количество страниц
sid_room: string; //комната
sid_scaff: string; //стеллаж
sid_rack: string; //полка
sNote: string; //примечание
YY, MM, DD: string;
begin
OpenDialog := TOpenDialog.Create(frmChoice);
OpenDialog.InitialDir := 'd:\Archive 1.01 Import\ImportCSV';
if OpenDialog.Execute then
begin
sl := TStringList.Create;
sl.LoadFromFile (OpenDialog.FileName); ///открытие файла
c := sl.Count - 1;
for i := 1 to c do
begin
arrStr := SplitString(sl[i], ';');
//0 sid_sked
if arrStr[0] <> '' then
begin
sid_sked := SQLExecute ('SELECT id FROM sked WHERE sked LIKE "' + arrStr[0] +'"');
if sid_sked = '' then
begin
SQLExecute ('INSERT INTO sked (sked) VALUES ("'+ arrStr[0] +'");');
sid_sked := IntToStr(Last_Insert_id('sked'));
if sid_sked = '-1' then sid_sked := 'NULL';
end;
end else sid_sked := 'NULL';
//1 sid_type
if arrStr[1] <> '' then
begin
sid_type := SQLExecute ('SELECT id FROM type WHERE type LIKE "' + arrStr[1] +'"');
if sid_type = '' then
begin
SQLExecute ('INSERT INTO type (type) VALUES ("'+ arrStr[1] +'");');
sid_type := IntToStr(Last_Insert_id('type'));
if sid_type = '-1' then sid_type := 'NULL';
end;
end else sid_type := 'NULL';
//2 sDocNum
if arrStr[2]<>'' then sDocNum := '"'+arrStr[2]+'"' else sDocNum := 'NULL';
//3 sDocName
if arrStr[3]<>'' then sDocName := '"' + ReplaceStr(arrStr[3], '"', '') + '"' else sDocName := 'NULL';
//4 sid_year
if arrStr[4] <> '' then
begin
sid_year := SQLExecute ('SELECT id FROM year WHERE year LIKE "' + arrStr[4] +'"');
if sid_year = '' then
begin
SQLExecute ('INSERT INTO year (year) VALUES ("'+ arrStr[4] +'");');
sid_year := IntToStr(Last_Insert_id('year'));
if sid_year = '-1' then sid_year := 'NULL';
end;
end else sid_year := 'NULL';
//5 sBeginDate
if arrStr[5]<>'' then
sBeginDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[5])) + '"'
else sBeginDate := 'NULL';
//6 sEndDate
if arrStr[6]<>'' then
sEndDate := '"'+ FormatDateTime('yyyy-MM-DD 00:00:00.000', StrToDate(arrStr[6])) + '"'
else sEndDate := 'NULL';
//7 sid_period
if arrStr[7] <> '' then
begin
sid_period := SQLExecute ('SELECT id FROM period WHERE period LIKE "' + arrStr[7] +'"');
if sid_period = '' then
begin
SQLExecute ('INSERT INTO period (period) VALUES ("'+ arrStr[7] +'");');
sid_period := IntToStr(Last_Insert_id('period'));
if sid_period = '-1' then sid_period := 'NULL';
end;
end else sid_period := 'NULL';
//8 sPages
if arrStr[8]<>'' then sPages := '"'+arrStr[8]+'"' else sPages := 'NULL';
//9 sid_room
if arrStr[9] <> '' then
begin
sid_room := SQLExecute ('SELECT id FROM room WHERE room LIKE "' + arrStr[9] +'"');
if sid_room = '' then
begin
SQLExecute ('INSERT INTO room (room) VALUES ("'+ arrStr[9] +'");');
sid_room := IntToStr(Last_Insert_id('room'));
if sid_room = '-1' then sid_room := 'NULL';
end;
end else sid_room := 'NULL';
//10 sid_scaff
if arrStr[10] <> '' then
begin
sid_scaff := SQLExecute ('SELECT id FROM scaff WHERE scaff LIKE "' + arrStr[10] +'"');
if sid_scaff = '' then
begin
SQLExecute ('INSERT INTO scaff (scaff) VALUES ("'+ arrStr[10] +'");');
sid_scaff := IntToStr(Last_Insert_id('scaff'));
if sid_scaff = '-1' then sid_scaff := 'NULL';
end;
end else sid_scaff := 'NULL';
//11 sid_rack
if arrStr[11] <> '' then
begin
sid_rack := SQLExecute ('SELECT id FROM rack WHERE rack LIKE "' + arrStr[11] +'"');
if sid_rack = '' then
begin
SQLExecute ('INSERT INTO rack (rack) VALUES ("'+ arrStr[11] +'");');
sid_rack := IntToStr(Last_Insert_id('rack'));
if sid_rack = '-1' then sid_rack := 'NULL';
end;
end else sid_rack := 'NULL';
//12 sNote
if arrStr[12]<>'' then sNote := '"'+arrStr[12]+'"' else sNote := 'NULL';
SQLExecute ('INSERT INTO one (id_sked, id_type, [docNum], [docName], id_year, [beginDate], [endDate], id_period, [pages], id_room, id_scaff, id_rack, [note]) VALUES ('+
sid_sked +','+
sid_type +','+
sDocNum +','+
sDocName +','+
sid_year +','+
sBeginDate +','+
sEndDate +','+
sid_period +','+
sPages +','+
sid_room +','+
sid_scaff +','+
sid_rack +','+
sNote +
');');
////////////////////////////////////////////////
////// frmChoice.bEditNAF.Click;
////// frmDocProcessingNAF.bOK1.Click;
////////////////////////////////////////////////
frmChoice.Label8.Caption := IntToStr(i) + ' з ' + IntToStr(c);
Application.ProcessMessages;
end;
sl.Free;
UpdateDatabase('sked');
UpdateDatabase('type');
UpdateDatabase('year');
UpdateDatabase('period');
UpdateDatabase('room');
UpdateDatabase('scaff');
UpdateDatabase('rack');
frmChoice.TableGrid1.dbUpdate;
end;
OpenDialog.Free;
begin
frmChoice.bSearch1.Click; ////!!!!!Нажатие на кнопку ПОИСК (при этом видимые записи таблицы обновляются)
end;
end;
//====================================================================
Хочется, чтобы вновь добавленные импортом записи попадали ещё и в журнал действий со статусом "Добавлено", как при добавлении по одной через кнопку "Добавить". Попытаюсь объяснить, зачем мне это всё. После редактирования записи, сделанной через кнопку "Добавить", в журнале есть первоначальные данные (статус "Добавлено") и изменённые данные (статус "Изменено"). Т.е. имеется возможность определить, что же конкретно изменилось в этой записи. После редактирования записи, сделанной импортом, такой возможности нет, так как в журнале отсутствует первоначальная запись.
Думаю, что скорее всего идею можно реализовать через кнопку редактирования записи. В код добавил (в коде импорта выделено):
frmChoice.bEditNAF.Click;
frmDocProcessingNAF.bOK1.Click;
где bEditNAF - кнопка редактирования записи, frmDocProcessingNAF - форма добавления/редактирования. bOK1 изменяет выбранную запись и записывает в журнал (для неё создано соответствующее событие). Вставил именно в это место кода потому, что процедура записи одной строки завершилась и запись следующей строки ещё не началась.
Код для записи в журнал записан так:
//==== Новая запись =====================================================
procedure frmDocProcessingNAF_bOK1_OnAfterClick (Sender: string);
var
sCurrentDate: string;
sUser: string;
sForm: string;
sOperation: string;
sSked: string;
sType: string;
sDocNum: string;
sDocName: string;
sYear: string;
sBeginDate: string;
sEndDate: string;
sPeriod: string;
sPages: string;
sRoom: string;
sScaff: string;
sRack: string;
sNote: string;
sFileYes: string;
begin
sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';
sUser := '"'+frmDocProcessingNAF.user.Text+'"';
sForm := '"'+frmDocProcessingNAF.form.Text+'"';
sSked := '"'+frmDocProcessingNAF.cBoxSked.Text+'"';
sType := '"'+frmDocProcessingNAF.cBoxType.Text+'"';
sDocNum := '"'+frmDocProcessingNAF.edNum.Text+'"';
sDocName := '"'+frmDocProcessingNAF.edName.Text+'"';
sYear := '"'+frmDocProcessingNAF.cBoxYear.Text+'"';
sPeriod := '"'+frmDocProcessingNAF.cBoxPeriod.Text+'"';
sPages := '"'+frmDocProcessingNAF.edPages.Text+'"';
sRoom := '"'+frmDocProcessingNAF.cBoxRoom.Text+'"';
sScaff := '"'+frmDocProcessingNAF.cBoxScaff.Text+'"';
sRack := '"'+frmDocProcessingNAF.cBoxRack.Text+'"';
sNote := '"'+frmDocProcessingNAF.mNote.Text+'"';
sFileYes := '"'+frmDocProcessingNAF.DBFileNAF.Text+'"';
if frmDocProcessingNAF.dtpBegin.Checked then
sBeginDate := '"' + FormatDateTime('DD.MM.yyyy', frmDocProcessingNAF.dtpBegin.Date) + '"'
else sBeginDate := 'NULL';
if frmDocProcessingNAF.dtpEnd.Checked then
sEndDate := '"' + FormatDateTime('DD.MM.yyyy', frmDocProcessingNAF.dtpEnd.Date) + '"'
else sEndDate := 'NULL';
if sLastActionForm = 'NewRecord' then sOperation := '"Додано"';
if sLastActionForm = 'ShowRecord' then sOperation := '"Змінено"';
SQLExecute ('INSERT INTO logNAF (date, user, form, operation, sked, type, docNum, docName, year, beginDate, endDate, period, pages, room, scaff, rack, note, FileYes)' +
'VALUES ('+sCurrentDate+', '+sUser+', '+sForm+','+sOperation+','+sSked+','+sType+','+sDocNum+','+sDocName+', '+sYear+', '+sBeginDate+', '+sEndDate+', '+sPeriod+', '+sPages+', '+sRoom+', '+sScaff+', '+sRack+', '+sNote+', '+sFileYes+')');
frmActions.tgActions.dbUpdate;
end;
Проблема: для frmChoice.bEditNAF.Click нужно сначала выбрать запись. Как сфокусировать действие этого кода на каждой вновь записанной строке?
Т.е., попросту говоря, мне нужно объединить в моём проекте вот эти два тестовые проекта:
http://myvisualdatabase.com/forum/misc. … download=1
http://myvisualdatabase.com/forum/misc. … download=1