Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Представление данных пользователю 
:(
    Опции темы
valentos
Дата 17.9.2014, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 7.12.2006
Где: Belarussia, Gomel

Репутация: нет
Всего: 2



Есть база данных электронной проходной на FireBird. Клиента пишу на Delphi 2005. Для доступа к базе использую InterBase. Сетка DbgridEh.
Данные тянутся через Ibquery и имеют вид:
--------------------------------------------------------
id   |     FIO    |   Date         | Time    | Type_Pass |
-------------------------------------------------------------
1    |  Иванов |01.09.2014 | 07:30  | 1                |
2    |  Иванов |01.09.2014 | 16:30  | 2                |
3    |  Иванов |02.09.2014 | 07:29  | 1                |
4    |  Иванов |02.09.2014 | 16:32  | 2                |
-----------------------------------------------------
Type_pass это событие проходной (1-вход, 2 - выход)
Нужно что бы пользовательская таблица имела читабельный вид:
------------------------------------------------------------
id2  |    FIO      |   Date         |  Vhod  | Vuhod  |
-------------------------------------------------------------
1     | Иванов  | 01.09.2014 | 07:30  | 16:30  |
2     | Иванов  | 02.09.2014 | 07:29  | 16:32  |
---------------------------------------------------------

 Пока на ум приходит:
1. Создать в БД дополнительную таблицу (как во втором варианте)
2. С помощью нескольких запросов забивать ее данными из первой таблицы
3. Показывать вторую таблицу пользователю
4. Если данные пользователь изменил, то проверять на соответствие с первой таблицей и апдейтить или инсертить первую.
5. Почистить вторую таблицу
6. см п2.
Этакий вариант времянки.

Может кто пнет меня на другую идею лучше/проще (нужное подчеркнуть)? Может как нибудь средствами делфи такое провернуть? Вообщем, я зациклился и не могу внятное что-то придумать smile  
 
P.S. FireBird только осваиваю (Сильно не пинайте).
--------------------
[code=sql]select name, telephone from Girls where age between 20 and 25 and (.)(.) >= 2 order by IQ desc [/code]
PM MAIL   Вверх
Akella
Дата 17.9.2014, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(valentos @  17.9.2014,  17:11 Найти цитируемый пост)
Клиента пишу на Delphi 2005. 

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

Добавлено через 3 минуты и 25 секунд
вторую таблицу можно формировать с помощью вложенных запросов, вычисляемых полей или с помощью хранимых процедур
тут дульфи не при чём
вопрос нужно было задавать в теме про firebird или в sql запросах http://forum.vingrad.ru/forum/forum-491.html

Добавлено через 4 минуты и 43 секунды
в первой таблице вместо FIO должно быть поле ID_USER и ссылаться на справочник пользователей
PM MAIL   Вверх
Vas
Дата 18.9.2014, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



А почему именно будет вот такой вид
id2  |    FIO      |   Date         |  Vhod  | Vuhod  |
-------------------------------------------------------------
1     | Иванов  | 01.09.2014 | 07:30  | 16:30  |
2     | Иванов  | 02.09.2014 | 07:29  | 16:32  |
а не вот такой
id2  |    FIO      |   Date         |  Vhod  | Vuhod  |
-------------------------------------------------------------
1     | Иванов  | 01.09.2014 | 07:30  | 16:32  |
2     | Иванов  | 02.09.2014 | 07:29  | 16:30  |
Как это определяется?

И что будет если удалить одну строку в исходных данных?
--------------------------------------------------------
id   |     FIO    |   Date         | Time    | Type_Pass |
-------------------------------------------------------------
1    |  Иванов |01.09.2014 | 07:30  | 1                |
2    |  Иванов |01.09.2014 | 16:30  | 2                |
4    |  Иванов |02.09.2014 | 16:32  | 2                |
-----------------------------------------------------
Может надо изменить структуру хранения в таблице (кстати как оно хранится, а то ваш query не известно как выбирает данные и откуда).
Почему бы не хранить в одной строке дату начала и дату окончания, при записи времени окончания просто апдейтить строку с date_close is null и id_user = наш юзверь?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Dremuk
Дата 18.9.2014, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



Цитата

   а не вот такой
   id2  |    FIO   |   Date   |  Vhod  | Vuhod  |
   -------------------------------------------------------------
   1  | Иванов  | 01.09.2014 | 07:30  | 16:32  |
   2  | Иванов  | 02.09.2014 | 07:29  | 16:30  |
   Как это определяется?
   


)) Нельзя войти 2 раза подряд, не выходя

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
valentos
Дата 18.9.2014, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 7.12.2006
Где: Belarussia, Gomel

