Разработка автоматизированного рабочего места менеджера розничной торговли

Примечаниеот автора: Программа полностью разработана в Borland Delphi 7 Studio с использованием стороннего компонента TmySQLDataBase. от редактора: только текстовый файл
Загрузить архив:
Файл: ref-24085.zip (370kb [zip], Скачиваний: 150) скачать

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ПЕДАГОГИЧЕСКИЙ УНИВЕРСИТЕТ»

ФАКУЛЬТЕТ ЭКОНОМИКИ И ИНФОРМАТИКИ

КАФЕДРА ИНФОРМАТИКИ

КУРСОВОЙ ПРОЕКТ

по дисциплине «Программирование» на тему: “Разработка автоматизированного рабочего места менеджера розничной торговли”

Выполнил: студент III курса гр.: И-04-2 Пивков В.А. Проверил: асс. Гаршин И.Л.

Липецк 2006

ЗАДАНИЕ.

Разработать клиентское приложение для СУБД mySQL 5.0.x на примере создания автоматизированного рабочего места менеджера розничной торговли.

ОГЛАВЛЕНИЕ

Введение

Глава 1. Постановка задачи 1.1.Литературный и патентный обзор постановки подобных задач. Анализ аналогичных информационных систем (ИС) 1.2.Характеристика организационной либо производственной структуры объекта или структуры предметной области 1.3.Назначение и цели создания системы

Глава 2. Проектная 2.1.Схема функциональной структуры системы с кратким описанием 2.2.Описание информационныхфункций и комплекса решаемых задач

2.3. Разработка решений по специальному математическому обеспечению ИС 2.3.1.Общий алгоритм функционирования системы

  1. Разработка алгоритмов решения отдельных функциональных задач
  2. Разработка решений по информационному обеспечению ИС
  3. Разработка решений по техническому обеспечению ИС

2.3.5. Разработка решений по программному обеспечению Библиографический список ПРИЛОЖЕНИЯ

Приложение 1. «Руководство оператора» Приложение 2. «Листинг исходного кода ИС»

ВВЕДЕНИЕ.

В настоящее время существует множество ИС для розничной торговли и каждая из них обладает своими достоинствами и недостатками. К основным недостаткам наверное можно отнести достаточно высокую цену за данные программные пакеты. Из-за этого еще многие торговые предприятия, не могут перейти на современные технологии ведения своего бизнеса.

Целью данной работы является разработка клиент-серверного приложения на основе свободно распространяемой СУБД mySQL 5.0 для ведения розничной торговли. В качестве примера в данной работе мы используем некую ООО Компания “X” для которой разрабатывается данная ИС.

Для достижения поставленной нами цели система должна решать следующие задачи:

  • Учет поставленной и реализованной продукции
  • Предоставлять актуальную информацию о наличии товара
  • Осуществлять поиск по базе данных
  • Генерировать отчет о продажах

ГЛАВА I. ПОСТАНОВКА ЗАДАЧИ

1.1 Литературный и патентный обзор постановки подобных задач. Анализ аналогичных систем

Информационные системы, в наше время, уже прочно заняли свои законные места в экономической сфере общества, в частности розничной торговле. Уже трудно представить себе, уважающее себя торговое предприятие, не использующее специализированного программного обеспечения для ведения своей деятельности. Спрос, как известно, рождает предложение и в настоящее время на рынке представлено множество систем, как отечественных, так и зарубежных. В данном материале рассмотрены некоторые российские и зарубежные разработки. Оставшуюся долю рынка занимает ряд малораспространенных продуктов, а также локализованные версии иностранных систем. Кроме того, существует довольно большое количество компаний, предлагающих проектные решения по реализации розничной торговли.

Рассмотрим системы для управления розничной торговлей, которые широко представлены на российском рынке.

Продукт LS Retail Axapta представляет собой единое программное решение для компаний, занимающихся розничной торговлей. Он может использоваться как в головных офисах, так и в офисах магазинов и на кассовых аппаратах (POS). Технически решение LS Retail Axapta состоит из ERP системы Microsoft Dynamics™ AX и двух специально разработанных к ней модулей. Это решение подходит для крупных компании, которые себе могут позволить покупку дорогостоящего программного обеспечения, ибо затраты на внедрение данного продукта в небольшую сеть, могут оказаться чрезмерно высокими.

Для малого бизнеса подходит отечественная разработка “1С: Предприятие”. Этот продукт является универсальной системой автоматизации деятельности предприятия. Основная его особенность – это настройка под особенности конкретного предприятия. Для использования данного пакета требуется не только покупка базового комплекта, но и так же написание собственной конфигурации, которая сможет удовлетворить нужды компании, что отразится на стоимости владения системой.

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

1.2 Характеристика структуры предметной области.

Предметной областью системы является продукция, реализуемая ООО Компания “X”. Для любого продукта существуют несколько характеристик:

  • Код товара
  • Наименование товара
  • Цена товара за шт.
  • Страна производитель
  • Гарантия

Исходя, из этих характеристик мы можем выделить некоторые задачи, которые должна реализовывать наша система:

  • Отбор наименовании имеющихся в наличии
  • Ведение учета по каждому наименованию
  • Обеспечение поиска по наименованиям
  • Добавление наименований
  • Удаление наименований
  • Редактирование характеристик наименований
  • Генерация отчета при реализации продукции

С точки зрения организационной структуры наша система используется сотрудниками компании, непосредственно задействованным в розничной торговле.

1.3. Назначение и цели создания системы.

Разрабатываемая мною система предназначается для автоматизации деятельности сотрудников задействованных непосредственно в розничной торговле в магазинах ООО Компания “X”.

Цели создания:

• Ускорение обслуживания клиентов

• Предоставление актуальной информации о наличии товара в магазине

  • Автоматический расчет стоимости покупки
  • Автоматическая генерация отчета
  • Реализация единого представления информации

ГЛАВА II ПРОЕКТНАЯ ЧАСТЬ.

2.1 Описание функциональной структуры системы.

Автоматизируемые функции данной программы определяются необходимыми данными для ведения розничной торговли.

Схема 1. Функциональная структура системы

2.2. Описание информационных функции и комплекса решаемых задач.

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

1. Подключение к серверу Входная информация – учетная запись пользователя на сервере БД. Выходная информация – получение доступа к БД При запуске системы требуется пройти аутентификацию на сервере БД

для получения подключения . Подключение реализовано в модуле Unit8 и предоставляет пользовательские интерфейсы на специально организованной форме - Form8.

