Страница 1 из 4
Как создать группу на основе *group?
Добавлено: 27 Декабрь 2018, 23:50
RaFaeL
Есть процедура, куда передается группа по адресу (*group), это Record файла (разных файлов)
Нужно внутри процедуры эту запись локально сохранять, чтобы потом восстанавливать
Как объявить? LIKE в такое не умеет
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 0:30
Дед Пахом
Если не брать в расчёт DynaLib (которая вроде бы так умеет), то я вижу только такой вариант: сохранять всё в queue
Код: Выделить всё
q queue
fname string(20) !- имя поля в переданной группе
fvalue ANY !- значение поля
затем пройти по группе через WHO/WHAT и сохранить в очереди.
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 0:39
RaFaeL
DynaLib у меня есть полная, ее можно брать в расчет
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 1:13
Дед Пахом
У меня нет, но уверен, что DynaLib это может, она, имхо, для этого и написана
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 3:36
vic7tar
А если просто делать слепок памяти с адреса группы?
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 9:26
Yufil
Вроде запись группы легко превращается в строку. И наоборот...
Не проскочит что-нибудь вроде?
Код: Выделить всё
Gr &Group
SaveGroup Any
SaveGroup = Gr & ''
Gr = SaveGroup
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 10:56
kreator
Если это Record файла, не вариант воспользоваться какими-нибудь методами класса FileManager? SaveBuffer, RestoreBuffer?
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 11:43
Игорь Столяров
RaFaeL писал(а): ↑27 Декабрь 2018, 23:50Нужно внутри процедуры эту запись локально сохранять
Здесь ещё вопрос, как запись сохраняется. Например, если содержимое Record не важно - то можно передать Record как String
и, например, в процедуре записывать / восстанавливать как бинарный слепок (BLOB).
У нас например так делается корзина удалённых записей. Т.е. различные виды удаляемых записей пишутся в общий
файл как BLOB поле, с указанием вида записи. А при восстановлении - бинарный BLOB просто переписывается обратно в нужный Record.
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 11:46
Дед Пахом
Можно прототип процедуры сделать Proc(STRING), а не Proc(GROUP), тогда группа как строка передастся.
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 12:21
Дед Пахом
А ещё можно группу в xml или json сериализовать, а потом обратно.
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 13:34
RaFaeL
Игорь Столяров писал(а): ↑28 Декабрь 2018, 11:43Здесь ещё вопрос, как запись сохраняется. Например, если содержимое Record не важно - то можно передать Record как String
Суть проблемы следующая
Есть форма Update (их много, ну допустим 50 штук разных по разным файлам)
В каждой есть условно список доп параметров. На списке на любое действие пользователя вызывается процедура source c кучей параметров, в т.ч. условно FIL:Record
Внутри этого source делается много чего, могут открываться разные другие формы, обрабатываться записи и т.п., в т.ч. по файлу, с update которого вызывается source. И соответственно иногда получаем ситуацию, когда буфер записи слетает и после работы source в основной форме теряются изменения, внесенные пользователем. Поэтому перед работой source надо запись сохранять, а после - восстанавливать. Так вот чтобы не лазить в 50 форм логично сделать это все внутри source так как record туда и так уже передается для других нужд. Отсюда и возник вопрос
Вроде запись группы легко превращается в строку. И наоборот...
Не проскочит что-нибудь вроде?
Про ANY надо посмотреть варианты, спасибо, не догадался
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 17:55
Игорь Столяров
RaFaeL писал(а): ↑28 Декабрь 2018, 13:34логично сделать это все внутри source так как record туда и так уже передается для других нужд
Т.е. выход из Sourse всегда в том же месте, где был вход Прекрасно !
- Получаем размер Size(*Group) и создаём под неё String такой длины.
- Сохраняем String = Group
- Работаем …
- Восстанавливаем Group = String, уничтожем String, .
- Всё. Выход из Source.
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 18:01
finsoftrz
Я предпочитаю подобные фоновые расчеты делать через алиасы. Просто и безопасно...
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 18:03
finsoftrz
Игорь Столяров писал(а): ↑28 Декабрь 2018, 11:43RaFaeL писал(а): ↑27 Декабрь 2018, 23:50Нужно внутри процедуры эту запись локально сохранять
Здесь ещё вопрос, как запись сохраняется. Например, если содержимое Record не важно - то можно передать Record как String
и, например, в процедуре записывать / восстанавливать как бинарный слепок (BLOB).
У нас например так делается корзина удалённых записей. Т.е. различные виды удаляемых записей пишутся в общий
файл как BLOB поле, с указанием вида записи. А при восстановлении - бинарный BLOB просто переписывается обратно в нужный Record.
А почему именно BLOB, а не STRING?
Как создать группу на основе *group?
Добавлено: 28 Декабрь 2018, 18:11
Игорь Столяров
finsoftrz писал(а): ↑28 Декабрь 2018, 18:03А почему именно BLOB, а не STRING?
А потому, что размер сохраняемой RECORD заранее не известен. Поэтому BLOB (или MEMO для Btrieve).