Программирование диалоговых запросов

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

Начну с процедуры Prih. Ее задача - ввести данные о новом приходе.

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

Например структура данных для приходов выглядит следующим образом Структура приходов Type PPP record Number LongInt номер прихода FirmName String 22 фирма поставщик Date String 10 дата прихода Kurs Real курс доллара ЦБ РФ на день прихода TotalItems LongInt кол-во пришедших наименований SebSumma Real общая сумма прихода End Структура приходов для наименования Type PPPItems Record Number LongInt ноиер наименования PrihodNum LongInt номер прихода SkladNum LongInt номер наименования на складе Name String lpname наименование Rasf String lprasf расфасовка Box Integer кол-во штук в упаковке Kolvo LongInt кол-во поступившего наименования SebPrice Real себестоимость наименования Price Real стоимость наименования SellTimes Boolean зарезервировано End Эти строки находятся в модуле SKLTYPES.PAS. В нем же находится описание всех структур данных, а так же их связь с файлами и основной программой Var ТИП ДАННЫХ PrihodData PPP PrihodItemsData PPPItems ТИП ДАННЫХ В ФАЙЛЕ PrihodFile File of PPP PrihodItemsFile File of PPPItems Теперь, надо ввести данные.

Для этого сначала появляется панель диалога для ввода даты прихода, курса прихода и реквизитов фирмы поставщика.

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

Ниже приведу текст модуля, cодержащего код для создания диалогового окна. unit PRIHOD1 interface uses Drivers, Objects, Views, Dialogs, Validate type PrihodDataRec record Field1 String 10 Field3 String 13 Field2 String 22 end PPrihodDataRec PrihodDataRec TPrihodDataDialog PPrihodDataDialog TPrihodDataDialog TPrihodDataDialog object TDialog constructor Init constructor Load var S TStream procedure HandleEvent var Event TEvent virtual procedure Store var S TStream function Valid Command word boolean virtual destructor Done virtual end Var PRD PrihodDataRec Const RPrihodDataDialog TStreamRec ObjType 12345 Insert a unique number 100 here VmtLink Ofs Typeof TPrihodDataDialog Load TPrihodDataDialog. Load Store TPrihodDataDialog. Store implementation TPrihodDataDialog constructor TPrihodDataDialog. Init var R TRect Control PView begin R.Assign 13, 3, 66, 17 inherited Init R, Приход Ввод данных Flags Flags and not wfMove R.Assign 24, 3, 36, 4 Control New PInputLine, Init R, 10 Insert Control PInputLine Control. Validator New PPXPictureValidator, Init, true R.Assign 5, 3, 24, 4 Insert New PLabel, Init R, Дата , Control R.Assign 24, 5, 39, 6 Control New PInputLine, Init R, 13 Insert Control PInputLine Control. Validator New PPXPictureValidator, Init False R.Assign 5, 5, 24, 6 Insert New PLabel, Init R, Курс прихода , Control R.Assign 24, 7, 48, 8 Control New PInputLine, Init R, 22 Insert Control R.Assign 5, 7, 24, 8 Insert New PLabel, Init R, Фирма поставщик , Control R.Assign 7, 10, 18, 12 Control New PButton, Init R, С брос, cmCancel, bfNormal Insert Control R.Assign 23, 10, 41, 12 Control New PButton, Init R, Н аименования, cmOK, bfDefault Insert Control R.Assign 37, 3, 51, 4 Control New PStaticText, Init R, ДД ММ ГГГГ Insert Control SelectNext False end constructor TPrihodDataDialog. Load var S TStream begin inherited Load S end procedure TPrihodDataDialog. HandleEvent var Event TEvent begin if Event. What evMessage then case Event. Command of end inherited HandleEvent Event if Event. What evMessage then case Event. Command of end end procedure TPrihodDataDialog. Store var S TStream begin inherited Store S end function TPrihodDataDialog. Valid Command word boolean var Result boolean begin Result inherited Valid Command Valid Result end destructor TPrihodDataDialog. Done begin inherited Done end end. Для отображения этого диалогового окна в процедуре PRIH испльзовался следующий код PRD.Field1 ShowDate Дата прихода - текущая дата Str GetKurs -1 2,PRD.Field3 Курс прихода - текущий курс FillChar PRD.Field2 1 ,22, Онулить фирму поставщика c1 ExecuteDialog New PPrihodDataDialog,Init , PRD Метод ExecuteDialog введен в седьмой версии Borlan Pascal очень удобен для отображения диалоговых окон, т.к. он осуществляет автоматическую вставку и получения данных в ходе создания и закрвтия панели диалога.

Ввести на экран панель диалога После ввода курса, даты и фирмы поставщика нужно ввести собственно наименования. Для этого я создал диалоговое окно см. модуль PRIH2.PAS , где вводится информации о наименовании название, расфасовка, стоимость, себестоимость и т.д см. рис. 3 рис.3 Введя данные, их надо сохранить.

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

