powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
23 сообщений из 73, страница 3 из 3
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932896
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ёёёёё
Ответы обязательно должны учитывать твои заблуждения?

Если вы не можете помочь, то зачем вообще реагировать на топик ?
Расскажите как у вас устроено редактирование подобного (составного) поля в гриде.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932899
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
Потом пользователь становится на третью строчку и тоже меняет адрес, уже нужно помнить два значения, для второй и для третей строки ?

Создать на сервере функцию, возвращающую адрес по набору кодов;
вызывать с новыми значениями из полей датасета после их изменения / установки;
результат, только для отображения, записывать или в поле Address или "в соседнее" (тогда через GetDisplayText).
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932903
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus
результат, только для отображения, записывать или в поле Address или "в соседнее" (тогда через GetDisplayText).

Да как в него записать, если оно ReadOnly ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932909
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
Да как в него записать, если оно ReadOnly ?

добавь в запрос null as "соседнее_поле"
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932910
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Del
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932913
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus
добавь в запрос null as "соседнее_поле"

Добавил, но оно тоже ReadOnly.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932917
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,

У вас адрес - Lookup-поле? Или вы его физически протянули в НД? Т.е. грид у вас привязан к одному запросу, в т.ч. и поле "Адрес"?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932924
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45
Т.е. грид у вас привязан к одному запросу, в т.ч. и поле "Адрес"?

Грид привязан к датасету, поле Адрес - результат функции которая формирует текст по 4 значениям таблички (CITY_ID,STREET_ID,HOUS_ID,APPARTMENT_NUMBER)
Код: sql
1.
select *, dbo.ReturnAddress(EMPLOYEE_ID) as Address from Employee



У вас адрес - Lookup-поле?
Классический Лукап - это поле ID в исходном Датасете и отдельный Датасет с перечнем подстановочных значений.

У меня 4 поля в датасете и пятое Адрес - текстовая сборка с четырёх справочников.
Я на колонке Адрес повесил редактор cxButtonEdit, по нажатию кнопки выбираю новый Адрес, полученные 4 значения присваиваю в Датасет. Теперь нужно как то изменить текст в поле Адрес. Поле ReadOnly так как это результат функции.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932926
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
оно тоже ReadOnly.

Что мешает поменять для него эту настройку ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932931
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich

Код: sql
1.
select *, dbo.ReturnAddress(EMPLOYEE_ID) as Address from Employee



У вас адрес - Lookup-поле?

Классический Лукап - это поле ID в исходном Датасете и отдельный Датасет с перечнем подстановочных значений.

У меня 4 поля в датасете и пятое Адрес - текстовая сборка с четырёх справочников.
Я на колонке Адрес повесил редактор cxButtonEdit, по нажатию кнопки выбираю новый Адрес, полученные 4 значения присваиваю в Датасет. Теперь нужно как то изменить текст в поле Адрес. Поле ReadOnly так как это результат функции.

Т.е. на вход функции ReturnAddress передаётся идентификатор человека, а не адрес??? Тогда пока новый адрес не запишется в таблицу, откуда функция берёт значение - никак.

Вариант - править ReturnAddress (или делать новую функцию), чтобы она по адресу (идентификатор улицы, номер дома, квартиры) формировала строку, которую можно было вызвать на клиенте, передавая в неё новые данные. Тогда это поле (Адрес) можно сделать Lookup.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932935
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus
Что мешает поменять для него эту настройку ?

Код: pascal
1.
2.
3.
4.
Dataset['CITY_ID'] := NewCITI_ID;
Dataset['Address'] := NewAddres;
...
Dataset.Post; // тут на сервер полетит новое значение поля Адрес ?




goldmi45Вариант - править ReturnAddress (или делать новую функцию), чтобы она по адресу (идентификатор улицы, номер дома, квартиры) формировала строку, которую можно было вызвать на клиенте, передавая в неё новые данные. Тогда это поле (Адрес) можно сделать Lookup.
А Lookup по какому полю ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932941
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
Код: pascal
1.
2.
3.
4.
Dataset['CITY_ID'] := NewCITI_ID;
Dataset['Address'] := NewAddres;
...
Dataset.Post; // тут на сервер полетит новое значение поля Адрес ?


