Программирование - это просто
Advertisement
Главная arrow Уроки программирования arrow Delphi - это просто! arrow Delphi - это просто. Урок 8.11.4:  Программируем печать накладных. Часть 4.  Редактируем стр. накл.
25.04.2024 г.
Главное меню
Главная
Интернет магазин
Программные продукты
Биржевые роботы
Искусственный интеллект
Математика и информатика
1С:Предприятие
Уроки C#
Уроки Delphi
Уроки программирования
Web-программирование
Дизайн и графика
Компьютер для блондинок
Исходники
Статьи
Платный раздел
Рассказы про компьютеры
Хитрости и секреты
Системный подход
Размышления
Наука для чайников
Друзья сайта
Excel-это не сложно
Все о финансах
.
Delphi - это просто. Урок 8.11.4:  Программируем печать накладных. Часть 4.  Редактируем стр. накл. Печать E-mail
Автор megabax   
17.01.2011 г.
Базы данных

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

 Часть 4.  Редактируем строку накладной (SQL-запрос, фильтр).

Исходники к уроку вы можете скачать здесь.

Сегодня мы добавим в нашу программу складского учета модуль редактирования табличной части накладной.  Сам процесс редактирования у нас будет происходить следующим образом: пользователь встает на нужную строчку и нажимает кнопочку "Редактировать". После этого у него открывается окно, где он может выбрать товар, цену и количество, а сумма посчитается сама.

Откроем проект, который мы создали на предыдущем уроке (там же есть ссылка на скачивание исходников).  Создаем в нем новую форму*:

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Сохраним модуль созданной формы под именем RowDocEdit, а саму форму назовем frmRowDocEdit. Сразу же подключим к этому модулю StoreTypes, так как нам потребуется объявленные в нем типы для перевода английский названий полей в русские:

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Теперь накидаем на форму компонентов согласно приведенной ниже таблицы:

Компонент (тип) Имя Для чего
TEdit edPrice Для редактирования цены
TEdit edCount Для редактирования количества
TDataSource dsWares Источник данных таблицы товаров
TTable tbWares Таблица товаров
TDBGrid dbgWares Для показа таблицы товаров
TCheckBox chbFilter Включает и выключает фильтрацию таблицы товаров
TEdit edFilter Строка фильтра
TLabel lbWare Показывает выбранный товар

Добавим кнопочки и метки*:

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Кнопочки мы назовем btnOK и btnCancel.

Теперь займемся реализацией класса окна. В секцию Public добавим следующее:

WareId:LongInt;
function OpenRow(AFields:TFieldsArray):integer;
procedure SetupFilter;

Реализуем процедуру SetupFilter:

procedure TfrmRowDocEdit.SetupFilter;
begin
   if chbFilter.Checked and (Length(edFilter.Text)>0) then
   begin
        tbWares.Filter:='name='+QuotedStr(edFilter.Text + '*');
        tbWares.Filtered:=true;
    end else tbWares.Filtered:=false;
end;

В ней мы устанавливаем фильтр см. урок 8.8 "Использование фильтрации записей в компонентах TTable и TQuery (TPanel, Filter)", для того, что бы было легче искать в списке нужный товар.

Для организации открытия списка товаров реализуем функцию OpenRow:

function TfrmRowDocEdit.OpenRow(AFields:TFieldsArray):integer;
var i,cn:integer;
begin
   tbWares.Active:=true;
   cn:=dbgWares.Columns.Count-1;
   tbWares.Locate('Id',WareId,[loCaseInsensitive]);
   for i:=0 to cn do dbgWares.Columns[i].Title.Caption:=glFindFieldAsName(AFields, dbgWares.Columns[i].FieldName);
   result:=showModal;
end;

В этой процедуре, как вы уже поняли, мы открываем таблицу товаров и устанавливаем у нее колонки с русскими заголовками.  Обратите внимание на строку:

tbWares.Locate('Id',WareId,[loCaseInsensitive]);

Заметили новое слово Locate? Это процедура, которая осуществляет поиск по ключу. В данном случае по коду товара. Таким образом, при открытии формы тот товар, который в данный момент хранится в редактируемой строке, будет автоматически выбран.

При клике на строке таблицы товаров нам надо установить цену в поле редактирования цены (Событие OnCellClick):

procedure TfrmRowDocEdit.dbgWaresCellClick(Column: TColumn);
begin
     edPrice.Text:=tbWares.FieldValues['Price'];
end;

Так же нам надо устанавливать фильтр каждый раз, когда пользователь изменяет флажок фильтрации или сам фильтр, а посему, создадим соответсвующие обработчики событий у флажка и поля фильтрации.

procedure TfrmRowDocEdit.edFilterChange(Sender: TObject);
begin
   SetupFilter;
end;

procedure TfrmRowDocEdit.chbFilterClick(Sender: TObject);
begin
   SetupFilter;
end;

С формой редактирования строки закончили. Теперь перейдем к модулю DocUnit (форма frmDoc). Перво наперво, нам надо подключить к нему созданный нами модуль RowDocEdit и добавить кнопочку "Редактировать" (btnEdit)*

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Еще нам надо добавить сюда таблицу (TTable) с именем tbTabl, она будет служить у нас для того, что бы записать результаты редактирования строк табличной части накладной. Связанная с этим компонентом таблица - "Tablparts.db"

Поехали дальше.  В таблицу Tablparts.db добавим поле ID с типов Autoincrement. Это можно сделать, например, при помощи программы Database Desctop см. Delphi. Урок 8.1. Программирование баз данных в Delphi 7 (Database Desktop, компоненты):*

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Изменим SQL-запрос в qTab:

select
   wares.Id as WareId,
   wares.name as name,
   tablparts.QUANTITY as QUANTITY,
   tablparts.Price as Price,
   tablparts.Summ as Summ,
   tablparts.Id As Id
from tablparts as tablparts
  left join wares as wares on tablparts.ware=wares.id
  where tablparts.doc=#docid#

В нем добавились поля WareId - код товара и Id - уникальный код строки. Первый нужен для того, что бы при открытии таблицы товаров стразу же позиционироваться на нужную строку (на тот товар, который у нас уже выбран), а уникальный номер строки что бы потом после редактирования мы могли изменить в базе именно эту, а не какую то другую строку.

Теперь у нас на очереди реализация функции открытия формы редактирования строки:

procedure TfrmDoc.btnEditClick(Sender: TObject);
var frm:TfrmRowDocEdit;
begin
    frm:=TfrmRowDocEdit.Create(self);
    frm.edPrice.Text:=FloatToStr(qTab.FieldValues['Price']);
    frm.edCount.Text:=FloatToStr(qTab.FieldValues['QUANTITY']);
    frm.WareId:=qTab.FieldValues['WareId'];
    if frm.OpenRow(WaresFields)=mrOk then
    begin
        tbTabl.Filter:='Id='+IntToStr(qTab.FieldValues['Id']);
        tbTabl.Filtered:=true;
        tbTabl.Active:=true;
        tbTabl.Edit;
        tbTabl.FieldValues['Price']:=StrTofloat(frm.edPrice.Text);
        tbTabl.FieldValues['QUANTITY']:=StrTofloat(frm.edCount.Text);
        tbTabl.FieldValues['Ware']:=frm.tbWares.FieldValues['Id'];
        tbTabl.FieldValues['SUMM']:=tbTabl.FieldValues['Price']*tbTabl.FieldValues['QUANTITY'];
        tbTabl.Post;
        tbTabl.Active:=false;
        qTab.Active:=false;
        qTab.Active:=true;
        SetupColumns;
    end;
end;
 

Как и во всех аналогичных случаях, сначала мы создаем форму, затем устанавливаем ее реквизиты, после этого открываем форму в модальном режиме. Если редактирование завершилось нажатием кнопки "ОК", то перезаписываем строку в базе данных. Для этого устанавливаем фильтр по Id, так как Id уникальный то это будет одна единственная строка,  которую мы открываем на редактирование методом Edit, устанавливаем поля и подтверждаем изменения командой Post. Затем закрываем и снова открываем запрос qTab, что бы обновить на экране таблицу строк накладной.

А да, там еще есть такая процедура как SetupColumns - она переводить имена колонок на русский язык и скрывает лишние колонки. Ее надо вызывать каждый раз при обновлении запроса, а так же при первом открытии, поэтому нам еще придется переделать процедуру TfrmDoc.OpenDoc:

function TfrmDoc.OpenDoc(Docid:integer;AFields:TFieldsArray):integer;
begin
   qTab.SQL.Text:=StringReplace(qTab.SQL.Text,'#docid#',IntToStr(Docid),[rfReplaceAll]);
   qTab.Active:=true;
   WaresFields:=AFields;
   SetupColumns;
   tbHeap.Filter:='id='+IntToStr(Docid);
   tbHeap.Filtered:=true;
   tbHeap.Active:=true;
   lbdbDocNum.DataField:='ID';
   lbEdDate.DataField:='DocDate';
   DBLookupComboBox.KeyValue:=tbHeap.FieldValues['Store'];
   DBLookupComboBoxTypes.KeyValue:=tbHeap.FieldValues['TypeDoc'];
   result:=ShowModal;
end;

а теперь, последний штрих -  SetupColumns собственной персоной:

procedure TfrmDoc.SetupColumns;
var cn,i:integer;
begin
   cn:=dbgTabl.Columns.Count-1;
   for i:=0 to cn do
   begin
      if UpperCase(dbgTabl.Columns[i].FieldName)='ID' then
      begin
          dbgTabl.Columns[i].Visible:=false;
      end;
      if UpperCase(dbgTabl.Columns[i].FieldName)='WAREID' then
      begin
         dbgTabl.Columns[i].Visible:=false;
       end;
      dbgTabl.Columns[i].Title.Caption:=glFindFieldAsName(WaresFields, dbgTabl.Columns[i].FieldName);
   end;
end;

Да, и не забудьте объявить этот метод в секции private класса TfrmDoc:

private
    { Private declarations }
    WaresFields:TFieldsArray;
    procedure SetupColumns;
public
   { Public declarations }

Все, теперь можно тестировать нашу программу:

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

А вот так работает фильтр:

Delphi - это просто. Урок 8.11.4:  Программируем печать накладных.

Исходники к уроку вы можете скачать здесь.

 


Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями  в соответствии со ст. 1274 ГК РФ программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation"). 


 

 

Последнее обновление ( 06.11.2011 г. )
 
« След.   Пред. »
 
© 2024 Программирование - это просто
Joomla! - свободное программное обеспечение, распространяемое по лицензии GNU/GPL.
Русская локализация © 2005-2008 Joom.Ru - Русский Дом Joomla!
Design by Mamboteam.com | Powered by Mambobanner.de
Я принимаю Яндекс.Деньги