а) в таблице 1 «Reis» ведется учет всех возможных рейсов с указанием их номера, который является уникальным и служит ключевым индексом для связи с другими таблицами, название рейса (начальная и конечная станции) и путь, то есть все станции, которые проходит поезд в порядке следования.
б) в таблице 2 «Allpoints», содержатся станции, из названий которых формируется маршрут рейса. Для уникальности используется поле “No”.
в) Таблица 3 «Tickets» состоит из 10 полей, поле «No_ticket» является уникальным и кодируется датой и временем регистрации пассажира. В поле «Startpoint» заносится пункт отправления пассажира, который может и не совпадать со станцией начала пути. Аналогичным образом в поле «Endpoint» запоминается пункт прибытия пассажира. Поле «EndDate» вычисляемое, и зависит от времени, проведенном в пути.
г) В таблице 4 «Stationofreis», содержатся 7 полей, где указывается информация о времени между двумя смежными станциями, стоимость участка пути, время прибытия, отправления и стоянки.
д) В таблице 5 «TypeVag» отображаются, какие вагоны относятся к плацкар-тному классу вагонов, какие к купейному.
е) В таблице 6 «Price» является временной и используется для сохранения данных о билете заказа для последующего формирования билета.
Таблица 1 - Reis
Таблица 2 – Allpoints
Таблица 3 - Tickets
Stationeries
Таблица 5 – TypeVag
Таблица 6 – Price
3 Описание программного обеспечения
3.1 Выбор и обоснование инструментальных средств
Данная система создана с использованием технологии «файл-сервер». Разработанная база данных является локальной. Приложение написано с помощью средств разработки Delphi 7 и осуществляет многопользовательский режим доступа.
Delphi 7 – мощная система визуального объектно-ориентированного программмирования. С ее помощью даже начинающие программисты могут создавать оконные интерфейсы, удовлетворяющие стандартам Windows, причем очень быстро. Спектр отраслей, в которых можно применять Delphi, достаточно широк: инженерные, офисные, торговые и др. К тому же Delphi является одним из самых распространенных средств создания приложений баз данных. Простота языка и эффективность (небольшие размеры и высокая производительность) создаваемых с его помощью программ сделали Delphi незаменимым средством разработки приложений для доступа к базам данных. Delphi используется для генерирования и вывода на печать сложных отчетов баз данных, а также предоставляет возможность связываться из своего приложения с такими продуктами Microsoft, как Word, Excel и другие, используя их возможности в создании мощных систем помощи.
Занимает 16 Мб дискового пространства. Оперативная память должна быть 64 Мб минимум.
3.2 Описание программных модулей и их взаимодействие
Данный программный продукт состоит из 4 основных вычисляющих модулей:
а) поиск всех возможных рейсов, последовательно проходящих через заданные начальную и конечную точки маршрута.
Для каждого из существующих рейсов указываются станции, через которые поезд проходит последовательно, к примеру, Москва – Санкт-Петербург – Казань – Воронеж.
Следует отметить, что поезд может идти только в одном направлении (из Москвы в Воронеж).
Задаются пункт отправления и пункт прибытия, указанные пассажиром. Рейс считается подходящим, если в его маршруте содержатся пункты отправления и прибытия, причем пункт прибытия следует после пункта отправления. Например, если пассажир следует из Санкт-Петербурга в Воронеж, то указанный выше рейс считается подходящим. Если же пункт его отправления Казань, а пункт назначения Санкт-Петербург, то рейс №100 не будет соответствовать заданному условию.
Листингпрограммногомодуля:
if (ComboBox1.Text <> '') and (ComboBox2.Text <> '') and (RzDateTimeEdit1.Text <> '') then
begin
Query1.Destroy;
DS1.Destroy;
Query1:=CreateQuery('select * from reis');
Query1.Open;
nomera:='';
Query1.First;
while not Query1.Eof do
begin
m:=-1;
n:=-1;
trains:= TStringList.Create;
trains.Text:= StringReplace(Query1.FieldValues['stancii'],'-',#13#10,[rfReplaceAll]);
for i:=0 to trains.Count-1 do
begin
if trains[i] = ComboBox1.Text then m:=i;
if trains[i] = ComboBox2.Text then n:=i;
end;
if (m <> -1) and (n <> -1) then
if (m < n) then
begin
nomera:=nomera+Query1.Fields[0].AsString+',';
end;
trains.Destroy;
Query1.Next;
end;
if nomera = '' then
begin
Application.MessageBox('Таких рейсов нет','Внимание',MB_OK+MB_ICONERROR);
DS1:= CreateDataSource(Query1);
// DBGrid1.DataSource:= DS1;
end else
begin
Delete(nomera,length(nomera),1);
Query1.SQL.Clear;
SQLString:='select * from reis where no_reisa in ('+nomera+')';
Query1.SQL.Add(SQLString);
Query1.Open;
DS1:=CreateDataSource(Query1);
DBGrid1.DataSource:= DS1;
end;
end;
Результатом работы программного модуля является список подходящих рейсов.
б) визуальное отображение всех занятых и свободных мест выбранного рейса с учетом даты отправления, проверка освободившихся мест.
После выбора необходимого рейса и даты отправления пассажира таблично отображаются занятые и свободные места. Для каждого занятого места запоминаются пункт назначения и дата прибытия. Место считается освободившимся для данного пассажира, если выполняется два условия: запомненный для места пункт назначения находится до пункта отправления пассажира или совпадает с ним; запомненная дата прибытия для места совпадает с датой отправления пассажира или дата отправления является более поздней.
Листингпрограммногомодуля:
SQLString:= 'select * from typevag where no_reisa="'+DBGrid1.Fields[0].Text+'"';
Query2:= CreateQuery(SQLString);
Query2.Open;
plackart:= TStringList.Create;
kupe:= TStringList.Create;
plackart.Text:=StringReplace(Query2.Fields[1].AsString,' ',#13#10,[rfReplaceAll]);
kupe.Text:=StringReplace(Query2.Fields[2].AsString,' ',#13#10,[rfReplaceAll]);
StringGrid1.RowCount:=plackart.Count+kupe.Count+1;
for i:=0 to plackart.Count-1 do
begin
StringGrid1.Cells[0,StrToInt(plackart[i])]:=plackart[i]+' плацкарт';
for j:=1 to 55 do StringGrid1.Cells[j,i]:='';
end;
for i:=0 to kupe.Count-1 do
begin
StringGrid1.Cells[0,StrToInt(kupe[i])]:=kupe[i]+' купе';
// for j:=1 to 55 do StringGrid1.Cells[j,i]:='';
for j:=37 to 55 do StringGrid1.Cells[j,StrToInt(kupe[i])]:='X';
end;
plackart.Destroy;
kupe.Destroy;
with Query2 do
begin
SQLString:='select * from tickets where no_reisa="'+DBGrid1.Fields[0].Text+'"and startdate="'+FormatDateTime('dd.mm',RzDateTimeEdit1.Date)+'"';
SQL.Clear;
SQL.Add(SQLString);
Open;
end;
Query2.First;
while not Query2.Eof do
begin
v:= Query2.Fields[8].AsInteger;
p:= Query2.Fields[9].AsInteger;
StringGrid1.Cells[p,v]:='*';
pnaz:= Query2.FieldValues['EndPoint'];
SQLString:= 'select * from stationofreis where No_reisa="'+DBGrid1.Fields[0].AsString+'"';
Query3:= CreateQuery(SQLString);
Query3.Open;
Query3.First;
while Query3.Fields[1].AsString <> pnaz do
begin
if Query3.FieldByName('station').AsString = ComboBox1.Text then
{if FormatDateTime() < FormatDateTime() then} goto m1;
Query3.Next;
end;
Query3.Destroy;
StringGrid1.Cells[p,v]:='';
m1:
Query2.Next;
end;
Query2.Destroy;
в) вычисление основных параметров для заданного маршрута: даты прибытия, времени в пути, стоимости билета.
Для каждого пункта маршрута в отдельной таблице указываются следующие параметры: стоимость участка пути от предыдущей до текущей станции и время его прохождения, время прибытия, стоянки и отправления. Для того, чтобы вычислить стоимость маршрута, по которому следует пассажир, нужно суммировать стоимости участков пути, составляющих данный маршрут. К цене маршрута добавляется наценка за класс вагона и обязательный страховой сбор. Чтобы вычислить время .проведенное в пути, нужно суммировать время прохождения каждого участка пути и время стоянки в каждом пункте. Дата прибытия вычисляется прибавлением времени в пути к дате отправления.
Листингпрограммногомодуля:
if (StringGrid1.Cells[ACol,ARow] <> '*') and (StringGrid1.Cells[ACol,ARow] <> 'X') then
begin
if (ComboBox1.Text <> '') and (ComboBox2.Text <> '') and (RzDateTimeEdit1.Text <> '') then
begin
if MessageDlg('Приступитькгегистрациипассажира?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
begin
Application.CreateForm(TFormTicket, FormTicket);
with FormTicket do
begin
Label2.Caption:= DBGrid1.Fields[0].Text;
Label3.Caption:= DBGrid1.Fields[2].Text;
Label6.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date);
Label17.Caption:= IntToStr(ACol);
Label15.Caption:= IntToStr(ARow);
Label10.Caption:= ComboBox1.Text;
Label11.Caption:= ComboBox2.Text;
time:=TStringList.Create;
time.Text:=StringReplace(StringGrid1.Cells[0,ARow],' ',#13#10,[rfreplaceall]);
Label13.Caption:= time[1];
time.Destroy;
Label19.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date);
SQLString:='select * from stationofreis where no_reisa="'+DBGrid1.Fields[0].Text+'"';
Query2:= CreateQuery(SQLString);
Query2.Open;
Query2.First;
hour:=0;
minute:=0;
price:=0;
s:='0';
while not Query2.Eof do
begin
if Query2.Fields[1].AsString = ComboBox1.Text then
begin
Label21.Caption:=Query2.Fields[6].AsString;
s1:= Query2.Fields[6].AsFloat;
while not Query2.Eof do
begin
Query2.Next;
s2:= Query2.Fields[4].AsFloat;
if s1>s2 then
begin
Label6.Caption:= FormatDateTime('dd.mm',RzDateTimeEdit1.Date+1);
s1:=s2;
end;
if Query2.Fields[1].AsString = ComboBox2.Text then
begin
if s = '' then
begin
s:= Query2.Fields[3].AsString;
end;
Label23.Caption:=Query2.Fields[4].AsString;
s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[3].AsFloat));
Label25.Caption:= s;
priceway:= price;
GetDir(0,Path);
with TIniFile.Create(Path+'\zd.ini') do
try
price:= price+Query2.Fields[2].AsFloat+StrToFloat(ReadString('cash',Label13.Caption,'no val ues'))+StrToFloat(ReadString('cash','сбор','no values'));
finally
Free;
end;
Label27.Caption:= FloatToStr(price);
// Edit3.Text:= StringReplace(Label27.Caption,',','.',[rfReplaceAll]);
{!!!!!добавить указание стоимости проезда!!!!!}
goto m1;
end;
price:=price+Query2.Fields[2].AsFloat;
s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[3].AsFloat));
s:= FloatToStr(sumhhmm(StrToFloat(s),Query2.Fields[5].AsFloat));
s1:=s2;
end;
end;
Query2.Next;
end;
m1:
end;
FormTicket.ShowModal;
end;
end;
end;
г) регистрация пассажира и формирование проездного документа.
После заполнения данных пассажира (фамилии, имени, отчества, номера документа, удостоверяющего личность) происходит регистрация пассажира на данный рейс и формируется проездной документ, в котором указываются рейс, вычисленные ранее стоимость билета, время пути, время отправления и прибытия, дата прибытия, данные пассажира, пункт отправления и пункт следования.