|
|
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Не могу в справке и в примерах найти, как сгенерировать запросы для таблицы. Подозреваю, что нужно использовать Код: pascal 1. здесь есть пример, пытаюсь разобраться http://forums.devart.com/viewtopic.php?p=80325&sid=1d80499992951ae5af6096aa9e904c8a#p80325 но там зачем-то нужно открывать набор данных О_о Как-то у FibPlus более понятней и проще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:42 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
А зачем? Это же внутренний код не для сторонних программистов. У DevArt есть собственная реализация ORM -- EntityDAC. Генерация и всё такое из коробки в пару строк кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:49 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDiА зачем? Это же внутренний код не для сторонних программистов. У DevArt есть собственная реализация ORM -- EntityDAC. Генерация и всё такое из коробки в пару строк кода. только на входе аццкое говно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:50 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecatorJaDiА зачем? Это же внутренний код не для сторонних программистов. У DevArt есть собственная реализация ORM -- EntityDAC. Генерация и всё такое из коробки в пару строк кода. только на входе аццкое говно. вЫходе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:50 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDi, ок, пусть внутренний, не трогаем его тогда как правильно сгенерировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:52 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Есть десяток однотипных справочников типа "id + name". Не создавать же 10 форм и/или 10 НД. Пользователь хочет отредактировать справочник типов или операций. Он выбирает, а программа уже генерирует запросы и отображает таблицу. На всё на это одна форма и один UniQuery. Странно, что примеров и справки нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:55 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Сомневаюсь. Как можно испортить элементарные запросы? Селекты да лефт джойны с условиями и сортировка. У меня 90% sql-кода такого. Остальное ORM уже не покроет и надо ручками писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:55 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11, Тут компоненты не нужны. Делаешь один универсальный справочник, где на входе передаешь имя таблицы и ID для выделения по умолчанию. Можно даже обычный TUniTable вставить, раз все поля одинаковые и нужно редактирование в списке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 16:59 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
тогда нужно ещё одно поле: Тип справочника ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:01 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
здесь http://forums.devart.com/viewtopic.php?f=7&t=30602 тоже предлагают использовать TDBAccessUtils.SQLGenerator ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:01 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11, так не надо ничего генерировать -- выше же написано, что куча однотипных справочников с ID и NAME. Т.е. разница только в имени таблицы: Код: pascal 1. Или вообще: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:09 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
При чем здесь имя? Мне нужно сгенерировать Insert, update, Refresh, Delete запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:11 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11, Во-первых, для TTable (TUniTable) никакие запросы генерировать не надо -- компоненты берут на себя все обязанности по работе с базой. Во-вторых, что тебе мешает сделать ОДИН универсальный справочник, подставить туда нужный запрос (см. выше) и при его создании заменять псевдо-таблицу на свою собственную? Код: pascal 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:18 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Сомневаюсь. Как можно испортить элементарные запросы? Селекты да лефт джойны лефт джойны вытягивают пол-базы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:25 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
не мешает, но я хочу понять, как правильно использовать SQL Generator пока получаю AV Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:29 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
почему людям лень писать простые SQl запросы ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 17:30 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecatorлефт джойны вытягивают пол-базы Ничего пол базы не вытягивает: Код: plsql 1. 2. 3. 4. 5. 6. Или речь про ORM идет? Дык, там тоже есть специальный режим с задержанной загрузкой, когда связанные данные грузятся лишь по требованию (например, загрузили список заказов, а данные о статусе заказа будут подгружены при обращении к этому полю или список позиций заказа или что-то еще -- всё это можно настроить). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:05 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecatorлефт джойны вытягивают пол-базы Ничего пол базы не вытягивает Inner Join вытягивает только совр\падающие по условию объединения записи, а Left Join вытянет все записи из таблицы слева, даже если нет совпадающих записей. Представь, в что в левой таблице миллиард записей, а в правой - всего сотня. Inner Join вытянет не более сотни записей, а Left Join - весь миллиард Аналогично для Right Join. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:09 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, так это ты сам должен строить запросы на данные, которые тебе нужны и нельзя заменять inner на left и при чем здесь миллиард? есть же where ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:17 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11defecator, так это ты сам должен строить запросы на данные, которые тебе нужны и нельзя заменять inner на left и при чем здесь миллиард? есть же where в случае Left Join твой Where ляжет на весь кортеж, а в случае Inner Join - только на записи, которые пришли по соединению. То есть на сотню, а не на миллиард ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:19 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, И что? Если по задаче нам надо вытянуть ВСЕ заказы, значит будут получены ВСЕ записи из таблицы orders: Код: plsql 1. 2. 3. 4. 5. 6. Если надо будет вытянуть ОДИН заказ -- запрос останется точно таким же с LEFT JOIN, добавится только условие WHERE: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Более того, именно JOIN-синтаксис и используется во всяких генераторах, т.к. на порядок проще для генерации нежели остальные виды записи типа SELECT * FROM a, b, c. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:20 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, И что? Если по задаче нам надо вытянуть ВСЕ заказы, значит будут получены ВСЕ записи из таблицы orders: Код: plsql 1. 2. 3. 4. 5. 6. Если надо будет вытянуть ОДИН заказ -- запрос останется точно таким же с LEFT JOIN, добавится только условие WHERE: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Более того, именно JOIN-синтаксис и используется во всяких генераторах, т.к. на порядок проще для генерации нежели остальные виды записи типа SELECT * FROM a, b, c. В первом случае Left лишний, так как судя по второму запросу, статус у заказов быть обязан, поле Not Null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:24 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Даже если статус может быть нулл -- то запрос останется точно таким же. Сначала отработает условие по основной таблице и, если запись под него попадает, будут запрашиваться все остальные. Т.е. в случае одного заказа будет одна строка из таблицы orders и одна строка из таблицы statuses. Что касается ORM'ов, то там это немного по другому сделано. Точнее, есть оба механизма: либо грузим одним большим запросом сразу все данные, в т.ч. и связанные; либо грузим только основную таблицу, а остальные подтягиваем при необходимости, в т.ч. с использованием кеша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:31 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Даже если статус может быть нулл -- то запрос останется точно таким же. Сначала отработает условие по основной таблице и, если запись под него попадает, будут запрашиваться все остальные. Т.е. в случае одного заказа будет одна строка из таблицы orders и одна строка из таблицы statuses. тогда зачем Left Join ? Для того, чтобы было ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:35 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Потому что так наглядно и просто... универсальная запись запросов, так сказать. А какой вариант у тебя (например, заказ со статусом, как выше)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:37 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Потому что так наглядно и просто... универсальная запись запросов, так сказать. А какой вариант у тебя (например, заказ со статусом, как выше)? Inner Join, это же очевидно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 18:41 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Во-первых, inner join не вернет запись с заказом, если у него статус пустой. Во-вторых, если статус всегда есть, то планы запросов аналогичные/похожие будут (что у left join, что у inner join). Так что по определению такие запросы (inner join) нельзя использовать в проектах -- есть большая вероятность нарваться на трудно определяемые баги, как-то "пропажа" записей, если вдруг начали менять логику базы (банально решили записывать ID без реальных ключей и случайно что-то удалили в сторонней таблице). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:00 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Во-первых, inner join не вернет запись с заказом, если у него статус пустой. Во-вторых, если статус всегда есть, то планы запросов аналогичные/похожие будут (что у left join, что у inner join). Так что по определению такие запросы (inner join) нельзя использовать в проектах -- есть большая вероятность нарваться на трудно определяемые баги, как-то "пропажа" записей, если вдруг начали менять логику базы (банально решили записывать ID без реальных ключей и случайно что-то удалили в сторонней таблице). Чтобы записи не пропадали, есть foreign key, а если записи пропадают, значит, целостность БД под угорозой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:08 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Бывают ситуации, когда невозможно поставить ключи. Например, необходимо хранить ссылку на сторонний документ (пример, документ-основание). И таких документов может быть большое количество и в разных таблицах. Но ссылку надо где-то хранить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:21 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, Да и банальное -- есть ссылка на документ-основание, а может и нет (т.е. null) -- и надо вывести номер и дату этого документа в дополнение к основной таблице. Как будет такой запрос записан без left join'а? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:23 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Бывают ситуации, когда невозможно поставить ключи. Например, необходимо хранить ссылку на сторонний документ (пример, документ-основание). И таких документов может быть большое количество и в разных таблицах. Но ссылку надо где-то хранить. Это зависит от уровня опыта проектировщика структуры БД. А в твоём конкретном примере проектировщика надо увольнять и через суд требовать компенсацию с его рукоблудия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:24 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
JaDidefecator, Бывают ситуации, когда невозможно поставить ключи. Например, необходимо хранить ссылку на сторонний документ (пример, документ-основание). И таких документов может быть большое количество и в разных таблицах. Но ссылку надо где-то хранить. Тогда это не база данных, а свалка данных. И на основании этого опыта давать глобальные рекомендации я бы постеснялся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:44 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
основной вопрос не решён а тему зафлудили ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2017, 19:50 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11 Код: pascal 1. есть проблема с утечкой памяти, скорей всего из-за TDAParamsInfo.Create(TDAParamInfo). Т.е. оно в момент генерации создается, но нигде, как я понял, не уничтожается Как это правильно утилизировать? вот текст ошибки: Unexpected Memory Leak --------------------------- This application has leaked memory. The leaks ordered by size are: 22: 2 x UnicodeString 30: 4 x CRAccess.TDAParamsInfo, 7 x UnicodeString, 2 x Unknown 38: 1 x UnicodeString 46: 4 x System.Generics.Collections.TList<System.Classes.TCollectionItem> 54: 19 x CRAccess.TDAParamInfo, 1 x UnicodeString 94: 2 x Unknown Как только я комментирую вызов процедуры генерирования SQL, то ошибки Unexpected Memory Leak нету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 14:18 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11, Код: pascal 1. 2. 3. 4. 5. 6. 7. Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 15:32 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
ну так и я могу... а это правильно? ведь после генерации запросов сам датасет будет же использоваться вдруг из-за такого кода что-то пойдет не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 15:41 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Я задал вопорос и на форуме тех.поддержки, но, как показывает практика, они там отвечают раз в неделю или вообще раз в месяц. У DevART тех.поддержка стала отвратительная. При том, что компоненты их весьма недешевые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 15:43 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11, Значит надо в потроха лезть и смотреть, почему этот ParamsInfo остается (и остается ли?) висеть в подвешенном состоянии. Или не использовать генератор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 17:46 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
они не дают исходников, вернее за исходники нужно платить в 2 раза бОльшую цену ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 18:56 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11 они не дают исходников, вернее за исходники нужно платить в 2 раза бОльшую цену ой, божечки-божечки, а то ты на ру-доске не зарегистрирован я тебя там очень часто вижу ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2020, 22:53 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, нету :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 09:19 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
DarkMaster Так? Перепроверил. Запрос генерируется, ошибок пока что не обнаружил. Пока оставлю этот вариант. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 09:51 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Капец... Генератор берет в оборот readonly-поля и добавляет их в Insert/Update запросы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 12:51 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
X11 Капец... Генератор берет в оборот readonly-поля и добавляет их в Insert/Update запросы а почему ты запросы руками не пишешь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 13:26 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Такой генератор я себе как-то делал. Лет 20 назад :) Типа экономил время при написании запросов, если таблица развесистая. Помнится мой еще и исходник куска кода генерил (заточенного под IBObjects). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 14:01 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Н-р в ФайрДАКе можно указать имя таблицы и ее ключевых полей. Чтобы генератор не ошибся в случае сложного селекта. При этом нельзя переименовывать алиасами ключевые поля. А для заранее неизвестного запроса нужно, чтобы имя таблицы было в одной строке с FROM, иначе не найдет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 14:11 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
defecator, 1. ну очень много полей. (программа по работе с разного рода объявлениями). 2. генераторы реально упрощают работу. 3. зачем писать 3-5 на 99% одинаковых запросов. 4. не всегда угадаешь на стадии разработки - какой запрос будет в тот или иной момент. 5. на форме можно держать 1-2 датасета вместо 5-10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 14:33 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Самый лучший генератор был в FibPlus. В UniDAC перед генерированием нужно обязательно: - отключить SmartFetch; - открыть датасет. В UniDAC некоторые readonly-поля всё равно попадают update/insert сгенерированные запросы. Уважаемые разработчики UniDAC, возьмите функционал/идеи из FibPlus и сделайте нормальные, человеческие генераторы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2020, 14:40 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Метод GenerateSql изначально разрабатывался для внутреннего использования. Он вызывается при выполнении DML-операций в наших датасетах и "заточен" исключительно под эти операции. Мы вообще не рассматривали возможность использования этого метода пользователями. Да, в случае сложных SELECT определённые недочёты в его работе могут быть, но в 99.9% случаев это перекрывается использованием свойств SQLInsert/SQLUpdate, которые специально предназначены для таких случаев. Что касается ситуации, когда в автоматически сгенерированный запрос попадают readonly-поля: это, безусловно, может быть нашей ошибкой. Обратитесь, пожалуйста, на наш форум с примером запроса, на котором возникает такое поведение, и мы постараемся разобраться в ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2020, 14:33 |
|
||
|
Unidac SQLGenerator
|
|||
|---|---|---|---|
|
#18+
Да у вас там на форуме раз в месяц отвечают. Техподдержка скатилась ниже плинтуса, а цена на компоненты не скатилась. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2020, 14:43 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2037549]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 441ms |

| 0 / 0 |
