Здавалка
Главная | Обратная связь

Клиентская часть приложения



Модуль данных. Компонент DataBase настраиваем как обычно. Для поддержки списка пунктов необходим компонент Table, связанный с таблицей Punct (Tpunct), и DataSource (Dpunct), настроенный на этот Table. Остальные невизуальные компоненты будем создавать по мере их надобности.

 

Основная форма приложения. Для выбора пункта назначения можно использовать компонент DBLookupComboBox. Это раскрывающийся список на основе какой-либо таблицы или представления. Установите его свойство ListSource равным DPunct , свойство ListField равным имени поля Name_punct, свойство KeyField-имени cod_punct.. Список будет показывать названия всех пунктов, при этом выбираться будут коды пунктов.

Для того, чтобы показать на форме расстояние до выбранного пункта, можно воспользоваться стандартными компонентами Label (допустим, мы дали метке имя Label_dictance). Тогда можно написать простой обработчик события OnClick для списка DBLookupComboBox.:

 

procedure TForm1.DBLookupComboBox1Click(Sender: TObject);

begin

Label_distance.caption:=Tpunct.FieldByName('distance').asstring;

end;

 

Функция FieldByName позволяет получить значение заданного поля для текущей записи (строки) Table. При движении по списку текущая запись изменяется автоматически, поэтому в момент наступления события OnClick текущей является выбранная запись. Свойство AsString обозначает преобразование значения поля к типу string.

Запустите приложение и убедитесь, что список работает правильно и в метке показывается правильное расстояние.

 

Для того, чтобы показать на форме все рейсы, проходящие через выбранный пункт, воспользуемся созданным на сервере представлением punct_rais. Можно было бы назначить для него компонент Table и воспользоваться уже известным приемом с установкой свойств MasterSource и MasterField на таблицу пунктов, но нам нужны не все рейсы, а только те, на которые есть билеты. Из этого положения тоже можно было бы найти выход, воспользовавшись свойством Filter (фильтр).

Все же лучшим способом кажется явный запрос на выборку по представлению punct_rais, параметром которого является код пункта. Стандартное средство обозначения параметра запроса — двоеточие перед его именем. Текст запроса будет выглядеть так:

select * from punct_rais

where cod_punct=:cod_punct

and free_places>0

Проверьте запрос в SQL Plus, подставив вместо параметра конкретные значения cod_punct.

Для выполнения запросов и отображения результатов запросов на выборку в Delphi существует специальный компонент Query. Он очень похож на Table (у них общий предок DataSet), но у Query отсутствует свойство TableName, зато есть основное свойство SQL, которое должно содержать текст запроса на языке SQL (без ; на конце!).

Поместите в модуль данных компоненты Query (назовем его Qpunct_rais), DataSource, а на форму — DbGrid, свяжите их друг с другом. В свойство SQL для Qpunct_rais поместите текст отлаженного запроса на выборку рейсов. Не забудьте устанавливать для компонента Query свойство DataBaseName, как вы это делали для компонентов Table. Для Query, как и для Table, имеется редактор полей. Установите для служебных полей видимость false, для остальных полей displaylabel.

Задать значение для параметра запроса в Delphi можно разными способами, например, у Query есть свойство ParamByName (имя параметра), которому можно присвоить выбранный из списка код пункта. Но есть совсем простой способ.

Установите свойство DataSource объекта Qpunct_rais равным dpunct (DataSource, соответствующий таблице punct). При этом параметр cod_punct запроса будет получать значение поля cod_punct_ таблицы punct, и запрос будет автоматически обновляться при смене текущего пункта назначения. Таким способом можно воспользоваться, только если у запроса всего один параметр. Для того, чтобы запрос активизировался первый раз при первом выборе пункта из списка, не устанавливайте его свойство Active=True на этапе разработке. Лучше добавьте в обработчик OnClick списка такую строку:

Qpunct_rais.Active:=true;// или Qpunct_rais.open;

Запустите приложение и убедитесь, что запрос работает правильно. Осталось оформить продажу билетов, для чего запустить на сервере хранимую процедуру.

 

Для вызова хранимых процедур и функций есть еще один компонент - StoredProc. Его основное свойство - StoredProcName – имя хранимой процедуры, а основной метод – ExecProc — запуск хранимой процедуры.

Чтобы воспользоваться этой функцией в нашем приложении, потребуется объект TStoredProc. Установите его свойство DatabaseName равным псевдониму базы данных, свойство StoredProcName – равным имени хранимой процедуры (Sale).

Поместите на форму компонент TEdit, куда будет вводиться требуемое число билетов. На событие OnClick кнопки “Продажа” поместите обработчик, который задаст значения входных параметров хранимой процедуры, запустит эту процедуру и обработает ее выходные параметры err и s. Текст процедуры, например, такой:

procedure TForm1.Button1Click(Sender: TObject);

var err:integer; sum:double;

begin

StoredProc1.ParamByName('cod_r').AsInteger:=

Qpunct_rais.FieldByName('cod_rais').AsInteger;

StoredProc1.ParamByName('cod_p').AsInteger:=

Qpunct_rais.FieldByName('cod_punct').AsInteger;

StoredProc1.ParamByName('n_ticket').AsInteger:=

strtoint(edit1.Text);

StoredProc1.ExecProc;

err:=StoredProc1.ParamByName('err').AsInteger;

sum:=StoredProc1.ParamByName('s').AsInteger;

if err>0 then ShowMessage('Нет такого количества билетов')

else

ShowMessage('Сумма: '+floattostr(sum));

end;

 

Запустите приложение и протестируйте.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.