При работе с персональным компьютером запрещается пользоваться неисправными розетками, соединительными проводами с поврежденной электроизоляцией, а также подключать компьютер в незаземленную электросеть.
Во время работы нельзя открывать системный блок компьютеров, а также любые работающие периферийные устройства. Не рекомендуется также подключать и/или отключать периферийные устройства от работающих ПЭВМ. Кроме того, рекомендуется использовать устройства, контролирующие изменения напряжения на входе в компьютер и другие устройства.
ЗАКЛЮЧЕНИЕ
В процессе работы над данным дипломным проектом мне пришлось столунуться с рядом достаточно сложных проблем, для решения которых пришлось пополнить некоторые теоретические знания и практические знания, как по общей теории баз данных, так и реализации приложений баз данных в среде визуального программирования Delphi. Именно на данную систему программирования и пал мой выбор после получения технического задания, содержащего все требования к функциональным характеристикам программы. Данный выбор не случаен. Borland Delphi 7.0 является, по-моему грлубочайшему убеждению одной из самых лучших (если не самой лучшей) системой по написанию приложений баз данных. Эта система имеет широкие возможности по реализации СУБД самой различной конфигурации и архитектуры, что в сочетании с гибгим и достаточно структурированным язком программирования Object Pascal дает Delphi огромное преимущество в сравнении с другими подобными системами.
В процессе разработки программы основная проблема состаяла в организации дружественного пользовательского интерфейса и организации стабильной работы всех функций программы, связанных как непосредственно с функциями управления данными, хранящимися в базе данных, так и связанных с сервисными функциями программы.
Однако, в итоге, после завершения работы над программой, она стала удовлетворять всем требованиям заказчика.
Программа занимает на диске до 15-ти мегабайт. В оперативной памяти программа вместе со всеми загруженными библиотеками DLL занимает 11 килобайт. Так как программа использует технологии баз данных, то это увиличивает требования к свободной оперативной памяти компьютера и минимальным объемом, при котором программа работает с приемлимым быстродействием, составляет 32 мегабайта.
Программа предназначена для автоматизации заполнения первичной документации, хранения информации об этой документации в базе данных, а так же для обработки этой информации. Программа, как отмечалось выше, удовлетворяет всем требованиям заказчика и при ее использовании заметно снижается трудоемкость и время заполнения необходимой документации. Более того, как показано в главе 4 написание данной программы является рентабельным проектом, а значит, приносит реальную прибыль предпритию, использующею ее и окупается за 1,6 года.
В завершении хочется отметить, что данный проект (программа «D-Art Aurora v.1.0») не будет заброшен и разработка новых версий не заставит себя ждать, возможности программы будут расширены, но основной принцип всех моих программ, «Максимум пользы, при минимуме сложности», останется неизменным.
СПИСОК ЛИТЕРАТУРЫ
1. Робинсон С. – Microsoft Access 2000: учебный курс – СПб.: Питер, 2002.
2. Валерий Фаронов – Delphi 6: учебный курс – СПб.: Питер, 2002.
3. Валерий Фаронов – Программирование баз данных в Delphi 6: учебный курс – СПб.: Питер, 2002.
4. Валерий Фаронов – Профессиональная работа в Delphi 6. Библиотека программиста. – СПб.: Питер, 2002
5. Елманова Н. – Delphi 6 и технология COM. – СПб.: Питер, 2002
6. Базы данных: Учебник для высших учебных заведений /Под ред. проф. А.Д. Хомоненко. – СПб.: КОРОНА принт, 2000
ПРИЛОЖЕНИЕ 1
«Листинг программы D-Art Aurora v.1.0»
(ПРОЕКТ AURORA.DPR)
{D-Art® Aurora® v.1.0. © D-Art Software Corporation - 2003-2004.
All Copyrights are protected. Only personal use.
Not legal sale - is forbidden! }
Program Aurora;
uses
Forms,
SysUtils,
Controls,
Av_General in 'Av_General.pas' {General},
Av_Data in 'Av_Data.pas' {P_Data: TDataModule},
Sub_Program in 'Sub_Program.pas',
Load in 'Load.pas' {LoadF},
Av_Nuclls in 'Av_Nuclls.pas' {Nucll},
Av_DBData in 'Av_DBData.pas' {DB_Data: TDataModule},
Calend in 'Calend.pas' {Calen},
Av_ListRed in 'Av_ListRed.pas' {ListRed},
Av_ManyW in 'Av_ManyW.pas' {Many_List},
Av_Querys in 'Av_Querys.pas' {FQuery},
Av_Find in 'Av_Find.pas' {FFind},
Av_QLibrary in 'Av_QLibrary.pas' {QLib},
Av_ActionNow in 'Av_ActionNow.pas' {AN},
Av_FSort in 'Av_FSort.pas' {FSort},
Av_Print in 'Av_Print.pas' {FPrint},
Registry,
Av_Reports in 'Av_Reports.pas' {FReport},
Av_Pwrd in 'Av_Pwrd.pas' {FPwrd},
Av_ClearT in 'Av_ClearT.pas' {Form1},
Av_Exp in 'Av_Exp.pas' {FExp},
Av_Help in 'Av_Help.pas' {FHelp};
var
Aurora_Reg: TRegistry;
{$R *.res}
begin
{-----------------Начальные значения переменных------------}
First_load:= True; //Устанавливает запуск программы (=>Av_General)
Can_RS:= False; //Запрещает менять размеры рабочего окна (=>Av_Nuclls)
//Set_Top:= True; //Разрешаем мнять местоположение рабочего окна (=>Av_Nuclls)
TAMode:= am_None; //Устанавливаем состаяние НД(N_Gen) - НД не менялся (=>Av_Nuclls)
//i:= 1; //Счетчик массива номеров записей для удаления (=>Av_Nucll)
SV_Click:= False;
CH_F:= False;
CH_F2:= False;
Del_Q:= 0;
//NumNewF:= 0;
//ShowMEssage(Prog_Dir);
{-----------------Начальные значения (конец)---------------}
Application.Title:= 'D-Art: Aurora v.1.0';
Application.CreateForm(TGeneral, General);
Application.CreateForm(TLoadF, LoadF);
Application.CreateForm(TP_Data, P_Data);
Application.CreateForm(TDB_Data, DB_Data);
Application.CreateForm(TCalen, Calen);
Application.CreateForm(TListRed, ListRed);
Application.CreateForm(TMany_List, Many_List);
Application.CreateForm(TFFind, FFind);
Application.CreateForm(TQLib, QLib);
Application.CreateForm(TAN, AN);
Application.CreateForm(TFSort, FSort);
Application.CreateForm(TFPrint, FPrint);
Application.CreateForm(TFPwrd, FPwrd);
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TFExp, FExp);
Application.CreateForm(TFHelp, FHelp);
Application.Initialize;
{-----------------Реестр Windows---------------------------}
Aurora_Reg:= TRegistry.Create;
//Считываем значения из системного реестра
With Aurora_Reg Do
begin
OpenKey('\Software\D-Art Soft\Aurora',True);
If not ValueExists('Work_dir') Then
WriteString('Work_dir',ExtractFileDir(ExpandFileName('Aurora.exe')) + '\D_bc\');
If not ValueExists('Prog_dir') Then
WriteString('Prog_dir',ExtractFileDir(ExpandFileName('Aurora.exe')) + '\');
If not ValueExists('NDS') Then
WriteFloat('NDS',0.18);
If not ValueExists('NSP') Then
WriteFloat('NSP',0.05);
If not ValueExists('Ent_name') Then
WriteString('Ent_name','(Нет данных)');
If not ValueExists('Sort_nuclls') Then
WriteString('Sort_nuclls','Num ASC');
Nds_v:= ReadFloat('NDS');
Nsp_v:= ReadFloat('NSP');
Work_dir:= ReadString('Work_dir');
Prog_dir:= ReadString('Prog_dir');
Name_E:= ReadString('Ent_name');
//Определяем установлен ли пароль
If not ValueExists('PassWord') Then WriteString('PassWord','')
Else
begin
rpw:= ReadString('PassWord');
If rpw <> '' Then
If FPwrd.ShowModal = mrCancel Then Application.Terminate;
end;
end;
{-----------------Реестр Windows (конец)-------------------}
Application.Run;
end.
(МОДУЛЬ AV_NUCLLS.PAS)
unit Av_Nuclls;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Mask, DBCtrls,
Grids, DBGrids, Buttons, ADODB, DB, Registry;
type
TNucll = class(TForm)
Redactor: TGroupBox;
E_Num: TDBEdit;
E_Sum: TDBEdit;
Tools: TControlBar;
Navig: TToolBar;
Grid: TDBGrid;
E_Date: TDBEdit;
DBEdit6: TDBEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Date_B: TButton;
Label8: TLabel;
Work_B: TButton;
Client_B: TButton;
FioO_B: TButton;
StatO_B: TButton;
Label9: TLabel;
StatP_B: TButton;
B_NSP: TDBCheckBox;
B_Sile: TDBCheckBox;
B_Many: TDBCheckBox;
Label10: TLabel;
Bevel2: TBevel;
DBEdit3: TDBEdit;
Label11: TLabel;
DBEdit4: TDBEdit;
Label12: TLabel;
E_FioP: TDBEdit;
Save: TToolButton;
Add: TToolButton;
Del: TToolButton;
Edit: TToolButton;
Next: TToolButton;
Prior: TToolButton;
ToolButton7: TToolButton;
View: TToolButton;
Help: TToolButton;
ToolButton10: TToolButton;
L_Work: TDBComboBox;
L_Client: TDBComboBox;
L_FioO: TDBComboBox;
L_StatO: TDBComboBox;
L_StatP: TDBComboBox;
Work_A: TBitBtn;
Client_A: TBitBtn;
FioO_A: TBitBtn;
StatO_A: TBitBtn;
StatP_A: TBitBtn;
Lst_Many: TButton;
Ap_Button: TToolBar;
Red_LST: TToolButton;
ToolButton2: TToolButton;
MB_LST: TToolButton;
MoveBy_P: TToolButton;
ToolButton9: TToolButton;
ToolButton11: TToolButton;
ToolButton12: TToolButton;
ToolButton13: TToolButton;
ToolButton14: TToolButton;
ToolButton4: TToolButton;
MoveBy_N: TToolButton;
ToolButton3: TToolButton;
Bevel1: TBevel;
procedure FormResize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Date_BClick(Sender: TObject);
procedure Work_BClick(Sender: TObject);
procedure EditClick(Sender: TObject);
procedure SaveClick(Sender: TObject);
procedure AddClick(Sender: TObject);
procedure DelClick(Sender: TObject);
procedure PriorClick(Sender: TObject);
procedure NextClick(Sender: TObject);
procedure B_ManyClick(Sender: TObject);
procedure Lst_ManyClick(Sender: TObject);
procedure Work_AClick(Sender: TObject);
procedure Client_BClick(Sender: TObject);
procedure Client_AClick(Sender: TObject);
procedure FioO_BClick(Sender: TObject);
procedure FioO_AClick(Sender: TObject);
procedure StatO_AClick(Sender: TObject);
procedure StatO_BClick(Sender: TObject);
procedure StatP_BClick(Sender: TObject);
procedure StatP_AClick(Sender: TObject);
procedure Red_LSTClick(Sender: TObject);
procedure MoveBy_PClick(Sender: TObject);
procedure MoveBy_NClick(Sender: TObject);
procedure E_NumEnter(Sender: TObject);
procedure E_NumExit(Sender: TObject);
procedure GridExit(Sender: TObject);
procedure GridEnter(Sender: TObject);
procedure MB_LSTMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure GridDblClick(Sender: TObject);
procedure HelpClick(Sender: TObject);
procedure E_SumEnter(Sender: TObject);
procedure E_DateEnter(Sender: TObject);
procedure E_DateExit(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Nucll: TNucll;
Can_RS: boolean;{Определяет нужно менять размеры рабочего окна}
TAMode{Определяет различные состояния набора данных N_Gen (=>Av_DBData)}: byte;
CH_F, CH_F2, NoATL, SV_Click, No_Adding, InGRD, Exec, CL_Click, SMM: boolean;
Active_Tab: TADOTable;
FS_Tab, MP_Tab: TCustomADODataSet;
Del_Q: byte;
Field_val, Right_num: Variant;
Tab_Name: String;
Active_Form: TForm;
Const
//Константы состаяний НД N_Gen
am_None = 0;
am_Add = 1;
am_Del = 2;
am_Edit = 3;
am_Scroll = 4;
implementation
uses Av_Data, Av_General, Load, Sub_Program, Av_DBData, Calend, Av_ListRed,
Av_ManyW, Av_Querys;
{$R *.dfm}
procedure TNucll.FormResize(Sender: TObject);
begin
//Проверяем размеры окна для изменения отображения
B_Sile.Left:= B_NSP.Left;
end;
procedure TNucll.FormCreate(Sender: TObject);
begin
//Устанавливаем размеры окна в соответствии с разрешением экрана
Height:= General.ClientHeight - General.BTools.Height - General.Gen_Stat.Height - 5;;
Width:= Round(Screen.Width * 0.90);
Top:= 0;
Nucll.Work_A.Visible:= RVB;
Nucll.Work_B.Visible:= RVB;
Nucll.Client_A.Visible:= RVB;
Nucll.Client_B.Visible:= RVB;
Nucll.FioO_A.Visible:= RVB;
Nucll.FioO_B.Visible:= RVB;
Nucll.StatO_A.Visible:= RVB;
Nucll.StatO_B.Visible:= RVB;
Nucll.StatP_A.Visible:= RVB;
Nucll.StatP_B.Visible:= RVB;
end;
procedure TNucll.FormActivate(Sender: TObject);
begin
Top:= 0;
//Меняем заголовок программы и окна
Application.Title:= 'D-Art: Aurora v.1.0 [Накладная]';
Active_Tab:= DB_Data.N_Gen;
FS_Tab:= DB_Data.N_Gen;
MP_Tab:= DB_Data.N_MIO;
Active_Form:= Self;
Tab_Name:= '"Накладные"';
DB_Data.Max_Num.SQL.Clear;
DB_Data.Max_Num.SQL.Add('Select Max(Num) From ' + Active_Tab.TableName);
Write_Stat(DB_Data.N_Gen,DB_Data.Primtabs,General.Gen_Stat);
Nucll.FocusControl(Navig);
end;
Procedure OnCls;
var i: byte;
Reg_nuc: TRegistry;
begin
//По закрытию сохраняем все изменения
DB_Data.N_Gen.UpdateBatch;
DB_Data.N_MIO.UpdateBatch;
P_Data.Control1.Enabled:= False;
Nucll.Destroy;//WindowHandle;
If Av_General.SC_Win[W_Querys] = False Then Active_Tab:= nil;
//Фиксируем закрытие окна в массиве (=>Av_General)
Av_General.SC_Win[W_Nuclls]:= False;
//Меняем заголовок программы и окна
Application.Title:= 'D-Art: Aurora v.1.0';
For i:= 0 To 3 Do
General.Gen_Stat.Panels[i].Text:= '';
//Записываем данные в реестр
Reg_nuc:= TRegistry.Create;
Reg_nuc.OpenKey('\Software\D-Art Soft\Aurora',True);
Reg_nuc.WriteString('Sort_nuclls',DB_Data.N_Gen.Sort);
Reg_nuc.Destroy;
end;
procedure TNucll.FormClose(Sender: TObject; var Action: TCloseAction);
var NS_Mes: integer;
begin
SV_Click:= True;
//Проверяем сохранность данных
If TAMode <> am_None Then
begin
NS_Mes:= Application.MessageBox(PChar('Не были сохранены изменения в накладной №'+ DB_Data.Num.AsString + '. Сохранить изменения?'),
'D-Art: Aurora',mb_OkCancel+mb_IconExclamation);
Case NS_Mes of
idOk: begin
{DB_Data.N_Gen.Post;
DB_Data.N_Gen.UpdateBatch;}
Try_SV;
Sub_Program.Op_Change;
Oncls;
Cancel_Cls:= False; //Можно закрыть программу
end;
idCancel: begin
Action:= caNone;
Cancel_Cls:= True; //Нельзя закрывать программу
SV_Click:= False;
end;
end; //Case
end
Else OnCls;
end;
procedure TNucll.Date_BClick(Sender: TObject);
begin
//Проверяем результат диалога с пользователем
With Calen,DB_Data do
If ShowModal = mrOk Then
Try
//Пытаемся установить выбранную дату в базу
FDate.Value:= MC.Date;
Except
Application.MessageBox('Не удается изменить дату выписки!','D-Art: Aurora',mb_Ok+mb_IconHand);
End;
end;
procedure TNucll.Work_BClick(Sender: TObject);
begin
Sub_Program.Show_ListRed(4,True); //Показываем окно редактора списков с нужным списком
end;
procedure TNucll.EditClick(Sender: TObject);
begin
DB_Data.N_Gen.UpdateBatch;
DB_Data.N_MIO.UpdateBatch;
Try
SV_Click:= False;
DB_Data.N_Gen.Edit; //Устанавливаем режим редактирования
Right_num:= DB_Data.Num.Value;
//Выбираем объект для передачи фокуса ввода, согласно режиму отображения (=> Av_Data)
Case View_Mode of
vm_TO: Nucll.FocusControl(Grid); //Передаем таблице
vm_TR,vm_RO: Nucll.FocusControl(E_Num) //Передаем первому полю редактора
End; //Case
SV_Click:= False;
Except
Application.MessageBox('Не удается превести запись в режим редактирования.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
End;
end;
procedure TNucll.SaveClick(Sender: TObject);
begin
SV_Click:= True;
CL_Click:= False;
Try_SV; //Процедура
end;
procedure TNucll.AddClick(Sender: TObject);
begin
Nucll.FocusControl(Navig);
DB_Data.N_Gen.UpdateBatch;
DB_Data.N_MIO.UpdateBatch;
//Пытаемся вставить новую запись
Try
SV_Click:= False;
//Активизируем запрос для выяснения максимального номера накладной
DB_Data.Max_Num.Active:= True;
DB_Data.N_Gen.Insert;
DB_Data.Max_Num.Active:= False; //Деактивируем запрос
Right_num:= DB_Data.Num.Value;
//Выбираем объект для передачи фокуса
Case View_Mode of
vm_TO: Nucll.FocusControl(Nucll.Grid); //Передаем таблице
vm_TR,vm_RO: Nucll.FocusControl(Nucll.E_Num); //Передаем первому полю редактора
End; //Case
SV_Click:= False;
Except
Application.MessageBox('Не удается добавить новую запись в таблицу.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
End;
end;
procedure TNucll.DelClick(Sender: TObject);
begin
//Сохраняем изменения перед следующим удалением
DB_Data.N_Gen.UpdateBatch;
DB_Data.N_MIO.UpdateBatch;
If Application.MessageBox(PChar('Вы действительно хотите удалить накладную №' + DB_Data.Num.AsString + '?'),
'D-Art: Aurora',mb_YesNo+mb_IconExclamation+mb_DefButton2) = idYes Then
Try
DB_Data.N_Gen.Delete; //Пытаемся удалить запись
Except
Application.MessageBox('Не удается удалить запись из таблицы.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
End;
end;
procedure TNucll.PriorClick(Sender: TObject);
begin
//Если не начало таблицы перемещаемся на предыдущую запись
If not DB_Data.N_Gen.Bof Then DB_Data.N_Gen.Prior
end;
procedure TNucll.NextClick(Sender: TObject);
begin
//Если не конец таблицы, то перемещаемся на следующую запись
If not DB_Data.N_Gen.Eof Then DB_Data.N_Gen.Next
end;
procedure Cancel_Input;
begin
If Del_Q = idYes Then
begin
CH_F:= True;
DB_Data.Many.Value:= 'Нет';
While not DB_Data.N_MIO.Eof do DB_Data.N_MIO.Delete;
end
end; //procedure
procedure TNucll.B_ManyClick(Sender: TObject);
var SM_Res: byte;
begin
If Exec = False Then
begin
Exec:= True;
Del_Q:= mrYes;
If CL_Click = False Then
begin
If (B_Many.Checked = True) And (TAMode <> am_None) And (CH_F2 = False) Then
If Application.MessageBox('Перед вводом/редактированием списка товаров и услуг на накладную, необходимо сохранить ее. Продолжить?',
'D-Art: Aurora',mb_IconQuestion + mb_YesNo) = mrYes Then
Repeat
CH_F:= False; //Можно убрать флажок
If Del_Q = mrYes Then No_Adding:= True; //Пока не добавляли записи
SV_Click:= True;
DB_Data.Many.Value:= 'Да';
Try
DB_Data.N_Gen.Post;
DB_Data.N_Gen.UpdateBatch;
With DB_Data Do Sub_Program.Write_Stat(N_Gen,Primtabs,GEneral.Gen_Stat);
Except
Screen.Cursor:= crDefault;
Application.MessageBox('Не удается сохранить изменения в таблице. Возможно введен неуникальный номер накладной, исправьте его и попробуйте ещё раз.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
DB_Data.N_Gen.Edit;
DB_Data.Many.Value:= 'Нет';
Exec:= False;
CH_F:= True;
DB_Data.Num.Value:= Right_Num;
SV_Click:= False;
//Выбираем оъект для предачи фокуса ввода
Case View_Mode of
vm_TR,vm_RO: Nucll.FocusControl(Nucll.E_Num); //Предаем фокус ввода первому полю редактора
vm_TO: Nucll.FocusControl(Nucll.Grid); //Предаем фокус ввода сетке
End; //Case
Abort;
End;
SV_Click:= False;
DB_Data.N_Gen.Edit;
SM_Res:= Many_List.ShowModal; //Показвываем окно
If SM_Res = mrCancel Then
begin
//Закрыли нажатием кнопки Cancel
if No_Adding = False Then
Del_Q:= Application.MessageBox(PChar('Прекратить ввод списка товаров и услуг для накладной №'+ DB_Data.Num.AsString +' и удалить все записи?'),
'D-Art: Aurora',mb_YesNo+mb_IconExclamation+mb_DefButton2)
Else Del_Q:= idYes;
Cancel_Input;
end;
If (No_Adding = True) And (SM_Res = mrOk) Then
begin
//Не добавили ни одной записи
Del_Q:= Application.MessageBox(PChar('Не было добавлено ни одной записи. Прекратить редактирование списка товаров и услуг для накладной №'+DB_Data.Num.Asstring+'?'),
'D-Art: Aurora',mb_YesNo+mb_IconExclamation+mb_DefButton2);
Cancel_Input;
if Del_Q = idNo Then SM_Res:= mrCancel;
end;
If (No_Adding = False) And (SM_Res = mrOk) Then
begin
if M_Mode <> mrNone Then
begin
DB_Data.N_MIO.Post;
M_Mode:= mr_None;
end;
DB_Data.Sum.Value:= StrToFloat(Many_List.Edit1.Text);
end;
DB_Data.N_MIO.UpdateBatch;
Until ((SM_Res = mrOk) and (No_Adding = False)) or (Del_Q = idYes)
Else
begin
CH_F:= True;
DB_Data.Many.Value:= 'Нет';
CH_F2:= False;
end;
end
Else
begin
CH_F:= False; //Можно убрать флажок
CL_Click:= False;
end;
//При снятии флажка
If (B_Many.Checked = False) And (TAMode <> am_None) And (CH_F = False) And (SMM = False) Then
begin
If CL_Click = False Then
begin
Del_Q:= Application.MessageBox(PChar('Удалить список товаров и услуг для накладной №' + DB_Data.Num.AsString + '?'),
'D-Art: Aurora',mb_YesNo+mb_IconExclamation+mb_DefButton2);
If Del_Q = idYes Then
begin
CH_F2:= False;
DB_Data.N_MIO.First;
While not DB_Data.N_MIO.Eof do DB_Data.N_MIO.Delete;
end
Else
begin
CH_F2:= True;
DB_Data.Many.Value:= 'Да';
CH_F:= False;
end;
end
Else
begin
CH_F2:= False;
DB_Data.N_MIO.First;
While not DB_Data.N_MIO.Eof do DB_Data.N_MIO.Delete;
CL_Click:= False;
end;
end;
Exec:= False;
end;
end;
{procedure ReFresh_Tab(NewVal: string);
begin
if View_Mode = vm_TR Then Nucll.Ap_Button.Focused;
//Обновляем номера накладных в таблице С.М.Т.
DB_Data.Fresh_ML.Parameters[0].Value:= StrToInt(NewVal); //Новое значение
DB_Data.Fresh_ML.Parameters[1].Value:= Num_Ins; //Старое значение
DB_Data.Fresh_ML.ExecSQL; //Выполняем запрос
DB_Data.N_MiO.Requery; //Обновляем таблицу
end;}
procedure TNucll.Lst_ManyClick(Sender: TObject);
var Old_Left: integer;
begin
{ If Application.MessageBox('Перед вводом/редактированием списка товаров и услуг на накладную, необходимо сохранить ее. Продолжить?',
'D-Art: Aurora',mb_IconQuestion + mb_YesNo) = mrYes Then
begin
{DB_Data.N_MIO.Active:= False;
DB_Data.N_MIO.MasterFields:= '';
DB_Data.N_MIO.Active:= True;
SV_Click:= True;
Try_SV; //Процедура
{DB_Data.N_MIO.Active:= False;
DB_Data.N_MIO.MasterFields:= 'Num';
DB_Data.N_MIO.Active:= True;
DB_Data.N_Gen.Edit;}
Old_Left:= Many_List.Ok_b.Left; //Запоминаем положение кнопки Ok
Many_List.Ok_b.Left:= Many_List.Cancel_b.Left; //Меняем положение кнопки Ok}
Many_List.Cancel_b.Visible:= False; //Прячем кнопку Отмена
//Показываем окно
Many_List.ShowModal;
If M_Mode <> mrNone Then
DB_Data.N_MIO.Post; //Сохраняем изменениня в таблице, если этого не сделал пользователь
//DB_Data.N_MIO.UpdateBatch;
DB_Data.Sum.Value:= StrToFloat(Many_List.Edit1.Text);
If DB_Data.N_MIO.RecordCount = 0 Then
begin
SMM:= True;
CL_Click:= False;
DB_Data.Many.Value:= 'Нет';
SMM:= False;
Try
SV_Click:= True;
DB_Data.N_Gen.Post;
DB_Data.N_Gen.UpdateBatch;
SV_Click:= False;
Except
End;
DB_Data.N_Gen.Edit;
end;
M_Mode:= mr_None; //Фиксируем сохранение
Many_List.Ok_b.Left:= Old_Left; //Восстанавливаем положение кнопки Ok
Many_List.Cancel_b.Visible:= True; //Показываем кнопку Отмена}
DB_Data.Sum.Value:= StrToFloat(Many_List.Edit1.Text);
//end;
end;
procedure TNucll.Work_AClick(Sender: TObject);
begin
If NoATL = False Then
With DB_Data do
If Sub_Program.A_LST(T_Work,W_List,L_Work.Text,L_Work,1) <> False Then
Many_List.Wk_Many.Items.Add(L_Work.Text);
end;
procedure TNucll.Client_BClick(Sender: TObject);
begin
Sub_Program.Show_ListRed(0,True); //Показываем окно редактора списков с нужным списком
end;
procedure TNucll.Client_AClick(Sender: TObject);
begin
With DB_Data do Sub_Program.A_LST(T_Client,C_List,L_Client.Text,L_Client,2);
end;
procedure TNucll.FioO_BClick(Sender: TObject);
begin
Sub_Program.Show_ListRed(2,True); //Показываем окно редактора списков с нужным списком
end;
procedure TNucll.FioO_AClick(Sender: TObject);
begin
With DB_Data do Sub_Program.A_LST(T_FioO,FO_List,L_FioO.Text,L_FioO,4); //Добавляем запись в список
end;
procedure TNucll.StatO_AClick(Sender: TObject);
begin
With DB_Data do Sub_Program.A_LST(T_StatO,SO_List,L_StatO.Text,L_StatO,5);
end;
procedure TNucll.StatO_BClick(Sender: TObject);
begin
Sub_Program.Show_ListRed(1,True); //Показываем окно редактора списков с нужным списком
end;
procedure TNucll.StatP_BClick(Sender: TObject);
begin
Sub_Program.Show_ListRed(3,True); //Показываем окно редактора списков с нужным списком
end;
procedure TNucll.StatP_AClick(Sender: TObject);
begin
With DB_Data do Sub_Program.A_LST(T_StatP,SP_List,L_StatP.Text,L_StatP,3);
end;
procedure TNucll.Red_LSTClick(Sender: TObject);
begin
With DB_Data do
//Определяем номер ячейки с фокусом и заполняем списки
Case Grid.Columns.Grid.SelectedIndex of
3: Sub_Program.Show_ListRed(4,True); //Показываем окно редактора списков с нужным списком
4: Sub_Program.Show_ListRed(0,True);
5: Sub_Program.Show_ListRed(2,True);
6: Sub_Program.Show_ListRed(1,True);
8: Sub_Program.Show_ListRed(3,True);
Else Sub_Program.Show_ListRed(0,True);
End;
end;
procedure TNucll.MoveBy_PClick(Sender: TObject);
begin
Sub_Program.MBR(1);
end;
procedure TNucll.MoveBy_NClick(Sender: TObject);
begin
Sub_Program.MBR(2);
end;
procedure TNucll.E_NumEnter(Sender: TObject);
begin
NoATL:= True;
{If error_save = False Then Field_val:= E_Num.Text
Else error_save:= False;
Nucll.Caption:= Field_Val
//Num_Ins:= StrToInt(E_Num.Text);}
end;
procedure TNucll.E_NumExit(Sender: TObject);
begin
NoATL:= False;
//ReFresh_Tab(E_Num.Text);
end;
procedure TNucll.GridExit(Sender: TObject);
begin
Sub_Program.Colum_Adress; //Проверяем расположение столбцов
InGRD:= False;
end;
procedure TNucll.GridEnter(Sender: TObject);
begin
{ If Grid.Columns.Grid.SelectedIndex = 0 Then
Num_Ins:= Grid.Columns.Grid.SelectedField.Value;
Sub_Program.Colum_Adress;
Then Grid.Columns.Grid.SelectedIndex of
CN[6] CN[7],CN[8],CN[9],CN[10],CN[11]: Field_val:= Grid.Columns.Grid.SelectedField.Value;}
InGRD:= True;
Field_val:= Grid.Columns.Grid.SelectedField.Value;
end;
procedure TNucll.MB_LSTMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Nucll.FocusControl(Ap_Button);
end;
procedure TNucll.GridDblClick(Sender: TObject);
begin
Try
//Переводим таблицу в режим редактирования
DB_Data.N_Gen.Edit;
Right_num:= DB_Data.Num.Value;
Nucll.FocusControl(Grid.Columns.Grid);
Except
Application.MessageBox('Не удается превести запись в режим редактирования.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
End;
end;
procedure TNucll.HelpClick(Sender: TObject);
begin
//Отменяем сделанные изменения
If TAMode = am_Add Then SV_Click:= True
Else SV_Click:= False;
CL_Click:= True;
DB_DAta.N_Gen.CancelBatch;
DB_Data.N_MIO.CancelBatch;
DB_Data.N_MIO.Requery;
If TAMode <> am_None Then DB_Data.N_Gen.Edit;
end;
procedure TNucll.E_SumEnter(Sender: TObject);
begin
NoATL:= True;
Field_Val:= E_Sum.Text;
end;
procedure TNucll.E_DateEnter(Sender: TObject);
begin
NoATL:= True;
Field_Val:= E_Date.Text;
end;
procedure TNucll.E_DateExit(Sender: TObject);
begin
//DB_Data.FDateSetText(DB_Data.FDate,E_Date.Text);
NoATL:= False; end; end.
//ПРОЕКТ "AURORA"
//Модуль данных - объекты для работы с БД
unit Av_DBData;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ToolWin, ExtCtrls, DB, ADODB, DBGrids;
type
TStr_UP = Function(S: PChar): PChar; stdcall;
//TInsstr = Function(SubS, S: PChar; Index: integer): PChar; stdcall;
TSS = Set of Char;
TDB_Data = class(TDataModule)
Nuclls: TADOConnection;
N_Gen: TADOTable;
N_MIO: TADOTable;
DS_Gen: TDataSource;
Num: TIntegerField;
Client: TWideStringField;
Fio_P: TWideStringField;
Stat_P: TWideStringField;
Fio_O: TWideStringField;
Stat_O: TWideStringField;
NDS_Sum: TCurrencyField;
Lists: TADOConnection;
DS_Work: TDataSource;
T_Client: TADOTable;
DS_Client: TDataSource;
Without_NDS: TCurrencyField;
End_Sum: TCurrencyField;
T_FioO: TADOTable;
DS_FioO: TDataSource;
T_StatO: TADOTable;
DS_StatO: TDataSource;
T_StatP: TADOTable;
DS_StatP: TDataSource;
T_Work: TADOTable;
W_List: TWideStringField;
FO_List: TWideStringField;
SO_List: TWideStringField;
SP_List: TWideStringField;
NSP: TWideStringField;
Sile: TWideStringField;
Many: TWideStringField;
Max_Num: TADOQuery;
MN: TIntegerField;
DS_MIO: TDataSource;
M_Values: TWideStringField;
M_SW: TBCDField;
C_List: TWideStringField;
AllSum: TFloatField;
Sectabs: TADOQuery;
Primtabs: TADOQuery;
Id: TAutoIncField;
N_MIOMInc: TAutoIncField;
M_id: TIntegerField;
Querys: TADOConnection;
Q_Teach: TADOTable;
DS_Teach: TDataSource;
Q_Teachinc: TAutoIncField;
Fields: TWideStringField;
Teach_F: TWideStringField;
Id_tab: TWideStringField;
Del_Query: TADOQuery;
QOU: TADOQuery;
DS_QOU: TDataSource;
Teach_V: TStringField;
DT: TWordField;
Selnull: TBooleanField;
NewData: TWideStringField;
Lng: TIntegerField;
QTValues: TWideStringField;
Ed_Query: TADOQuery;
Sum: TBCDField;
Work: TWideStringField;
FDate: TDateTimeField;
Teach_USL: TMemoField;
Mnds: TCurrencyField;
MWnds: TCurrencyField;
Lk_use: TBooleanField;
str_date: TStringField;
Q_Rep: TADOQuery;
QRep_DS: TDataSource;
M_count: TIntegerField;
Q_RepExpr1000: TBCDField;
Q_RepTWork: TWideStringField;
Q_RepNumpp: TIntegerField;
Q_RepExpr1002: TBCDField;
Q_Rep2: TADOQuery;
DS_QR2: TDataSource;
Q_Rep2Expr1000: TBCDField;
Q_Rep2TWork: TWideStringField;
Q_Rep2Expr1002: TIntegerField;
Q_Rep2Numpp: TIntegerField;
Del_ALLT: TADOQuery;
procedure N_GenCalcFields(DataSet: TDataSet);
procedure NumValidate(Sender: TField);
procedure N_GenBeforeScroll(DataSet: TDataSet);
procedure N_GenAfterPost(DataSet: TDataSet);
procedure N_GenAfterEdit(DataSet: TDataSet);
procedure FDateValidate(Sender: TField);
procedure N_GenPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure N_GenNewRecord(DataSet: TDataSet);
procedure N_GenAfterInsert(DataSet: TDataSet);
procedure NSPValidate(Sender: TField);
procedure SileValidate(Sender: TField);
procedure ManyValidate(Sender: TField);
procedure SumValidate(Sender: TField);
procedure N_MIONewRecord(DataSet: TDataSet);
procedure N_GenBeforePost(DataSet: TDataSet);
procedure N_GenBeforeEdit(DataSet: TDataSet);
procedure N_GenAfterDelete(DataSet: TDataSet);
procedure N_GenBeforeDelete(DataSet: TDataSet);
procedure N_GenDeleteError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure N_GenEditError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure T_WorkBeforePost(DataSet: TDataSet);
procedure N_GenAfterScroll(DataSet: TDataSet);
procedure N_MIOAfterInsert(DataSet: TDataSet);
procedure N_MIOPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
procedure N_MIOAfterPost(DataSet: TDataSet);
procedure N_MIOAfterScroll(DataSet: TDataSet);
procedure N_MIOCalcFields(DataSet: TDataSet);
procedure N_MIOBeforePost(DataSet: TDataSet);
procedure Q_TeachCalcFields(DataSet: TDataSet);
procedure Q_TeachAfterScroll(DataSet: TDataSet);
procedure QTValuesChange(Sender: TField);
procedure Q_TeachBeforePost(DataSet: TDataSet);
procedure FDateSetText(Sender: TField; const Text: String);
Function Ins_Str(SubS, S: string; Index: integer): string;
procedure Q_RepCalcFields(DataSet: TDataSet);
procedure Q_Rep2CalcFields(DataSet: TDataSet);
procedure QOUAfterOpen(DataSet: TDataSet);
private
{ Private declarations }
public
{ Public declarations }
end;
var
DB_Data: TDB_Data;
Nds_v, Nsp_v: real;
RD: TDateTime;
SV_Qes: integer;
//Old_Val: Array[1..12] of Variant;
Str_UP: TStr_UP;
Txt_UP: String;
No_SV, DoPR, error_save, DOQAS, UB_MIO: boolean;
implementation
uses Av_Nuclls, Av_General, Sub_Program, Calend, Av_Data, Av_ListRed,
Av_ManyW, Av_Querys, Av_QLibrary;
{$R *.dfm}
procedure TDB_Data.N_GenCalcFields(DataSet: TDataSet);
begin
NDS_Sum.Value:= Sum.Value - (Sum.Value*100)/(100 + 100 * Nds_v); //Сумма НДС
Without_NDS.Value:= Sum.Value - NDS_Sum.Value; //Сумма без НДС
If NSP.Value = 'Да' Then
End_Sum.Value:= Sum.Value + (Sum.Value * Nsp_v) //Итоговая сумма
Else
End_Sum.Value:= Sum.Value;
//Формируем текстовое представление даты
If FDate.AsString <> '' Then str_date.Value:= Sub_Program.D_STR(FDate.AsString);
end;
procedure TDB_Data.NumValidate(Sender: TField);
begin
//Определяем правильность номера накладной
If Num.Value <= 0 Then
begin
Nucll.E_Num.Text:= Right_num;
Nucll.Grid.Columns.Grid.SelectedField.Value:= Right_num;
Application.MessageBox('Неверное значение! Номер накладной введен неправильно.','D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
end;
end;
procedure NoAccess;
begin
TAMode:= am_None;//Фиксируем сохранение
Nucll.Grid.Options:= [dgTitles,dgIndicator,dgColumnResize,dgColLines,
dgRowLines,dgTabs,dgRowSelect,dgAlwaysShowSelection,
dgCancelOnExit];
end;
procedure TDB_Data.N_GenBeforeScroll(DataSet: TDataSet);
begin
//Записываем технические данные
If TAMode <> am_None Then N_GenBeforePost(N_Gen);
{begin
N_Gen.Edit; //Перводим таблицу в режим редактирования
RD:= StrToDate(FDate.Value); //Преобразуем дату в правильный формат
FDate.Value:= DateToStr(RD);
Sub_Program.Date_Val; //Вычисляем значения дня, месяца и года
Real_Sum.Value:= End_Sum.Value;
N_Gen.Post; //Сохраняем изменения в таблице}
NoAccess;
Deactive_Ed; //Показываем сохранение
//end;}
CH_F:= False; //Можно снимать флажок мно-ва работ
CH_F2:= False; //Можно устанавливать флажок
Screen.Cursor:= crDefault;
end;
procedure TDB_Data.N_GenAfterPost(DataSet: TDataSet);
begin
//Показываем сохраненение
NoAccess;
Deactive_Ed;
CH_F:= False; //Можно снимать флажок мно-ва работ
CH_F2:= False; //Можно устанавливать флажок}
Screen.Cursor:= crDefault;
If SV_Click = False Then
begin
Try
N_Gen.UpdateBatch;
Sub_Program.Write_Stat(N_Gen,Primtabs,GEneral.Gen_Stat);
Except
error_save:= true;
Screen.Cursor:= crDefault;
Application.MessageBox('Не удается сохранить изменения в таблице. Возможно введен неуникальный номер накладной, исправьте его и попробуйте ещё раз.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
DB_Data.N_Gen.Edit;
Num.Value:= Right_num;
SV_Click:= False;
//Выбираем оъект для предачи фокуса ввода
Case View_Mode of
vm_TR,vm_RO: Nucll.FocusControl(Nucll.E_Num); //Предаем фокус ввода первому полю редактора
vm_TO: Nucll.FocusControl(Nucll.Grid); //Предаем фокус ввода сетке
End; //Case
Abort;
End;
end;
CL_Click:= False;
SV_Click:= False;
Cancel_Cls:= False; //Можно закрыть окно
end;
procedure TDB_Data.N_GenAfterEdit(DataSet: TDataSet);
begin
TAMode:= am_Edit; //Фиксируем режим редактирования
SV_Click:= False;
Nucll.Grid.Options:= [dgEditing,dgAlwaysShowEditor,dgTitles,dgIndicator,dgColumnResize,
dgColLines,dgRowLines,dgTabs,dgAlwaysShowSelection,dgCancelOnExit];
//Показываем режим редактирования
Active_Ed;
Screen.Cursor:= crDefault;
end;
procedure TDB_Data.FDateValidate(Sender: TField);
var RD1: TDateTime;
begin
Try
RD1:= Sender.Value;
Except
Nucll.E_Date.Text:= Field_val;
If InGRD = True Then Nucll.Grid.Columns.Grid.SelectedField.Value:= Field_val;
Application.MessageBox('Не верное значение даты выписки! Воспользуйтесь календарем для ввода даты.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
Abort;
End;
end;
procedure TDB_Data.N_GenPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
{Screen.Cursor:= crDefault;
Application.MessageBox('Не удается сохранить изменения в таблице. Возможно введен неуникальный номер накладной.',
'D-Art: Aurora',mb_Ok + mb_IconHand);
SV_Click:= False;
Abort;
//Выбираем оъект для предачи фокуса ввода
Case View_Mode of
vm_TR,vm_RO: Nucll.FocusControl(Nucll.E_Num); //Предаем фокус ввода первому полю редактора
vm_TO: Nucll.FocusControl(Nucll.Grid); //Предаем фокус ввода сетке
End; //Case}
end;
procedure TDB_Data.N_GenNewRecord(DataSet: TDataSet);
begin
Num.Value:= MN.Value + 1; //Увиличиваем номер на 1 и вставляем в таблицу
FDate.Value:= Date; //Вставляем текущую дату
Sum.Value:= 0.00; //Вставляем начальную сумму
NSP.Value:= 'Нет'; //НСП
Many.Value:= 'Нет'; //Множественность записей
Sile.Value:= 'Нет'; //Отметка об уплате
Num_Ins:= DB_Data.Num.Value;
end;
procedure TDB_Data.N_GenAfterInsert(DataSet: TDataSet);
begin
TAMode:= am_Add; //Фиксируем режим добавления
Nucll.Grid.Options:= [dgEditing,dgAlwaysShowEditor,dgTitles,dgIndicator,dgColumnResize,
dgColLines,dgRowLines,dgTabs,dgAlwaysShowSelection,dgCancelOnExit];
//Показываем режим добавления
Active_Ed;
Screen.Cursor:= crDefault;
end;
procedure TDB_Data.NSPValidate(Sender: TField);
begin
//Проверяем правильность значений логических полей
Sub_Program.Bool_ValiDate(NSP);
end;
procedure TDB_Data.SileValidate(Sender: TField);
begin
Sub_Program.Bool_ValiDate(Sile);
end;
procedure TDB_Data.ManyValidate(Sender: TField);
begin
Sub_Program.Bool_ValiDate(Many);
end;
procedure TDB_Data.SumValidate(Sender: TField);
begin
//Проверяем правильность введенной суммы
If Sum.Value < 0 Then
begin
Nucll.E_Sum.Text:= Field_val;
If InGRD = True Then Nucll.Grid.Columns.Grid.SelectedField.Value:= Field_val;Application.MessageBox('Не верное значение! Сумма накладной не может быть отрицательной.',
'D-Art: Aurora', mb_Ok+mb_IconStop);
Abort;
end;
end;
procedure TDB_Data.N_MIONewRecord(DataSet: TDataSet);
begin
M_id.Value:= Id.Value; //Указываем номер нокладной (реальной записи)
M_Count.Value:= 1;
M_Values.Value:= 'Товар '+IntToStr(Num.Value);
M_SW.Value:= 0;
end;
procedure TDB_Data.N_GenBeforePost(DataSet: TDataSet);
begin
//ShowMessage('POST!');
If SV_Click = False Then
begin
SV_Qes:=Application.MessageBox(PChar('Не были сохранены изменения в накладной №'+ DB_Data.Num.AsString + '. Сохранить изменения?'),
'D-Art: Aurora',mb_OkCancel+mb_IconExclamation);
Case SV_Qes of
idOk: SSh;
idCancel: Abort; //Отменяем сохранение
End; //Case
end //If SV_Click = False
Else Sub_Program.SSh;
end;
procedure TDB_Data.N_GenBeforeEdit(DataSet: TDataSet);
begin
Screen.Cursor:= crHourGlass;
end;
procedure TDB_Data.N_GenAfterDelete(DataSet: TDataSet);
begin
Screen.Cursor:= crDefault;
Write_Stat(DB_Data.N_Gen,DB_Data.Primtabs,General.Gen_Stat);
end;
procedure TDB_Data.N_GenBeforeDelete(DataSet: TDataSet);
begin
Screen.Cursor:= crHourGlass;
DB_Data.N_MIO.First;
While not DB_Data.N_MIO.Eof do DB_Data.N_MIO.Delete;
end;
procedure TDB_Data.N_GenDeleteError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
Screen.Cursor:= crDefault;
end;
{procedure ReFresh_Tab(NewVal: string);
begin
if View_Mode = vm_TR Then Nucll.Ap_Button.Focused;
//Обновляем номера накладных в таблице С.М.Т.
DB_Data.Fresh_ML.Parameters[0].Value:= StrToInt(NewVal); //Новое значение
DB_Data.Fresh_ML.Parameters[1].Value:= Num_Ins; //Старое значение
DB_Data.Fresh_ML.ExecSQL; //Выполняем запрос
DB_Data.N_MiO.Requery; //Обновляем таблицу
end;}
procedure TDB_Data.N_GenEditError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
Screen.Cursor:= crDefault;
end;
procedure TDB_Data.T_WorkBeforePost(DataSet: TDataSet);
begin
RL_Ctrl:= rl_None;
If DOQAS = True Then
QLib.CB1.Text:= DataSet.Fields[0].AsString;
Listred.List_Grid.Options:= [dgTitles,dgIndicator,dgRowSelect,
dgColumnResize,dgColLines,dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit] //FocusControl(List_Grid);
end;
procedure TDB_Data.N_GenAfterScroll(DataSet: TDataSet);
begin
Cancel_Cls:= False;
GEneral.Gen_Stat.Panels[2].Text:= 'Текущая запись: ' + IntToStr(N_Gen.RecNo);
end;
procedure TDB_Data.N_MIOAfterInsert(DataSet: TDataSet);
begin
No_Adding:= False;
end;
procedure TDB_Data.N_MIOPostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
//Ошибка при сохранении
Application.MessageBox('Не удается сохранить изменения!','D-Art: Aurora',mb_IconStop + mb_Ok);
Abort;
MS_Click:= False;
end;
procedure TDB_Data.N_MIOAfterPost(DataSet: TDataSet);
begin
M_Mode:= mr_None;
N_MIO.UpdateBatch;
Many_List.All_ManySum;
end;
procedure TDB_Data.N_MIOAfterScroll(DataSet: TDataSet);
begin
M_Mode:= mr_None;
end;
procedure TDB_Data.N_MIOCalcFields(DataSet: TDataSet);
begin
AllSum.Value:= M_SW.Value * M_Count.Value; //Формируем значение вычисляемого поля
Mnds.Value:= AllSum.Value - (AllSum.Value * 100)/(100 + 100 * Nds_v); //Сумма НДС
MWnds.Value:= AllSum.Value - Mnds.Value; //Сумма без НДС
end;
procedure TDB_Data.N_MIOBeforePost(DataSet: TDataSet);
begin
//Many_List.Edit1.Text:= FloatToStr(StrToFloat(MAny_List.Edit1.Text)+M_SW.Value);
end;
//Функция вставки подстроки в строку
Function TDB_Data.Ins_Str(SubS, S: string; Index: integer): string;
var Res_Str, Site_Str, Site_Chr, Rs, Ls: string;
j: byte;
begin
Ls:= '';
Rs:= '';
Site_Str:= S;
Site_Chr:= SubS;
If Index <= 1 Then
Res_Str:= Site_Chr + Site_Str
Else
begin
For j:= 1 to Index - 1 do
Ls:= Ls + Site_Str[j];
For j:= Index to Length(Site_Str) do
Rs:= Rs + Site_Str[j];
Res_Str:= Ls + Site_Chr +Rs;
end;
Ins_Str:= Res_Str;
end;
procedure TDB_Data.Q_TeachCalcFields(DataSet: TDataSet);
var ORW, ANDW, LKW, str_f, fld_s, U1, U2, U2p, ULK,
U1_n, U2_n, U2p_n, Empt_U: string;
i, Num_a: integer;
HLib: THandle; //Дискрептор DLL
SFI: Array[1..255] of integer; //Позиции для вставки наименований полей
Kav_USL: Boolean;
begin
if QTValues.Value <> '' Then
begin
Kav_USL:= False; //Обнуляем все значения переменных
Teach_V.Value:= '';
str_f:= QTValues.Value;
i:= 0;
While i <> Length(QTValues.Value) Do
begin
i:= i + 1;
If str_f[i] = '"' Then //Определяем часть строки условия как значение поля
Case Kav_USL of
True: Kav_USL:= False;
False: Kav_USL:= True;
End;
//Проверяем вхождение слов связи условий (И, ИЛИ) в условие запроса
ORW:= str_f[i-1] + str_f[i] + str_f[i+1] + str_f[i+2] + str_f[i+3];
ANDW:= str_f[i-1] + str_f[i] + str_f[i+1];
If i = 1 Then LKW:= str_f[i] + str_f[i+1] + str_f[i+2] + str_f[i+3]
Else LKW:= str_f[i-1] + str_f[i] + str_f[i+1] + str_f[i+2] + str_f[i+3];
HLib:= LoadLibrary(PChar(Prog_Dir + 'String_DLL.dll')); //Загружаем DLL в память
If HLib <> 0 Then
begin
Str_UP:= GetProcAddress(HLib,'RS_UP'); //Определяем адрес функции
ORW:= StrPas(Str_UP(PChar(ORW))); //Преобразуем регистр
ANDW:= StrPas(Str_UP(PChar(ANDW)));
LKW:= StrPas(Str_UP(PChar(LKW)));
FreeLibrary(HLib);
//ShowMessage('*' + ORW + '*');
end;
//Меняем русские условия на английские
If Kav_USL = False Then
begin
If (ORW <> ' ИЛИ ') And (ANDW <> ' И ') And (LKW <> ' КАК ') And (LKW <> 'КАК ') Then
Teach_V.Value:= Teach_V.Value + str_f[i]
Else
begin
If ORW = ' ИЛИ ' Then
begin
i:= i + 2;
Teach_V.Value:= Teach_V.Value + 'Or';
end;
If ANDW = ' И ' Then
Teach_V.Value:= Teach_V.Value + 'And';
end;
If (LKW = ' КАК ') Or (LKW = 'КАК ') Then
begin
i:= i + 2;
Teach_V.Value:= Teach_V.Value + 'Like';
end;
end
Else Teach_V.Value:= Teach_V.Value + str_f[i];
end; //While
//Подставляем наименование поля
For i:= 1 To 255 Do
SFI[i]:= -1;
Num_a:= 1;
str_f:= Teach_V.Value;
For i:= 1 To Length(str_f) Do
begin
//Проверяем вхождение условий запроса (=, <>, >, < и т.д.)
U1:= str_f[i] + str_f[i+1];
U2:= str_f[i] + str_f[i+1] + str_f[i+2];
U2p:= str_f[i-1] + str_f[i] + str_f[i+1];
ULK:= str_f[i] + str_f[i+1] + str_f[i+2] + str_f[i+3] + str_f[i+4] + str_f[i+5];
U1_n:= str_f[i];
U2_n:= str_f[i] + str_f[i+1];
U2p_n:= str_f[i-1] + str_f[i];
//Выясняем позиции для вставки наименования поля
If (((DT.Value=1)Or(DT.Value=2)) And ((((U1='="')Or(U1='>"')Or(U1='<"'))And((U2p<>'<>"')And(U2p<>'>="')And(U2p<>'<="')))Or(U2='<>"')Or(U2='>="')Or(U2='<="')Or(ULK='Like "'))) Or (((DT.Value=0)Or(DT.Value=2)) And ((((U1_n='=')Or(U1_n='>')Or(U1_n='<'))And((U2p_n<>'<>')And(U2p_n<>'>=')And(U2p_n<>'<=')))Or(U2_n='<>')Or(U2_n='>=')Or(U2_n='<=')Or(ULK='Like "'))) Then
begin
SFI[Num_a]:= i;
Num_a:= Num_a + 1;
end;
end; //For
fld_s:= Teach_F.Value;
//tch_s:= Teach_V.Value;
//Вставляем наименование поля
For i:= 1 To Num_a Do
If SFI[i] <> -1 Then
begin
//ShowMessage(IntToStr(SFI[i]));
{HLib:= LoadLibrary('String_Dll.dll'); //Загрузка бибилиотеки
Ins_Str:= GetProcAddress(HLib,'INS_STR'); //Определяем адрес функции}
T