Для используемого датасета не существует возможности (путем собственно SQL) задать, какие именно поля полетят на сервер - ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932947
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ma1tus
Для используемого датасета не существует возможности (путем собственно SQL) задать, какие именно поля полетят на сервер - ?

Не знаю. Используется ADOQuery. Где можно задать какие поля полетят на сервер ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932953
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
goldmi45Вариант - править ReturnAddress (или делать новую функцию), чтобы она по адресу (идентификатор улицы, номер дома, квартиры) формировала строку, которую можно было вызвать на клиенте, передавая в неё новые данные. Тогда это поле (Адрес) можно сделать Lookup.

А Lookup по какому полю ?
При формировании lookup-поля задаются key fields и lookup keys. Т.е. можно по нескольким полям сделать lookup.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932969
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich, а вообще, можно сделать поле адрес - вычисляемым (calc) и в событии OnCalcField вычислять его по другим полям. Тогда будет то поведение, которое вы хотите: Вы будете устанавливать 4 поля адреса, эти 4 поля будут передаваться в процедуру, которая по ним будет возвращать строку адреса, и вот эту строку вы и будете отображать в гриде. Тогда при нажатии ESC вернутся старые значения полей.
Теоретически такое можно конечно сделать. Но если у вас в гриде будет 100500 человек, то будет 100500 запросов по адресу. И всё это ради того, чтобы пользователь имел возможность нажать ESC, если он увидел, что неправильно ввёл адрес до того, как этот адрес улетел на сервер.
И встаёт вопрос "зачем такое поведение"?

Сделайте процедуру, которая возвращает людей и их адреса
Field type commentEMPLOYEE_ID integer идентификаторEMP_FIO string ФИОCITY_ID integer к справочнику городовSTREET_ID integer к справочнику улицHOUS_ID integer к справочнику домовAPPARTMENT_NUMBER integerADDRESS string адрес
В гриде отображаете 2 поля - ФИО и адрес.
У поля адрес делаете кнопку "редактировать", по кнопке поднимаете диалог с выбором адреса. Как только пользователь выберет адрес (т.е. будут готовы все 4 поля), вы записываете этот адрес в базу. Потом делаете рефреш данных (или одной записи, если позволяет датасет) и позиционируетесь на запись, которую пользователь редактировал.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39932977
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45
При формировании lookup-поля задаются key fields и lookup keys. Т.е. можно по нескольким полям сделать lookup.

Тогда Датасет для Лукапа нужно построить не по всем возможным адресам, а только по тем которые есть в результирующем наборе ?

Получается, открываем запрос из EMPLOYEE, потом пробегаем по всему полученному датасету и складываем в отдельный Датасет для Лукапа поля 1+2+3+4 и Адрес. А на сервере формируем такое же комбинированное поле 1+2+3+4.
Код: sql
1.
2.
3.
select *, dbo.ReturnAddress(EMPLOYEE_ID) as ADDRESS, 
       CITY_ID+STREET_ID+HOUS_ID+APPARTMENT_NUMBER as LOOKUP_ID
 from Employee


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
begin
  EmployeeShow.Open;
  EmployeeShow.DisabledControls;
  while not EmployeeShow.EOF do
  begin
    if not LookupDataset.Locate('LOOKUP_ID',EmployeeShow['LOOKUP_ID'],[]) then
    begin
      LookupDataset.Append;
      LookupDataset['LOOKUP_ID'] := EmployeeShow['LOOKUP_ID'];
      LookupDataset['ADDRESS'] := EmployeeShow['ADDRESS'];
      LookupDataset.Post;
    end;
    EmployeeShow.Next;
  end;
  EmployeeShow.First;
  EmployeeShow.EnabledControls;
end;



Так ?
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933272
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
Простите, что поднимаю старый топик.
Прочитал пару раз, но решения так и не понял.

Есть набор данных, где одна из колонок Адрес - результат работы функции, которая собирает слова Город, Улица, Дом, Квартира в один стринг.
Код: sql
1.
2.
select *, dbo.ReturnAddress(EMPLOYEE_ID) as Address
  from Employee


Структура такая
Код: sql
1.
2.
3.
4.
5.
EMPLOYEE_ID integer,
CITY_ID integer,   -- к справочнику городов
STREET_ID integer, -- к справочнику улиц
HOUS_ID integer,   -- к справочнику домов
APPARTMENT_NUMBER integer



В гриде у этого поля (Address) редактор TcxButtonEdit
Пользователь нажимает на кнопку, открывается Дерево городов, раскрывая узел показываются улицы, далее номера домов.
Выбирая нужный адрес, возвращаются набор значений (CITY_ID,STREET_ID,HOUS_ID,APPARTMENT_NUMBER), на которые нужно поменять редактирумую строку, и каким то образом нужно изменить текст в колонке Адрес на вновь выбранный.
Подскажите, как это сделать.
Может нужно какой то другой компонент для редактирования в гриде ?


Я конечно извиняюсь, но у Вас лыжи в гамаке из-за неправильной организации данных в БД. У Вас нарушение 5 нормальной
формы, иными словами, судя по Вашему алгоритму действий, атрибуты, которые Вы пытаетесь хранить в таблице взаимозависимы.
Если HOUS_ID является последним элементом в Вашей иерархии, то в таблице храните только это значение, если-же последним элементом иерархии является номер комнаты, то достаточно в таблице хранить только уникальный индекс комнаты. Зная уникальный номер комнаты вы всегда можете восстановить (вычислить) и дом, и улицу и город.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933285
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zeon11
Зная уникальный номер комнаты вы всегда можете восстановить (вычислить) и дом, и улицу и город.

Хранить квартиры (впрочем как и дома) в отдельной табличке нет необходимости.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933305
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,

Тогда храни только улицы. После коммита ID улицы на сервер, вычитывай на клиента вычисляемое поле , напр. FullAddress,
где будут отражаться "Страна+Область+Город+Улица", ну и отдельными полями, если надо, дом и квартира
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933317
Petrashkevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
zeon11
Тогда храни только улицы. После коммита ID улицы на сервер, вычитывай на клиента вычисляемое поле , напр. FullAddress,
где будут отражаться "Страна+Область+Город+Улица", ну и отдельными полями, если надо, дом и квартира

Не важно что хранить. Важно понять(разработать) методику "составного Лукапа" и способ редактирования его в гриде.
Наверняка у каждого есть такой Лукап, но все почему то молчат как у них это реализовано
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933320
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как уже сказал кто-то выше, редактировать прямо в гриде на определенном жизненном этапе перестает казаться правильным :)
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933328
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich
zeon11
Тогда храни только улицы. После коммита ID улицы на сервер, вычитывай на клиента вычисляемое поле , напр. FullAddress,
где будут отражаться "Страна+Область+Город+Улица", ну и отдельными полями, если надо, дом и квартира

Не важно что хранить. Важно понять(разработать) методику "составного Лукапа" и способ редактирования его в гриде.
Наверняка у каждого есть такой Лукап, но все почему то молчат как у них это реализовано


У меня такой был, но потом потерялся в 90-х, за ненадобностью. Но если серьёзно хочется, то сделай маленькую формочку, которую вызывай по событию выпадающего списка какого-либо лукапа и передавай туда фокус ввода. Естественно положение этой формочки при отображении надо рассчитывать, чтобы она выглядела по-месту, как выпадающий список. На показ стандартного лукапа надо поставить заглушку. Ну, а в самой показываемой форме делай какие хочешь компоненты отображения, запросы, деревья и т.п.
...
Рейтинг: 0 / 0
Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
    #39933339
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrashkevich,
ещё, как вариант, сделать датасет в памяти, с ним резвиться, накатывать изменения, откатывать, и только когда пользователь созрел, отправлять данные на сервер.
А лучше, всё-таки, об этом уже тут говорили, сделать редактируемую карточку записи и пускай пользователь что хочет, то и делает.
...
Рейтинг: 0 / 0
23 сообщений из 73, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расскажите, как вы организуете редактирование связанных табличек (в гриде, например)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]