Страница 2 из 3

Re: Справочная служба аэропорта (delphi)

Добавлено: 16 дек 2007, 11:03
BHy4ok
verty писал(а):Я сделал так:
1) таблица рейсов:
1 рейс
2 откуда
3 куда
4 тип самолета
5 кол-во мест всего

2) таблица вылетов
1 рейс
2 дата вылета
3 время отправления
4 время прибытия
5 продано билетов
6 свободно билетов

И такие вот возникли вопросы:
Создал эти две таблицы, но почемуто в таблиу вылетов не возможно добавлять новые записи или редактировать?
Я думаю проданных билетов и свободных будут вычисляемыми полями , зависящими от общего кол-ва мест , а как это реализовать в коде?
Заранее благодарю .

Во первых для начало сделай правильные связи между таблицами.
Допустим у тебя: кол-во мест всего = 30
Тогда начальное значение "свободно билетов" = 30 (которое при каждом проданном билете будет уменьшаться на "1").
Продано билетов: = следовательно увеличиваться на "1".

Вы опять не написали какие компоненты используете для работы с БД.

Все данные беруться из БД.

В итоге получаем:

Код: Выделить всё

a:integer; // кол-во мест всего (начальное значение 30)
b:integer; // продано билетов (начальное значение 0)
c:integer; // свободно билетов (начальное значение 30) // т.е. у тебя всегда будет "a:=b+c;"
begin
//В зависимости от типа самолета.
//button.click (для примера)
c:=query.FieldByName('свободно билетов').AsInteger; //В зависимости от того как называется у тебя поле.
b:=query.FieldByName('продано билетов').AsInteger; 
c:=c-1; // (свободно билетов:=29)
b:=b+1; // (продано билетов:=1)
//Затем загоняешь обратно в базу. 
query.FieldByName('свободно билетов').AsString:=inttostr(c);
query.FieldByName('продано билетов').AsString:=inttostr(b);
query.open;
query.refresh;

Re: Справочная служба аэропорта (delphi)

Добавлено: 16 дек 2007, 22:19
verty
На форме у меня имеется 1 table, 1 query, 2 datasource

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:integer;
begin
b:=StrToInt(Edit1.Text);
Query1.Edit;
Table1.Open;
Query1buy.Value:=b+Query1buy.Value;

Query1svob.Value:=Table1Mest.Value - Query1buy.Value;
end;

Этим я считаю кол-во проданных и свободных мест,
вроде все считает верно, но не совсем:
1)В столбцах проданных и свободных мест появляются нужные данные, но не сохраняются, как их сохранять?
2) К примеру у меня в самолете всего 100 мест, а я решил купить 110, получается в столбце проданных 110, а в столбце свободных -10. Как это отрегулировать?

Re: Справочная служба аэропорта (delphi)

Добавлено: 17 дек 2007, 08:26
BHy4ok
verty писал(а):На форме у меня имеется 1 table, 1 query, 2 datasource

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c:integer;
begin
b:=StrToInt(Edit1.Text);
Query1.Edit;
Table1.Open;
Query1buy.Value:=b+Query1buy.Value;

Query1svob.Value:=Table1Mest.Value - Query1buy.Value;
end;

Этим я считаю кол-во проданных и свободных мест,
вроде все считает верно, но не совсем:
1)В столбцах проданных и свободных мест появляются нужные данные, но не сохраняются, как их сохранять?
2) К примеру у меня в самолете всего 100 мест, а я решил купить 110, получается в столбце проданных 110, а в столбце свободных -10. Как это отрегулировать?
Зачем тебе использовать в связке "table" and "query"? Ну да ладно - дело твое.

Table1Mest.Value - я так понимаю это значение из первой таблицы. т.е. "Всего мест" - и это значение не будет меняться. Следовательно выражение:
Query1svob.Value:=Table1Mest.Value - Query1buy.Value; - будет не верным при последующем расчете. т.е.
Query1svob.Value:=Table1Mest.Value(=30) - Query1buy.Value(=5);
Query1svob.Value:=25 так?
Если идет последующая покупка, то:
Query1svob.Value:=Table1Mest.Value(=30 - значение всегда стабильно) - Query1buy.Value(=3);
Query1svob.Value:=27? а должно быть := 22
Хотя может у тебя все иначе - тебе виднее. Но значение из table1 по идее не меняется и над ним не совершаются никакие вычисления.
Правильней будет написать так:
Query1svob.Value:=Query1svob.Value - Query1buy.Value;

1) Попробуй вот так:

Код: Выделить всё

Query1.Edit;                        
Query1buy.Value:=b+Query1buy.Value;

Query1svob.Value:=Query1svob.Valu - Query1buy.Value;
Query1.Refresh;
Query1.Open; // После вычислений ее снова нужно будет открыть. 
end;
2) Логически как "всего мест" может быть меньше "купленных"(проданных)? Странным не находишь?
Поставь условие: "свободно мест"<="всего мест" и "покупка" <= "свободных мест"

Re: Справочная служба аэропорта (delphi)

Добавлено: 17 дек 2007, 10:41
BHy4ok
Так примерно?
Скачать

ICQ: 8721378

Re: Справочная служба аэропорта (delphi)

