Правильная ссылка на эту страницу
http://az-design.ru/Projects/AzBook/AZMicro/AZMicro34.shtml

Таблица "Журнал по счету"

       Все предыдущие действия не требовали активных действий от пользователя. Запросом открывалась таблица и редактировалась на месте. В данном случае таблицу необходимо сначала заполнить с помощью хранимой процедуры, а затем посмотреть на результаты.
       Сначала набросаем на форму необходимые элементы, а затем напишем для них соответствующий код.
       Итак, выбираем на PageControl страницу "Журнал по счету". После чего:
       — из вкладки "Win32" выбираем компонент TToolBar, кладем его на страницу и устанавливаем свойство Align=alTop, а свойство Height=29;
       — из вкладки "Data Control" выбираем компонент TDBText, кладем его на страницу и устанавливаем свойство Align=alTop, свойство AutoSize=False, а свойство Height=17;
       — из вкладки "Data Control" выбираем компонент TDBMemo, кладем его на страницу и устанавливаем свойство Align=alBottom, а свойство Height=65;
       — из вкладки "Data Control" выбираем компонент TDBGrid, кладем его на страницу и устанавливаем свойство Align=alClient.
       Получилась достаточно удобная заготовка, на которой нужно разместить элементы управления. Что для этого нужно:
       — для перемещения по таблице необходимо с вкладки "Data Control" выбрать компонент TDBNavigator и положить его на ToolBar. В свойстве VisibleButtons достаточно оставить только кнопки nbFirst, nbPrior, nbNext, nbLast. Эта таблица не редактируется, поэтому остальные кнопки бесполезны.
       — для выбора номера счета, по которому будет строиться "Журнал по счету", с вкладки "Standard" необходимо выбрать компонент TComboBox и положить его на ToolBar. Установите свойство Width=137, а Name=cbxAccntList. Кроме того, свойству Text нужно присвоить начальное значение "Выберите счет";
       — для выбора даты начала и конца периода будем использовать компонент TDateTimePicker, который можно взять с вкладки "Win32", а для подписи используем компонент TLabel с вкладки "Standard". Измените свойство Name на dtpDtBeg для начала периода и на dtpDtEnd для конца периода. Соответствующим образом измените свойство Caption для компонента TLabel. Учтите, что свойство AutoSize лучше установить в False, для того чтобы можно было выставить размеры TLabel по своему желанию;
       — и, наконец, нужно как-то запустить процедуру получения "Журнала по счету". Для этого можно использовать банальную кнопку TBitBtn с вкладки "Additional". Установите для нее свойства Height=24, Width=103, Caption="Выполнить".
       Осталось настроить сетку для отображения таблицы. Для этого выберите DBGrid, кликните на нем правой кнопкой мыши для вызова контекстного меню и выберите в нем "Columns Editor". Последовательно вставьте поля, которые будут использоваться и исзмените их свойства:
       — вставить "LdDate", свойство Database.FieldName="LdDate", свойство Localizable.Title.Caption="Дата", свойство Localizable.Title.Alignment=taLeftJustify;
       — вставить "LdCorAcc", свойство Database.FieldName="LdCorAcc", свойство Localizable.Title.Caption="Корр.Счет", свойство Localizable.Title.Alignment=taLeftJustify;
       — вставить "LdMCrd", свойство Database.FieldName="LdMCrd", свойство Localizable.Title.Caption="Кредит", свойство Localizable.Title.Alignment=taCenter;
       — вставить "LdMDbt", свойство Database.FieldName="LdMDbt", свойство Localizable.Title.Caption="Дебит", свойство Localizable.Title.Alignment=taCenter;
       — вставить "LdMSld", свойство Database.FieldName="LdMSld", свойство Localizable.Title.Caption="Сальдо", свойство Localizable.Title.Alignment=taCenter.
       И, наконец, необходимы компоненты для взаимодействия с таблицей. Для этого, как обычно, берем компоненты TTransaction, TQuery и TDataSource. Их настройка аналогична "Журналу операций". Дополнительно у компонента DBText нужно в свойстве DataSource указать dsLedger, а в свойстве DataField указать имя поля "Title". То же самое нужно сделать для компонента DBMemo, только имя поля должно быть DataField="JrLegend".
       Все, что после этого получилось можно посмотреть на рисунке:

дизайн Журнала по счету
Рис.AzMicro003 — дизайн "Журнала по счету"

       А теперь можно написать код, который оживит всю эту конструкцию.
       Итак, первое что нам нужно, это выбрать счет, по которому составляется "Журнал по счету". Для этого мы на форму положили ComboBox cbxAccntList. Но он пустой. Его нужно заполнить списком счетов, но в какой момент. У ComboBox нет подходящего события для этого. А вот PageControl оказывается очень подходящим для этого местом. Его событие onChange позволяет настраивать объекты на странице при переходе к ней. Если сделать двойной клик на этом событии, то Delphi создаст заготовку процедуры:

procedure TForm1.PageControlChange(Sender: TObject);
Var
  sAcc : String;
begin
  if PageControl.ActivePage = tsMLedger then begin
     qrExeTemp.Close;  qrExeTemp.SQL.Clear;
     qrExeTemp.SQL.Add('Select JrCredit as Accnt from Journal ');
     qrExeTemp.SQL.Add(' Union ');
     qrExeTemp.SQL.Add('Select JrDebit as Accnt from Journal ');
     qrExeTemp.SQL.Add(' order by 1 ');
     qrExeTemp.Open; qrExeProc.First;
     cbxAccntList.Items.Clear;
     While not qrExeTemp.EOF do begin
        sAcc := qrExeTemp.FieldValues['Accnt'];
        cbxAccntList.Items.Add(sAcc);
        qrExeTemp.Next;
     end;
     qrExeTemp.Close;
  end;
end;

       Для работы этой (и других процедур) создадим вспомогательный DataSet. Для чего кинем на форму компоненты TTransaction и TQuery и переименуем их в trExeTemp и qrExeTemp соответственно.
       Если активная страница стала tsMLedger, то формируем запрос, который выбирает все используемые в журнале операций номера счетов. Использовать для этой цели "План Счетов" не целесообразно по следующим причинам:
       Во-первых, в "Плане Счетов" счетом всегда много больше чем реально используется.
       Во-вторых, существует большая вероятность того, что по выбранному счету не проводилось никаких операций, и тогда это будет потеря времения.
       Результирующий запрос состоит из двух подзапросов, один из которых выбирает номера счетов по кредиту, а другой выбирает номера счетов по дебету. Объединение данных осуществляется благодаря оператору Union, который вдобавок оставляет только уникальные значения.

Select JrCredit as Accnt from Journal
 Union
Select JrDebit as Accnt from Journal
 order by 1

       И напоследок, результат запроса нужно отсортировать.
       Результат запроса нужно присвоить свойству Items. Для этого оно сначала очищается, а затем в цикле каждое значение считывается из набора qrExeTemp и добавляется в cbxAccntList.Items как показано ниже:

     cbxAccntList.Items.Clear;
     While not qrExeTemp.EOF do begin
        sAcc := qrExeTemp.FieldValues['Accnt'];
        cbxAccntList.Items.Add(sAcc);
        qrExeTemp.Next;
     end;

       Для выбора начала и конца периода не требуется каких-либо особенных действий. DataTimePicker после выбора пользователем даты в календаре будет хранить выбранное значение в свойстве Date.
       После того как все входные параметры выбраны можно получить "Журнал по счету". Для этого используется кнопка, которая запускает процедуру связанную с событием onClick:

procedure TForm1.btnGetLedgerClick(Sender: TObject);
Var
   sAccnt,sDtBeg,sDtEnd : String;
begin
   sAccnt := ''''+cbxAccntList.Text+'''';
   sDtBeg := ''''+DateToStr(dtpDtBeg.Date)+'''';
   sDtEnd := ''''+DateToStr(dtpDtEnd.Date)+'''';
   If trExeProc.Active then trExeProc.Commit;
   trExeTemp.Active := true;
   qrExeTemp.Close;
   qrExeTemp.SQL.Clear;
   qrExeTemp.SQL.Add('Execute procedure LedgerNone('+sAccnt+','+sDtBeg+','+sDtEnd+');');
   qrExeTemp.ExecSQL;    trExeProc.Commit;
   qrExeTemp.Close;
   qrLedger.Close;   qrLedger.Open;
end;

       Сначала все полученные параметры переводятся в строковый формат. Затем из них формируется запрос на выполнение процедуры LedgerNone. После чего запрос выполняется.

       Конечно, для выполнения хранимых процедур есть специальный компонент TIBStoredProc, но работа с ним из программы неудобна. Для настройки его в режиме разработки требуется соединение с БД, что неправильно. С другой стороны, таких проблем нет при использовании компонента TQuery, так как он более универсален.

       Всё бы было хорошо, но мы ничего не увидели. Если использовать какой-нибудь инструмент типа IBExpert, то увидим, что таблица Ledger заполнена. Значит необходимо отобразить ее на форме.
       Положим на форму стандартный набор компонентов TTransaction, TQuery, TDataSource. Дадим этим компонентам имя таблицы Ledger с соответствующими префиксами и настроим связи между ними как это делалось в предыдущих случаях. Запрос, который необходимо записать в qrLedger.SQL, должен отображать не только саму таблицу Ledger, но и значения из связанных с ней таблиц ChartAcc и Journal. Начнем строить его по частям:

Select l.LdID,l.LdAccnt,l.LdDate,l.LdCorAcc,l.LdMCrd,l.LdMDbt,l.LdMSld,

       Сначала перечислим все необходимые поля из таблицы Ledger

l.LdCorAcc||'' - ''||a.AccTITLE as Title,j.JrLegend

       потом построим отображение корреспондирующего счета, объединив номер счета и наименование счета. И добавим к этому описание операции из "Журнала операций"

from Ledger l 
 join ChartAcc a on l.LdCorAcc=a.AccntNum

       затем укажем, что выбираем данные из таблицы Ledger, и присоединим к ней таблицу ChartAcc, указав что связь осуществляется через поля LdCorAcc и AccntNum.

join Journal j on l.LdJrnl=j.JrnID

       а также присоединим таблицу Journal, указав что связь осуществляется через поля LdJrnl и JrnID.

order by l.LdID

       И, наконец, отсортируем результат по полю LdID.

В результате можно дабавить в процедуру CreateForm следующие строки:

  qrLedger.Close;
  qrLedger.SQL.Clear;
  qrLedger.SQL.Add('Select l.LdAccnt,l.LdDate,l.LdCorAcc,l.LdMCrd,l.LdMDbt,l.LdMSld,');
  qrLedger.SQL.Add(' l.LdID,l.LdCorAcc||'' - ''||a.AccTITLE as Title,j.JrLegend');
  qrLedger.SQL.Add('from Ledger l ');
  qrLedger.SQL.Add(' join ChartAcc a on l.LdCorAcc=a.AccntNum');
  qrLedger.SQL.Add(' join Journal  j on l.LdJrnl=j.JrnID ');
  qrLedger.SQL.Add(' order by l.LdID');
  qrLedger.Open;

       Полученный в результате этого инструмент, можно попробовать в работе:

выбор параметров для Журнала по счету
Рис.AzMicro008 - выбор параметров для "Журнала по счету"

       После выбора параметров нужно нажать на кнопку "Выполнить" для получения результатов.

результат после выполнения хранимой процедуры LedgerNone
Рис.AzMicro009 — результат после выполнения хранимой процедуры LedgerNone

       При перемещении по таблице "Журнал по счету" в верху будет показано название корреспондирующего счета, а внизу описание текущей операции их "Журнала операций".

Архангельский Андрей




<<< Пред. Оглавление
Начало раздела
След. >>>

Дата последнего изменения:
Thursday, 21-Aug-2014 09:10:56 MSK


Постоянный адрес статьи:
http://az-design.ru/Projects/AzBook/AZMicro/AZMicro34.shtml