2. Добавление товара Входная информация – это перечень характеристик товара. Обычно

предоставляется в бумажной форме Выходная информация – это запись о товаре в базе данных. По своей структуре информация выглядит так:

  • Код товара
  • Наименование товара
  • Цена товара
  • Количество
  • Страна – производитель

• Гарантийный срок Добавление товара происходит на специально выделенной форме Form4. Для добавления надо заполнить находящиеся на форме поля

типа TEdit и выбрать из списка типа TComboBox значение характеристики товара – страна-производитель. В случае успешного завершения операции будет сообщение.

3. Редактирование характеристик товара Входная информация – исходная запись Выходная информация – исправленная запись Редактирование записей происходит на специально выделенных полях

типа TEdit находящихся на форме Form5. Для редактирования доступны лишь следующие поля:

  • Наименование товара
  • Цена товара
  • Гарантийный срок

Оставшиеся поля не могут быть редактированы, чтобы не нарушать целостности данных.

4. Удаление товара Входные данные – исходная запись Выходные данные – сообщение о завершении операции удаления

Удаление записей происходит на специально выделенной форме Form3. На данной форме находятся таблица с данными типа DBGrid и две кнопки “Удалить” и “Выход” типа TBinBtn. При выбранной записи и нажатой кнопки “Удалить” из нашей БД сначала удаляются все подчиненные ей записи, только после этого удаляется сама запись о товаре и выводится сообщение о успешном завершении операции удаления.

5. Поиск товара Входные данные – исходная строка для поиска Выходные данные – записи БД удовлетворяющие исходному значению

либо пустой набор данных

Функция поиска реализована на главной форме проекта Form1 и предоставляет поле для ввода данных типа TEdit и кнопку для запуска операции типа TSpeedButton. В поле вводится исходная строка-шаблон и нажимается кнопка. Если операция завершена успешно то на главной форме мы получаем список соответствующих строке-шаблону товаров иначе мы получаем пустой набор данных.

6. Формирование списка покупки Входные данные – выбранная запись в DBGrid1 Выходные данные – полученная запись в StringGrid1 Формирования списка покупки происходит, на главной форме проекта

и предоставляет две таблицы типа TDBGrid и TStringGrid. При двойном нажатии левой клавиши мыши по записи находящейся в таблице DBGrid1 происходит перемещение одной единицы товара в список покупки – таблица StringGrid1. Одновременно в таблицы tbrko и tbrko_ware БД происходит занесение соответствующих записей о выбранном товаре.

7. Отмена покупки. Входные данные – массив строк содержащийся в StringGrid1 Выходные данные – восстановление исходных данных (до выполнения

последней сессии Формирование списка покупки) в DBGrid1

Данная функция удаляет все записи сделанные в БД последней сессией функции формирования списка покупки, очищает StringGrid1.

8. Генерация отчета (товарного чека) Входные данные – массив строк содержащийся в StringGrid1 Выходные данные – Excel – лист, бумажный товарный чек Генерирует товарный чек на основе содержимого SringGrid1

2.3 Разработка решений по специальному математическому обеспечению ИС.

    1. Общий алгоритм работы программы. Общий алгоритм моей программы можно представить так:
      1. Загружается клиентская часть программы.
      2. Пользователь вводит свои данные в форму для подключения к серверу БД
      3. Подключение к серверу БД
      4. Пользователь начинает работу с программой
  1. Завершение работы с системой, отключение от сервера БД Действия в п.4. полностью зависят от пользователя. Общего алгоритма работы системы нет, т.к. невозможно узнать какие задачи и в какой последовательности будет выполнять пользователь. Графическое изображение алгоритма представлено ниже.

Схема 2. Общий алгоритм работы программы

2.3.2 Разработка алгоритма для решения отдельных функциональных задач.

    1. Поиск товара Алгоритм решения данной задачи достаточно прост, после ввода исходной строки -шаблона пользователь нажимает на кнопку “Поиск” вызывается функция которая:
      1. Формируется запрос
      2. Оправляет запрос на сервер БД
      3. Обрабатывает полученный ответ
  1. Выводит результат поиска Проверка корректности работы осуществляется путём ввода различных строк

– шаблонов.

    1. Генерация товарного чека При готовом наборе покупки пользователь нажимает на кнопку “Оплатить” вызывается функция, которая:
      1. Отображает форму отчета Form9
      2. Создает на форме Form9 объект отчета типа Excel.Sheet
      3. Оформляет отчет и импортирует строковый массив о покупке из Form1.StringGrid1 в отчет
  1. Отображает отчет Проверка корректности работы осуществляется путём генерации отчетов с различными наборами данных.

2.3.3. Разработка решений по информационному обеспечению ИС

Принципы организации информационного обеспечения ИС

Основные принципы организации информационного обеспечения, необходимого для корректной работы программы “Розничная торговля ”:

• отделение данных от интерфейса пользователя;

2.3.4. Разработка решений по техническому обеспечению ИС. Минимальные требования к аппаратному обеспечению приложения “Розничная торговля ”

  • Процессор: Pentium – 2 450 Mhz
  • ОЗУ: 64 Mb
  • Video : int
  • LAN

2.3.5. Разработка решений по программному обеспечению Структура программного обеспечения

Схема 3. Структура программного обеспечения

Краткая характеристика общего программного обеспечения Операционная система Приложение “Розничная торговля ” может функционировать в компьютерах с установленной ОС Window 2000 и новее, также для корректной работы приложения на машине должен быть установлен MS EXCEL XP.

ЗАКЛЮЧЕНИЕ

В ходе данной работы была разработана система «Розничная торголя», которая полностью выполняет необходимые функции. Система полностью разработана в среде программирования Delphi 7 Studio с использованием компонента TmySQLDataBase.

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

  • система авторизации;
  • дополнительные отчёты;
  • интеграция со складом, бухгалтерией и тп.;

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

  1. Архангельский А.Я. “Delphi 2006 Справочное пособие” ”Бином” 2006
  2. Богомолов С. “MySQL: установка, настройка, описание”

