- •Зертханалық жұмыс
- •Зертханалық жұмысты орындаудың тәртібі
- •Мәліметтер қорының құрылуы Мәліметтер қоры құрылуының жоспары
- •4.3. Мқбж құрылуы
- •4.3.1. TDataModule контейнерінің құрылуы
- •4.3.2. Экрандық формалардың құрылуы, олардың мқ – на қатынау жасалуы және мәліметтерді өңдеуді ұйымдастыру (қарапайым нұсқасы)
- •2.1) Экрандық формада кестелер арасында байланысты орнатпай кесте құрамын бейнелеу.
- •2.2) Мқ кестелерінің байланысын ескере отырып, оларды экрандық формаға шығару, яғни олардың арасындағы Master-Detail байланысының орнауы.
- •4.3.3. Мқ бейнелеу үшін, одан әрі күрделі форманың құрылуы.
- •4.3.4. Есептік формаларды құру және олардың мқ қатынау жасалуы.
- •4.3.5. Жүйе жұмысын тексеру және іске қосу
- •5.1. Есептерді құруға арналған компоненттер.
- •5.2. TQuickRep және tqrBand компоненттері көмегімен
- •TqrBand компоненті көмегімен бағандардың тақырыпшаларын көрсету.
- •5.3. Есептегі мәліметтерді топтау әдісі
- •5.4. Сүзбеуді қолданып есептерді құрылымдау
- •Бақылау сұрақтары
5.3. Есептегі мәліметтерді топтау әдісі
Мәліметтерді топтау үшін TQRGroup компоненті қолданылады. Оның Expression қасиеті өрнекті көрсетеді. Топқа өрнектің шартын қанағаттандыратын МЖ-нің жазбалары кіреді. Өрнектің мәнін өзгерткенде топтар өзгереді. Топтың тақырыпшасы ретінде компонентасының ВапdТуре қасиетінде rbColumnHeader мәні қойылған TQRBand қызмет етеді. Топтың подвалы ретінде ВапdТуре қасиетінде rbGroup Footer мәні қойылған TQRBand компонентасы қызмет етеді.
TQRGroup компонентінің FooterBand қасиеті топтың подвалының компонентіне сілтемесі бар.
Мысалы. Ақпарат материалдың атымен топталатын қоймағақа материалдар келуі туралы жаңа есеп құрастырайық. Ол үшін №7 формада есептің мәліметтер тобын анықтайық (ТТаblе компоненті, аты Table1, TablelName қасиетіне - Prihod.DB, Active - True). МЖ-да Material өрісіне ағымды индексті орнатайық (FieldIndexNames немесе IndexName қасиетінде). Есепте орнастырайық:
есептің тақырыпшасы - TQRBand компоненті QRBand1 атымен, ВапаТуре қасиеті = rbTitle;
бағандар тақырыпшасы - TQRBand компоненті QRBand2 атымен, ВапаТуре қасиеті = rbColumnHeader;
TQRGroup компонеттер-тобы QRGroup1 атымен.
Бөлшектік ақпараттың аймағы - TQRBand компоненті QRBand3 атымен, ВапаТуре қасиеті = rbDetail;
Топ подвалы - TQRBand компонент QRBand4 атымен, ВапаТуре қасиеті= rbGroupFooter.
QRGroup1 компонентасына келесіні орналастырайық:
FooterBand қасиетіне QRBand4 мәнін;
Expression қасиетіне Table1.MATERIAL мәнін, ол формула болып табылады және формулалар редакторында жазылады.
Expression қасиеті өрнектің мәнін визуалдамағандықтан, топта TQRExpr (аты QRExpr1) компонентін орналастырамыз және Expression қасиетін Table1.MATERIAL мәні анықталғандай етіп қоямыз (40-сурет).
40-сурет – Формулаланың құрылуы
QRBand4 топтар подвалының компонентасында Kolvo өрісінде қосындыны (келіп түскен нақты материалдың жалпы санын) есептейміз. Ол үшін топтар подвалында TQRExpr (аты QRExpr2) компонентасын орналастырамыз және оның Expression қасиетін SUM(Table1.KOLVO) формуласын құрайтындай етіп қоямыз.
Бөліктенген ақпараттар тобында мәліметтер тобының N_Prih, Material, DataPrih и Kolvo өрістерімен байланыстырылған (DataSet және DataField қасиеттері) TQRDBText компонентасын орнастырамыз.
41-суретте көрсетілгендей есеп берудің басқа аймағын статикалық мәтінмен толтырамыз.
41-сурет – Есептің тауар бойынша топтау макет
42-суретте алдын ала қарап шығу режиміндегі есептің бейнесі көрсетілген.
42-сурет – Алдын-ала қарау терезесінде есепті тауар бойынша топтау
Алдын-ала қарау терезесін ашу үшін №4 формасындағы "Топ" батырмасын басу керек. №4 формаға TButton батырмасын қосайық. Оның OnClick оқиғаларды өңдеуді анықтайық:
Form7. QuickRep1.Preview;
42-суретте топтардың бірінің подвалы көрсетілген- ондағы материалдың келуінің соммалық түрі шығарылады.
5.4. Сүзбеуді қолданып есептерді құрылымдау
Filtered қасиетіне True мәнін қоямыз, OnFilterRecord оқиғасының өңдеушісінде шарттары жазылған фильтрацияны орындаймыз. Мысалы, егер МЖ-да фильтр орналастырылса:
begin
Accept := DataSet['KOLVO'] >= 500;
End;
онда Table1Filtered қасиетінде False мәнін қойғанда фильтрацияны орындайды; мәліметтер тобының нәтижесінде тек қана 'KOLVO' өрісіндегі 500 және одан да көп мәндері бар жазбалар көрсетіледі.
Filtered қасиетінің мәнін False мәніне орнатқан кезде, сүзбеу тоқтатылады, оның шарттары OnFilterRecord оқиғасында көрсетілген.
Қосымшаны тестілеу және жөндеу.
Тестілеуден кейін Ввод/Название материала меню пункті жұмыс істемейтінін байқадық. Жаңа материалдарды және оның мінездемесін қосу үшін форма құрайық. Осы формаға TDBGrid компонентасын орналастырайық, DataSource қасиетіне DataSource1 мәнін қоямыз. TButton компонентін орналастырамыз, бұл компонентке CancelBtn (Name қасиеті) атын берейік, батырманың тақырыпшасын "Закрыть" атына (Caption қасиеті) өзгертейік. Батырманы Кодпен байланыстырайық. OnClick бұл оқиғаларды өңдеу процедураларын құру үшін "Закрыть" батырмасына тышқанмен екі рет басу керек. Кодтар редакторінде келесі кодты жазамыз:
Сlose;
Form1.Visible := True;
№ 1 формаға ауысайық және Ввод/Название материала менюінің пункті үшін № 8 форманы шақыратын кодты жазайық:
Form1.Visible := False;
Form8.Visible := True;
Осымен қосымшаның дайындалуы аяқталды деп есептейміз.
Жөндеу №1.
Есеп берутің жаңа формасын құрайық (№9 форма). Формаға TQuickRep (аты QuickRep1) компонентасын орналастырайық, бірақ оған қатынау Query1 арқылы жүзеге асырылсын. Ол үшін DataSet қасиетін DataModule5.Query1 мәнін қоямыз. 43-суретте көрсетілгендей басқа компоненттерді қосайық және есеп беру аймағын статикалық мәтінмен толтырайық.
43-сурет – Есеп берудің нәтижелік макеті
Есептің аяғында барлық әкелінген материалдардың нәтижелік сомасын сөз түрінде қосамыз. Ол үшін QRBand4 аты бар TQRBand компонентін қосамыз, ВапdТуре қасиеті = rbSummary.
QRBand4-ке TQRLabel (аты QRLabel7) компонентін орналастырамыз.
Unit4-ке көшіп және "Итог" батырмасының OnClick оқиға өңдеуіне мына кодты қосамыз:
procedure TForm4.Button5Click(Sender: TObject);
var ss: String;
begin
Str(TempTotal,ss);
Form9.QRLabel7.Caption := SumNumToFull(TempTotal);
Form9.QuickRep1.Preview;
end;
Unit5-те TempTotal айнымалысын анықтаймыз және қоймаға әкелінген TempTotal материалдардың нәтижелік сомасын есептейін кодын қосамыз:
var
DataModule5: TDataModule5;
TempTotal: Integer;
implementation
Объектілер инспекторінде AfterOpen қасиетін тышқанмен 2 рет шертіп, Unit5 ашамыз және келесі кодты қосамыз:
procedure TDataModule5.Query1AfterOpen(DataSet: TDataSet);
begin
Query1.First;
TempTotal := 0; { use temp for efficiency }
while not Query1.EOF do
begin
TempTotal := TempTotal + Query1Stoim.Value;
Query1.Next;
end;
SumNumToFull(TempTotal);
end;
Проектке Writesum.pas жазбасына Project|Add to Project менюін қолданып сандарды ауыстру модулін қосайық.
П2. Writesum.pas модулінің листингі
Unit Writesum;
interface
uses SysUtils;
{ Санмен жазылған сомманы жазбаша жазу функциясы: мысалы, 23.12 -> жиырма үш теңге 12 тиын. 999999999 тенге 99 тиын дейінгі мәндерді аударады. Number параметрінде дұрыс әлде бұрыс мән екенін функция байқамайды. (яғни жүздіктерге дейінгі дәлдікпен дөңгелектелген оң сан) – бұл жөндеуді функцияны шақырғанға дейін жүргізу керек.}
function SumNumToFull(Number:real):string;
implementation
function SumNumToFull(Number:real):string;
var
PartNum, TruncNum, NumTMP, D: integer;
NumStr : string;
i, R : byte;
Flag11 : boolean;
Begin
D:=1000000;
R:=4;
TruncNum:=Trunc(Number); // теңгені белгілейміз
if TruncNum<>0
then
repeat
PartNum:=TruncNum div D;
Dec(R);
D:=D div 1000;
Until PartNum<>0
else
R:=0;
// теңге аударымы
FOR i:=R DOWNTO 1 DO
BEGIN
Flag11:=False;
NumTMP:=PartNum div 100; {сандардың жүздік белгілеуі}
Case NumTMP of
1: NumStr:=NumStr+'СТО ';
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 100) div 10; {ондық сандарды белгілеу }
Case NumTMP of
1: begin
NumTMP:=PartNum mod 100;
case NumTMP of
10: NumStr:=NumStr+'ДЕСЯТЬ ';
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; //---SumNumToFull
end.
QRBand4 өрісіне TQRLabel (аты QRLabel8) компонентасын қосайық, Caption қасиетіне "Итого:" деп өзгертеміз. Тағы да TQRExpr (аты QRExpr1) компонентін қосайық және ол SUM(Table1.Stoim) формуласы болуы керек оның Expression қасиетінің мәнін анықтаймыз 44-суретте алдын-ала қарау терезесінде есебінің нәтижесі көрсетілген.
44-сурет – Тауардың нәтижелік мәндерінің есеп беруі
№2 жөндетуі
Есепті дайындау үшін, Excel-дің көптеген мүмкіндіктері (графикалық бейнелеулер және т.с.с.) бар.
Сонымен қатар, бизнес-үрдіске Excel ортасында жасау ыңғайлы болып келеді. Сондықтан, осы ресурсты қолдану үшін, OLE процедурасы көмегімен мәліметтерді Excel-ге жіберу керек.
