Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2012, 20:06
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
Печаль Delphi 7 и база на InterBase 1.5

Доброго Вам времени суток уважаемые форумчане!!! Помогите плиз! На работе запускается новый сервис, в принципе не большой, но кроме главного программиста никто написать его не может... А он в отпуске
Всеми усилиями пытаемся как то без него, но результат пока не большой... В общем в чем собственно проблема: Есть инструментарий - Delphi 7 и база на InterBase 1.5. В базе есть две таблицы, называются TICK и TICKED_USED. Первая таблица состоит из двух столбцов, называются SER и NOM, и содержит серию и номер билетика от автобуса (например билет АВ-01 000123 или АП 009384), т.е в первом столбце содержится АВ-01, а во втором 000123. Далее, во второй таблице хранится также серия и номер билета, она нужна для использованных билетиков. Почему использованных? Сейчас расскажу. Акция вот в чем. Наша компания сеть ресторанов пиццы. Руководство запускает акцию, найди счастливый билет в автобусе и получи пиццу бесплатно. Так вот, база счастливых билетов как раз хранится в таблице TICK. В Delphi мы создали форму, на которой расположено 3 TEdit: первый для буквенной части серии, второй для цифровой части серии (ее может не быть, поэтому для нее отдельное поле) и третий TEdit для номера. Диспетчер получает звонок и клиент диктует ей свой номер: если номер только с буквенной серией, тогда диспетчер оставляет второе поле пустым, если же нет то заполняет. Хорошо, далее в событии OnKeyPress третьего Edit мы передаем серию и номер в два ранее созданных TLabel, серию если двойная то конкатенацией строк двух TEdit, если же одинарная то просто передаем, ну а номер аналогично в третий Edit. Дальше нужно произвести запрос в таблицу TICK на проверку выигрышный этот билет или нет? Если же да, то нужно проверить в TICKED_USED, а не использовался ли этот билет ранее? Если же оба контроля проходит, то заносим этот билет в TICKET_USED. Соответственно нужно выводить сообщения при не прохождении того или иного пункта. Задача не сложная, но нам не хватает опыта... Помогите пожалуйста люди добрые!
Ответить с цитированием
  #2  
Старый 05.10.2012, 04:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это настолько примитивно, что непонятно даже в чем проблема.
Соответственно, тема, ИМХО, должна быть в разделе "Работа" со всеми вытекающими...

ЗЫ. Кстати, а зачем 3 Edit'а, если в любом случае в БД хранится все вместе? Что бы тире не ставить "руками"?
Ответить с цитированием
  #3  
Старый 05.10.2012, 07:15
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
По умолчанию

Да, это как раз чтобы тире не ставить.. Какие же все таки запросы в IBQuery нужно прописать не подскажешь?
Ответить с цитированием
  #4  
Старый 05.10.2012, 08:35
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Я бы сделал так 1 таблица с двумя полями 1-е number это номер билета VarChar(30) уникальное, not null
2-е used это использован или нет, smallInt, not null, по умолчанию 0-не использован

тогда Select Number,Used FRom Tickets Where Upper(Number)=Upper('тут введённый номер обязательно в кавычках') даст тебе либо Null если нет такого билета либо соответственно Number,Used

Update Tickets Set Used=1 Where Number='Введённый номер' пометит билет как использованный
__________________
Код сырец
Ответить с цитированием
  #5  
Старый 05.10.2012, 08:51
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
По умолчанию

Вот код на событие OnKeyPress третьего Edit, все прекрасно проверяет но почему то если обе проверки проходит, то в лэйблы ничего не заносится....

