Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zvit_2013(ЧорнийВ).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
318 Кб
Скачать
☆

Розділ 3.

Індивідуальне завдання

Опис предметної області

Облік продукції повинен забезпечити контроль за: виконанням завдань, щодо продажу продукції, за договірним асортиментом, збереженням продукції на складі, одержанням договірної дисципліни отримання та оплати продукції покупцями, правильним відображенням витрат пов’язаних з реалізацією продукції і результатів від її реалізації.

Основою побудови бухгалтерського обліку продукції на складі та її реалізації є:

  • класифікація продукції;

  • оцінка продукції в поточному обліку;

  • документальне оформлення продажу та реалізації продукції.

Товари облічують на складі продукції і оформляють діючими здавальними документами – накладними. У поточному обліку продукцію оцінюють за “твердими” обліковими цінами (середньорічною плановою собівартістю, договірними або оптовими цінами або за фактичною собівартістю). Такі ціни є основою ведення бухгалтерського обліку готової продукції оперативно-бухгалтерським методом.

Велике значення для правильної організації обліку продукції має розробка її номенклатури - перелік найменувань видів виробів, які знаходяться на складі. За основу його складання береться класифікація товару по визначеним ознакам, які дозволяють відрізняти один виріб від іншого (модель, фасон, сорт, марка, артикул і т. д.). номенклатурний номер може мати різну кількість цифр. Деякі підприємства користуються в якості номенклатурних номерів прейскурантними номерами, які затверджені Держкомітетом цін.

Продаж кожного виду продукції зі складу оформляється відповідною первинною документацією: накладні на продаж товару зі складу. У них вказують код товару, дату, опис, найменування продукції, ціну за одиницю товару, суму до оплати та інші реквізити. Тут також відображають підписи осіб того, хто відпустив, і того хто отримав готову продукцію. Накладні надходять до бухгалтерії для обліку проданої продукції.

Проектування інформаційно-пошукової системи ”Склад”

Створимо програму, яка буде прикладом роботи з базами даних в Delphi. Для цього використаємо базу даних MS Access db1.mdb, в якій знаходяться наступні таблиці: „Товар” (таблиця, що містить дані про товар, його опис і ціну), „Партія товару” і „Рахунок”, які зв'язані наступним чином:

Для початку зареструємо псевдонім для бази даних в ODBC. Для цього перейдемо в папку “Панель управления” Пуск Настройка Панель управления і двічі натиснемо на ярличку “Источники данных ODBC (32)”, в вкладці «Пользовательский DSN», натиснемо на кнопку “Добавить”, виберемо зі списку “Microsoft Access Driver (*.mdb)” і натиснемо “Готово”. У вікні, що відкриється введемо “Имя источника данных” текст “_db6” і натиснувши на кнопку “Выбрать...” вкажемо шлях до нашої бази даних: “С:\DB\db1.mdb”. Тиснемо “ОК” і переходимо безпосередньо в Delphi 7.0. Для створення програми виберемо в меню File  New  Application. Створимо DataModule необхідний для розміщення на ньому компонент для роботи з базами даних, для цього виберемо в меню File  New, в вікні що з'явилось вибираємо піктограмку “DataModule”. Збережемо проект як db.dpr, DataModule1 data.pas, unit1 dp1.pas. Додамо з палітри компонентів з вкладок “Data Access” і “BDE” компоненти необхідні для роботи з нашою базою даних Database, три компоненти DataSource, три компоненти Table i Query помістивши їх на DataModule1:

Д ля компоненти Database1 в вікні “Object Inspector” надамо наступні значення для властивостей: AliasName = “_db6” (вказуємо псевдонім нашої бази даних), DatabaseName = “_db1” (ім'я бази даних яке будуть використовувати решта компоненти DataAccess), LoginPromt = “False” (не запрошувати ім'я користувача і пароль при відкритті бази даних). Для компонент Table1, Table2, Table3 встановимо DatabasName = “_db1”, TableName відповідно “Товар”, “Рахунок”, “Партія товару”, і після цього для кожної компоненти Active присвоїмо значення True. Для компонент Datasource1, DataSource2, Datasource3 присвоїмо властивості DataSet відповідно значень “Table1”, “Table2”, “Table3”.

З вкладки Win32 на форму Form1 помістимо компоненту PageControl, в вікні “Object Inspector” якої вкажемо Align = “alClient”. Викликавши правою кнопкою миші контекстне меню виберемо пункт “New Page” і для нової закладки TabSheet1 властивість Caption присвоїмо значення “Товари”, яке буде назвою нашої закладки. На закладку помістимо компоненту DBGrid1 з закладки DataControls палітри компонентів. Надамо їй наступних властивостей: Align = “alClient”, DataSource = “DataModule1.DataSource1”. Тепер в вікні закладки “Товари” ми можемо переглядати дані з таблиці Товар. Для можливості оперування з цими даними додамо на форму елемент управління DBNavigator. Для цього створимо для нашої форми Form1 панель інструментів. Помістимо на форму ControlBar1 з закладки Additional, властивість AutoSize якого встановимо “False”. Після цього на ControlBar1 помістимо DBNavigator1. Створимо ще одну закладку PageControl1, для перегляду і редагування всіх трьох таблиць. Присвоїмо властивості Caption = «Виписка рахунку», для TabSheet2, і помістимо на закладку три компоненти GroupBox з палітри “Standart”, присвоївши властивості Caption для яких, відповідно, “Рахунок”, “Товар” і “Партія товару”. Помістимо на GroupBox1 (“Рахунок”) чотири компоненти DBEdit, з закладки “Data Controls”. Властивостям цих елементів DataSource присвоїмо значення DataModule1.DataSource2, а DataField, відповідно, імена полів з таблиці “Рахунок”: “Код рахунку”, “Дата виписки”, “Дата проплати”, “Сума оплати”. Над елементами DBEdit помістимо компоненти Label з палітри “Satndart”, присвоївши властивості Caption кожного з них імена відповідних полів. Аналогічно поступимо з GroupBox2 (“Товар”), помістивши на нього відповідну кількість DBEdit i Label, створивши перегляд таблиці “Товар”. На GroupBox3 (“Партія товару”) помістимо DBGrid, присвоїмо його властивостям такі значення: Align = alClient, DataSource = DataModule1.DataSource3. Для того щоб перехід по всіх полях різних таблиць відбувався синхронно, а в DBGrid2 ми могли бачити список партій товару які виписані на вибраний рахунок вкажемо зв'язки між таблицями. Але щоб в першій закладці таблиця товар відображалась правильно зробимо це для таблиць “Рахунок” і “Партія товару” в «Object Inspector», а для таблиць “Партія товару” і “Товар” – програмно. Виберемо Table2 на DataModule1 і для властивості MasterSource виберемо значення DataSource3, для властивості MasterFields – “Код рахунку”. Для компоненти PageControl1 в колонці “Object Inspector” “Events” виберемо подію «OnChange», двічі натиснемо ліву клавішу миші і введемо наступне:

Procedure TForm1.PageControl1Change(Sender: TObject);

begin

// якщо здійснено перехід на закладку "Товар"

if PageControl1.ActivePage=TabSheet1 then

begin

MainMenu1.Items.Items[0].Enabled:=False;

ToolBar1.Visible:=False;

MainMenu1.Items.Items[1].Enabled:=True;

DBNavigator1.Left:=11;

DBNavigator1.Visible:=True;

MainMenu1.Items.Items[2].Enabled:=False;

DBNavigator1.DataSource:=DataModule1.DataSource1;

// панель DBNavigator керує таблицею "Товар"

DataModule1.Table1.MasterSource:=nil;

// забираємо зв'язок з таблицею "Партія товару"

DataModule1.Table1.MasterFields:='';

end;

// якщо здійснимо перехід на закладку "Виписка рахунку"

if PageControl1.ActivePage=TabSheet2 then

begin

MainMenu1.Items.Items[0].Enabled:=False;

ToolBar1.Visible:=False;

MainMenu1.Items.Items[1].Enabled:=True;

DBNavigator1.Left:=11;

DBNavigator1.Visible:=True;

MainMenu1.Items.Items[2].Enabled:=False;

DBNavigator1.DataSource:=DataModule1.DataSource3;

// панель DBNavigator керує таблицею "Партія товару"

DataModule1.Table1.MasterSource:=DataModule1.DataSource3;

// встановлюємо зв'язок між "Товар" і

DataModule1.Table1.MasterFields:='Код товару';

// "Партія товару" по полю "Код товару"

end;

// якщо здійснимо перехід на закладку "Запити"

if PageControl1.ActivePage=TabSheet3 then

begin

MainMenu1.Items.Items[0].Enabled:=True;

ToolBar1.Left:=11;

ToolBar1.Visible:=True;

MainMenu1.Items.Items[1].Enabled:=False;

DBNavigator1.Visible:=False;

MainMenu1.Items.Items[2].Enabled:=False;

end;

// якщо здійснимо перехід на закладку "Звітність"

if PageControl1.ActivePage=TabSheet4 then

begin

MainMenu1.Items.Items[0].Enabled:=False;

ToolBar1.Visible:=False;

MainMenu1.Items.Items[1].Enabled:=False;

DBNavigator1.Visible:=False;

MainMenu1.Items.Items[2].Enabled:=True;

DBNavigator1.DataSource:=DataModule1.DataSource1;

// панель DBNavigator керує таблицею "Товар"

DataModule1.Table1.MasterSource:=nil;

// забираємо зв'язок з таблицею "Партія товару"

DataModule1.Table1.MasterFields:='';

end;

end;

Біля полів “Дата виписки» та «Дата проплати» помістимо кнопки для переходу на нову форму – вибору дати. Створимо її у вигляді dll. Виберемо в меню меню File  New, і вікні “New Items” виберемо піктограму “Dll”. Після появи самого тексту dll збережемо проект як «slave.dpr», і виберемо в меню File  New  Form. Властивостям нової форми надамо такі значення: Name = CalendarForm, Caption = «Виберіть дату», BorderStyle = bsToolWindow, Position = poDesktopCenter. Помістимо на форму компоненту MonthCalendar з закладки Win32, і SpeedButton з закладки Additional. Додамо в опис змінних для модуля:

var

selDate: TDate;

Для SpeedButton1 створимо таку процедуру обробки події OnClick:

Procedure TCalendarForm.SpeedButton1Click(Sender: TObject);

begin

selDate:=MonthCalendar1.Date; // запам'ятовуємо вибрану дату

CalendarForm.Close; // закриваємо форму

end;

В модуль slave.dpr введемо наступний текст:

uses

Forms,

SysUtils,

Classes,

cal in 'cal.pas' {CalendarForm};

Function GetDate: TDateTime; stdcall;

begin

Application.CreateForm(TCalendarForm, CalendarForm);

// динамічно створюємо форму

CalendarForm.ShowModal; // виводимо форму на екран

GetDate:=selDate; // значенню що повертає функція

присвоюємо значення вибраної дати

end;

exports

GetDate; // функція для зовнішнього використання

Begin

End.

Для SpeedButton1 i SpeedButton2 в основній програмі, в процедуру обробки події OnClick вставимо наступний текст:

Procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

DBEdit2.Text:=DateToStr(GetDate);

end;

Procedure TForm1.SpeedButton2Click(Sender: TObject);

begin

DBEdit3.Text:=DateToStr(GetDate);

end;

Відповідно перед секцією Implementation вставимо наступне:

{export from slave.dll}

