пятница, 4 мая 2012 г.

Урок 42. Обороты по счету

Давайте дадим пользователю (едва не сказал привычное "бухгалтеру") еще одну возможность поиска, сопоставления, проверки... назовите это как угодно - еще один инструмент.

Этот инструмент позволит ответить на вопрос:

А из чего складывается тот или иной оборот по конкретному счету за выбранный период?


Ну, например: в оборотной ведомости за январь (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;


Результат работы виден на следующих двух иллюстрациях:




Комментариев нет:

Отправить комментарий