Код:
procedure TForm20.nom_eKeyPress(Sender: TObject; var Key: Char);
var seriya,nomer:string;
  begin
    if not (key in [#48..#57,#13,#08]) then key := #0;            
  begin
    if key=#13 then
  begin
    if (length(ser1_e.Text)<2) or (length(nom_e.Text)<6) then    
      begin
        showmessage('Заполните необходимые поля!');
      end else
            begin
              if (length(ser2_e.Text)=0) then                   
            begin
              s1:=ser1_e.Text;
                nom:=nom_e.Text;
                  label_seriya.Caption:=s1;
                label_nomer.Caption:=nom;
              end
                else                                              
            begin
              s1:=ser1_e.Text;
                s2:=ser2_e.Text;
              nom:=nom_e.Text;
            label_seriya.Caption:=s1+'-'+s2;
          label_nomer.Caption:=nom;
           end;

     begin
     st1:=chr(39)+AnsiUpperCase(label_seriya.Caption)+chr(39);   
     st2:=chr(39)+AnsiUpperCase(label_nomer.Caption)+chr(39);
          t.Active:=false; q.Close;
          q.SQL.Text:='select ser, nom from tick where ser='+st1+' and nom='+st2;    
          t.StartTransaction; q.Open;
            if q.IsEmpty then
          begin
            ShowMessage('Такого билета нет среди призовых.');
            exit;
          end else
            q.SQL.Text:='select ser, nom from ticket_used where ser='+st1+' and nom='+st2;
            t.Active:=false; q.Close;
            t.StartTransaction; q.Open;
            if not q.IsEmpty then
          begin
            ShowMessage('По этому билету уже получен подарок.');
            exit;
          end else
            t.Active:=false; q.Close;
            t.StartTransaction; q.Open;
            mainf.label_ser.Caption:=q.FieldByName('ser').AsString;
            mainf.label_nom.Caption:=q.FieldByName('nom').AsString;
            seriya:=mainf.label_ser.Caption;
            nomer:=mainf.label_nom.Caption;
            mainf.ticket.Caption:=seriya+nomer;
            form20.Close;
            exit;
      end;
  end;
end;
  begin                                                           
    if key=#08 then
      begin
       if (length(nom_e.Text)=0) then
        begin
          ser2_e.SetFocus;
            ser2_e.SelStart:=Length(ser2_e.Text);
        end;
      end;
    end;
  end;
end;

Последний раз редактировалось delicious777, 05.10.2012 в 09:00.
Ответить с цитированием
  #6  
Старый 05.10.2012, 08:57
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Lost_Fish
Я бы сделал так 1 таблица с двумя полями 1-е number это номер билета VarChar(30) уникальное, not null
2-е used это использован или нет, smallInt, not null, по умолчанию 0-не использован

тогда Select Number,Used FRom Tickets Where Upper(Number)=Upper('тут введённый номер обязательно в кавычках') даст тебе либо Null если нет такого билета либо соответственно Number,Used

Update Tickets Set Used=1 Where Number='Введённый номер' пометит билет как использованный

Хорошо, а дальше нужно еще и по использованным проверить
Ответить с цитированием
  #7  
Старый 05.10.2012, 09:09
Аватар для Lost_Fish
Lost_Fish Lost_Fish вне форума
Начинающий
 
Регистрация: 21.07.2011
Адрес: Новосибирск
Сообщения: 103
Версия Delphi: Delphi 7,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от delicious777
Хорошо, а дальше нужно еще и по использованным проверить

идея такова что у тебя в таблице есть только выйгрышные билеты и пометка использован он или нет

если Select Number,Used FRom Tickets Where Upper(Number)=Upper('тут введённый номер обязательно в кавычках') не получает записей, значит введённый билет не является выйгрышным (так как его нет в нашем списке выйгрышных), если этот запрос возвращает запись значит это выйгрышный, если Used=1 значит использовали уже, Used=0 значит не использовали
__________________
Код сырец
Ответить с цитированием
Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение:
delicious777 (05.10.2012)
  #8  
Старый 05.10.2012, 09:29
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
Смех

УРААА Проблема решена))) Заменили код на:
Код:
 procedure TForm20.nom_eKeyPress(Sender: TObject; var Key: Char);  
var seriya,nomer:string;
  begin
    if not (key in [#48..#57,#13,#08]) then key := #0;            
  begin
    if key=#13 then
  begin
    if (length(ser1_e.Text)<2) or (length(nom_e.Text)<6) then 
      begin
        showmessage('Заполните необходимые поля!');
      end else
            begin
              if (length(ser2_e.Text)=0) then                    
              begin
              s1:=ser1_e.Text;
                nom:=nom_e.Text;
                  label_seriya.Caption:=s1;
                label_nomer.Caption:=nom;
               end else                                             
              begin
              s1:=ser1_e.Text;
                s2:=ser2_e.Text;
              nom:=nom_e.Text;
            label_seriya.Caption:=s1+'-'+s2;
          label_nomer.Caption:=nom;
           end;
     st1:=chr(39)+AnsiUpperCase(label_seriya.Caption)+chr(39);     
     st2:=chr(39)+AnsiUpperCase(label_nomer.Caption)+chr(39);
          t.Active:=false; q.Close;
          q.SQL.Text:='select ser, nom from tick where ser='+st1+' and nom='+st2;   
          t.StartTransaction; q.Open;
            if q.IsEmpty then
            begin
            ShowMessage('Такого билета нет среди призовых.');
            t.Rollback;
            exit;
     end  else
            q.SQL.Text:='select ser, nom from ticket_used where ser='+st1+' and nom='+st2;
            t.Active:=false; q.Close;
            t.StartTransaction; q.Open;
            if not q.IsEmpty then
            begin
            ShowMessage('По этому билету уже получали подарок.');
            t.Rollback;
            exit;
     end  else
            begin
            t.Active:=false; q.Close;
            q.SQL.Text:='select ser, nom from tick where ser='+st1+' and nom='+st2;   
            t.StartTransaction; q.Open;
            mainf.label_ser.Caption:=q.FieldByName('ser').AsString;
            mainf.label_nom.Caption:=q.FieldByName('nom').AsString;
            seriya:=mainf.label_ser.Caption;
            nomer:=mainf.label_nom.Caption;
            mainf.ticket.Caption:=seriya+nomer;
            form20.Close;
            exit;
          end;
  end;
end;
  begin                                                           
    if key=#08 then
      begin
       if (length(nom_e.Text)=0) then
        begin
          ser2_e.SetFocus;
            ser2_e.SelStart:=Length(ser2_e.Text);
        end;
      end;
    end;
  end;
end;
Ответить с цитированием
  #9  
Старый 05.10.2012, 09:45
delicious777 delicious777 вне форума
Прохожий
 
Регистрация: 04.10.2012
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Lost_Fish
идея такова что у тебя в таблице есть только выйгрышные билеты и пометка использован он или нет

если Select Number,Used FRom Tickets Where Upper(Number)=Upper('тут введённый номер обязательно в кавычках') не получает записей, значит введённый билет не является выйгрышным (так как его нет в нашем списке выйгрышных), если этот запрос возвращает запись значит это выйгрышный, если Used=1 значит использовали уже, Used=0 значит не использовали
Ааа понял) Кстати так даже попроще Спасибо))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter