-
Дмитрий (15.05.14 16:16) [18] Простите мою глупость...а как тогда в таблицу аудита попадут старые записи?
-
> а как тогда в таблицу аудита попадут старые записи? а те которые раньше там были не в счет? ну вот начали "аудит", хотя это ближе к логированию, как сейчас понимаю, сразу скопировали всю таблицу в таблицу "аудита" и считаем первые записи "точкой отчета", дальше изменения. и получится по записьно если выбрать один код и сортировать по времени добавления - что было, что стало, и т.д. для каждой следующей предыдущая старая запись.
-
-
2. что будет в in_number, если два пользователя одновременно выполнят insert? - ничего не будет..один пользователь.
-
Проблема моя решилась так..может кому пригодится
unit Events_unit; interface uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants; type// добавляем параметры Taudit_params = Record material: AnsiString; //параметр таблицы материал weight: Integer; // параметр таблицы вес end; type TEvents_main=class(TObject) private public Str_SQL: array of AnsiString; //массив строк audit: Taudit_params; audit_need_save: Boolean; type_event: AnsiString; // тип события St: String;//добавление новой строки //если редактирование строки procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet); begin Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String; Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger; Smelt.type_event:='edit rec ferr'; // тип события редактирование // добавление новой строки (записи) procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet); begin Smelt.type_event:='insert rec ferr'; SV.ferr:=1; end; procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet); var St: Integer; // строка begin if(Smelt.audit_need_save = false)then Exit; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,St+1); Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) '; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1); if(Smelt.type_event = 'insert rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');'; end; if(Smelt.type_event = 'edit rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');'; end; Smelt.type_event:= ''; Smelt.audit.material:=''; Smelt.audit.weight:=0; end; // ну и сам массив на кнопке "Сохранить" procedure Tadd_form.N2Click(Sender: TObject); var i:Integer; begin save_all_data(true); DataModule2.DataSet_material_audit.Close; DataModule2.DataSet_material_audit.SQL.Add('begin'); for i:=0 to length(Smelt.Str_SQL)-1 do begin // добавление данных в таблицу аудита при помощи выполнения массива DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]); end; DataModule2.DataSet_material_audit.SQL.Add('commit;'); DataModule2.DataSet_material_audit.SQL.Add('end;'); DataModule2.DataSet_material_audit.Open; for i:=0 to length(Smelt.Str_SQL)-1 do begin // чистим массив Smelt.Str_SQL[i]:=''; end; Setlength(Smelt.Str_SQL, 0); end;
В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время. На удаление строки - делается аналогично. На удаление строки аналогично. Спасибо всем, кто откликнулся и помогал.
-
Проблема моя решилась так..может кому пригодится
unit Events_unit; interface uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants; type// добавляем параметры Taudit_params = Record material: AnsiString; //параметр таблицы материал weight: Integer; // параметр таблицы вес end; type TEvents_main=class(TObject) private public Str_SQL: array of AnsiString; //массив строк audit: Taudit_params; audit_need_save: Boolean; type_event: AnsiString; // тип события St: String;//добавление новой строки //если редактирование строки procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet); begin Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String; Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger; Smelt.type_event:='edit rec ferr'; // тип события редактирование // добавление новой строки (записи) procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet); begin Smelt.type_event:='insert rec ferr'; SV.ferr:=1; end; procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet); var St: Integer; // строка begin if(Smelt.audit_need_save = false)then Exit; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,St+1); Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) '; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1); if(Smelt.type_event = 'insert rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');'; end; if(Smelt.type_event = 'edit rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');'; end; Smelt.type_event:= ''; Smelt.audit.material:=''; Smelt.audit.weight:=0; end; // ну и сам массив на кнопке "Сохранить" procedure Tadd_form.N2Click(Sender: TObject); var i:Integer; begin save_all_data(true); DataModule2.DataSet_material_audit.Close; DataModule2.DataSet_material_audit.SQL.Add('begin'); for i:=0 to length(Smelt.Str_SQL)-1 do begin // добавление данных в таблицу аудита при помощи выполнения массива DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]); end; DataModule2.DataSet_material_audit.SQL.Add('commit;'); DataModule2.DataSet_material_audit.SQL.Add('end;'); DataModule2.DataSet_material_audit.Open; for i:=0 to length(Smelt.Str_SQL)-1 do begin // чистим массив Smelt.Str_SQL[i]:=''; end; Setlength(Smelt.Str_SQL, 0); end;
В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время. На удаление строки - делается аналогично. На удаление строки аналогично. Спасибо всем, кто откликнулся и помогал.
-
Проблема моя решилась так..может кому пригодится
unit Events_unit; interface uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants; type// добавляем параметры Taudit_params = Record material: AnsiString; //параметр таблицы материал weight: Integer; // параметр таблицы вес end; type TEvents_main=class(TObject) private public Str_SQL: array of AnsiString; //массив строк audit: Taudit_params; audit_need_save: Boolean; type_event: AnsiString; // тип события St: String;//добавление новой строки //если редактирование строки procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet); begin Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String; Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger; Smelt.type_event:='edit rec ferr'; // тип события редактирование // добавление новой строки (записи) procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet); begin Smelt.type_event:='insert rec ferr'; SV.ferr:=1; end; procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet); var St: Integer; // строка begin if(Smelt.audit_need_save = false)then Exit; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,St+1); Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) '; St:=length(Smelt.Str_SQL); Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1); if(Smelt.type_event = 'insert rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');'; end; if(Smelt.type_event = 'edit rec ferr')then begin Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''', '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');'; end; Smelt.type_event:= ''; Smelt.audit.material:=''; Smelt.audit.weight:=0; end; // ну и сам массив на кнопке "Сохранить" procedure Tadd_form.N2Click(Sender: TObject); var i:Integer; begin save_all_data(true); DataModule2.DataSet_material_audit.Close; DataModule2.DataSet_material_audit.SQL.Add('begin'); for i:=0 to length(Smelt.Str_SQL)-1 do begin // добавление данных в таблицу аудита при помощи выполнения массива DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]); end; DataModule2.DataSet_material_audit.SQL.Add('commit;'); DataModule2.DataSet_material_audit.SQL.Add('end;'); DataModule2.DataSet_material_audit.Open; for i:=0 to length(Smelt.Str_SQL)-1 do begin // чистим массив Smelt.Str_SQL[i]:=''; end; Setlength(Smelt.Str_SQL, 0); end;
В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время. На удаление строки - делается аналогично. На удаление строки аналогично. Спасибо всем, кто откликнулся и помогал.
-
>Спасибо всем, кто откликнулся и помогал. жаль, что Вы не прислушались к советам
-
>Спасибо всем, кто откликнулся и помогал. жаль, что Вы не прислушались к советам
-
>Спасибо всем, кто откликнулся и помогал. жаль, что Вы не прислушались к советам
-
Кшд, прислушалась.. но в этом варианте только так приходится делать.
-
Кшд, прислушалась.. но в этом варианте только так приходится делать.
-
Кшд, прислушалась.. но в этом варианте только так приходится делать.
-
>Natalinka © (21.05.14 12:24) [26] обманываете всё... 1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да? 2. используйте параметры; 3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки; 4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?
в целом, код унылый и нелепый справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли
поэтому, Ваш код - пример того, как делать нельзя никому никогда
-
>Natalinka © (21.05.14 12:24) [26] обманываете всё... 1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да? 2. используйте параметры; 3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки; 4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?
в целом, код унылый и нелепый справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли
поэтому, Ваш код - пример того, как делать нельзя никому никогда
-
>Natalinka © (21.05.14 12:24) [26] обманываете всё... 1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да? 2. используйте параметры; 3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки; 4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?
в целом, код унылый и нелепый справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли
поэтому, Ваш код - пример того, как делать нельзя никому никогда
-
>Кщд (21.05.14 13:09) [27] и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
-
>Кщд (21.05.14 13:09) [27] и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
-
>Кщд (21.05.14 13:09) [27] и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
-
в курсе..но это службу безопасности не волнует, сказали хотим так - получили..раз в месяц данные будут удаляться из базы аудит
|