Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
1

Настройка Lookup

04.08.2022, 12:01. Показов 1047. Ответов 13

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вопрос вроде детский, но, то ли старость, то ли звезды криво стоят, но, не могу сообразить.

Есть master таблица, компонент tSrc:
SQL
1
2
3
4
5
6
7
8
CREATE TABLE DT15(
id      dom_pk PRIMARY KEY,
docs_id dom_fk NOT NULL REFERENCES docs(id) ON DELETE cascade,
tovar_id    dom_fk NOT NULL REFERENCES sp_tovar(id),
qty     DECIMAL(12,5),                    /*кол-во*/
edizm_id   dom_fk NOT NULL REFERENCES rEdIzm(id),
koef            DECIMAL(8,3),                    /*коэффициент единицы измерения*/
percent     DECIMAL(8,4))
и detail таблица, компонент tEdIzm:
SQL
1
2
3
4
5
CREATE TABLE rEdIzm(
id      dom_pk PRIMARY KEY,
tovar_id    dom_fk REFERENCES sp_tovar(id) ON DELETE cascade,
name    VARCHAR(10) CHARACTER SET UTF8 NOT NULL,
koef        DECIMAL(12,5))
Создаю lookup поле EdIzm_Name в tSrc со следующими свойствами:
Delphi
1
2
3
4
5
6
F.FieldKind := fkLookup;
    F.DataSet := tSrc;
    F.LookupDataSet := tEdIzm;
    F.LookupKeyFields := 'ID';
    F.LookupResultField := 'NAME';
    F.KeyFields := 'EDIZM_ID';
У tEdizm в поле DataSource указываю dsSrc, который использует tSrc.
Delphi
1
2
3
4
5
tEdIzm.SQL.Text := 'SELECT ID,NAME FROM rEdIzm WHERE TOVAR_ID=:TOVAR_ID';
tSrc.SelectSQL.Text := 
  'SELECT D.ID,D.DOCS_ID,D.TOVAR_ID,T.NAME as TOVAR_NAME,D.EDIZM_ID,D.KOEF,D.QTY'#13 +
  'FROM DT15 D LEFT JOIN SP_TOVAR T ON(T.ID=D.TOVAR_ID)'#13 +
  'WHERE D.DOCS_ID=:ID';
Т.е. все настроено по классике, но в результате, колонка единиц измерений, пустая. А если начать редактировать, то выпадающий список правильный. Проблему видно на скиншоте. Там в углу, "отладочный" DBGrid, чтоб видеть, что tEdIzm выбирается правильно, и поля имеют правильные значения.

Предположение такое: единицы измерений пустые, потому что на момент вычисления lookup поля, подчиненная таблица выбрана для другой строки. Решить можно было бы, отобрав нужные единицы для всех товаров, но тогда при редактировании, они ВСЕ будут вываливаться в выпадающем списке, что не правильно. А иначе, редактирование правильное, но lookup пустые.

Эх, по моему, сумбурно объяснил, но, как смог. Помогите!
Миниатюры
Настройка Lookup  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2022, 12:01
Ответы с готовыми решениями:

Lookup
LookRes:=DM.Priem_DB.Lookup('TypeP; NameP; ArcticP; DateP; Kol_voP; Cena', VarArrayOf(), ...

2 зависимых lookup
здравствуйте подскажите пожалуста как реализовать и ли стратегию или вообще пример даже лучше у...

Lookup field
у меня такой вопрос появился:можно ли сделать так,чтобы лукап поле заполняло несколько полей при...

Фильтрация + LookUp
Здравствуйте. Скажите пожалуйста как сделать фильтрацию по LookUp полю. Заранее спасибо. Вот не...

13
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
04.08.2022, 12:21 2
на первый взгляд все верно
видимо, есть какая-то недосказанность
0
3586 / 2195 / 693
Регистрация: 29.05.2013
Сообщений: 9,375
04.08.2022, 12:59 3
Смущает меня вид вашего грида, а точнее первая колонка с нумерацией. Это явно нестандартное решение, возможно копать надо там где это рисуется. Значение ID у вас довольно длинное и вполне может просто не влезать в поле и это тоже может как-то неожиданно повлиять. Часто бывает, что в дизайнере создают колонки грида и забывают об этом меняя структуру датасета, что приводит к разным сюрпризам при отображении.
0
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
04.08.2022, 15:43  [ТС] 4
Это обычное calculated поле, в DataSet.OnCalculated
Delphi
1
DataSet.FieldByName('LINE').AsInteger := DataSet.RecNo;
в гриде ему назначен другой цвет. Грид рисуется стандартно, и сам стандартный. Даже без единого обработчика, пока.

В данном случае, все колонки и в датасете и в гриде создаются динамически при выполнении, а не через инспектор при проектировании

Добавлено через 11 минут
Даже не знаю, что сказать. Попробую так:
база Firebird 3.0.7
компоненты модифицированные IBX
среда Lazarus 2.2
0
Модератор
3629 / 2150 / 759
Регистрация: 15.11.2015
Сообщений: 8,631
04.08.2022, 16:06 5
lordgray, так у вас Lazarus или Delphi?
0
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
05.08.2022, 09:31  [ТС] 6
Изначально Lazarus. Заподозрил, вдруг дело в нем, или в модифицированных под две транзакции, IBX. Накидал тестовый проект на Delphi XE5. Все компоненты родные! Результат тот же.
Прилагаю скриншот, и тестовый проект на Delphi XE5 с базой Firebird 3.0.7
Миниатюры
Настройка Lookup  
Вложения
Тип файла: zip Test.zip (5.54 Мб, 5 просмотров)
0
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
05.08.2022, 10:33  [ТС] 7
Есть сдвиг: если в
Delphi
1
2
3
4
tSrc.OnAfterScroll(DataSet: TDataSet);
begin
  Dataset.Refresh;
end;
то начало в текущей строке выводить единицу измерения. Прогресс! Похоже, какой то косяк в IBX. Жаль, придется решать через ж...
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
05.08.2022, 16:35 8
ну я вас умоляю
если бы фреймворку был год, можно говорить, что малоличо
если фреймворку 20 лет, то косяк в IBX - это ну уж точно нонсенс
ясно что проблема на стороне программиста

и ессно - это так

т.к. 100 лет отказался от IBX в пользу FIBPlus, мне пришлось воспроизвести ваш пример на FIBPlus
собсно сразу - Query не заменит датасет, поэтому пусть tEdIzm тоже будет Dataset
а второе - у вас собрана схема мастер-деталь на Datasource
и EdIzm подключено к dsSrc, т.е. должно содержать только те значения, которые СВЯЗАНЫ с текущей записью tSrc
ЭТОТ ЖЕ датасет - источник значений для Lookup поля в том же tSrc
круг замкнулся
хорошо, что не в бесконечность а в ноль.

мораль
для всего, чем собираетесь пользоваться, понадобится ОТДЕЛЬНЫЙ датасет

мораль 2
оставили бы вы стюардессу в покое - не откапывая
этот подход к построению программ был актуален в 2000
и несет с собой многовато боли
не зря от него потихоньку отказались ((
гриды, мастер-деталь, и все такое - в конце концов все равно все "автоматическое" будете переписывать на "ручное"
лучше делать это прямо сейчас

ну и если все-таки будете делать Клиент-сервер, рекомендую библиотеку доступа либо современный FireDAC
либо FIBPlus, который с тех пор не стал хуже, только осиротел и сейчас его можно свежий забрать на GitHub
В одном из проектов я его до сих пор вполне успешно использую, параллельно мигрируя на WEB API к той же базе
0
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
08.08.2022, 09:18  [ТС] 9
Цитата Сообщение от krapotkin Посмотреть сообщение
у вас собрана схема мастер-деталь на Datasource
и EdIzm подключено к dsSrc, т.е. должно содержать только те значения, которые СВЯЗАНЫ с текущей записью tSrc
ЭТОТ ЖЕ датасет - источник значений для Lookup поля в том же tSrc
круг замкнулся
хорошо, что не в бесконечность а в ноль.
мораль
для всего, чем собираетесь пользоваться, понадобится ОТДЕЛЬНЫЙ датасет
Так, что то я не понял. tEdIzm и есть отдельный датасет, он исключительно для lookup поля. Судя по всему, Вы увидели ошибку, но я так и не понял, в чем она
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
08.08.2022, 09:23 10
Цитата Сообщение от lordgray Посмотреть сообщение
есть отдельный датасет
я описал проблему же - он подключен как деталь к dsSrc
это значит, что при каждом перемещении по tSrc он заново переоткрывается и фильтруется
0
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
08.08.2022, 09:25  [ТС] 11
Я правильно понял, Вы намекаете, что, tEdIzm выбрав значения для текущей записи, теряет значения для остальных, по этому там и пусто? Если да, то я думал об этом. Но ведь DBGridу, для прорисовки строк, нужно пройтись по ним, соответственно, на момент прорисовки строки, она будет текущей, и tEdIzm будет содержать нужные значения. В чем я ошибаюсь? Какя разница, что он потеряет значения для других строк, они же уже выведены.
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
08.08.2022, 09:31 12
Лучший ответ Сообщение было отмечено lordgray как решение

Решение

поставьте точку останова в OnAfterScroll а потом в OnCalFields для tSrc
посмотрите, в каком порядке вызываются эти обработчики
в первом - датасет edIzm фильтруется, во втором - в нем ищутся через Locate нужные значения
как вы найдете там другие значения, если только что отфильтровали его, чтобы он содержал только одно ???
1
0 / 0 / 0
Регистрация: 04.08.2022
Сообщений: 7
08.08.2022, 09:41  [ТС] 13
Я в шоке. Сначала OnCalc, потом AfterScroll. Н-да. Придется менять идеологию. А ведь так все хорошо казалось. Смущал только один нюанс: если документ в 10000 строк (ревизия,ввод остатков, переоценка), то будет и 10000 запросов, что нормально отработает только при локальном соединении. Ладно, буду думать. Точнее, идея уже есть.
Спасибо, помогли!
0
5786 / 4528 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
08.08.2022, 09:58 14
нет
для лукап поля все вычитывается разом и потом гоняет Locate
вот для master-detail переоткрытие идет на каждое перемещение по master - таблице

Добавлено через 51 секунду
но делать мастер-деталь для 10000 строк это безумие. кому это смотреть??
0
08.08.2022, 09:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.08.2022, 09:58
Помогаю со студенческими работами здесь

Поиск в LookUp
Есть созданное поле LookUp, нужно сделать поиск по этому полю, не получается. делаю через...

Lookup-поля
Почему не получается выбрать два lookup поля одновременно, если выбираю ФИО 2-го спортсмена слетает...

Lookup поля
Здравствуйте. Создал lookup поля, можно ли в DBGrid убрать всплывающий список.

Lookup поля
Здравствуйте, есть БД в Access, подключена к Delphi, таблицы подключены через ADOTable и в DBGrid...

Lookup fields
Беда, товарищи! В этом деле уж совсем новичок, местами сильно тормозящий... не судите строго....

LookUp в Query
Можно ли в Query реализовать LookUp?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru