Delphi 2.0

7. óra

Adatbáziskezelés IV.

Feladat:

1. Az adott vevo rendelései legyenek láthatók egy gridben, mely tartalma frissítodjön a vevok táblában való lépegetés alkalmával.

2. Egy rendelés Gridben legyen látható az áru, vevo neve mellett az érték is ,ami a darab*egységár képlet alapján számítható ki (Kikeresett és számított mezok használata)

3. Egy adott dátumra vonatkozó rendeléseket kell egy grid-ben megjelenítenünk. A dátumot kérjük be, és ellenorizzük le, hogy jó formátumban gépelték-e be.

Készítsük el a menübol hívható formokat.

Megoldás: A táblák már létre vannak hozva. Ha hiányzik valamelyik, akkor hozzuk létre. Típus:dBASE IV. A rendelés táblát bovítsük ki egy DATUM dátum típusú mezovel (Database Desktop-ban a Table/Restructure menüponttal lehetséges) és töltsük is ki (Table/Edit Table).

Áruk tábla szerkezete:

Field Name Type Size Dec
ARUKOD N 4  
ARUNEV C 20  
EGYSEGAR N 6 2
AFAKOD N 2  

Index:Arukod

 

Vevok tábla szerkezete:

Field Name Type Size Dec
VEVOKOD N 4  

VEVONEV

C 25  
IRSZAM N 4  
VAROS C 20  
UTCA C 35  

Index: Vevokod, Vevonev szerint.

 

Rendelés tábla szerkezete:

Field Name Type Size Dec
RENDKOD N 6  
VEVOKOD N 4  
ARUKOD N 4  
DARAB N 4  

Index: Rendkod szerint.

Hozzunk létre egy adatmodult (File/New Data Module). A Name tulajdonságához írjunk be egy nevet (adatmodul), majd mentsük el abba a könyvtárba, ahova a táblát is mentettük adatok néven. Helyezzünk el rajta a Data Access palettáról 3 Table, 4 Data Source és 1 Query komponenst, majd a jellemzoket az alábbiak szerint állítsuk be:

Komponens Jellemz Érték
Table1 Name tblaruk
  DatabaseName ora5  (vagy annak az alias-nak a neve, amibe létre lett hozva)
  TableName aruk
  Active True (ilyenkor tervezés közben is látszanak az adatok)
  IndexName arukod
DataSource1 Name dsraruk
  DataSet tblaruk
Table2 Name tblvevok
  DatabaseName ora5
  TableName vevok
  Active True
  IndexName vevokod
DataSource2 Name dsrvwvok
  DataSet tblvevok
Table3 Name tblrendeles
  DatabaseName ora5
  TableName rendeles
  Active True
  IndexName rendkod
DataSource3 Name dsrrendeles
  DataSet tblrendeles
Query1 Name vevorend
  DatabaseName ora5
  SQL select * from rendeles where vevokod=:vkod

(azokat vegye ki, ahol a rendelésbeli vevokód megegyezik
a vevok táblában éppen aktuális rekord vevokódjával)

DataSource4 Name dsrvevorend
  DataSet vevorend (query neve, ebbol kapja majd az adatokat)

1. feladat megoldása:

A képernyon lévo form unit-jában (unit1) biztosítsuk az utat az adatmodul felé:

unit unit1;

...

implementation

{$R *.DFM}

uses adatok;

...

end.

A Data Controls palettáról helyezzünk el 5 db DbEdit-et a vevok adatainak, 1 db DbGrid-et az rendelés adatainak megjelenítésére, a Standard palettáról 3 db Button-t a a lépégetéshez a vevok táblában és a kilépéshez.

Komponens Jellemzo Érték
DBEdit1 DataSource adatmodul.dsrvevok
  DataField Vevokod

OnChange eseménye:

procedure Tfrmvevorend.DBEdit1Change(Sender: TObject);

begin

adatmodul. vevorend.close;

adatmodul. vevorend.parambyname('vkod').asInteger:=StrtoInt(dbedit1.text);

adatmodul. vevorend.prepare;

adatmodul. vevorend.open;

end;

Komponens Jellemzo Érték
DBEdit2 DataSource adatmodul.dsrvevok
  DataField Vevonev
DBEdit3 DataSource adatmodul.dsrvevok
  DataField Irszam
DBEdit4 DataSource adatmodul.dsrvevok
  DataField Varos
DBEdit5 DataSource adatmodul.dsrvevok
  DataField Utca
DBGrid1 Name DbgRendeles
  DataSource adatmodul.dsrvevorend
  Enabled True
Button1 Name BtnKilepes
  Caption ‘Kilépés’
  OnClick eseménye: Close;
Button2 Name BtnElozo
  Caption ‘Elozo'
     

Button2 OnClick eseménye:

procedure TForm1.BtnelozoClick(Sender: TObject);

begin

with adatmodul.tblvevok do

Begin

prior;

if bof then

Begin

BtnElozo.enabled:=false;

end;

end;

If BtnKovetkezo.Enabled=false then

begin

BtnKovetkezo.Enabled:=true;

end;

end;

 

Komponens Jellemzo Érték
Button3 Name BtnKovetkezo
  Caption ‘Következo’

OnClick eseménye:

procedure TForm1.BtnkovetkezoClick(Sender: TObject);

begin

with adatmodul.tblvevok do

Begin

next;

If Eof then

Begin

BtnKovetkezo.Enabled:=false;

End;

end;

if BtnElozo.enabled=false then

begin

BtnElozo.enabled:=true;

end;

end;

 

Komponens Jellemzo Érték
Form1 Name frmvevorend
  Caption ‘Vevo rendelései’

 

2. feladat megoldása:

Kérjünk egy új form-ot (File/New Form) és biztosítsuk az utat az adatmodul felé:

unit unit3;

...

implementation

{$R *.DFM}

uses adatok;

...

end.

Tegyünk ki rá egy Grid-et a Data Controls palettáról és egy gombot a Standard palettáról a kilépésnek.

Komponens Jellemzo Érték
DBGrid1 Name Dbgrendel
  DataSource adatmodul.dsrrendeles
  Enabled True

Ahhoz, hogy mi határozzuk meg, hogy mely mezok jelenjenek meg, be kell hívnunk a mezoszerkesztot. Kattintsunk 2x az adatmodul ablak tblrendeles ikonján. A mezoszerkeszto ablak most még üres. A jobb gombra megjeleno gyorsmenübol válasszuk ki az Add fields... -t. Ezzel a paranccsal a táblában létezo mezoket olvashatjuk be. Jelöljük ki az összes mezot és OK. Szeretnénk, ha az árukódja mellett látható lenne az áruk táblában lévo, hozzá tartozó árunév, és a vevokód mellett a vevo neve. Ehhez az egér jobb gombjának lenyomása után válasszuk a New field... parancsot. A megjeleno ablakban a Name: ARUNEV (a származtatott mezo nev), Type: string, Size: 20, Field type: Lookup (másik táblából származtattuk), Key Fields: ARUKOD (kapcsolómezo az alaptáblából (rendelés)), DATASET: ARUK (a kereso tábla, amibol szeretnénk az adatokat kapni), Loopup Keys: ARUKOD (a kapcsolómezo a keresotáblából), Result Field: ARUNEV (melyik mezo értékét veszi át).

Ahhoz, hogy a vevonév mezo is látható legyen, ugyanezt végig kell csinálnunk a megfelelo mezokkel. Ehhez az egér jobb gombjával kell kattintanunk a mezoszerkeszto ablakán. Megint New field... parancs. A megjeleno ablakban a Name: VEVONEV, Type: string, Size: 25, Field type: Lookup, Key Fields: VEVOKOD, DATASET: VEVOK, Loopup Keys: VEVOKOD, Result Field: VEVONEV.

Most már csak a számított mezo van hátra, ami a darab és az egységár szorzatát adja. Ehhez az egér jobb gombjával kell kattintanunk a mezoszerkeszto ablakán. Megint New field... parancs. A megjeleno ablakban a Name: AR, Type: Currency, Size: Nincs kitöltve, Field type: Calculated,

Az ar számított mezo értékét a rendelés tábla OnCalcFields metódusában kell kiszámolni a következoképpen:

procedure Tadatmodul.tblrendelesCalcFields(DataSet: TDataSet);

var egysar:variant;

begin

with dataset do

begin

egysar:=adatmodul.tblaruk.lookup('arukod', fieldbyname('arukod').value, 'egysegar');

if not VarIsNull(egysar) then

fieldbyname('ar').value:=fieldbyname('darab').value*egysar;

end;

end;

Az OnCalcFields metódus minden egyes megjelenítendo rekord esetén meghívódik.

 

A lookup metódus megkeresi az elso feltételnek megfelelo rekordot és annak megadott mezojének értékével tér vissza. Lookup(‘az a mezo amiben keresünk’, ‘az érték, amit keresünk’, ‘a mezo, melynek értéke érdekel abból a rekordból’). Az eredmény variant típusú.

A Grid-re 2x klikkelve az oszlopszerkeszto töltodik be, ahol kiválaszthatjuk a megjelenítendo oszlopokat és beállíthatjuk azok tulajdonságait.

Az Add All Fields gombra kattintva az összes mezo megjelenik a felette levo ablakban, melybol rendre a Delete gomb segítségével törölhetjük azokat, melyekre nincs szükségünk a rácsban. (pl. arukod, vevokod, stb.) A sorrendjük itt módosítható, ha az új helyére húzzuk a kívánt mezo nevét.

A form kilépés gombjának elkészítésérol se feledkezzetek meg!!!

Komponens Jellemzo Érték
Form2 Name frmrendeles
  Caption ‘Rendelések listája’

 

3. feladat megoldása:

Az adatmodulra tegyünk ki egy Query-t és egy Datasource-t.

Komponens Jellemzo Érték
Query1 Name renddatum
  DatabaseName ora5
  SQL select * from rendeles where datum=:renddat
DataSource1 Name dsrrenddatum
  DataSet renddatum (query neve, ebbol kapja majd az adatokat)

 

Kérjünk egy új form-ot (File/New Form) és biztosítsuk az utat az adatmodul felé:

unit unit4;

...

implementation

{$R *.DFM}

uses adatok;

...

end.

Tegyünk ki rá egy Grid-et a Data Controls palettáról, 1 EditBox-ot a dátumnak, 2 gombot a kigyujtésnek és a kilépésnek a Standard palettáról.

 

Komponens Jellemzo Érték
DBGrid1 Name Dbgrenddatum
  DataSource adatmodul.dsrrenddatum
  Enabled True

A Grid-en 2x kattintva beállíthajuk, hogy mely oszlopokat kívánjuk megjeleníteni. (Ezt Kedves Hallgatóimra bízom).

 

Komponens Jellemzo Érték
Edit1 Name Edatum
  Text üres
Button1 Name BtnKigyujt
Caption Kigyujt

OnClick eseménye:

procedure TFrmrenddatum.btnkigyujtClick(Sender: TObject);

begin

with adatmodul.renddatum do

begin

Try

close;

parambyname('renddat').AsDate:=StrToDate(EDatum.text);

prepare;

open;

Except

on EConvertError do

begin

ShowMessage('A dátum formátuma nem megfelelo!'+#13#10+

'Például: '+DateToStr(Date));

end;

End;

end;

end;

A Try után beírt utasításokat hajtja végre. Ha valami miatt nem sikerül, akkor az Except részben megnézi a Dephi, hogy az a jellegu hiba le van-e kezelve (pl. EConvertError konverziós hiba). Ha igen, akkor végrehajtódnak az ott megadott utasítások, ha nem, akkor a saját kivételkezeloje fut le a Deplhi-nek.

Ahhoz, hogy a kivételkezelo lefusson, és a program ne álljon le, a Tools/Options/Preferences ablakban a Break on exception-nak nem szabad kijelölve lennie.

kilépés gomb...

 

Komponens Jellemzo Érték
Form3 Name frmrenddatum
  Caption ‘Adott dátumú megrendelések’

 

Kérjünk egy új form-ot (File/New Form) és hozzuk létre rajta az elozo ablakokat hívó és az alkalmazást befejezo menüpontokat:

 

Vevo rendelései Rendelések listája                                   Kilépés

Adott dátumú megrendelések

Rendelések számított mezovel

 

Állítsuk be az OnClick eseményeket.

frmrendeles.Showmodal;

frmvevorend.Showmodal;

frmrenddatum.Showmodal;

Close;

 

Adjuk nevet neki a Name tulajdonságának kitöltésével és a címsorába írjunk a Caption használatával.

A Project/Options menüpontban Main form-nak állítsuk be a menüs ablakot és az auto-create forms résznél pedig a legelso helyre húzzuk az adatmodult. (különben nem látja a megjeleníto ablak az adatokat)