Это делается приблизительно так подробно см. файл FIRMA.PAS OpenPrihodFile Процедура открытия файла см.модуль SklFiles. Pas Seek PrihodFile,FileSize PrihodFile -1 Write PrihodFile,PrihodData ClosePrihodFile см. модуль SklFiles. Pas Если нажимается кнопка СБРОС, то вызывается процедура сброса прихода в которой все задействованные файлы данных усекаются до предыдущей длина в начале процедуры PRIH запоминаются текущие длины файлов при помощи стандартной процедуры TRUNCATE. После успешного ввода данных появляется запрос о печати приходной накладной.

Печать осуществляется стандартными средствами см. процедуры PrintPrihodNakl и PrintEndOfPrihodNakl в модуле SklUnit. С помощью константы LST, компьютер связывается с печатающим устройством на LPT1, затем процедурами Writeln LST,строка для печати данные выводятся на принтер. Все введенные данные помещаются в файлы данных SKLAD.001 Товар на складе , PRIHOD.001 Заголовки приходов , PRIHOD.002 Пришедшие наименования. Затем пользователь получает доступ к следующим командам меню Данные-Склад, Данные-Приходы, Печать-Прайс-Лист, Печать-Отчет о наличии товара на складе, Клиент-Продажа.

Основной из вышеперечисленных команд является Клиент-Продажа.

При помощи этой команды пользователь должен выписать накладную по заказу клиента.

Реализовал эту команду так Появляется диалоговое окно со списком наименований, имеющихся на складе В нем пользователь выбирает продаваемые наименования и их количества. Затем при нажатии на кнопку ОПЛАТА появляется окно со списком всех выбранных наименований накладная в котором предоставляется возможность отредактировать введенные данные изменить количество каждого наименования, его стоимость и курс доллара. Далее после нажатия на ОПЛАТА на экране появляется диалоговое окно для ввода следующей информации реквизиты клиента, форма сделки реализация, округление суммы накладной, дата накладной.

После нажатия на ВЫПИСАТЬ НАКЛАДНУЮ у пользователя программы спрашивает, нужно ли печатать накладную и если товар дается клиенту не на реализацию, то спрашивается, нужно ли печатать приходный кассовый ордер.

Все введенные данные помещаются в файлы данных SDELKA.001 Заголовки сделок , SDELKA.002 Наименования сделок, в файле SKLAD.001 делаются соответствующие изменения по количеству оставшегося товара.

Для реализации диалогового окна со списком я создал коллекцию строк наименований имеющихся на складе, причем если товара на складе не осталось то это наименование не помещаеся в коллекцию. Data1 New PStrSor,Init 10,1 Указатель на коллекцию For N 0 to FileSize DataFile -1 do Каждую позицию проверить, если нулевая то не вносить в коллекцию begin 1 Seek DataFile, n Read DataFile,Data Считываем данные val Data. ProductOst, tempccc, code Str Data1 .Count 1,Numm if tempccc 0 then goto ccc Если нулевая позиция, то не вносить в коллекцию o 0 chr 57 FillChar o 1 ,57, with data do begin Создание строки типа Номер, Наименование, Расфасовка move Numm 1 ,o 2 ,Length Numm move ProductName 1 ,o succ lpnum-1 4 ,Length Data. ProductName move ProductRasf 1 ,o succ lpnum lpname 5 ,Length Data. ProductRasf move ProductNumber 1 ,o 50 , Length Data. ProductNumber end Data1 .Insert NewStr o Помещаю ее в коллекцию строк ccc end 1 Для реализации списка строк в Turbo Vision предусмотрен объект TListBox. Это объект создает специальное окно скроллера с указателем на текущий элемент.

Наименования я поместил в вышеописанную коллекцию строк, указатель на которую передал объекту с помощью метода TListBox. NewList. Var SCR PScrollBar LIST PLitstBox Begin RR.Assign 50,05,51,17 Координаты скроллера Scr New PscrollBar,Init RR Указатель на полосу скроллера Insert Scr Создаем скроллер R.Assign 03,05,50,17 Координаты окна со списком List New PMyListBox,Init R,1,scr Указатель на окно со списком List. NewList Data1 Связывание окна со коллекцией строк Insert list Создаем окно со списком End Диалоговое окно выбора наименований выглядит следующим образом Перейду теперь к описанию процедуры Данные-Сделки.

При выборе соответствующего пункта меню на экране почвляется диалоговое окно выбора периода для просмотра сделок.

В нем нужно ввести нижнюю и верхнюю границы периода.

После ввода при нажатии на кнопку ПОКАЗАТЬ ЗА ПЕРИОД разворачивается окно со списком сделок накладных относящихся к введенному периоду.

Это реализованно следующим образом.

При соэдании коллекции строк с накладными сравниваютя дата сделки, нижняя и верхняя границы периода при помощи написанной прцедуоы DATECOMP из модуля DATES.PAS. Но для того, чтобы накладные распологались по порядку по дате мне пришлось перекрыть метод сортировки коллекции см. модуль SKLSTR.PAS . После того, как создано диалоговое окно, пользователю предоставляется возможность распечатать выбранную накладную, соответствующую накладную по себестоимости и если накладная оплачена, то и приходный кассовый ордер. 2.6.4.5