Function GetDate: TDateTime; stdcall; external 'slave.dll';

Тепер при натисненні на кнопку біля відповідних полів користувач зможе вибрати дату з календаря.

Створимо нову закладку PageControl1, назвемо її “Запити”. Створимо для цієї закладки нову панель інструментів, помістивши на ControlBar1 ToolBar1. Додамо декілька кнопок викликаючи контекстне меню на ToolBar1 і вибираючи опцію New Button. Помістимо на закладку DBGrid для перегляду результатів запитів. Помістимо на закладку GroupBox, на якому розташуємо для початку 6 компонент Edit, над якими розмістимо по Label з назвами відповідних полів з таблиці “Товар”. Розташуємо між двома останніми полями ComboBox1. Будемо використовувати відповідні поля для вводу критеріїв для запитів. Перш за все зробимо вікно в якому ми зможемо контролювати правильність створення запиту SQL. Виберемо в меню команду File  New Form, надамо її властивостям наступних значень: Name = SQLText, BorderStyle = bsToolWindow, Position = poDesktopCenter. Помістимо на форму Memo1, змінимо властивість Align = alClient. Для Query1 з DataModule1 введемо такий текст для обробки події AfterOpen:

var

SQLtxt:TStrings;

…

Procedure TDataModule1.Query1AfterOpen(DataSet: TDataSet);

begin

SQLtxt:=DataModule1.Query1.SQL;

end;

a для події кнопки OnClick, якій ми присвоїмо Hint “Показати текст виконаного запиту”, цей напис буде з'являтись при наведенні курсору миші на кнопку (властивість ShowHints для відображення вспливаючих підказок повинна мати значення True, для присвоєння всім елементам цього значення, достатньо присвоїти ShowHints = True батьківському елементу, наприклад Form1):

Procedure TForm1.ToolButton1Click(Sender: TObject);

begin

Application.CreateForm(TSQLText, SQLText);

// динамічно створюємо форму

SQLText.Memo1.Lines:=SQLtxt; // виводимо текст запиту

SQLText.ShowModal; // показуємо форму

SQLText.Close;

end;

Для DBGrid3 властивості DataSource присвоїмо значення DataModule1.DataSource4, властивості DataSource4 DataSet = Query1. Щоб при завантаженні програми DBGrid не був пустим відобразимо в ньому таблицю «Товар» наступним чином – властивості DatabaseName з Query1 надамо значення “_db1” в полі SQL викликавши вікно введемо текст: “select * from Товар;” (без лапок).

Для другої кнопки з ToolBar1 – ToolButton2 в полі властивості Hint напишемо настпуне – “Шукати записи по введених критеріях”, створимо для цієї кнопки виконання запиту з використанням інструкції SQL select. Перед цим ComboBox1 надамо таких значень для вибору в властивості «Items»: “=”,”>”,”<”,”..”. Для події OnChange ComboBox1 введемо наступне:

Procedure TForm1.ComboBox1Change(Sender: TObject);

begin

if ComboBox1.ItemIndex=3 then Edit6.Visible:=True

// при виборі значення “..” з'являється поле для вказування

інтервалу відбору значень

else Edit6.Visible:=False;

end;

Для обробки події OnClick ToolButton1 введемо наступний текст:

const

t1:string='[Код товару]'; // назви полів

t2:string='[Назва товару]';

t3:string='[Опис товару]';

t5:string='[Ціна за одиницю товару]';

t4:string='[Упаковка]';

…

Procedure TForm1.ToolButton2Click(Sender: TObject);

var sqlTable,sqlWhere: String;

begin

DataModule1.Query1.SQL.Clear;

sqlTable:='Select * ';

sqlWhere:='where ';

sqlTable:=sqlTable + 'from Товар ';

