Этот инструмент позволит ответить на вопрос:
А из чего складывается тот или иной оборот по конкретному счету за выбранный период?
Ну, например: в оборотной ведомости за январь (YYYY года) есть расход в строке со счетом "Коммунальные платежи", но сейчас, в мае, вы нашли под кроватью квитанцию за январь, и не помните, вносили Вы эту сумму в январе или нет. Да и вообще, из чего складывается общая цифра коммунальных платежей за январь, из каких сумм и кому заплаченных?
Добавим в проект новую форму (я так легко это говорю, потому что уже несколько раз подробно рассказывал ранее, как это сделать)
Для вызова этой формы подготовлен пункт меню в главной форме, осталось только прописать обработчик события:
procedure TMainFrm.N4Click(Sender: TObject);
begin
// Сначала нужно дать возможность выбрать счет
MySelect.MySel_IDAcc:=0;
MySelect.MySel_AccName:='';
ShowAccounts;
// Открыть форму
Application.CreateForm(TAccOborRfm, AccOborRfm);
AccOborRfm.ShowModal;
AccOborRfm.Free;
end;
После этого в модуле AccOborot формы AccOborRfm нужно написать несколько стандартных на мой взгляд процедур, обрабатывающих процесс создания и закрытия формы, а также - нажатия клавиш:
implementation
Uses Main;
{$R *.dfm}
procedure TAccOborRfm.FormCreate(Sender: TObject);
begin
// В момент создания формы присвоить стартовые значения датам
Date_N.Value:=Now();
Date_K.Value:=Now()+1;
// Назначение коннекции компоненту - запросу
ADOQuery1.Connection:=MainFrm.ADOConnection1;
end;
procedure TAccOborRfm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
procedure TAccOborRfm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Стандартная процедура обработки нажатия клавишей в форме
case Key of
VK_ESCAPE: // Обработка нажатия Excape = закрытие формы
begin
MyClose;
end;
else
End;
end;
procedure TAccOborRfm.MyClose();
Begin
Close;
end;
procedure TAccOborRfm.ButtonsClickExecute(Sender: TObject);
begin
// Обработчик нажатия стандартных кнопок (ОК и Cancel)
if (ModalResult=1) OR (ModalResult=2)
then
Begin
MyClose;
end;
end;
Аналогичные действия мы уже проделывали.
Теперь перейдем к самому нужному, к обработчику события нажатия кнопки "Показать".
Но прежде нужно воспользоваться уже описанным мною приемом, чтобы составить SQL-строку запроса, которая потом "вкладывается" в переменную MyStr по частям:
procedure TAccOborRfm.Button1Click(Sender: TObject);
Var MyStr: String;
s: String;
begin
// Обработка нажатия кнопки Показать
// Запомнить в переменную идентификатор выбранного счета, хранящийся в записи MySelect.MySel_IDAcc
s:=IntToStr(MySelect.MySel_IDAcc);
// Подготовка строки запроса
ADOQuery1.Active:=False;
ADOQuery1.SQL.Clear;
// Создание строки запроса
MyStr:='SELECT Main.MyDate, MOs.Name, Accounts.Name, Accounts_1.Name, IIf([D]='+s+',[Summa],0) AS Поступило, IIf([K]='+s+',[Summa],0) AS Списано, Main.Rem ';
MyStr:=MyStr+'FROM Accounts AS Accounts_1 INNER JOIN (MOs INNER JOIN (Accounts INNER JOIN Main ON Accounts.ID = Main.D) ON MOs.ID = Main.MO) ON Accounts_1.ID = Main.K ';
MyStr:=MyStr+'WHERE (((Main.MyDate)>=#'+FormatDateTime('mm/dd/yyyy',Date_N.Value)+'# And (Main.MyDate)<#'+FormatDateTime('mm/dd/yyyy',Date_K.Value)+'#) AND ((Main.D)='+s+')) OR (((Main.MyDate)>=#'+FormatDateTime('mm/dd/yyyy',Date_N.Value)+'# And (Main.MyDate)<#'+FormatDateTime('mm/dd/yyyy',Date_K.Value)+'#) AND ((Main.K)='+s+'))';
MyStr:=MyStr+'ORDER BY Main.MyDate DESC';
ADOQuery1.SQL.Add(MyStr);
// Включение запроса
ADOQuery1.Active:=True;
end;
Собственно, на этом можно было бы поставить точку.
Но, где-то не так давно мной была подготовлена замечательная функция вывода содержимого грида в электронную таблицу. Будет не плохо, если в соответствующем пункте контекстного меню организовать вызов этой функции:
procedure TAccOborRfm.N_ExportClick(Sender: TObject);
begin
// Экспорт в Эксель
MainFrm.ExportTo(PCHAR(MySelect.MySel_AccName), DBGridEh1, MainFrm.XLApp, PCHAR('Движение по счету'), PCHAR('Период: '+FormatDateTime('dd/mm/yy',Date_N.Value)+' - '+FormatDateTime('dd/mm/yy',Date_K.Value)));
end;
Результат работы виден на следующих двух иллюстрациях:
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.