Страница 2 из 4

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 18:21
finsoftrz
Глянул у себя в системе логирования, там MEMO. Вспомнил, что это для ускорения поиска. MEMO можно не считывать, если поиск ведется по другим критериям, кроме контекста (период изменений, подпись пользователя и т.п.). Если скорость поиска не критична, то можно и STRING, он все равно в tps поджимается. Вопрос, собственно, в чем смысл именно BLOB, может, я чего не знаю?

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 18:24
finsoftrz
То есть, я имею ввиду, что можно продекларировать в структуре STRING разумного размера, покрывающий максимальный размер сохраняемых записей. При этом в базе данных будет сохраняться только заполненная часть, пробелы поджимаются в tps (и не только пробелы).

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 18:51
Игорь Столяров
finsoftrz писал(а): 28 Декабрь 2018, 18:24можно продекларировать в структуре STRING разумного размера
Можно продекларировать. Но только это сразу вводить искусственное ограничение, которое надо помнить.
В данном случае хранятся бинарные данные неопределённой длины - под них существует тип данных BLOB (MEMO, BINARY)
В физическом файле строки-то конечно подрезаются при хранении, но !

1. Хранимые данные - не строки, а бинарный набор.
В них может быть всё что угодно, в т.ч. и управляющие символы вроде <0> и т.д.

2. В памяти всё равно буфер будет объявляться под полную строку. Да и BROWSE по такому списку будет тупить.
А из BLOB (MEMO) просто выполняется выборка только при выполнении операции восстановления и всё. :)

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 18:56
finsoftrz
Если правильно понял смысл темы, то сохранять может потребоваться не только одну запись. Например, если мы редактируем строку накладной и вызываем для выбора какой-то справочник по ссылке, то в нем могут быть затронуты как буфер записи строки, так и буфер записи заголовка накладной. Поэтому надо сохранять и восстанавливать оба буфера. Я это делаю шаблонами при вызове справочника.
classif.jpg

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:03
finsoftrz
Игорь Столяров писал(а): 28 Декабрь 2018, 18:51
finsoftrz писал(а): 28 Декабрь 2018, 18:24можно продекларировать в структуре STRING разумного размера
Можно продекларировать. Но только это сразу вводить искусственное ограничение, которое надо помнить.
В данном случае хранятся бинарные данные неопределённой длины - под них существует тип данных BLOB (MEMO, BINARY)
В физическом файле строки-то конечно подрезаются при хранении, но !

1. Хранимые данные - не строки, а бинарный набор.
В них может быть всё что угодно, в т.ч. и управляющие символы вроде <0> и т.д.

2. В памяти всё равно буфер будет объявляться под полную строку. Да и BROWSE по такому списку будет тупить.
А из BLOB (MEMO) просто выполняется выборка только при выполнении операции восстановления и всё. :)
Видимо, от задачи зависит...

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:07
finsoftrz
Во всяком случае, в своих проектах я обхожусь без BLOB. MEMO использую иногда, но только в системных таблицах типа лога. В прикладных только STRING.

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:11
Игорь Столяров
finsoftrz писал(а): 28 Декабрь 2018, 19:07В прикладных только STRING
Я рискну сложить два+два и предположить, что Вы вообще используете только базовые типы данных (String, Byte, Long, Real)
Потому, что меняете файловый драйвер БД на лету, а учитывать особенности типов данных каждого драйвера - не умеете. ;)

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:20
finsoftrz
Предположение правильное. Привычка со времен Clarion 2.1 для dos. Никогда не чувствовал потребности в каких-то специальных типах данных. Зато иметь одно приложение, которое умеет работать без пересборки и с tps, и c btrieve - это ОЧЕНЬ круто. Реализация идеи Баррингтона о сменяемых драйверах в первозданной красоте. Но это уже к рассматриваемой теме отношения не имеет...

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:31
Игорь Столяров
finsoftrz писал(а): 28 Декабрь 2018, 19:20Реализация идеи Баррингтона о сменяемых драйверах в первозданной красоте.
Эх, если бы последователи довели великие идеи отца-основателя до конечно реализации ! Но нет.
Изобретение подписки всё испортило. Ведь теперь можно просто собирать гроши и ничего не делать. ;)

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 19:44
finsoftrz
Любой бизнес имеет свой срок жизни. Удивительно, что кларион вообще еще существует и даже как-то пытается развиваться. При том, что из команды разработчиков не осталось никого. Технология, действительно, с большой буквы. Хотя и не в струе мейнстрима, задаваемого крупными софтверными компаниями...

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 20:01
Игорь Столяров
finsoftrz писал(а): 28 Декабрь 2018, 19:44Удивительно, что кларион вообще еще существует
Изначально хорошо продуманная структура и реализация. То же самое, как и у FoxPro. Очень живучие приложения на C трансляторе.
Посмотрите, эпизодически кто-нибудь выходит из леса и спрашивает, как прикрутить что-то к Clarion 5.5, а на C63 я и сам ещё работаю. :)

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 20:20
RaFaeL
Игорь Столяров писал(а): 28 Декабрь 2018, 17:55
RaFaeL писал(а): 28 Декабрь 2018, 13:34логично сделать это все внутри source так как record туда и так уже передается для других нужд
Т.е. выход из Sourse всегда в том же месте, где был вход Прекрасно ! :)
- Получаем размер Size(*Group) и создаём под неё String такой длины.
- Сохраняем String = Group
- Работаем …
- Восстанавливаем Group = String, уничтожем String, .
- Всё. Выход из Source. :)
В принципе, так и сделал, завел просто строку максимально возможной длины записи (у нас это 8192), в нее сохраняю, затем восстанавливаю как str[1:size(rec)]
finsoftrz писал(а): 28 Декабрь 2018, 18:01Я предпочитаю подобные фоновые расчеты делать через алиасы. Просто и безопасно...
Фоновые расчеты да, но здесь иногда нужно справочник открывать того же объекта, что и изменяемая запись, алиас не пойдет. Во-вторых, в С63 есть ограничение на размер секции данных для компиляции в 640 кб, мы в него давно уперлись, а алиас объявляется как отдельное описание таблицы, поэтому если можно обойтись без него то лучше без него

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 20:37
vic7tar

Код: Выделить всё

        ag &= new( string(len(grp)) )
        poke(ADDRESS(ag), grp)
        clear(grp)
        poke(ADDRESS(grp), ag)
нормально работает.

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 20:44
finsoftrz
RaFaeL писал(а): 28 Декабрь 2018, 20:20 Фоновые расчеты да, но здесь иногда нужно справочник открывать того же объекта, что и изменяемая запись, алиас не пойдет. Во-вторых, в С63 есть ограничение на размер секции данных для компиляции в 640 кб, мы в него давно уперлись, а алиас объявляется как отдельное описание таблицы, поэтому если можно обойтись без него то лучше без него
А сколько у Вас таблиц, полей, ключей в проекте? У меня проблем пока с этим не возникало, хотя основной проект достаточно большой. Вот такая статистика, без учета алиасов.
stat.jpg

Как создать группу на основе *group?

Добавлено: 28 Декабрь 2018, 20:50
RaFaeL
finsoftrz писал(а): 28 Декабрь 2018, 20:44А сколько у Вас таблиц, полей, ключей в проекте? У меня проблем пока с этим не возникало, хотя основной проект достаточно большой. Вот такая статистика, без учета алиасов.
А у вас есть "основная dll" c генерацией описаний всех таблиц?

Статистику такую не могу предоставить, так как нечем посчитать )
Просто таблиц в базе (физических) насчитал 216