pavlenko.vladimir.v, спасибо!
Хотя, конечно, помучался пока понял как это заставить работать.

Есть необходимость прогнать процесс через несколько форм.

Form1.Show;
Form2.Show;
Form3.Show
etc
Выходные результаты каждой формы являются входными для следующей.
Как затормозить работу программы до закрытия выполняемой формы?

Можно, конечно, while boolean =0 do delay=500 со взводом флага по закрытию формы (событие OnExit), но опять эти прыжки по коду....
Может есть какой-то параметр типа WindowState = Close?

Просто сразу не въехал, что в подзапросе   именно таблица х определяется как алиас, можно же прочитать и так
(select max(x2.id) from x) as x2, но тогда всплывает рекурсия...

Кроме того, пусть я ещё не постиг смысл конструкции x2.id и y2.id, но есть какое-то смутное ощущение, что я как-то до этого должен определить, что значение x2 является последним для линка z1, а  y2 - для линка z2.  Но если у нас появится (а оно появится) значение x5 для линка z1, или y5 для линка z2, то что, переделывать запрос?

k245 wrote:

идея такая:

select *
from z
left join x on  x.id = (select max(x2.id) from x as x2 where x2.id_z = z.id )
left join y on  y.id = (select max(y2.id) from y as y2 where y2.id_z = z.id )

Возможно, это какие-то тонкости языка SQL, которых я не постиг (напоминаю - я новичок)
Но из синтаксиса этого запроса x2, y2 - это какие-то временные таблицы (которые ещё непонятно как сформированы)
А из скрина следует, что это просто данные таблиц x и y. (Да из синтаксиса следует , в общем, то же самое)
Какой-то дуализм из квантовой физики

идею не бросил, вот до чего додумался, главное - работает:

SELECT z.z,
               a,
               b,
               c,
               d,
               MAX(id) as id

FROM (SELECT x.a as a,
                           x.b as b
                           y.c as c,
                           y.d as d,
                           x.z_id as z_id,
                           MAX(x.id),
                           y.id as id
             FROM x, y
             WHERE x.z_id=y.z_id
             GROUP BY x.z_id (можно y.z_id, один фиг),  y.id)

LEFT OUTER JOIN z ON z_id=Z.id

GROUP BY z.id

sparrow wrote:
netros wrote:

Я за 2 недели чего только не прочитал, не перепробовал...

На мой взгляд дело не в очень корректной работе оператора GROUP BY в SQLite/

Просто не первый раз сталкиваюсь с тем, что оператор должен бы сработать одним образом (ну так пишут в книжках), а на выходе имеем немного не то.


Ну хватит... не смешите народ.
Кстати Microsoft, GOOGLE и другие гиганты не жалуются на работу GROUP BY в SQLite. Может не знают про проблемы.


при работе с аггрегатными функциями существуют определенные правила для столбцов в SELECT и GROUP BY.

Ну что тут сказать...

Не знаю как GOOGLE,  а вот  что Microsoft, Oracle, IBM  и другие гиганты не используют SQLite, а предпочитают свои базы данных - это факт.

И, кстати, на Acsess мне удалось добиться результата без особых проблем....

sparrow wrote:

Улыбнуло
Вокруг столько литературы, сайтов, примеров ...


Кстати вы привели пример CROSS JOIN даже не подозревая об этом.

Ну почему же не подозревая? :-)

Я за 2 недели чего только не прочитал, не перепробовал...

На мой взгляд дело не в очень корректной работе оператора GROUP BY в SQLite/

Просто не первый раз сталкиваюсь с тем, что оператор должен бы сработать одним образом (ну так пишут в книжках), а на выходе имеем немного не то.

sparrow wrote:

Спасибо.
А как на счет INNER ?


Ой догадался они без иерархии , они равнозначны. Правильно ?

Они в иерархии, но на одном уровне, просто как бы в разных ветках от Z

sparrow wrote:

Спасибо.
А как на счет INNER ?

INNER объединяет только те данные, которые есть в обеих таблицах, X и Y. В моём случае это не обязательно, поэтому эти данные выпадут из выборки, а они мне нужны. В этом случае сработал бы FULL JOIN, но его опять же нет. Но конструкция
SELECT *
FROM X,Y
на мой взгляд даёт почти тот же результат

