Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > пользователя привязать к определенным полям access


Автор: SULLEN_27 6.9.2010, 08:49
Драсьте. Подскажите в одном вопросе чот никак не догоню как реализовать это дело. В общем есть база access которая лежит на сетевом ресурсе, к ней имеют доступ определенные юзера которые соответственно работают с этой базой заносят изменения, чот там добавляют и т.п.. Ну соответственно реализовал все это на delphi через ado, datasource, table - ну вся эта байда. Вопрос в следующем. Каким образом сделать так, что бы допустим заходит человек под своим логином и паролем в свою программу и что бы видел в этой общей базе т.е. в dbgrid только те сведения которые относятся к нему. и точно так же со следующим юзером ага типа зашел вот он под этим логином и соответственно в dbgrid отобразились поля только относящиеся к нему. допустим с аутентификацией пользователя я разберусь, а вот вот как  сделать сделать привязку полей на определенного пользователя не пойму не фига? подскажите пож... Только sql не предлагайте.

Автор: aleksh 6.9.2010, 14:24
м-да, если не предлагать sql, то можно столбцы делать невидимыми. какие столбцы делать невидимыми можно хранить там же где и настройки профиля (тот же пароль)

но sql лучше, опиши задачу подробней, подскажем как запрос составить

Автор: Данкинг 6.9.2010, 14:44
Сделать отдельную табличку, в которой прописывать права каждого пользователя.

Автор: pseud 6.9.2010, 16:45
Цитата(Данкинг @  6.9.2010,  14:44 Найти цитируемый пост)
Сделать отдельную табличку, в которой прописывать права каждого пользователя. 

и динамически формировать SQL ))))
Без SQL увы - будет очень сложно (ну или просто "сложнее").

Вриант решения:
2 таблицы. 1 - таблица ролей. 2 таблица пользователей. Можно еще 3 таблицу - пользователь/роль, если планируется что одному юзеру 5 колонок отражать, второму - другие 5, третьему - все 10.

В таблице ролей заводим поле "Columns". Где пишем состав полей: "clm1,clm2,clm3,clm4,clm5"
Ну иформируем SQL исходя из ролей.
Вот как быть с формированием колонк в Гриде. 
Можно, например, в дизайне не создавать колонок. Тогда грид будет отражаться в колонках все пришедшие поля.

Автор: Данкинг 6.9.2010, 17:28
Цитата(pseud @  6.9.2010,  17:45 Найти цитируемый пост)
и динамически формировать SQL ))))

В смысле? Я имел в виду, что скрывать/показывать колонки в гриде в зависимости от прав доступа.

Автор: okkonst 6.9.2010, 18:30
Без детального описания задачи (на языке бизнес-процесса, к примеру: надо создать список клиентов, который имеет набор атрибутов, зависящий от пользователя БД, чтобы разные менеджеры могли исправлять разные поля. Пример "навскидку", без претензии на разумность) посоветовать что-то конкретное сложно. Вернее, можно четко ответить на поставленный вопрос (как сделано выше), но есть большая вероятность того, что вопрос задан неправильно (пример: "Как выбить болт из гайки?" - от человека, не знающего о существовании гаечных ключей) и на самом деле нужно совсем другое. Просто я, как преп, постоянно сталкиваюсь именно с такой ситуацией. Поэтому присоединяюсь к просьбе, обращенной к автору треда, подробнее рассказать о проблеме - зачем понадобилось такое техническое решение? Поскольку вариантов много - хранить список соответствия полей и пользователей в бд, реестре, внешнем файле, самой программе (коде); не исключен и вариант неправильного проектирования БД...

Автор: SULLEN_27 6.9.2010, 19:31
Спасибо конечно, что хоть откликнулись на мой вопрос. В общем я еще чуть подумаю, если не надумаю,  то опишу задачу детально по полочкам, может тогда и  разберемся.

Автор: SULLEN_27 6.9.2010, 20:23
Ладно, сча детально описывать не буду пока, задам вопрос по короче и по точнее, мож и на мысль вас какую наведет. 

  Вопрос.
   
     Есть форма, на форме расположены компоненты (описываю только виз. компоненты)
     Dbgrid, checkbox - 2 шт., button. И сделать так: ставлю галочку на одном из checkbox жму  на   кнопку и отображаются только те поля, в котором хоть в одном поле стоит фамилия Иванов И.И. (допустим поле с Ф.И.О - это пусть будет 2 столбец, а их там много много всяких фамилий и именов, а мне вот так раз и опа... отобразились поля только с фамилией Иванов И.И. ) соответственно все остальные поля не видимы были, причем не только не видимы а что бы они вобще в Dbgrid не подгружались, ну фиг с ним пусть даже и  подгружаются. А потом ставлю галку на другой checkbox,  жму на кнопку и отобразились поля где фигурирует фамилия Сидоров А.А., вернее конечно здесь использовать вместо checkbox  RadioButton.      

|-----------------------------------------------------------------------------------------------------------------
|    1   |  Сидоров | зам.нач.     | 35 лет | казел           |                        |                           |
|----------------------------------------------------------------------------------------------------------------           |         | Иванов   |  начальник  |40 лет | норм. мужик|                        |                           |                  |    2   |                |                     |                                  |                        |                           |
| ---------------------------------------------------------------------------------------------------------------    
И раз так и все поля допустим которым 40 лет и отобразил, а всех остальных нафиг от сюда, ну и нумерция соответственно должна измениться. Ну это так я нарисовал примерно, база то у меня другая конечно и access замечу.

Добавлено через 1 минуту и 8 секунд
Ой блин чот предварительный просмтор не сделал и все сместилось. ну фиг с ним поймете.

Автор: okkonst 6.9.2010, 22:55
Нифига я не понял. 

Цитата

и отображаются только те поля, в котором хоть в одном поле стоит фамилия Иванов И.И. 


Может, все-таки, не поля, а записи? То есть, отображаются те записи, в полях которых присутствует иванов и.и.? Если так - смотри на свойство filter датасета или генери sql с соответствующим условием. Если же тебе надо прятать поля (то есть КОЛОНКИ грида), в которых ни в одной записи нет искомого текста, тут сложнее. Я бы сделал так: спрятал бы все колонки, затем:

MyDataset.DisableControls;
MyDataset.First;
while not MyDataset.eof do
begin
  for C:=0 to dbgrid1.Columns.Count -1  do
    dbgrid1.Columns[C].Visible := dbgrid1.Columns[C].Visible or (Pos('Иванов И.И.', MyDataSet.FieldByName(dbgrid1.Columns[C].FieldName).AsString)>0);
  MyDataset.Next;
end;

MyDataset.EnableControls;

На всякий случай - указанный поиск регистрозависим. MyDataSet - это твой компонент доступа к данным, вероятно, TADOTable (бросил бы каку, а?)

Автор: Deniz 7.9.2010, 05:13
ТС явно путается в полях и записях.
SULLEN_27, перейди в объяснениях на строчки и столбцы.

Автор: SULLEN_27 7.9.2010, 10:16
Да. Не поля а записи. Не правильно изложил.

Автор: pseud 7.9.2010, 10:29
Цитата(SULLEN_27 @  7.9.2010,  10:16 Найти цитируемый пост)
Да. Не поля а записи. Не правильно изложил. 

всего-то.
определяйся, короче.

Автор: SULLEN_27 7.9.2010, 10:29
Существует n кол-во пользователей у которых установлена клиенсткая программа для работы с общей базой acceess. Каждый из пользователей формирует заявки на ремонт в службу ИТ (в этой общей базе). Так вот и требуется что бы каждый пользователь видел в своей клиентской программе только свои заявки. В каждой заявке сформированным пользователем, автоматически в поле заносится запись т.е.  его имя пользователя в сети. Так вот и думаю что по имени пользователя и делать выборку именно его записей из общей базы (что бы только свои заявки видел в DBGRID). Ну а у меня стоит админская часть программы - которая то же работает с этой же базой что и пользаки, ток я там вижу все принятые заявки удаленные и т.д. Вот впринципе и все.

Автор: pseud 7.9.2010, 10:35
Код

select 
  *
from
  t_claim c
where
  :v_id_user = 1 
  or c.id_user = :v_id_user

1 - id админа

Добавлено через 50 секунд
вместо table пользуй query

Добавлено через 1 минуту и 31 секунду
админу вывалятся все заявки, а простому смертному только его

Добавлено через 2 минуты и 9 секунд
вобщем можно обойтись без динамического формирования SQL

Автор: SULLEN_27 7.9.2010, 10:47
Если честно, то с qvery не работал да и с SQL не очень я. Да. Наверное лучше бы без динамического формирования SQL. Просто я не пойму SQL Qvery и база access разве все это вяжется между собой. Ведь qvery на сколько я знаю этот компонент вяжется в основном с SQL. мне бы то что хорошо работает с access.

Добавлено через 1 минуту и 3 секунды
Хотя честно, то нужно сесть и почитать по внимательней на всю эту тему.

Автор: pseud 7.9.2010, 10:59
Цитата(SULLEN_27 @  7.9.2010,  10:47 Найти цитируемый пост)
Хотя честно, то нужно сесть и почитать по внимательней на всю эту тему. 

Нужно всего-то заменить TADOTable на TADOQuery.
Поверь, это не больно. Потом спасибо скажешь  smile 

Автор: Данкинг 7.9.2010, 11:16
Цитата(SULLEN_27 @  7.9.2010,  11:47 Найти цитируемый пост)
Просто я не пойму SQL Qvery и база access разве все это вяжется между собой. Ведь qvery на сколько я знаю этот компонент вяжется в основном с SQL. 

Сам понял, что сказал? smile 
select * from TABLE1 работает в любой СУБД. smile 

Автор: Deniz 7.9.2010, 11:59
Цитата(SULLEN_27 @  7.9.2010,  12:47 Найти цитируемый пост)
Хотя честно, то нужно сесть и почитать по внимательней на всю эту тему.
вот это самая умная мысль.

Автор: SULLEN_27 7.9.2010, 21:11
Ладно спасибо вам конечно за ответы. Я впринципе и сам бы всю эту тему догнал. Только время нужно. Книг полно на эту тему. Если честно, лень читать. Я сколько раз убеждался в том, что допустим задашь какой нибудь вопрос, вроде бы тебе и отвечают и может даже и правильно, но все равно неясности много остается. Пока книгу не откроешь не прочитаешь всю эту тему самостоятельно, только тогда догоняешь что то.

Автор: okkonst 8.9.2010, 17:24
Динамический SQL тут нафиг не нужен, это раз. Меняешь значение параметра и переоткрываешь датасет - все. Если ломает - можно и TTable, у него есть свойство filter (с критерием фильтрации) и filtred - включить/выключить фильтрацию, которыми ты решишь свою проблему полностью. 

Автор: SULLEN_27 8.9.2010, 17:42
Понятно все. Сча буду эксперементировать. спасибо.

Автор: SULLEN_27 14.9.2010, 19:08
Ну все впринципе спасибо. Разобрался. Сделал фильтр и норма.

Добавлено через 33 секунды
благодарствую

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)