sqlWhere:=sqlWhere+'('+t1+' like '''+'%'+Edit1.Text+''') and ('+t2+'

like '''+Edit2.Text+''') and ('+t3+' like '''+Edit3.Text+''') and ('+t4+'

like '''+Edit4.Text+''') and (';

case ComboBox1.ItemIndex of

0: sqlWhere:=sqlWhere+t5+' = '+Edit5.Text+');';

// рівне вказаному значенню

1: sqlWhere:=sqlWhere+t5+' > '+Edit5.Text+');'; // більше

2: sqlWhere:=sqlWhere+t5+' < '+Edit5.Text+');'; // менше

3:sqlWhere:=sqlWhere+t5+' between '+Edit5.Text+' and

'+Edit6.Text+');'; // в інтервалі

end;

DataModule1.Query1.SQL.Add(sqlTable+sqlWhere);

DataModule1.Query1.Active:=True;

end;

Символ процента використовується в мові SQL драйвера MS ACCESS для вибору всіх значень з предикатом Like (наприклад like’a%’ поверне всі значення що починаються з букви а), тому по замовчуванні для Edit полів таблиці товар задамо значення Text = %, для поля «Ціна за одиницю товару” Text = 0, для Edit12, поля в якому вказується верхня межа по замовчуванню введемо Text = 1000. Запустимо програму і перейшовши на закладку “Запити” натиснемо кнопку з підказкою “Шукати записи по введених критеріях”, після чого натиснемо на кнопку для перегляду тексту запиту з підказкою “Показати текст виконаного запиту”, отримаємо наступне:

Аналогічно створимо на панелі інструментів кнопки, яким присвоїмо властивість Hint відповідно «Знищити записи, що задовольняють критеріям», «Створити нову таблицю на основі записів, що задовольняють критеріям», «Додати новий запис» і «Ввести запит самому», для яких введемо наступний текст обробки подій OnClick:

Procedure TForm1.ToolButton3Click(Sender: TObject);

// знищення записів

var sqlTable, sqlWhere: String;

begin

if MessageDlg('Ви впевненні що хочете знищити записи,

що задовольняють введеним даним?', mtConfirmation, [mbYes,

mbNo], 0) = mrYes then

begin

DataModule1.Query1.SQL.Clear;

sqlTable:='Delete * ';

sqlWhere:='where ';

sqlTable:=sqlTable + 'from Товар ';

sqlWhere:=sqlWhere+'('+t1+' like '''+'%'+Edit1.Text+''') and

('+t2+' like '''+Edit2.Text+''') and ('+t3+' like '''+Edit3.Text+''') and

('+t4+' like '''+Edit4.Text+''') and (';

case ComboBox1.ItemIndex of

0: sqlWhere:=sqlWhere+t5+' = '+Edit5.Text+');';

1: sqlWhere:=sqlWhere+t5+' > '+Edit5.Text+');';

2: sqlWhere:=sqlWhere+t5+' < '+Edit5.Text+');';

3: sqlWhere:=sqlWhere+t5+' between '+Edit5.Text+' and

'+Edit6.Text+');'; end;

DataModule1.Query1.SQL.Add(sqlTable+sqlWhere);

DataModule1.Query1.ExecSQL;

end;

end;

Procedure TForm1.ToolButton5Click(Sender: TObject);

// додання записів

var sqlInsert: String;

begin

DataModule1.Query1.SQL.Clear;

sqlInsert:='Insert into Товар Values

('''+Edit1.Text+''','''+Edit2.Text+''','''+

Edit3.Text+''','''+Edit5.Text+''','''+Edit4.Text+''');';

DataModule1.Query1.SQL.Add(sqlInsert);

DataModule1.Query1.ExecSQL;

end;

Procedure TForm1.ToolButton4Click(Sender: TObject);

// створення нової таблиці

var TableName,sqlCreate:string;

begin

DataModule1.Query1.SQL.Clear;

TableName:=InputBox('Введіть ім''я нової таблиці','','');

sqlCreate:='Select * into '+TableName+' from Товар where ('+t1+'

like '''+'%'+Edit1.Text+''') and ('+t2+' like '''+Edit2.Text+''') and ('+

t3+' like '''+Edit3.Text+''') and ('+t4+' like '''+Edit4.Text+''') and (';

case ComboBox1.ItemIndex of

0: sqlCreate:=sqlCreate+t5+' = '+Edit5.Text+');';

1: sqlCreate:=sqlCreate+t5+' > '+Edit5.Text+');';

2: sqlCreate:=sqlCreate+t5+' < '+Edit5.Text+');';

3: sqlCreate:=sqlCreate+t5+' between '+Edit5.Text+' and

'+Edit6.Text+');';

end;

DataModule1.Query1.SQL.Add(sqlCreate);

DataModule1.Query1.ExecSQL;

DataModule1.Query1.SQL.Clear;

DataModule1.Query1.SQL.Add('Select * from '+TableName);

DataModule1.Query1.Active:=True;

end;

Procedure TForm1.ToolButton6Click(Sender: TObject);

// самостійне введення запиту

begin

with DataModule1.Query1 do

begin

SQL.Clear;

SQL.Add(InputBox('Введіть запит','',''));

Active:=True;

end;

end;

Н аведемо приклад створення запиту з двох таблиць. Помістимо на GroupBox5 Edit7, ComboBox2 i дві компоненти SpeedButton. Одна з них буде використовувати нашу функцію з dll GetDate. Запит повинен вибирати за введеною датою товари з таблиці «Товар» на основі дати виписки рахунку з таблиці «Рахунок». В ComboBox введемо такі елементи для вибору: Рахунок.[Сума оплати], Товар.[Назва товару], Рахунок.[Дата проплати], які користувач може вибрати для вибору сортування результатів. Введемо наступний текст для обробки події OnClick для SpeedButton3 (вибір дати) і SpeedButton4 (вивід результатів запиту):

Procedure TForm1.SpeedButton3Click(Sender: TObject);

var i:integer;

Choise:string[10];

begin

Choise:=DateToStr(GetDate);

i:=1;

Edit7.Text:=''; Edit8.Text:=''; Edit9.Text:='';

While Choise[i]<>'.' do

begin

Edit7.Text:=Edit7.Text+Choise[i];

inc(i);

end;

inc(i);

While Choise[i]<>'.' do

begin

Edit8.Text:=Edit8.Text+Choise[i];

inc(i);

end;

inc(i);

While i<=Length(Choise) do

begin

Edit9.Text:=Edit9.Text+Choise[i];

inc(i);

end;

end;

Procedure TForm1.SpeedButton4Click(Sender: TObject);

var sqlStr: String;

sDate: string;

begin

if (Edit7.Text='')or(Edit8.Text='')or(Edit9.Text='') then

begin

ShowMessage('Потрібно вибрати дату');

exit;

end;

sDate:=Edit8.Text+'/'+Edit7.Text+'/'+Edit9.Text;

DataModule1.Query1.SQL.Clear;

sqlStr:='Select Товар.[Назва товару],Товар.[Опис

товару],[Партія товару].[Код рахунку],Рахунок.[Дата

проплати],Рахунок.[Дата виписки],Рахунок.[Сума оплати]

from Товар inner join ([Партія товару] inner join '+

'Рахунок on Рахунок.[Код рахунку]=[Партія товару].[Код

рахунку]) on '+'Товар.[Код товару]=[Партія товару].[Код

товару] where Рахунок.[Дата виписки]=#'+sDate+'#';

if ComboBox2.Items[ComboBox2.ItemIndex]<>'' then

sqlStr:=sqlStr+' Order By

+ComboBox2.Items[ComboBox2.ItemIndex];

sqlStr:=sqlStr+';';

DataModule1.Query1.SQL.Add(sqlStr);

DataModule1.Query1.Active:=True;

end;

Текст нашого запиту при введеній даті і сортуванні по назві товару буде мати вигляд:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]