Страница 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:43
RaFaeL писал(а): 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).