Första databastillämpningen Databasen vi ska använda En textfil innehåller följande data om 200 personer. Fält Typ Exempel Förnamn sträng [20] BENGT Efternamn sträng [20] KVIST Födelsedatum sträng [6] 310713 Vikt heltal 80 Längd heltal 190 Med hjälp av ett engångsprogram, har vi läst in textfilen och konverterat innehållet till filen FOLKDATA.DBF. Filtillägget DBF skvallrar om att det handlar om DBase. Filen kan öppnas med Database Desktop, som vi hittar under Tools i C++ Builder. Varje rad i filen motsvarar en person och varje kolumn avhandlar ett fält. Så här ser början av filen ut: FNAMN ENAMN FDATUM VIKT LANGD FET 1 BENGT KVIST 310713 80 190 False 2 ÖSTEN JOHANSSON 550716 60 181 False 3 BERTIL KARLSSON 201001 63 181 False 4 MONIKA BROSTRÖM 190805 85 165 True 5 GUSTAV ANDERSSON 291101 76 161 True 6 ADAM LINDKVIST 431124 78 208 False 7 JOHAN EK 560110 64 177 False Översta raden i tabellen ger oss de 6 fältens namn, som överensstämmer med den inledande tabellen, så när som på fältet FET, av typen boolsk, som är sann om personen är överviktig. Innan konverteringen gjordes skapades en tom databas med hjälp av Database Desktop. Efteratt New Table valts får man chansen att välja databasmotor och där valde vi Dbas for windows. Direkt efter detta val skriver vi nu in postens fält genom namn,typ,storlek och antalet decimaler. De vanligaste typerna är: Kod Storlek Typ C 1-254 Tecken N 1-20 Tal D Date L Logiskt Dessutom har vi här angivit i vilka olika ordningar, vi vill ha personerna sorterade i databasen. Vi har valt tre, förnamn, efternamn, ochfödelsedatum. Dessa val leder till att filen FOLKDATA.MDX skapas. I denna indexfil finns uppgifter om, på vilken plats en post befinner sig de olika ordningarna. Så här kommer postbeskrivningen att se ut: Håkan Strömberg 1 KTH Syd
Field Name Type Size Dec FNAMN C 20 ENAMN C 20 FDATUM C 6 VIKT N 3 0 LANGD N 3 0 FET L med index: FNAMN, ENAMN och FDATUM. För denna databas vill vi nu skapa en applikation, som klarar av följande: Visa hela databasen i ordning efter födelsedatum Visa hela databasen i bokstavsordning efter efternamn Visa hela databasen i bokstavsordning efter förnamn Söker efter person med givet födelsedatum Ta bort all personer med förnamnet Håkan Beräkna medelvikten Tilldela fältet FET värdet true om personen i fråga är överviktig och sedan filtrera bort alla smala. Återställa filtret så att alla poster visas igen Byta ut alla KARL mot KALLE 1 #include <vcl.h> 2 #pragma hdrstop 3 #include "PersonProg.h" 4 #pragma package(smart init) 5 #pragma resource "*.dfm" 6 #include <stdlib.h> 7 TFormular Formular; 8 fastcall TFormular::TFormular(TComponent Owner): TForm(Owner){ 9 } 1-9 Dessa rader är automatgenererade. 1 void fastcall TFormular::SortFodelseDatumClick(TObject Sender){ 2 Tabell >IndexName="FDATUM"; 3 Tabell >First(); 5 void fastcall TFormular::SortEfterNamnClick(TObject Sender){ 6 Tabell >IndexName="ENAMN"; 7 Tabell >First(); 8 } 9 void fastcall TFormular::SortForNamnClick(TObject Sender){ 10 Tabell >IndexName="FNAMN"; 11 Tabell >First(); 12 } 2 Att byta sorteringsordning innebär helt enkelt att välja ett nytt index. 3 För tabellen finns ett antal metoder. First flyttar fokus till början av tabellen. Håkan Strömberg 2 KTH Syd
1 void fastcall TFormular::SokKnappClick(TObject Sender){ 2 bool ok; 4 Opts.Clear(); 5 ok=tabell >Locate("FDATUM",FodelsedatumRuta >Text,Opts); 6 if (!ok) ShowMessage("Finns tyvärr inte"); 7 } 1-7 I editrutan FodelsedatumRuta har vi skrivit in ett datum och vi söker nu i tabellen efter en person med detta födelsedatum. 2 ok får värdet true då vi finner det vi söker. 3 Opts håller reda på vad som gäller under sökandet, locaseinsensitive, sökandet skiljer inte på stora och små bokstäver. lopartialkey, nyckeln kan bestå endast av en del av vad som söks. Ingen av dessa optioner använder vi dock här. 5 Här utförs själva sökandet. Första parametern anger fältets namn och den andra nyckeln, som vi alltså hämtar från FodelsedatumRuta. 1 void fastcall TFormular::BortHakanClick(TObject Sender){ 2 bool ok,slut; 4 Opts.Clear(); 5 Tabell >First(); 6 slut=false; 7 while (!slut){ 8 ok=tabell >Locate("FNAMN","HÅKAN",Opts); 9 if (ok) 10 Tabell >Delete(); 11 else 12 slut=true; 13 } 1 1-14 Vi söker här igenom hela tabellen efter poster med förnamnet HÅKAN och tar bort dessa från tabellen 7-12 Så länge vi inte når slutet i tabellen, söker vi nästa post förnamnet HÅKAN. 9 Om funktionen Locate returnerar true har vi funnit en post och kan ta bort den med metoden delete. 11 Blir det ingen träff har vi nått slutet av tabellen och rutinen kan avbrytas. Håkan Strömberg 3 KTH Syd
1 void fastcall TFormular::MedelViktKnappClick(TObject Sender){ 2 int summa,antal; 3 AnsiString s; 4 Tabell >First(); 5 summa=0; 6 antal=0; 7 while (!Tabell >Eof){ 8 summa=summa+tabell >FieldByName("VIKT") >AsInteger; 9 antal++; 10 Tabell >Next(); 11 } 12 s=floattostr(float(summa)/antal); 13 MedelViktRuta >Text=s; 1 1-14 Här ska vi beräkna medelvärdet av personernas vikt och stegar därför igenom tabellen post för post och summerar vikterna, samtidigt håller vi reda på antalet personer som ingår i beräkningen. 7-11 Så länge vi inte nått slutet av tabellen utförs denna while-loop. 8 Här tar vi fram vikten och representerar den som ett heltal innan vi adderar den till sum. 10 Flyttar fokus till nästa post. 1 void fastcall TFormular::ValjTjockisarClick(TObject Sender){ 2 Tabell >First(); 3 while (!Tabell >Eof){ 4 if (Tabell >FieldByName("LANGD") >AsInteger 5 Tabell >FieldByName("VIKT") >AsInteger<100){ 6 Tabell >Edit(); 7 Tabell >FieldByName("FET") >AsBoolean=true; 8 Tabell >Post(); 9 } 10 Tabell >Next(); 11 } 12 Tabell >Filter="FET"; 13 Tabell >Filtered=true; 14 Tabell >Refresh(); 15 } 1-15 Här ska vi återigen gå igenom hela tabellen och räkna ut om aktuell person är överviktig eller inte, med den bekanta formeln: Om längden minus vikten är mindre än 100 så är personen ifråga lite för fet. Vi uppdaterar därefter fältet FET med true eller false. Från genereringen av tabellen har alla värdet false 4-5 Vi uttrycker villkoret och om det är sant så... 6 möjliggör vi uppdatering genom metoden Edit... 7 och sätter postens värde till true. 8 Till sist utför vi uppdateringen till tabellen. 12-14 Efter att ha genomfört beräkningarna ovan vill vi endast visa de överviktiga och sätter därför på ett filter. Först anger vi vilket villkoret som ska vara sant, värdet i FET ska vara TRUE och därefter sätter vi filtret i verksamhet. Genom metoden refresh utförs själva filtreringen. Håkan Strömberg 4 KTH Syd
1 void fastcall TFormular::AtarAllaClick(TObject Sender){ 2 Tabell >Filtered=false; 3 Tabell >Refresh(); Här tar vi bort filtret och vi visar åter alla genom refresh. 1 void fastcall TFormular::KalleKnappClick(TObject Sender){ 2 bool slut,ok; 4 5 Opts.Clear(); 6 Tabell >First(); 7 slut=false; 8 while (!slut){ 9 ok=tabell >Locate("FNAMN","KARL",Opts); 10 if (ok){ 11 Tabell >Edit(); 12 Tabell >FieldByName("FNAMN") >AsString="KALLE"; 13 Tabell >Post(); 1 15 else 16 slut=true; 17 } 18 } 1-18 I programmets sista funktion ska vi byta ut förnamnet Karl mot Kalle. 12 Den enda egentliga nyheten i denna funktion 1 void fastcall TFormular::FormCreate(TObject Sender){ 2 Tabell >DatabaseName="PVPDataBas"; 3 Tabell >TableName="FolkData.dbf"; 4 Tabell >Active=true; 5 DataSource1 >DataSet=Tabell; 6 DBGrid1 >DataSource=DataSource1; 7 } 2-6 Fem initieringar för att data ska kunna strömma mellan databasen med sin enda tabell till tabellen på skärmen. 1 void fastcall TFormular::AvslutaClick(TObject Sender){ 2 Tabell >Close(); 3 Close(); Håkan Strömberg 5 KTH Syd