|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
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
|
|||
|
|||
Это настолько примитивно, что непонятно даже в чем проблема.
Соответственно, тема, ИМХО, должна быть в разделе "Работа" со всеми вытекающими... ЗЫ. Кстати, а зачем 3 Edit'а, если в любом случае в БД хранится все вместе? Что бы тире не ставить "руками"? |
#3
|
|||
|
|||
Да, это как раз чтобы тире не ставить.. Какие же все таки запросы в IBQuery нужно прописать не подскажешь?
|
#4
|
||||
|
||||
Я бы сделал так 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
|
|||
|
|||
Вот код на событие 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
|
|||
|
|||
Цитата:
Хорошо, а дальше нужно еще и по использованным проверить |
#7
|
||||
|
||||
Цитата:
идея такова что у тебя в таблице есть только выйгрышные билеты и пометка использован он или нет если Select Number,Used FRom Tickets Where Upper(Number)=Upper('тут введённый номер обязательно в кавычках') не получает записей, значит введённый билет не является выйгрышным (так как его нет в нашем списке выйгрышных), если этот запрос возвращает запись значит это выйгрышный, если Used=1 значит использовали уже, Used=0 значит не использовали Код сырец |
Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение: | ||
delicious777 (05.10.2012)
|
#8
|
|||
|
|||
УРААА Проблема решена))) Заменили код на:
Код:
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
|
|||
|
|||
Цитата:
|