Добавлено: 18 дек 2007, 00:39
verty
Подскажите пожалуста как мне показать все вылеты на определенную (вводимую) дату?
К примеру для показа рейсов из определенного места вылета я делаю так:

Код: Выделить всё

begin
 DataSource1.DataSet:=Query2;
if okbottomdlg.ShowModal=mrok then   \\ в edit1.text ввожу нужный пункт отправления и ищу
with Query2 do
begin
close;
ParamByName('dnazv').Value:=okbottomdlg.edit1.text;
open;
end;
end;

А в sql пишу select * from aa where aa.otkuda=:dnazv
А вот с датой чето не получается, пишет вроде несоотетствие типов.

Re: Справочная служба аэропорта (delphi)

Добавлено: 18 дек 2007, 08:38
BHy4ok
verty писал(а):Подскажите пожалуста как мне показать все вылеты на определенную (вводимую) дату?
Пиши запрос на отбор данных.

Код: Выделить всё

S:=.... //  Допустим "ListBox"
S1:=('((table.datefield) Like "%' + S + '%") '); // будет искать все совпадения, если нужно точную дату, 
// то напиши просто = "" без Like. Я думаю ты знаешь как писать запросы.

    Query.SQL.Text:='SELECT [table].datefield ' + // собственно сам запрос. Где table - имя таблицы. 
// datafield имя поля с датой. Опять-же смотри чтобы совпадал формат с ListBox. 
// Лучше возьми данные с BD и потом их на выбор. Добавишь дополнительные поля для вывода в таблицу. 
// Я указал только одно.
    'FROM [table] ' +
    'WHERE (' + S1 + ');'; // Например S1:= 05.05.2007
    Query.Active:=true;
    Query.Open;

Re: Справочная служба аэропорта (delphi)

Добавлено: 18 дек 2007, 12:10
BHy4ok
Вот исходники и "ехе".

Скачать

Re: Справочная служба аэропорта (delphi)

Добавлено: 20 дек 2007, 20:52
verty
Такой вопрос: хочу сделать справку.
Как сделать так чтобы при вызове справки открывался вордовский документ?

Re: Справочная служба аэропорта (delphi)

Добавлено: 21 дек 2007, 09:35
BBB

Код: Выделить всё

ShellExecute (NULL, // HWND hwnd, 
    NULL, // "open", // LPCTSTR lpOperation,
    "C:\\.......\\MyHelp.doc", // LPCTSTR lpFile, 
    NULL, // LPCTSTR lpParameters, 
    NULL, // LPCTSTR lpDirectory,
    SW_SHOWDEFAULT // INT nShowCmd
  );

Re: Справочная служба аэропорта (delphi)

Добавлено: 23 дек 2007, 20:01
verty
Подскажите пожалуйста.
В одной таблице имеются рейсы , в другой даты вылета этого рейса (связь 1 к многим);
1) таблица рейсов: 2) таблица вылетов
1 рейс 1 рейс
2 откуда 2 дата вылета
3 куда 3 время отправления
4 тип самолета 4 время прибытия
5 кол-во мест всего 5 продано билетов
6 свободно билетов


В таблице рейсов имеется несколько рейсов с разным кол-вом билетов, и у каждого рейса по несколько вылетов.
В таблице рейсов я выбираю рейс(1) . Потом нажимаю кнопку и показываю все рейсы из заданного пункта отправления. Выбираю появившейся рейс и в другой таблице показываются все вылеты этого рейса. Выбираю нужный рейс(2) и нажимаю кнопку покупки билетов, ввожу нужное кол-во билетов. НО кол-во купленных и свободным мест рассчитывается на основании (кол-во мест всего) рейса который я выбрал первым(1) еще до выборки из заданного пункта отправления , а должно рассчитываться на основании рейса который я выбрал после выборки(2).
Надеюсь вы поняли.

Как это исправить?


Так я выбираю рейс из заданного пункта отправления

Код: Выделить всё

procedure TForm1.N5Click(Sender: TObject);
begin
  DataSource2.DataSet:=Query1;
DataSource1.DataSet:=Query2;
if okbottomdlg.ShowModal=mrok then
with Query2 do
begin
close;
ParamByName('dnazv').Value:=okbottomdlg.edit1.text;
open;
 end;
А в sql пишу select * from aa where aa.otkuda=:dnazv
Так я осуществляю покупку билетов

Код: Выделить всё

procedure TForm4.Button1Click(Sender: TObject);
var
b:integer;
begin
form1.Query1buy.ReadOnly:=False;
 form1.Query1svob.ReadOnly:=False;
form1.Query1.Edit;
 form1.Table1.Open;
 b:=StrToInt(Edit1.Text);
form1.Query1svob.Value:=form1.Table1Mest.Value - form1.Query1buy.Value ;
 if b>form1.Query1svob.Value then ShowMessage('ошибка') else begin
 form1.Query1.Edit;
form1.Table1.Open;
  form1.Query1buy.Value:=b+ form1.Query1buy.Value;
 form1.Query1svob.Value:=form1.Table1Mest.Value - form1.Query1buy.Value ;
   form1.Query1.Post;
    end;
  form1.Query1buy.ReadOnly:=True;
  form1.Query1svob.ReadOnly:=true;
  form4.Close;
 end;