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

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

 Часть 3.  (DBLookupComboBox, как записать в базу данных).

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

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

И так, открываем проект, который мы сделали на предыдущем уроке. Если у вас нет этого проекта, можете скачать его здесь.

Для начала, дабы заголовки у таблицы формы редактирования документа перевести на русский язык, изменим обработчик создания формы главного окна программы:

procedure TfrmStoreForm.FormCreate(Sender: TObject);
begin
   SetLength(WaresFields, 8);

   WaresFields[0].Name:='Id';
   WaresFields[0].Caption:='Код';

   WaresFields[1].Name:='Name';
   WaresFields[1].Caption:='Товар';

    WaresFields[2].Name:='Price';
    WaresFields[2].Caption:='Цена';

    WaresFields[3].Name:='Fio';
    WaresFields[3].Caption:='Фамилия Имя Отчество';

   WaresFields[4].Name:='Address';
   WaresFields[4].Caption:='Адрес';

   WaresFields[5].Name:='Phone';
   WaresFields[5].Caption:='Телефон';

   WaresFields[6].Name:='Quantity';
   WaresFields[6].Caption:='Количество';

   WaresFields[7].Name:='Summ';
   WaresFields[7].Caption:='Сумма';
end;

Мы добавили в массив соответствий новые поля, теперь он стал длиннее, обратите внимание на код в начале процедуры

SetLength(WaresFields, 8);

Теперь откроем форму TfrmDoc и  положим нижеперечисленные компоненты:

Компонент Имя Для чего
TDBLookupComboBox DBLookupComboBox Выпадающий список складов
TDataSource dsStores Источник данных для выпадающего списка складов
TTable tbStores Для связи с базой данных складов
TDBLookupComboBox DBLookupComboBoxTypes Выпадающий список типов документов (приходная или расходная накладная)
TDataSource dsTypesDocs Источник данных для выпадающего списка типов накладных
TTable tbTypesDocs Для связи с базой данных типов накладных

Если забыли как открывать форму, напомню, через иконку View form*:

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

выбираем из списка нужную форму*:

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

Так же добавим две метки (TLabel), что бы сделать к выпадающим спискам комментирующие надписи*:

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

Теперь свяжем между собой добавленные компоненты. У компонента dsStores свойство DataSet установим tbStores, у tbStores свойство DatabseName сделаем StorPrj, а TableName выберем "stores.DB". Если у вас не получается выбрать DatabseName  как StorPrj то загляните в урок 8.2.   Таблицу складов (dsStores) делаем активной (свойство Active=true). Затем переходим к компоненту TDBLookupComboBox, у него в качестве свойства ListSource выберем ссылку на компонент dsStores. Свойство ListFiled установим равным "Name", а свойство KeyField (ключевое поле) у нас будет равно "Id".

Аналогичным способом связываем dsTypesDocs и tbTypesDocs. У tbTypesDocs устанавливаем DatabseName равным StorPrj, имя таблицы "docstypes.db", так же делаем этот компонент активным (свойство Active=true).  DBLookupComboBoxTypes: в качестве источника списка (ListSource ) у него будет dsTypesDocs, ListFiled  равно "Name", а ключевое поле "Id"

Так же нам надо переписать процедуру OpenDoc класса TfrmDoc:

function TfrmDoc.OpenDoc(Docid:integer;AFields:TFieldsArray):integer;
var cn,i:integer;
begin
     qTab.SQL.Text:=StringReplace(qTab.SQL.Text,'#docid#',IntToStr(Docid),[rfReplaceAll]);
     qTab.Active:=true;
     cn:=dbgTabl.Columns.Count-1;
     for i:=0 to cn do dbgTabl.Columns[i].Title.Caption:=glFindFieldAsName(AFields, dbgTabl.Columns[i].FieldName);
     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;

Теперь немного комментариев к коду.  По сравнению с предыдущей версией мы добавили инициализацию начальных значений выпадающий списков:

     DBLookupComboBox.KeyValue:=tbHeap.FieldValues['Store'];
     DBLookupComboBoxTypes.KeyValue:=tbHeap.FieldValues['TypeDoc'];

В качестве начальных значений берем текущие значения из базы данных.

У и еще, мы переводим столбцы на русский язык:

     cn:=dbgTabl.Columns.Count-1;
     for i:=0 to cn do dbgTabl.Columns[i].Title.Caption:=glFindFieldAsName(AFields, dbgTabl.Columns[i].FieldName);

Еще в модуля DOCUnit и в DOCSFRM  нам надо добавить подключение модуля  StoreTypes*:

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

Что бы записать сделанные изменения, давайте напишем обработчик нажатия кнопочки ОК:

procedure TfrmDoc.btnOkClick(Sender: TObject);
begin
   tbHeap.Edit;
   tbHeap.FieldValues['Store']:=DBLookupComboBox.KeyValue;
   tbHeap.FieldValues['TypeDoc']:=DBLookupComboBoxTypes.KeyValue;
   tbHeap.Post;
end;

Кстати, мы изменили параметры функции TfrmDoc.OpenDoc, поэтому, во первых, не забудьте поменять эти параметры еще и в объявлении метода  OpenDoc класса TfrmDoc:

...

public
    { Public declarations }
     function OpenDoc(Docid:integer;AFields:TFieldsArray):integer;
end;
 

А во вторых, нам надо так же исправить все вызовы этой функции, к счастью,  он ну нас только один из метода TfrmDocs.btnEditClick:

procedure TfrmDocs.btnEditClick(Sender: TObject);
var frm:TfrmDoc; id:integer;
begin
    id:=qDocs.FieldByName('DocNum').Value;
    frm:=TfrmDoc.Create(self);
    if frm.OpenDoc(id, WaresFields)=mrOK then
    begin
      qDocs.Active:=false;
      qDocs.Active:=true;
   end;
end;

У нас там появилась новая переменная WaresFields, нам тоже ее нужно объявить, переделаем объявление класса TfrmDocs (выделено красным):

TfrmDocs = class(TForm)
   dsDocs: TDataSource;
   dbgDocs: TDBGrid;
   qDocs: TQuery;
   btnEdit: TButton;
   procedure btnEditClick(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
   WaresFields:TFieldsArray;
end;

Очевидно, что теперь нам надо исправить саму процедуру вызова журнала документов:

procedure TfrmStoreForm.acDocsExecute(Sender: TObject);
var frm:TfrmDocs;
begin
   frm:=TfrmDocs.Create(self);
   frm.WaresFields:=WaresFields;
   frm.Show;
end;

Эта процедура у нас находиться в форме frmStoreForm*:

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

Немного подкорректируем функцию  glFindFieldAsName в модуле StoreTypes:

function glFindFieldAsName(AFields:TFieldsArray; AName:TFieldString):TFieldString;
var i:integer;
begin
   Result:='???';
   for i:=Low(AFields) to High(AFields) do if UpperCase(AFields[i].Name)=UpperCase(AName) then
   begin
       Result:=AFields[i].Caption;
       exit;
   end;
end;

В данном случае мы в сравнении преобразуем все символы к верхнему регистру, так как для имен полей без разницы, какими буквами они набраны - строчными или прописными. Раз уж мы используем функцию UpperCase то нужно подключить модуль где она объявлена SysUtils*:

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


Все, компилируем программу и запускаем ее:

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

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


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


 

 

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