Страница 1 из 2
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 11:53
kreator
Хочется типа очередь:
Код: Выделить всё
LOC:Queue QUEUE,PRE()
LOC:Date DATE
LOC:Quantity LONG[1000]
END
Но вот массив в 1000 элементов хочется сделать плавающим, может 10, может 100. Можно ли в принципе (через new)? Или не заморачиваться, заложить побольше на всякий случай? Память не экономить?
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 12:03
Shur
Хитрая задачка. Только наиболее эффективно она решается не при помощи new(), а при помощи создания одной единственной таблицы с полями date и long и ключом по date -- давайте всё же не забывать, что у Клариона где-то совсем сбоку прикручены базы данных. Шучу.
На самом деле вопрос -- зачем так сложно?
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 12:13
Shur
И я уже не спрашиваю про "вытягивание" такой концепции в простую очередь с неуникальным date. Для удобства можно добавить ID внутри одной даты, если нужно быстро смещаться по массиву внутри одной даты.
Код: Выделить всё
LOC:Queue QUEUE,PRE()
LOC:Date DATE
LOC:ID SHORT
LOC:Quantity LONG
END
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 12:20
kreator
Для удобства работы нужно. Теоретический вопрос. Представьте таблицу - по вертикали даты, по горизонтали люди. Но количество людей разное, в зависимости от организации/подразделения. Заказчик, допустим, хочет видеть двумерную таблицу а-ля Excel.
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 12:36
Игорь Столяров
Ну так и сделай - как написал.
Код: Выделить всё
LOC:Queue QUEUE,PRE()
LOC:Date DATE
LOC:Quantity &QUEUE
END
LOC:QQuantity QUEUE
Loc:QElement Long
end
Для каждой записи LOC:Queue создаем очередь LOC:QQuantity с произвольным числом записей и запоминаем ее адрес.
Описание чего-то подобного есть в разделе справки "Reference Assignments". Главное потом корректно освободить память ...

Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:04
Shur
Была у меня и такая мысль. Но больно геморрно плодить LOC:QQuantity показалось, да потом ещё их и чистить надо, как правильно подмечено. А, главное, всё это в оперативной памяти и нигде больше! А что делать после перезапуска программы?
А вообще как предполагается выводить/отбражать такую сводную таблицу?
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:13
Игорь Столяров
Ну чистить не сложно, пробежать по очереди и сделать Dispose для каждого указателя.
Главное сделать это корректно, а не потеряв записей родительской очереди.
Вопрос был про структуру данных, там хранение в БД нигде не упоминается.
Ну а если нужно - то просто пишем в BLOB произвольное кол-во значений из каждой очереди, а потом загружаем - в справке есть пример.
Или просто список с тремя полями: строка, столбец и значение - выгружаем / загружаем его в структуру в памяти ...
Понятно, что решение не тривиальное, но и постановка задачи тоже: хранить для произвольного кол-ва строк - произвольное кол-во столбцов. Но описанная технология - решает эту задачу, и на мой взгляд не особо и сложно ...

Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:24
kreator
Shur писал(а):А вообще как предполагается выводить/отбражать такую сводную таблицу?
Так и предполагается, в двумерном виде, столбцы - люди, ряды - даты. Но в моём конкретном случае нужно это кидануть в Excel, на экране пока не надо. Вопрос только в том - как сделать кол-во столбцов динамическим.
В бухгалтерии есть такое понятие - "Шахматка". Бухгалтерские счета выложены по вертикали и горизонтали, а на пересечениях - некие цифры (например, обороты). Счетов может быть неопределенное кол-во. Как это отобразить. Причём не нужно отображать те, по которым нет движения.
Игорь Столяров писал(а):Ну так и сделай - как написал.
Код: Выделить всё
LOC:Queue QUEUE,PRE()
LOC:Date DATE
LOC:Quantity &QUEUE
END
LOC:QQuantity QUEUE
Loc:QElement Long
end
Для каждой записи LOC:Queue создаем очередь LOC:QQuantity с произвольным числом записей и запоминаем ее адрес.
Описание чего-то подобного есть в разделе справки "Reference Assignments". Главное потом корректно освободить память ...

Чё-то как-то заумно. А как к элементам LOC:Queue обращаться? Через what?
Было бы возможным вот так:
Не проходит. Хотя Clarion# такое может.
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:32
Shur
Shur писал:
А вообще как предполагается выводить/отбражать такую сводную таблицу?
Так и предполагается, в двумерном виде, столбцы - люди, ряды - даты. Но в моём конкретном случае нужно это кидануть в Excel
Потому и задал вопрос -- Excel прекрасно умеет строить сводные таблицы сам, причём подать ему для этого надо как раз простой "одномерный" список, выгнанный, к слову сказать, из таблицы БД.
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:36
Игорь Столяров
Не проходит, потому что в Clarion нет такого типа данных как &long[].
Зачем через WHAT ?
Из очереди LOC:Queue (предположим строки) получаешь адрес очереди с содержимым колонок этой строки.
Перекидываешь адрес на второю очередь и работаешь с ее содержимым через Get(LOC:QQuantity,НОМЕР).
Тем более для экспорта в Excel, где идет построчное формирование.
Посмотри примеры в справке, на которые я ссылался.
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 13:44
PavelNK
Зачем так сложно?
Я в аналогичном случае делал так
LOC:Queue QUEUE,PRE()
Id LONG
LOC:Date DATE
END
LOC:Queue1 QUEUE
IdOwn LONG
Num SHORT
Elem LONG
end
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 14:08
Игорь Столяров
Согласен, так проще. Но у меня более красиво.

И везде свои плюсы и минусы.
У тебя проще получить значение произвольной ячейки, а у меня узнать кол-во элементов в конкретной строке.

Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 15:29
Yufil
Вроде была такая штука как Prop:VlbProc, я успешно пользовал ....
Там можно создать "виртуальную" очередь, не создавая реальную
Очередь с переменным количеством полей
Добавлено: 11 Февраль 2015, 16:19
Shur
А чем, собственно, вариант от PavelNK отличается от моего?
И я уже не спрашиваю про "вытягивание" такой концепции в простую очередь с неуникальным date. Для удобства можно добавить ID внутри одной даты, если нужно быстро смещаться по массиву внутри одной даты.
Код: Выделить всё
LOC:Queue QUEUE,PRE()
LOC:Date DATE
LOC:ID SHORT
LOC:Quantity LONG
END
И сидят, и меряются красиво-некрасиво! А надо бы: реляционно-нереляционно!
Путаете вы, господа, "эффектно" с "эффективно"!

Очередь с переменным количеством полей
Добавлено: 12 Февраль 2015, 10:38
kreator
Согласен с Shur, в моём случае его вариант проще. Тем более, что из SQL запроса я данные вытащу именно в таком виде. Нет смысла использовать две очереди, делать два Get'а. Просто хотел сделать "красиво". Допустим, есть таблица 100х100 ячеек. Все они должны быть заполнены, пусть даже нулями, не нулей может быть 5-10%. Понятно, записей в очереди мало. И, получается, мне надо 10000 раз делать get и если нет записи, то подсовывать в Excel нуль. Так буду делать, раз нет другого варианта. Но, мне при сбросе в Excel, конечно, было бы удобнее делать get по строкам 100 раз и формировать сразу 100 колонок.
А вариант VlbProc нужно в голове оставить, может пригодиться. Только из примера в Help мало, что понятно. Без пол-литра не разберёшься. В примерах что-нибудь есть?