HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Termékek adatainak karbantartása


Internetes számlázó 4. rész

Példaprogram letöltése

40515 bájt


Következő lépésként továbbfejlesztjük az internetes számlázó rendszerünket, kiegészítve azt a számla készítéshez szükséges termékek táblájának felhasználásával. Így képesek leszünk új termékek felvételére a weboldalon keresztül, illetve a már meglévők listázására.

A mellékelt példa fordítása előtt szokás szerint ellenőrizze és szükség esetén javítsa a Constant.pas-ban lévő konstansok értékeit (TEMPLATEPATH, CONNECTIONSTRING, stb.).
Az előző cikkekben már létrehozott NetInvoice virtuális web könyvtár elérési útvonalát módosítsa úgy, hogy az a most mellékelt NetInvoice könyvtárra mutasson.

Elindítva alkalmazásunkat a megjelenő nyitó lapon kellene elhelyeznünk azokat a funkciókat, melyekkel elvégezhető a számla készítés és a hozzákapcsolódó minden egyéb tevékenység. Ezeket a funkciókat viszont csak akkor szabad megjeleníteni, ha a felhasználó már bejelentkezett. Ennek megoldására a home.dat állományba elhelyezünk egy <#tools> címkét. Ide szúrjuk be a tools.dat újonnan létrehozandó html rész állományunkat, mely tartalmazni fogja a szükséges funkciókat. Ezt a beszúrást csak akkor végezzük el, ha a felhasználó bejelentkezett, különben a címke helyére nem teszünk semmit.
procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String;
    TagParams: TStrings; var ReplaceText: String);
begin
…
      if (TagString='tools') and not FAnonymous then begin
        PageProducer2.HTMLFile:=TEMPLATEPATH+'tools.dat';
        ReplaceText:=PageProducer2.Content;
      end else begin
…
A tools.dat jelenleg két linket tartalmaz:
<a href="/scripts/NetInvoice.exe?uid=<#uid>&command=2">Új termék</a><br>
<a href="/scripts/NetInvoice.exe?uid=<#uid>&command=3">Termékek listája</a>
Ezek segítségével tudjuk az új termékeket felvenni, illetve a meglévőket listázni. Új felvételhez a command paraméter értékét kettőre, míg a listázásnál hármasra választottuk.
procedure TWebModule1.Command;
begin
  case FCommand of
…
    2: begin//Új termék
      PageProducer1.HTMLFile:=TEMPLATEPATH+'productnew.dat';
      Response.Content:=PageProducer1.Content;
    end;
...
Az "Új termék" linkre történő kattintáskor betöltjük a productnew.dat tartalmát. Ebben egy Html Form-ot helyezünk el, melyben a felhasználó megadhatja az új termék minden jellemző adatát.
A Form-ban elhelyezünk egy rejtett paramétert command névvel, mely alapján majd értelmezni tudja alkalmazásunk a végrehajtandó funkciót, mely nyilván a megadott adatok tárolása lesz.
…
<form method=get action="/scripts/NetInvoice.exe">
<input type=hidden name=command value=4>
…

Ha tehát a command paraméter értéke 4, akkor egy új rekordba tárolnunk kell a megadott termék adatait. Ehhez készítünk egy ProcessNewProduct nevű függvényt, mely elvégzi a megadott adatok helyességének ellenőrzését és tárolását. Visszatérési értékként igazat ad, ha az adatok tárolása sikeresen megtörtént, illetve hamisat, ha valamely adat nem lett megadva, vagy hibás. E logikai értéket felhasználva elágaztatjuk a programunk további futását.
procedure TWebModule1.Command;
begin
  case FCommand of
…
    4: begin//uj termek
      if ProcessNewProduct then begin
Ha az adat tárolás sikeres, akkor a productlist.dat állományt adjuk vissza eredményül a felhasználónak, mely nem más, mint a már meglévő termékek listája, így látható lesz az újonnan felvett tétel is.
        PageProducer1.HTMLFile:=TEMPLATEPATH+'productlist.dat';
        Response.Content:=PageProducer1.Content;
      end else begin
Amennyiben a feldolgozás közben hiba történt, akkor az error.dat kerül visszaadásra, melyben megjeleníthetjük a felhasználó számára a hibaüzenetet, melyet a szokásos módon az FMessage globális változóba tárolunk és onnan helyezzük át a generálandó web oldalra.
        PageProducer1.HTMLFile:=TEMPLATEPATH+'error.dat';
        Response.Content:=PageProducer1.Content;
      end;
    end;
…

Nézzük mi történik a ProcessNewProduct eljárásban.
function TWebModule1.ProcessNewProduct: boolean;
var
  ds: TDataSet;
begin
  result:=false;
  with Request.QueryFields do begin
Első lépés annak ellenőrzése, hogy a Html Form-on megadott adatok közül az összes olyan kapott-e értéket, melyet kötelező kitölteni.
    if (Values['ProductName']='') or (Values['Unit']='') or (Values['UnitPrice']='') or 
       (Values['VAT']='') then begin
Ha van olyan, mely nem kapott értéket, akkor elhelyezzük a hibaüzenetünket és ezzel a ProcessNewProduct be is fejezte működését adattárolás nélkül.
      FMessage.Add('Nem adta meg az összes kötelezően kitöltendő mezőt!');
    end else begin