Репутация: нет
Всего: 2



Цитата(Akella @  17.9.2014,  22:47 Найти цитируемый пост)
если, конечно, лицензия позволяет перейти

нет, к сожалению не позволяет

Цитата(Akella @  17.9.2014,  22:47 Найти цитируемый пост)
вопрос нужно было задавать в теме про firebird или в sql запросах http://forum.vingrad.ru/forum/forum-491.html
 
Буду признателен, если перенесете. Просто думал, может в делфе можно как нибудь с помощью сторонних гридов поизвращатся)

Цитата(Akella @  17.9.2014,  22:47 Найти цитируемый пост)
в первой таблице вместо FIO должно быть поле ID_USER и ссылаться на справочник пользователей 

Так и есть. Первая таблица, (не уточнил, извиняюсь) - это результат уже выборки из базы, и привел я ее только в качестве примера. Сама база - это софт, сторонней организации занимающейся производством и установкой электронных проходных (название оставлю в тайне, дабы не было рекламы). 
Естественно в самой базе все нормализованно.
Моя задача просто вытащить для редактирования те данные, которые представлены в таблицах выше.

Цитата(Vas @  18.9.2014,  07:10 Найти цитируемый пост)
Как это определяется?

Привязкой к дате

Цитата(Vas @  18.9.2014,  07:10 Найти цитируемый пост)
И что будет если удалить одну строку в исходных данных?

Данные не должны удаляться. Человек утром прошел на работу, отбил пропуск - время прихода попало в базу. Вечером ушел, отбил пропуск - время ухода тоже в базе. На основе этих данных контролируется выработка рабочего времени. Смысл весь в том что бы просто можно было подправить время прихода/ухода с работы.

Цитата(Vas @  18.9.2014,  07:10 Найти цитируемый пост)
Может надо изменить структуру хранения в таблице (кстати как оно хранится, а то ваш query не известно как выбирает данные и откуда).
Почему бы не хранить в одной строке дату начала и дату окончания, при записи времени окончания просто апдейтить строку с date_close is null и id_user = наш юзверь? 

База входит в готовый софт ЭП. Что-то менять в структуре нельзя.
Вот привожу две таблицы из базы из которых собственно и будет происходить выборка.
Таблица Staff (ключ Id_staff):
user posted image
Таблица Tabel_Intermediadate (ключ ID_TB_IN ):
user posted image
Связь Staff_id - id_staff
Мой запрос на выборку был в ibquery (изначально не хотел писать хранимую процедуру на сервере):
Код

select s.TABEL_ID, s.LAST_NAME, s.FIRST_NAME, s.MIDDLE_NAME,  s.ID_STAFF, t.STAFF_ID, t.DATE_PASS, t.TIME_PASS, t.TYPE_PASS
from  STAFF s
left  join TABEL_INTERMEDIADATE t on s.id_staff=t.staff_id
where s.id_staff = :ids
and t.date_pass between :d1 and :d2

Получал:
user posted image
Нужно было это привести к виду второй таблицы из первого моего поста.
Сделанный вывод: хоть и не хотелось что бы обработка данных лежала на сервере (дабы не иметь проблем с фирмой сопровождающей ПО проходной), но по ответу
Akella, понял что придется.
--------------------
[code=sql]select name, telephone from Girls where age between 20 and 25 and (.)(.) >= 2 order by IQ desc [/code]
PM MAIL   Вверх
Akella
Дата 18.9.2014, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(valentos @  18.9.2014,  09:52 Найти цитируемый пост)
Буду признателен, если перенесете. Просто думал, может в делфе можно как нибудь с помощью сторонних гридов поизвращатся)


напиши модератору этого раздела
PM MAIL   Вверх
Akella
Дата 18.9.2014, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(valentos @  18.9.2014,  09:52 Найти цитируемый пост)
хоть и не хотелось что бы обработка данных лежала на сервере


Если есть возможность, делай всё по максимуму на сервере  smile 
PM MAIL   Вверх
valentos
Дата 18.9.2014, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 187
Регистрация: 7.12.2006
Где: Belarussia, Gomel

Репутация: нет
Всего: 2



Цитата(Akella @  18.9.2014,  12:14 Найти цитируемый пост)
Если есть возможность, делай всё по максимуму на сервере

Ну вот после совещания мне и вынесли вердикт "Делай что хочешь, а в базе данных левого ничего не должно быть". 
В качестве аргументов привели то что ПО электонной проходной проверяет БД на соотвествие, да и "сопровождение" ничего там найти не должно.

Остался как я понимаю только вариант локально перелопачивать данные, полученные запросом из БД.