http://www.mysql.ru/docs

  1. Дархвелидзе П., Марков Е. “Delphi 2005 для WIN 32” “БВХ-ПЕТЕРБУРГ” 2005
  2. Дархвелидзе П., Марков Е. “Программирование в Delphi 7” “БВХ-ПЕТЕРБУРГ” 2004
  3. Елманова Н., Трепалин С., Тенцер А. “Delphi и технология COM” “Питер” 2003
  4. Ильин М. “MySQL (введение)” http://www.mysql.ru/docs
  5. Марков Е., Никифоров В. “Delphi 2005 для .NET” “БВХ-ПЕТЕРБУРГ” 2005
  6. Мишенин А.И. Теория экономических информационных систем: Учебник. – 4-е изд. доп. и перераб. – М.: Финансы и статистика, 2001.
  7. Паутов А. “Описание СУБД MySQL” http://www.mysql.ru/docs 10.Ревич Ю. “Нестандартные приемы программирования на Delphi” “БВХ-ПЕТЕРБУРГ” 2005

11.Романов В.П., Емельянова Н.З., Партыка Т.Л. Проектирование экономических информационных систем: методология и современные технологии. Учебное пособие. – М.: Издательство «Экзамен», 2005.

12.Руссинович М., Соломон Д. Внутреннее устройство MS Windows: Windows 2003 Server, Windows XP, Windows 2000. Мастер-класс. / Пер. с англ. – 4-е издание – СПб.: Питер, 2005

13.Семенов М.И. Автоматизированные информационные технологии в экономике. – М.: Финансы и статистика, 2002.

14.Справочное руководство по MySQL http://mysql.ru/docs 15.Стиввене Род “Delphi готовые алгоритмы” “Питер” 2004 16.В.Фаронов “Программирование БД в Delphi 7” “Питер” 2003 17.Флёнов М.Е. “Delphi 2005 Секреты программирования” “Питер” 2006

ПРИЛОЖЕНИЕ 1 РУКОВОДСТВО ОПЕРАТОРА

При запуске программы мы попадаем на главную форму системы см. рис. 1

Рис. 1 Главная форма системы “Розничная торговля”

Для того чтобы начать работу с системой необходимо пройти установить подключение к серверу БД. Для этого следует нажать на кнопку

. После нажатия на данную кнопку перед вами появится окно “Настройки подключения” см. рис.2

Рис. 2 Окно “Настройки соединения”

После подключения к серверу БД окно автоматически закроется, и вы можете начинать работу с системой.

Товар может быть добавлен в список покупок двойным щелчком по либо клавише мыши, либо через контекстное меню “Добавить”. Выбрав в контекстном меню “Добавить” перед вами появится окно см. рис 3.

Рис 3. Ввод количества выбранного товара После ввода значения и нажатия клавиши “Ok” выбранный вами товар окажется в списке покупок см. Рис. 4

Рис. 4 Список покупок Для того чтобы очистить весь список покупок, воспользуйтесь клавишей “ОТМЕНА”, если же вы хотите удалить только один пункт из списка покупок, то воспользуйтесь контекстным меню.

Если надо оформить покупку, то нажмите на кнопку “ОПЛАТИТЬ”, перед Вами появится см рис 5.

Рис 5. Товарный чек. Если на этой форме нажать “ПЕЧАТЬ”, то бланк указанный на форме будет распечатан на принтере. Если же В нажимаете закрыть, то чек напечатан не будет, но данные о покупке все равно будут сохранены.

Для добавления товара в БД воспользуйтесь кнопкой

или в горизонтальном меню Правка => Добавить При нажатии на данную клавишу появится см рис.6

Рис. 6 Окно добавления товаров

Для редактирования характеристик товара в БД воспользуйтесь кнопкой или в горизонтальном меню Правка => Редактировать При нажатии на данную клавишу появится см рис. 7

Рис 7. Окно редактирования информации о товаре Для удаления товара из БД воспользуйтесь кнопкой

или в горизонтальном меню Правка => Удалить При нажатии на данную клавишу появится см рис. 8

Рис. 8 Окно удаления товара

В системе розничная торговля также присутствует функция поиска в БД см. рис. 9

Рис. 9 Поиск При вводе строки в поле поиска нажатии клавиши

запустится процедура поиска по введенной вами строке. Если результат поиска успешен, то вы получите результаты поиска на месте списка товаров. Если нет, то пустое поле.

При нажатии клавиши

вы вернетесь к исходному списку товаров.

Листинг 1 Unit1.pas
procedure SpeedButton5Click(Sender: TObject);
unit Unit1;
procedure SpeedButton4Click(Sender: TObject);


procedure Action1Execute(Sender: TObject);
interface
procedure Action2Execute(Sender: TObject);
uses
procedure Edit1KeyPress(Sender: TObject; var Key:
Windows, Messages, SysUtils, Variants, Classes, Char);
Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, Buttons,
procedure Action3Execute(Sender: TObject);
Grids, DBGrids, ExtCtrls, DB, DBClient, ComCtrls, ActnList;
procedure N13Click(Sender: TObject);


procedure N14Click(Sender: TObject);
type
procedure N10Click(Sender: TObject);
TForm1 = class(TForm)

Panel1: TPanel;
private
DBGrid1: TDBGrid;
{ Private declarations }
BitBtn1: TBitBtn;
public
BitBtn2: TBitBtn;
{ Public declarations }
StringGrid1: TStringGrid;
end;
Label1: TLabel;

Label2: TLabel;
var
Label3: TLabel;
Form1: TForm1;
SpeedButton2: TSpeedButton;
sql : String;
SpeedButton3: TSpeedButton;
Rec : Integer;
SpeedButton4: TSpeedButton;
d : Integer;
SpeedButton6: TSpeedButton;
e : Boolean;
MainMenu1: TMainMenu;
r : Word;
N1: TMenuItem;
procedure Init;
N2: TMenuItem;
implementation
N3: TMenuItem;
uses
N4: TMenuItem;
Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8,
N5: TMenuItem;
Unit9, Other;
N6: TMenuItem;
{$R *.dfm}
N7: TMenuItem;
procedure Init;
N8: TMenuItem;
begin
N9: TMenuItem;
Form1.Label2.Caption:= '0';
N11: TMenuItem;
Form1.BitBtn1.Enabled:= False;
N13: TMenuItem;
Form1.BitBtn2.Enabled:= False;
SpeedButton1: TSpeedButton;
with Form1.StringGrid1 do
ActionList1: TActionList;
begin
Panel2: TPanel;
Cells[0, 0]:= 'Код товара';
Action4: TAction;
Cells[1, 0]:= 'Наименование товара';
Edit1: TEdit;
Cells[2, 0]:= 'Цена за ед.';
SpeedButton5: TSpeedButton;
Cells[3, 0]:= 'Количество';
Action1: TAction;
Cells[4, 0]:= 'Стоимость';
Action2: TAction;
Cells[5, 0]:= 'Гарантия';
Action3: TAction;
end;
PopupMenu1: TPopupMenu;
end;
N14: TMenuItem;

