Delphi - Vevők adatainak karbantartása

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

forráskód letöltése

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 vevők táblájának kezelésével. Így képesek leszünk új vevő 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.

Az alkalmazásunk nyitó web oldalán bejelentkezés után már megjelenik a tools.dat tartalma. Ezt most kiegészítjük két további linkkel, melyek segítségével felvehetünk új vevőt, vagy listázhatjuk a meglévőket.
<a href="/scripts/NetInvoice.exe?uid=<#uid>&command=5">Új vevő</a><br>
<a href="/scripts/NetInvoice.exe?uid=<#uid>&command=6">Vevők listája</a><br>
Új vevő felvételének szándékát a command paraméter 5-ös értéke jelöli.
procedure TWebModule1.Command;
begin
  case FCommand of
…
    5: begin//Új vevo
      PageProducer1.HTMLFile:=TEMPLATEPATH+'customernew.dat';
      Response.Content:=PageProducer1.Content;
    end;
...
Ekkor betöltjük a customernew.dat tartalmát. Ebben egy Html Form-ot helyezünk el, melyben a felhasználó megadhatja az új vevő 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=7>
…

Ha tehát a command paraméter értéke 7, akkor egy új rekordba tárolnunk kell a megadott vevő adatait. Ehhez készítünk egy ProcessNewCustomer nevű függvényt, mely elvégzi a megadott adatok helyességé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
…
    7: begin//uj vevo proc
      if ProcessNewCustomer then begin
Ha az adat tárolás sikeres, akkor a customerlist.dat állományt adjuk vissza eredményül a felhasználónak, mely nem más, mint a már meglévő vevők listája, így látható lesz az újonnan felvett tétel is.
        PageProducer1.HTMLFile:=TEMPLATEPATH+'customerlist.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 ProcessNewCustomer eljárásban.
function TWebModule1.ProcessNewCustomer: 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['CustomerName']='' then begin
Ha van olyan, mely nem kapott értéket, akkor elhelyezzük a hibaüzenetünket és ezzel a ProcessNewCustomer be is fejezte működését adattárolás nélkül.
      FMessage.Add('Nem adta meg az összes kötelezoen kitöltendo mezot!');
    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:=tSQLCustomers;
{$else}
      ds:=tDbaseCustomers;
{$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ő CustomerID 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('customer');
{$endif}
Ezt követően tároljuk az összes többi megadott adatot a megfelelő mezőbe.
      ds.Fields[1].AsString:=Values['CustomerName'];
      ds.Fields[2].AsString:=Values['ContactName'];
      ds.Fields[3].AsString:=Values['IRSZ'];
      ds.Fields[4].AsString:=Values['City'];
      ds.Fields[5].AsString:=Values['Address'];
      ds.Fields[6].AsString:=Values['Phone'];
      ds.Post;
MS SQL esetén zárjuk a tranzakciót.
{$ifdef MSSQLVERSION}
      ADOConnection1.CommitTrans;
{$endif}

      ds.Close;
      result:=true;
    end;
  end;
end;
A GetNextID ugyanúgy működik, mint ahogy azt előző cikkünkben ismertettük, csak most paraméterként a customer szót adjuk meg, így az ehhez tartozó azonosítót szolgáltatja.

Hátra van még a customerlist.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 "Vevők listája" linket választja.
procedure TWebModule1.Command;
begin
  case FCommand of
…
    6: begin//vevo lista
      PageProducer1.HTMLFile:=TEMPLATEPATH+'customerlist.dat';
      Response.Content:=PageProducer1.Content;
    end;
…
A customerlist.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 customers táblában. Elhelyezünk tehát egy customerlistitems címkét a customerlist.dat-ba, arra a helyre, ahová be kell szúrnunk az adatokat. Ezt a műveletet pedig rábízzuk a GetCustomerListItems nevű függvényünkre.
procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String;
    TagParams: TStrings; var ReplaceText: String);
begin
…
            if TagString='customerlistitems' then begin
              ReplaceText:=GetCustomerListItems;
            end;
…
A GetCustomerListItems függvényben megnyitjuk a szükséges adatbázis Customers 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. GetCustomerListItems: 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 meg is valósítottuk a vevők felvételi és listázási lehetőségét.




Internetes számlázó cikksorozat