Страница 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).