Хотя сейчас начал понимать идею к245, но боюсь не сработает.
Даже задумался, не сделать ли всё на Acsess`e.

sparrow wrote:
netros wrote:

...таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, ...


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

Есть такой момент, возможно условный, таблицы, которые имеют связь с другой таблицей, считается, что они находятся справа от этой таблицы и подключаются оператором RIGHT JOIN. Т.е. одному значению таблицы СЛЕВА соответствует несколько значений из таблицы СПРАВА. Иерархия называется. Оператор LEFT JOIN подключает таблицы более верхнего уровня, а RIGHT JOIN -более низкого. Для примера: относительно таблицы НОМЕР
-
ТИП - Модель - (LEFT JOIN) - НОМЕР - (RIGHT JOIN) - ПЕРЕМЕЩЕНИЕ

Кстати, а зачем ещё загружать и таблицу Z?
Ведь те же данные есть в таблицах x и Y?
Ведь так вывод возрастёт ещё на порядок. (Ну до срабатывания WHERE)

Спасибо,  sparrow, тут есть над чем подумать, проверю.

Для К245 - к сожалению таблицы X и Y находятся СПРАВА, поэтому LEFT JOIN не проходит.

У таблицы Z слева ещё есть справочники, просто я не стал  усложнять вопрос :-)

Помогите начинающему, уже всю голову сломал.
Есть 2 таблицы, независимые друг от друга, но связанные по одному параметру с третьей таблицей.
т.е. X.id_Z = Z.id  и Y.id_Z = Z.id/

Нужно свести данные из этих 2 таблиц в одну и выбрать строки с максимальными id из каждой таблицы (одновременно) для каждого элемента из таблицы Z. Проще всего было бы объеденить эти таблицы через RIGHT JOIN от таблицы Z, но... в SQLite он не работает.

Наиболее близки результат даёт вот это:

SELECT Z.Z,
              .....,
              .....,
              MAX(Y.id),
              MAX(X.id)
FROM X, Y

LEFT OUTER JOIN Z ON X.id_Z = Z.id

WHERE X.id_Z= Y.id_Z

GROUP BY Z.id

Для полей X.id и Y.id всё срабатывает как надо, но вот для остальных полей данные подтаскиваются из совершенно левых строк, а не из соответствующих условию.

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

Как уже ни крутил, даже через временные таблицы пробовал - нужного результата не добился.
Может у кого идеи есть.

16

(4 replies, posted in Russian)

k245, спасибо.
Я уже и сам подумывал о временной таблице.
Только вот как сделать, чтобы таблица была именно временной?
Пока приходится пристреливать DROP'ом...

17

(4 replies, posted in Russian)

Подскажите, как можно экспортировать грид (именно грид!) с результатами в FastReport
SQL-отчёт не проходит, так как грид формируется скриптом на основе другого грида, в который выводится запрос.
Ну или как вариант подойдёт экспорт в Exel, но мне нужно, чтобы в Exel можно было в заголовок добавить данные из DateTimPicker'ов и текстовку.

18

(5 replies, posted in Russian)

Блин, не могу понять, почему по запросу
s := VarToStr(SQLExecute('SELECT * FROM Table'));
выводится только первое поле? Неужели каждое поле придётся вытягивать отдельным запросом?
И какой используется сепаратор строк?

Спасибо. Но не работает.
Не определён тип TNxTextColumn.

Не совсем.
Нужно что-то типа
TableGrid.AddRow() только для столбцов
TableGrid.Columns.Add и  TableGrid.AddColumns не срабатывают

Извиняюсь, конечно, но нигде не нашёл ответа на вопрос:
Как указать количество столбцов в Гриде, или добавить столбец?

22

(5 replies, posted in Russian)

Уже всю голову сломал.
Как SQL-запрос запихнуть в двумерный массив, и какого типа.

если

var Array: array of extended;
begin
Array := SQLExecute('SELECT * FROM Table');
for i := 0 to iCol do
    begin
    TableGrid.Cells[0, i] := VarToStr(Array[0,i]);
    TableGrid.Cells[1, i] := Array[1,i];
    end;
end;

то без ошибок выдаёт пустое значение.

а если

var Array: array of string;
begin
Array := SplitString(VarToStr(SQLExecute('SELECT * FROM Table')), '|');
for i := 0 to iCol do
    begin
    TableGrid.Cells[0, i] := Array[0,i];
    TableGrid.Cells[1, i] := Array[1,i];
    end;
end;

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

И ещё вопрос вдогонку
Можно ли в грид вставить CheckBox? не "Нет", "да", а именно чекбокс?

Спасибо большое!

Неплохо бы в справку добавить описание и остальных функций, используемых в программе.
А не только относящихся к визуальным объектам.

Подскажите, как создать файл, с последующей записью в него текстовой переменной, не из базы.
А то в версии 1,46 нет функций CreateFile или SaveFile. SaveFileFromDatabase немного не то.