PopupMenu2: TPopupMenu;
procedure TForm1.FormCreate(Sender: TObject);
N10: TMenuItem;
begin
procedure FormCreate(Sender: TObject);
init;
procedure DBGrid1DblClick(Sender: TObject);
end;
procedure BitBtn2Click(Sender: TObject);
procedure TForm1.DBGrid1DblClick(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
var
procedure Action4Execute(Sender: TObject);
s : Integer;

begin s:= 0; //ShowMessage(IntToStr(Rec)); Form1.BitBtn1.Enabled:= True; Form1.BitBtn2.Enabled:= True; if StringGrid1.RowCount = 1 then begin

sql:= 'INSERT INTO tbrko(date) VALUES (' + #39 +

DBDate + #39 + ');'; Query(MyData.Query2, sql, True); Rec:= count(MyData.Query2, 'tbrko');

end; if StringGrid1.RowCount > 1 then s:= FindART(StringGrid1, MyData.Query1.Fields[0].AsString); sql:= 'INSERT INTO tbrko_ware(ware, rko) VALUES (' + #39 + MyData.Query1.Fields[0].AsString + #39 + ',' +

IntToStr(Rec) + ');'; Query(MyData.Query2, sql, True); if (s > 0) then begin

with StringGrid1 do

begin Cells[3, s]:= FloatToStr(StrToInt(Cells[3, s]) + 1); Cells[4, s]:= FloatToStr(StrToInt(Cells[3, s]) *

StrToFloat(Cells[2, s]));

end; end else begin

with StringGrid1 do begin Cells[0, RowCount]:= MyData.Query1.Fields[0].AsString; Cells[1, RowCount]:= MyData.Query1.Fields[1].AsString; Cells[2, RowCount]:=

MyData.Query1.Fields[2].AsString; Cells[3, RowCount]:= '1'; Cells[4, RowCount]:= FloatToStr(StrToInt(Cells[3,

RowCount]) * StrToInt(Cells[2, RowCount])); Cells[5, RowCount]:= MyData.Query1.Fields[5].AsString; RowCount:= RowCount + 1;

end; end; Label2.Caption:=

FloatToStr(StrToFloat(Label2.Caption) + StrToFloat(MyData.Query1.Fields[2].AsString)); MyData.Query1.Refresh; end;

procedure TForm1.BitBtn2Click(Sender: TObject); begin sql:= 'DELETE FROM tbrko_ware WHERE rko = ' +

FloatToStr(Rec) + ';'; Query(MyData.Query2, sql, True); sql:= 'DELETE FROM tbrko WHERE code = ' +

FloatToStr(Rec) + ';'; Query(MyData.Query2, sql, True); StringGrid1.RowCount:= 1; MyData.Query1.Refresh; Label2.Caption:= '0'; BitBtn1.Enabled:= False; BitBtn2.Enabled:= False; Rec:= 0;

end; procedure TForm1.BitBtn1Click(Sender: TObject); begin

Form9.ShowModal; Rec:= 0; BitBtn1.Enabled:= False; BitBtn2.Enabled:= False; Label2.Caption:= '0'; StringGrid1.RowCount:= 1;

end;

procedure TForm1.Action4Execute(Sender: TObject); begin Form8.ShowModal; end;

procedure TForm1.SpeedButton5Click(Sender: TObject); begin sql:= 'SELECT art, name, price, country, garant FROM tbware, tbmanufacturer WHERE tbware.man = ' + 'tbmanufacturer.code AND tbware.name LIKE ' + #39

+ '%' + Edit1.Text + '%' + #39 + ';';

Query(MyData.Query1, sql, False); end;

procedure TForm1.SpeedButton4Click(Sender: TObject); begin sql:= 'SELECT art, name, price, country, garant FROM tbware, tbmanufacturer WHERE tbware.man = ' + 'tbmanufacturer.code;'; Query(MyData.Query1, sql, False); end;

procedure TForm1.Action1Execute(Sender: TObject); begin Form4.ShowModal; end;

procedure TForm1.Action2Execute(Sender: TObject);

begin Unit5.Form5.ShowModal; end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then SpeedButton4Click(Sender); end;

procedure TForm1.Action3Execute(Sender: TObject); begin Form3.ShowModal; end;

procedure TForm1.N13Click(Sender: TObject); begin AboutBox.ShowModal; end;

procedure TForm1.N14Click(Sender: TObject); var

i : Word; r, k : String;

begin if StringGrid1.Row > 0 then begin k:= StringGrid1.Cells[4, StringGrid1.Row]; r:= StringGrid1.Cells[0, StringGrid1.Row];;

with StringGrid1 do begin for i:=Row to RowCount do Rows[i].Assign(Rows[i+1]);

RowCount:= RowCount - 1; end; sql:= 'DELETE FROM tbrko_ware WHERE rko = ' +

IntToStr(Rec) + ' AND ware = ' + #39 + r + #39 + ';'; Query(MyData.Query2, sql, True); Label2.Caption:= IntToStr(StrToInt(Label2.Caption) -

StrToInt(k)); MyData.Query1.Refresh; end

else exit; end;

procedure TForm1.N10Click(Sender: TObject); var k,i : Word;

begin if MyData.Query1ART.AsString <> '' then begin

Form7.ShowModal;

if r > MyData.Query1.Fields[3].AsInteger then r:= MyData.Query1.Fields[3].AsInteger; for i:= 1 to r do

DBGrid1DblClick(Sender); end else exit;

end; end.

Листинг 2 Unit2.pas

unit Unit2;

interface

uses SysUtils, Classes, DB, mySQLDbTables;

type

TMyData = class(TDataModule) Connection1: TmySQLDatabase; Query1: TmySQLQuery; Query2: TmySQLQuery; Query3: TmySQLQuery; DataSource1: TDataSource; DataSource2: TDataSource; DataSource3: TDataSource; Query1ART: TStringField; Query1NAME: TStringField; Query1PRICE: TFloatField; Query1COUNTRY: TStringField; Query1GARANT: TLargeintField; Query1COUNT: TWordField; DataSource4: TDataSource; Query4: TmySQLQuery; procedure Query1CalcFields(DataSet: TDataSet); procedure Query1FilterRecord(DataSet: TDataSet; var

Accept: Boolean); private { Private declarations } public { Public declarations } end;

var MyData: TMyData; sql : String;

function MyConnection : Boolean; function Query(var name : TmySQLQuery; sql : String;

Ex : Boolean) : Boolean; procedure a(var m, n : Word); function count(name : TMySQLQuery; table : String) :

Word; implementation {$R *.dfm} // Подключение к СУБД function MyConnection : Boolean; begin

try Unit2.MyData.Connection1.Open; MyConnection:= True;

except MyConnection:= False;

end; end; //Выполняем запрос function Query(var name : TmySQLQuery; sql : String;

Ex : Boolean) : Boolean; var

sql:= 'SELECT * FROM tbpko_ware WHERE ware =' + #39 +

myData.Query1.Fields[0].AsString + #39 +';'; Query(myData.Query2, sql, False); m:= myData.Query2.RecordCount; sql:= 'SELECT * FROM tbrko_ware WHERE ware = '

+ #39 +

myData.Query1.Fields[0].AsString + #39 +';'; Query(myData.Query2, sql, False); n:= myData.Query2.RecordCount;

end; procedure TMyData.Query1CalcFields(DataSet: TDataSet); var m, n : Word;

begin a(m, n); Query1COUNT.Value:= (m - n);

end; procedure TMyData.Query1FilterRecord(DataSet: TDataSet; var Accept: Boolean); var m, n : Word; begin

t : TStrings; a(m, n);

begin if (m - n) > 0 then Accept:= True else Accept:= False; t:= TStringList.Create; end; t.Append(sql); //==Кол-во записей в таблице=== try function count(name : TMySQLQuery; table : String) :

case Ex ofWord; False : var begin sql : String;

name.Active:= False; begin name.SQL := t; sql:= 'SELECT * FROM ' + table + ';'; name.Active:= True; Query(name, sql, False);

end; //ShowMessage(table + ' ' + True : IntToStr(name.RecordCount)); begin if name.RecordCount <> 0 then

name.Active:= False; begin name.SQL := t; name.Last; name.ExecSQL; count:= StrToInt(name.Fields[0].AsString);

end; name.First; end; end Query:= True; else count:= 0;

except end; Query:= False;

end; end. end; procedure a(var m, n : Word); Листинг 3 Unit3.pas var

sql : String; unit Unit3; begin

interface ShowMessage('Товар успешно удален!!!'); end; uses Windows, Messages, SysUtils, Variants, Classes, procedure TForm3.BitBtn2Click(Sender: TObject); Graphics, Controls, Forms,begin Dialogs, StdCtrls, Buttons, Grids, DBGrids; MyData.Query1.Refresh; Close; type end;

TForm3 = class(TForm) DBGrid1: TDBGrid; end. BitBtn1: TBitBtn; BitBtn2: TBitBtn; Листинг 4 Unit4.pas procedure FormActivate(Sender: TObject);unit Unit4; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject);interface

private { Private declarations } uses public Windows, Messages, SysUtils, Variants, Classes, { Public declarations } Graphics, Controls, Forms, end; Dialogs, StdCtrls, ExtCtrls, DBCtrls;

var Form3: TForm3; sql : String;

implementation uses Unit2; {$R *.dfm}

procedure TForm3.FormActivate(Sender: TObject); begin sql:= 'SELECT art, name, price, country, garant FROM tbware, tbmanufacturer WHERE ' +

'tbware.man = tbmanufacturer.code;'; Query(MyData.Query2, sql, False); DBGrid1.DataSource:= MyData.DataSource2;

end;

procedure TForm3.BitBtn1Click(Sender: TObject); var

type

TForm4 = class(TForm) Panel1: TPanel; Edit1: TEdit; Edit2: TEdit; Edit4: TEdit; Edit5: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button2: TButton; Button3: TButton; Label6: TLabel; Edit6: TEdit; ComboBox1: TComboBox; procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject);

k : String;

begin k:= MyData.Query2.Fields[0].AsString; sql:= 'DELETE FROM tbpko_ware WHERE ware = ' +

#39 + k + #39 + ';'; Query(MyData.Query3, sql, True); sql:= 'DELETE FROM tbrko_ware WHERE ware = ' +

#39 + k + #39 + ';'; Query(MyData.Query3, sql, True); sql:= 'DELETE FROM tbware WHERE art = ' + #39 + k

procedure Button1Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); procedure Edit3KeyPress(Sender: TObject; var Key: Char); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations }

+ #39 + ';'; end; Query(MyData.Query3, sql, True);type MyData.Query2.Refresh; s = set of Char;

var if (MyData.Query3.RecordCount > 0) and Form4: TForm4; (MyData.Query2.RecordCount = 0) then art, nm, man ,price, n, g, sql : String;c:= MyData.Query3.Fields[0].AsString;

  1. k : Boolean; if (MyData.Query2.RecordCount = 0) then
  2. w : s; procedure Clear; implementation uses Unit2, Other, Unit1; {$R *.dfm} procedure Clear; begin

with Form4 do

begin Edit1.Clear; Edit2.Clear; //Edit3.Clear; Edit4.Clear; Edit5.Clear; Edit6.Clear;

end; end;

procedure TForm4.Button2Click(Sender: TObject); begin Close; end;

procedure TForm4.Button3Click(Sender: TObject); var

begin sql:= 'INSERT INTO tbware VALUES (' + #39 + art + #39 + ',' + #39 + nm + #39 + ',' + c + ',' + price + ',' + g + ');';

Query(MyData.Query3, sql, True); end; if k then begin

k := False; sql:= 'INSERT INTO tbpko(date) VALUES (' + #39 +

DBDate + #39 + ');'; Query(MyData.Query3, sql, True); m:= count(MyData.Query3, 'tbpko');

end; for i:= 1 to StrToInt(n) do begin

sql:= 'INSERT INTO tbpko_ware(ware, pko) VALUES ('+ #39 + art + #39 + ',' + IntToStr(m) + ');';

Query(MyData.Query3, sql, True); end; ShowMessage('Товар успешно добавлен!!!'); Clear; MyData.Query1.Refresh;

end; procedure TForm4.Button1Click(Sender: TObject);

c : String; i, l, m : Word;

begin art := Edit1.Text; nm := Edit2.Text; man := ComboBox1.Text; price := Edit4.Text; n := Edit5.Text; g := Edit6.Text; ShowMessage(man); if (art = '') or (nm = '') or (man = '') or (price = '') or (n =

'') or (g = '') then begin MessageBox(0, 'Заполнены не все поля!!!', 'АХТУНГ!!!', MB_OK);

exit; end; sql:= 'SELECT * FROM tbware WHERE

art='+#39+art+#39+';'; Query(MyData.Query2, sql, False); sql:= 'SELECT code FROM tbmanufacturer WHERE

country = ' + #39 + man + #39 + ';'; Query(MyData.Query3, sql, False);

begin Button3Click(Sender); Clear; Close;

end;

procedure TForm4.Edit1KeyPress(Sender: TObject; var Key: Char);

begin w:= ['0'..'9', #8]; if not (key in w) then key:= #0;

end;

procedure TForm4.Edit3KeyPress(Sender: TObject; var Key: Char);

begin w:= ['А'..'Я', 'а'..'я', #8]; if not (key in w) then key:= #0;

end;

procedure TForm4.FormActivate(Sender: TObject); var

i : Word; begin

k:= True; sql:= 'SELECT * FROM tbmanufacturer;'; Query(MyData.Query2, sql, False); while not MyData.Query2.Eof do begin

ComboBox1.Items.Append(MyData.Query2.Fields[1].AsString); MyData.Query2.Next; end; end;

end.

Листинг 5 Unit5.pas

unit Unit5;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Grids, DBGrids;

type

TForm5 = class(TForm) Label1: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Button1: TButton; Button2: TButton; DBGrid1: TDBGrid; procedure DBGrid1DblClick(Sender: TObject); procedure Edit2KeyPress(Sender: TObject; var Key:

Char); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormActivate(Sender: TObject);

private { Private declarations } public { Public declarations } end;

var Form5: TForm5; sql : String;

implementation uses Unit2; {$R *.dfm}

procedure TForm5.DBGrid1DblClick(Sender: TObject); begin

Button1.Enabled:= True;

Label1.Caption:= MyData.Query2.Fields[0].AsString;

Edit1.Text:= MyData.Query2.Fields[1].AsString;

Edit2.Text:= MyData.Query2.Fields[2].AsString;

Edit3.Text:= MyData.Query2.Fields[3].AsString;

Edit1.Enabled:= True;

Edit2.Enabled:= True;

Edit3.Enabled:= True;

end;

procedure TForm5.Edit2KeyPress(Sender: TObject; var Key: Char); type a = set of Char; var

f : a;

begin

f:= ['0'..'9', #8];

if not (key in f) then key:= #0;

end;

procedure TForm5.Button1Click(Sender: TObject); var sql : String; begin if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') then begin ShowMessage('Одно или несколько полей не содержат значении!!!');

exit;

end;

sql:= 'UPDATE tbware SET name = ' + #39 + Edit1.Text + #39 +

', price = ' + Edit2.Text + ', garant = ' + Edit3.Text + ' WHERE art = ' + #39

+ Label1.Caption + #39 + ';'; Query(MyData.Query3, sql, True); MyData.Query2.Refresh; //MyData.Query1.Refresh; Button1.Enabled:= False; Label1.Caption:= ''; Edit1.Text:= '<Описание товара>'; Edit2.Text:= '<Цена>'; Edit3.Text:= '<Гарантия>'; Edit1.Enabled:= False; Edit2.Enabled:= False; Edit3.Enabled:= False;

end;

procedure TForm5.Button2Click(Sender: TObject); begin

MyData.Query1.Refresh; interface Close; end; uses

Windows, Messages, SysUtils, Variants, Classes, procedure TForm5.FormActivate(Sender: TObject); Graphics, Controls, Forms,begin Dialogs, StdCtrls, Buttons;

Button1.Enabled:= False; Edit1.Enabled:= False; type Edit2.Enabled:= False; TForm7 = class(TForm) Edit3.Enabled:= False; Edit1: TEdit; sql:= 'SELECT art, name, price, garant FROM tbware'; BitBtn1: TBitBtn; Query(MyData.Query2, sql, False); procedure Edit1KeyPress(Sender: TObject; var Key: DBGrid1.DataSource:= MyData.DataSource2; Char);

end; procedure BitBtn1Click(Sender: TObject); procedure FormActivate(Sender: TObject);end. private { Private declarations } public

{ Public declarations } Листинг 6 Unit6.pas end; unit Unit6;

var interface Form7: TForm7;

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, Buttons, ExtCtrls, jpeg;

type

TAboutBox = class(TForm) Panel1: TPanel; ProgramIcon: TImage; ProductName: TLabel; Version: TLabel; Copyright: TLabel; Comments: TLabel; OKButton: TButton;

private { Private declarations } public { Public declarations } end;

var

AboutBox: TAboutBox; implementation {$R *.dfm} end.

Листинг 7 Unit7.pas

implementation uses Unit1; {$R *.dfm}

procedure TForm7.Edit1KeyPress(Sender: TObject; var Key: Char); type d = set of Char; var c : d;

begin c:= ['0'..'9', #8]; if not(key in c) then key:= #0;

end;

procedure TForm7.BitBtn1Click(Sender: TObject);

begin if Edit1.Text = '' then begin

ShowMessage(' !!!');

exit; end; Unit1.r:= StrToInt(Edit1.Text); Close;

end;

unit Unit7; procedure TForm7.FormActivate(Sender: TObject); begin type

Edit1.Clear; procedure TForm8.BitBtn1Click(Sender: TObject);
End; begin
end. if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '')
unit Unit8; or (Edit4.Text = '') or (Edit5.Text = '') then

begin
interface ShowMessage('Одно из полей не заполнено!!!');

exit;
uses end;
Windows, Messages, SysUtils, Variants, Classes, Form8.DragCursor:= crHourGlass;
Graphics, Controls, Forms, MyData.Connection1.Connected := False;
Dialogs, StdCtrls, Buttons, ExtCtrls; MyData.Connection1.UserName := Edit1.Text;

MyData.Connection1.UserPassword:= Edit2.Text;
type MyData.Connection1.Host := Edit3.Text;
TForm8 = class(TForm) MyData.Connection1.DatabaseName:= Edit4.Text;
Panel1: TPanel; MyData.Connection1.Port := StrToInt(Edit5.Text);
Panel2: TPanel; if not MyConnection then
Edit1: TEdit; begin
Edit2: TEdit; MessageBox(0, 'ИНВАЛИД КОННЕКШН!!!',
Edit3: TEdit; 'АХТУНГ', MB_OK);
Edit4: TEdit; exit;
Edit5: TEdit; end;
BitBtn1: TBitBtn; Form1.DBGrid1.Enabled:= True;
BitBtn2: TBitBtn; Form1.SpeedButton1.Enabled:= True;
Label1: TLabel; Form1.SpeedButton2.Enabled:= True;
Label2: TLabel; Form1.SpeedButton3.Enabled:= True;
Label3: TLabel; Form1.SpeedButton4.Enabled:= True;
Label4: TLabel; Form1.SpeedButton5.Enabled:= True;
Label5: TLabel; Form1.Edit1.Enabled:= True;
procedure FormActivate(Sender: TObject); Form1.MainMenu1.Items[0][1].Enabled:= True;
procedure BitBtn1Click(Sender: TObject); Form1.MainMenu1.Items[1][0].Enabled:= True;
procedure BitBtn2Click(Sender: TObject); Form1.MainMenu1.Items[1][1].Enabled:= True;
private Form1.MainMenu1.Items[1][2].Enabled:= True;
{ Private declarations } MyData.Query1.Active:= True;
public Form8.DragCursor:= crDefault;
{ Public declarations } Close;
end; end;
var procedure TForm8.BitBtn2Click(Sender: TObject);
Form8: TForm8; begin
implementation Close;
uses end;
Unit2, Unit1;
{$R *.dfm} end.

Листинг 9 Unit9.pas
procedure TForm8.FormActivate(Sender: TObject); unit Unit9;
begin
Edit1.Text:= MyData.Connection1.UserName; interface
Edit2.Text:= MyData.Connection1.UserPassword;
Edit3.Text:= MyData.Connection1.Host; uses
Edit4.Text:= MyData.Connection1.DatabaseName; Windows, Messages, SysUtils, Variants, Classes,
Edit5.Text:= IntToStr(MyData.Connection1.Port); Graphics, Controls, Forms,
end; Dialogs, OleCtnrs, ComObj, StdCtrls, Buttons, ExtCtrls;
Листинг 8 Unit8.pas

TForm9 = class(TForm) Panel1: TPanel; OleContainer1: TOleContainer; BitBtn1: TBitBtn; Panel2: TPanel; BitBtn2: TBitBtn; procedure FormActivate(Sender: TObject); procedure FormClose(Sender: TObject; var Action:

TCloseAction); procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject);

private { Private declarations } public { Public declarations } end; const xlCenter = -4108;

var Form9: TForm9; WB : Variant;

i : Word; implementation uses Unit1, Other; {$R *.dfm}

procedure TForm9.FormActivate(Sender: TObject);

begin // создаем OLE объект OleContainer1.CreateObject('Excel.Sheet', False); // присваиваем его псевдониму WB:= OleContainer1.OleObject; // Дизаин чека //=== начало === WB.Worksheets[1].Range['A1:D1'].MergeCells:= True; WB.Worksheets[1].Range['A1:A5'].Font.Bold:= True; WB.Worksheets[1].Cells[1, 1].Font.Size:= 14; WB.Worksheets[1].Cells[1, 1]:= 'ТОВАРНЫЙ ЧЕК №

' + IntToStr(Rec); WB.Worksheets[1].Range['A2:C2'].MergeCells:= True; WB.WorkSheets[1].Cells[2, 1].Font.Italic:= True; WB.WorkSheets[1].Cells[2, 1].Font.Size:= 8; WB.Worksheets[1].Cells[2, 1]:= DateToStr(Date) + ' ' +

TimeToStr(Time); WB.Worksheets[1].Range['A4:C4'].MergeCells:= True; WB.Worksheets[1].Cells[4, 1]:= 'Продавец: ООО "X"'; WB.Worksheets[1].Range['D4: I4'].MergeCells:= True; WB.Worksheets[1].Cells[4, 4].Font.Bold:= True; WB.Worksheets[1].Cells[4, 4].Font.Italic:= True; WB.Worksheets[1].Cells[4, 4].Font.Size:= 8; WB.Worksheets[1].Cells[4, 4]:= 'ИНН

AAXXXXXXXXXX Юр. адрес: XXXXXXXXXXXXXXX';

WB.Worksheets[1].Range['A5:C5'].MergeCells:=True; WB.Worksheets[1].Cells[5, 1]:= 'Покупатель: физ. лицо'; WB.Worksheets[1].Rows['6:6'].RowHeight:= 30;

WB.Worksheets[1].Range['A6:I6'].Interior.ColorIndex:= 15; WB.Worksheets[1].Range['A6:I6'].VerticalAlignment:= xlCenter; WB.Worksheets[1].Columns['F:F'].ColumnWidth:=

10.29; WB.Worksheets[1].Columns['G:G'].ColumnWidth:= 10; WB.Worksheets[1].Columns['H:H'].ColumnWidth:= 9; //Вывод из грида -начало for i:= 0 to Form1.StringGrid1.RowCount do begin

WB.Worksheets[1].Range[WB.Worksheets[1].Cells[i

+ 6, 2],WB.Worksheets[1].Cells[i + 6, 5]].MergeCells:=True; WB.Worksheets[1].Cells[i + 6, 1]:= Form1.StringGrid1.Cells[0, i]; WB.Worksheets[1].Cells[i + 6, 2]:= Form1.StringGrid1.Cells[1, i]; WB.Worksheets[1].Cells[i + 6, 6]:= Form1.StringGrid1.Cells[2, i]; WB.Worksheets[1].Cells[i + 6, 7]:= Form1.StringGrid1.Cells[3, i]; WB.Worksheets[1].Cells[i + 6, 8]:=

Form1.StringGrid1.Cells[4, i]; end; //Вывод из грида -конец WB.Worksheets[1].Cells[i + 6, 7].Font.Bold:= True; WB.Worksheets[1].Cells[i + 6, 8].Font.Bold:= True; WB.Worksheets[1].Cells[i + 6, 7]:= 'Итого: '; WB.Worksheets[1].Cells[i + 6, 8]:=

Form1.Label2.Caption; WB.Worksheets[1].Range[WB.Worksheets[1].Cells[i + 7, 1],WB.Worksheets[1].Cells[i + 7 , 8]].MergeCells:=True;

WB.Worksheets[1].Cells[i + 7, 1].Font.Bold:= True; WB.Worksheets[1].Cells[i + 7, 1].Font.Italic:= True; WB.Worksheets[1].Cells[i + 7, 1]:= 'Всего к оплате: ' +

SumNumToFull(StrToFloat(Form1.Label2.Caption)); WB.Worksheets[1].Range[WB.Worksheets[1].Cells[i + 9, 1],WB.Worksheets[1].Cells[i + 9 , 5]].MergeCells:=True; WB.Worksheets[1].Cells[i + 9, 1]:= 'Отпустил:_______________________'; WB.Worksheets[1].Range[WB.Worksheets[1].Cells[i + 10, 1],WB.Worksheets[1].Cells[i + 10, 5]].MergeCells:=True; WB.Worksheets[1].Cells[i + 10, 1]:= 'Получил:________________________'; //---Конец дизайна-------- end;

procedure TForm9.FormClose(Sender: TObject; var Action: TCloseAction);


begin begin

WB.Application.Quit; FindART:= i;

end; exit;


end;

procedure TForm9.BitBtn1Click(Sender: TObject); end;

begin FindART:= -1;

WB.ActiveSheet.PrintOut; end;

WB.Application.Quit; function SumNumToFull(Number:real):string;

Close; var

end; PartNum, TruncNum, NumTMP, D: integer;


NumStr : string;

procedure TForm9.BitBtn2Click(Sender: TObject); i, R : byte;

begin Flag11 : boolean;

WB.Application.Quit; begin

Close; D:=1000000;

end; R:=4;

end. //выделяем рубли


TruncNum:=Trunc(Number);

Листинг 11 Other.pas if TruncNum<>0 then


repeat

unit Other; PartNum:=TruncNum div D;


Dec(R);

interface D:=D div 1000;

uses until

SysUtils, Grids, Unit2; PartNum<>0

function DBDate : String; else

function FindART(name : TStringGrid; k : String) : R:=0;
Integer;
// перевод рублей

function SumNumToFull(Number:real):string; for i:=R downto 1 do


begin


Flag11:=False;

implementation // выделение цифры сотен

//Время в формате БД NumTMP:=PartNum div 100;

function DBDate : String; case NumTMP of

var 1: NumStr:=NumStr+'сто ';

DelphiDate, SqlDate : String; 2: NumStr:=NumStr+'двести ';

begin 3: NumStr:=NumStr+'триста ';

DelphiDate:=DateToStr(Date()); 4: NumStr:=NumStr+'четыреста ';

SqlDate:=Copy(DelphiDate,7,4)+' 5: NumStr:=NumStr+'пятьсот ';
'+Copy(DelphiDate,4,2)+'-'+Copy(DelphiDate,1,2); 6: NumStr:=NumStr+'шестьсот ';

DBDate:=SqlDate; 7: NumStr:=NumStr+'семьсот ';

end; 8: NumStr:=NumStr+'восемьсот ';

//===Поиск в гриде по коду товара==== 9: NumStr:=NumStr+'девятьсот ';

function FindART(name : TStringGrid; k : String) : end;
Integer;
// выделение цифры десятков

var NumTMP:=(PartNum mod 100) div 10;

i : Word; case NumTMP of

begin 1:


begin
//ShowMessage(IntToStr(Form1.StringGrid1.RowCount)); NumTMP:=PartNum mod 100;

for i:= 1 to name.RowCount - 1 do case NumTMP of

begin 10: NumStr:=NumStr+'десять ';

if (name.Cells[0, i] = k) then 11: NumStr:=NumStr+'одиннадцать ';

12: NumStr:=NumStr+'двенадцать ';

13: NumStr:=NumStr+'тринадцать ';

14: NumStr:=NumStr+'четырнадцать ';

15: NumStr:=NumStr+'пятнадцать ';

16: NumStr:=NumStr+'шестнадцать ';

17: NumStr:=NumStr+'семнадцать ';

18: NumStr:=NumStr+'восемнадцать ';

19: NumStr:=NumStr+'девятнадцать '; end; case i of

3: NumStr:=NumStr+'миллионов ';

2: NumStr:=NumStr+'тысяч ';

1: NumStr:=NumStr+'рублей '; end; Flag11:=True;

end;

2: NumStr:=NumStr+'двадцать ';

3: NumStr:=NumStr+'тридцать ';

4: NumStr:=NumStr+'сорок ';

5: NumStr:=NumStr+'пятьдесят ';

6: NumStr:=NumStr+'шестьдесят ';

7: NumStr:=NumStr+'семьдесят ';

8: NumStr:=NumStr+'восемьдесят ';

9: NumStr:=NumStr+'девяносто '; end; // выделение цифры единиц NumTMP:=PartNum mod 10; if not Flag11 then begin

case NumTMP of

1: if i=2 then NumStr:=NumStr+'одна '

else NumStr:=NumStr+'один ';

2: if i=2 then NumStr:=NumStr+'две '

else NumStr:=NumStr+'два ';

3: NumStr:=NumStr+'три ';

4: NumStr:=NumStr+'четыре ';

5: NumStr:=NumStr+'пять ';

6: NumStr:=NumStr+'шесть ';

7: NumStr:=NumStr+'семь ';

8: NumStr:=NumStr+'восемь ';

9: NumStr:=NumStr+'девять '; end; case i of

3: case NumTMP of

1: NumStr:=NumStr+'миллион '; 2,3,4: NumStr:=NumStr+'миллиона ';

else NumStr:=NumStr+'миллионов '; end;

2: case NumTMP of

1 : NumStr:=NumStr+'тысяча '; 2,3,4: NumStr:=NumStr+'тысячи '; else

if PartNum<>0 then NumStr:=NumStr+'тысяч '; end;

1: case NumTMP of

1 : NumStr:=NumStr+'рубль '; 2,3,4: NumStr:=NumStr+'рубля '; else

NumStr:=NumStr+'рублей '; end;

end; end; if i>1 then begin

PartNum:=(TruncNum mod (D*1000)) div D; D:=D div 1000;

end; end; //перевод копеек PartNum:=Round(Frac(Number)*100); if PartNum=0 then begin

SumNumToFull:=NumStr+'00 копеек';

Exit; end; // выделение цифры десятков NumTMP:=PartNum div 10; if NumTMP=0 then

NumStr:=NumStr+'0'+IntToStr(PartNum)+' ' else

NumStr:=NumStr+IntToStr(PartNum)+' '; // выделение цифры единиц NumTMP:=PartNum mod 10; case NumTMP of

1: if PartNum<>11 then NumStr:=NumStr+'копейка' else NumStr:=NumStr+'копеек'; 2,3,4: if (PartNum<5) or (PartNum>14) then NumStr:=NumStr+'копейки' else

NumStr:=NumStr+'копеек'; else

NumStr:=NumStr+'копеек';

end;

SumNumToFull:=NumStr; end;

end.