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 |
|
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)