Пока что промелькнула мысль сделать DbGridEh скрытым, а пользователю выгружать данные в обычный grid, так как ему нужно, с помощью цикла. Если что то он изменит, то изменить это и в DbgridEh и алилуя. 

Какие то извращенные у меня мысли smile  

Это сообщение отредактировал(а) valentos - 18.9.2014, 15:35
--------------------
[code=sql]select name, telephone from Girls where age between 20 and 25 and (.)(.) >= 2 order by IQ desc [/code]
PM MAIL   Вверх
superVad
Дата 18.9.2014, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 735
Регистрация: 6.4.2006
Где: Черкассы, Украина

Репутация: 3
Всего: 15



Цитата(valentos @  18.9.2014,  14:31 Найти цитируемый пост)
Пока что промелькнула мысль сделать DbGridEh скрытым, а пользователю выгружать данные в обычный grid, так как ему нужно, с помощью цикла. Если что то он изменит, то изменить это и в DbgridEh и алилуя. 

При таком подходе, DbGridEh можно вообще удалить. Он ни к хранению, ни к изменению данных не имеет никакого отношения.

Можно попробовать как то вложенными, агрегатными запросами это решить, не знаю. Можно конечно и лопатить на клиенте.
PM MAIL   Вверх
Vas
Дата 18.9.2014, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Dremuk @  18.9.2014,  09:19 Найти цитируемый пост)
)) Нельзя войти 2 раза подряд, не выходя
Правильно, поэтому время начала сеанса и время окончания сеанса правильнее хранить в одной строке. Insert при входе и Update при выходе и пофигу хоть день, хоть сутки, хоть трое суток человек на работе провел. Разница дат вернет отработанное время и никаких проблем с выборками.  Но раз нельзя править БД, то зачем обсуждать это.

Цитата(valentos @  18.9.2014,  09:52 Найти цитируемый пост)
Смысл весь в том что бы просто можно было подправить время прихода/ухода с работы.
С этого обычно всё и начинается  smile 

Цитата(valentos @  18.9.2014,  09:52 Найти цитируемый пост)
изначально не хотел писать хранимую процедуру на сервере
Имхо самый лучший вариант как раз ХП на сервере.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 18.9.2014, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(valentos @  18.9.2014,  15:31 Найти цитируемый пост)
Ну вот после совещания мне и вынесли вердикт "Делай что хочешь, а в базе данных левого ничего не должно быть". 


хранимые процедуры и вычисляемы поля - это левое? smile

Добавлено через 4 минуты и 34 секунды
Цитата(Vas @  18.9.2014,  20:00 Найти цитируемый пост)
равильно, поэтому время начала сеанса и время окончания сеанса правильнее хранить в одной строке. Insert при входе и Update при выходе и пофигу хоть день, хоть сутки, хоть трое суток человек на работе провел.


А если человек выходит на обед?
А если по служебной необходимости выходит и входит.

Не сегодня, так завтра понадобится добавить ещё один контроллер. Непример посещение како-го режимного кабинета или цеха. Опять вход-выход.

Я бы сделал одно поле "Дата-Время" и там уже обозначал бы тип: вход/выход, а также номер контроллера, ID пользователя, ну и другие данные каки-то.
PM MAIL   Вверх
Vas
Дата 19.9.2014, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Akella @  18.9.2014,  21:02 Найти цитируемый пост)
А если человек выходит на обед?
А если по служебной необходимости выходит и входит.

Он это время и не работает, курит, обедает и т.д.


Цитата(Akella @  18.9.2014,  21:02 Найти цитируемый пост)
Не сегодня, так завтра понадобится добавить ещё один контроллер. Непример посещение како-го режимного кабинета или цеха. Опять вход-выход

Да хоть пятдесят контроллеров апдейтим строку с максимальным временем и все, добавить еще поля номера контроллеров не составит труда. Причем можно также войти в один, выйти в другой (два входа/выхода в цеху).
Зашли в цех с 10:30
Дошли до режимного объекта вошли в 10:50
Вышли из режимного в 10:45 следующего дня, обновили строку с макимальным временем входа и пустым временем выхода.
Вышли из цеха, обновили оставшуюся строку 
(индекс по чуваку + времени захода на таблицу вешаем)

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

P.S. варианты реализации еще зависят от конкретных задач, так что оба варианта пригодны. Что-то нас в оффтоп понесло

Добавлено через 47 секунд
Цитата(Akella @  18.9.2014,  21:02 Найти цитируемый пост)
А если по служебной необходимости выходит и входит.

Пусть контроллер перепрыгивает  smile 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

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


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1348 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.