Ha a megadott adatok helyesek, akkor nekiláthatunk azok tárolásának. Első lépésként a felhasználandó adatbázis típusától függően adunk értéket a ds változónak.
{$ifdef MSSQLVERSION}
      ds:=tSQLProducts;
{$else}
      ds:=tDbaseProducts;
{$endif}
      ds.Open;
MS SQL adatbázis esetén egy új tranzakciót kezdeményezünk.
{$ifdef MSSQLVERSION}
      ADOConnection1.BeginTrans;
{$endif}
      ds.Append;
Dbase adatbázis esetén nekünk kell gondoskodnunk arról, hogy a termékek táblájában lévő ProductID mező értéket kapjon. MS SQL esetén erre nincs gondunk, hiszen beállítottuk az Indentity tulajdonságot. Ha tehát Dbase-t használunk, akkor a soron következő azonosítót a GetNextID belső függvényünk fogja szolgáltatni.
{$ifndef MSSQLVERSION}
      ds.Fields[0].Value:=GetNextID('product');
{$endif}
Ezt követően tároljuk az összes többi megadott adatot a megfelelő mezőbe.
      ds.Fields[1].AsString:=Values['ProductName'];
      ds.Fields[2].AsString:=Values['KSH'];
      ds.Fields[3].AsString:=Values['Unit'];
      ds.Fields[4].AsString:=Values['UnitPrice'];
      ds.Fields[5].AsString:=Values['VAT'];
      ds.Post;
MS SQL esetén zárjuk a tranzakciót.
{$ifdef MSSQLVERSION}
      ADOConnection1.CommitTrans;
{$endif}
      ds.Close;
      result:=true;
    end;
  end;
end;
Dbase esetén a GetNextID függvény úgy képes mindig egy soron következő sorszám visszaadására, hogy egy INI állományban tárolja az aktuálisat. Paraméterként annak a táblának a nevét kell megadni, amelyhez tartozó sorszámot szeretnénk visszakapni. Bár most még csak a Products tábla esetén van erre szükségünk, de a későbbiek folyamán már több táblát is használunk.
Létrehozunk tehát egy config.ini állományt, melyet szintén a TEMPLATEPATH konstans által meghatározott könyvtárba helyezünk.
Ennek tartalma az alábbi:
[ID]
product=0
user=0
costumer=0
invoice=0
A GetNextID mindig kiolvassa a szükséges számot, növeli eggyel és vissza is írja az új értéket, ami egyben a függvény visszatérési értéke is lesz.
function TWebModule1.GetNextID(name: string): integer;
var
  ini: TIniFile;
begin
  ini:=TIniFile.Create(TEMPLATEPATH+'config.ini');
  result:=ini.ReadInteger('ID', name, 0);
  inc(result);
  ini.WriteInteger('ID', name, result);
  ini.Free;
end;

Hátra van még a productlist.dat elkészítése, melyre akkor irányítjuk a felhasználót, amikor felvett egy új terméket sikeresen, illetve amikor a nyitólapon a "Termékek listája" linket választja.
procedure TWebModule1.Command;
begin
  case FCommand of
…
    3: begin//termék lista
      PageProducer1.HTMLFile:=TEMPLATEPATH+'productlist.dat';
      Response.Content:=PageProducer1.Content;
    end;
…
A productlist.dat-ban egy Html táblázat kap helyet, melyben megtalálható a termékek táblájának fejléce, így programból nekünk csak a sorokat kell generálnunk attól függően, hogy rekord is található-e a products táblában. Elhelyezünk tehát egy productlistitems címkét a productlist.dat-ba, arra a helyre, ahová be kell szúrnunk az adatokat. Ezt a műveletet pedig rábízzuk a GetProductListItems nevű függvényünkre.
procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String;
    TagParams: TStrings; var ReplaceText: String);
begin
…
        if TagString='productlistitems' then begin
          ReplaceText:=GetProductListItems;
        end else begin
…
A GetProductListItems függvényben megnyitjuk a szükséges adatbázis Products tábláját, majd egy while ciklussal végigmegyünk az összes rekordon és annak összes mezőjét kilistázzuk. E művelet közben a megfelelő Html kódokat is elhelyezzük a sztringben, mely a függvény visszatérési értéke lesz.
function TWebModule1.GetProductListItems: string;
…
  while not ds.Eof do begin
    result:=result+'<tr>';
    for i:=0 to ds.FieldCount-1 do begin
      result:=result+'<td>'+ds.Fields[i].AsString+'</td>';
    end;
    result:=result+'</tr>';
    ds.Next;
  end;
…

Ezzel megvalósítottuk a termékek felvételi és listázási lehetőségét.


Cikksorozat

#IDKategóriaCikk címeSorozat
3916WindowsA javascript nyelv bemutatása1. rész
3946WindowsJavascript változók és operátorok2. rész
3975WindowsKódvezérlés JScript-ben3. rész
4004WindowsFüggvények és objektumok4. rész
4036WindowsFejlett funkciók a JavaScript nyelvben5. rész
4066WindowsFejlett funkciók a JavaScript nyelvben - folytatás6. rész
4116WindowsReguláris kifejezések7. rész
4145WindowsReguláris kifejezések - folytatás8. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2001 évkönyv 625. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |