Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Господа!

Известно, что в Гриде можно перетаскивать колонки.
При этом автоматически меняются ColumnOrder.

Есть ли возможность в отображаемой таблице синхронно менять местами поля?
14 авг 12, 17:33    [13010691]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Физически менять? Структуру таблицы? Нет. Невозможно. Для этого надо пересоздать таблицу заново. Т.е. закрыть, пересоздать и открыть заново. А закрытие таблицы автоматически сделает невозможным ее отображение пока она снова не откроется. А если таблица еще и большая по объему, то время такого персоздания также будет достаточно велико.

Кроме того, как правило, в этом нет особой необходимости. Способ хранения данных и так не очень-то похож на то, как данные отображаются. Но если очень уж хочется, то меняй структуру после закрытия формы.

Если же речь идет только об отображении, то меняй значение ControlSource столбцов Grid. Кстати, можно еще и запретить перетаскивание столбцов в Grid.
14 авг 12, 18:08    [13010878]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Уважаемый ВладимирМ!

Я неправильно сформулировал вопрос.

Точнее, мне нужно сохранить ColumnOrder всех столбцов, чтобы при следующем запуске столбцы расположились в той последовательности, в которой они остались при выходе из программы.

Но.

Я конечно знаю, что можно записать значения ColumnOrder в некоторую мета таблицу.

Практика показывает, что мета таблица довольно часто портится и программа вообще не запускается.

Так вот, куда бы записать мета данные, чтобы повысить надежность программы (в контейнер БД в поле комментариев)?

Это сделает программу более надежной?

Думаю, что чем выше скорость программы, тем она вероятнее ПОЛНОСТЬЮ заканчивает то или иное действие и становится надежнее.

Каково ваше мнение об этом?
15 авг 12, 09:08    [13012827]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
Dima T
Member

Откуда:
Сообщений: 15282
Я храню в виде текстовой строки. Для грида использую свой класс, там сделал два метода:
+ Сохранение (возвращает строку настроек)
local loCol, lcText
create Cursor tColumnList (nOrder i, cField c(50))
for each loCol in This.Columns 
	insert into tColumnList (nOrder, cField) values (loCol.ColumnOrder, loCol.ControlSource + '|' + alltrim(str(loCol.Width)))
endfor
index on nOrder tag nOrder
lcText = ''
scan
	lcText = lcText + ';' + alltrim(tColumnList.cField)
endscan
use in tColumnList
return substr(lcText, 2)


+ Восстановление (получает строку настроек)
lpara tcSort
local i, j, lcCS, lnWidth
i = 0
j = 1
do while .T.
	lcCS = GetWordNum(tcSort, j, ';')
	lnWidth = max(5, min(Val(GetWordNum(lcCS, 2, '|')), This.Width))
	lcCS = upper(GetWordNum(lcCS, 1, '|'))
	if empty(lcCS)
		exit
	endif
	for each loCol in This.Columns 
		if upper(loCol.ControlSource) == lcCS
			i = i + 1
			loCol.ColumnOrder = i
			loCol.Width = lnWidth
			exit
		endif
	endfor
	j = j + 1
enddo

Саму строку храню в инишнике в профиле пользователя, т.к. у разных пользователей может быть желание по-разному колонки расположить.
15 авг 12, 09:47    [13012959]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
UAP
Практика показывает, что мета таблица довольно часто портится и программа вообще не запускается.

Это предрассудки, а не практика.

Во-первых, чем эта самая мета-таблица отличается от обычных рабочих таблиц? Да ничем! Значит, вероятность повреждения мета-таблицы должна быть точно такая же, что и любой другой рабочей таблицы. Следовательно, Ваша фраза "переводится" так: "Практика показывает, что рабочие таблицы довольно часто портятся".

Во-вторых, мета-таблица - это таблица, значения в которой могут быть, но могут и не быть. Ведь до самого первого запуска формы и перетаскивания столбцов в ней еще ничего не записано. Как следствие, если при запуске приложения мета-таблица повреждена, то она просто отключается с соответствующим сообшением администратору и работа с приложением продолжается, но без возможности сохранения настройки. Разумеется, этот режим надо предусмотреть в своем приложении.

UAP
Так вот, куда бы записать мета данные, чтобы повысить надежность программы (в контейнер БД в поле комментариев)?

Все то, что Вы перечислили, физически, все-равно поля таблиц. Опять возвращаемся к вопросу о том, чем надежность одной таблицы отличается от надежности другой.

UAP
Думаю, что чем выше скорость программы, тем она вероятнее ПОЛНОСТЬЮ заканчивает то или иное действие и становится надежнее.

Скорость вообще никак не связана с надежностью. Логичнее скорее сделать обратный вывод. Чем выше скорость, тем менее надежна программа. За счет чего скорость-то подняли? За счет снижения требований по безопасности (надежности)

Вероятность повреждения файлов - это целиком и полностью проблемы "железа". Любые программные ухищрения могут лишь незначительно скомпенсировать глюки сетевых карт, соединений, видекарт и т.п. Причем вся эта программная обработка по повышению целостности хранилища данных уже реализована в так называемых серверных СУБД. Так что, если Вы работаете на не надежном "железе", то Вам следует использовать в качестве хранилища данных не DBF-таблицы, а какую-либо из клиент-серверных баз данных: MySQL, MS SQL, Oracle и т.п. Существуют бесплатные версии.
15 авг 12, 11:19    [13013459]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Уважаемый ВладимирМ!

Я не затеваю дискуссию, но хочу возразить.

Таблицы не могут не отличаться, поскольку включены в приложение РАЗНЫМИ способами - используются с РАЗНОЙ частотой, чаще или реже открываются и закрываются, сортируются, индексируются и т. д.

Надежность одной таблицы ОТЛИЧАЕТСЯ от надежности другой в "динамическом" смысле.

Скорость программы я понимаю НЕ как скорость компьютера, а как "правильность" программы, которая написана рационально и не делает "лишних" действий.

Таким образом, некоторое действие "быстренько" завершается и таблица, например, закрывается.
Повредить закрытую таблицу труднее, чем открытую!

Так вот хочется понять как и куда рационально записывать мета данные.
15 авг 12, 15:24    [13015559]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
Dima T
Member

Откуда:
Сообщений: 15282
UAP
Так вот хочется понять как и куда рационально записывать мета данные.

Для начала неплохо бы понять что конкретно содержат твои "мета данные". Раз ты считаешь что при хранении в таблице таблица часто портится, то могу предположить что идет слишком много добавлений/удалений т.к. только эти операции приводят к "порче". После RELPACE и UPDATE максимум могут индексы слететь.
Как выше Владимир написал - потеря мета-данных никак не должна влиять на основной функционал приложения.

Лично я предпочитаю хранить в инишниках. Не знаю насколько рационально, но по крайней мере удобно если надо быстро посмотреть. И добавить что-то по-быстрому элементарно: прописал в проге обработку параметра и админу сказал прогу обновить и в инишник дописать.
Причем отсутствие параметра или пустота считается значением по умолчанию прописанным внутри EXE, там же (в EXE) прописан возможный диапазон в котором должен быть параметр. Т.е. "порча" парализующая прогу невозможна по определению.
И потом надо как минимум два хранилища:
1. общее, в котором настройки касающиеся всех пользователей (я его храню вместе с DBF-ками)
2. локальное, в нем настройки конкретного рабочего места пользователя (кладу в профиль пользователя)
PS Саморазрушения инишника я ни разу не наблюдал.
15 авг 12, 17:41    [13016642]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
UAP
Таблицы не могут не отличаться, поскольку включены в приложение РАЗНЫМИ способами - используются с РАЗНОЙ частотой, чаще или реже открываются и закрываются, сортируются, индексируются и т. д.

Отличаются не таблицы, а именно способы работы. Т.е. речь может идти о надежности того или иного способа работы с таблицей, но никак не о надежности собственно таблицы.

Потенциально опасное событие - это момент сохранения внесенных изменений. Если в этот момент происходит сбой питания или разрыв соединения, то велик риск повреждения таблицы. Значит, общая стратегия работы с таблицами должна заключаться в том, чтобы как можно меньше времени выполнять процесс внесения изменений.

Например, использовать буферизацию, чтобы отделить процесс внесения изменений от процесса сохранения внесенных изменений. Использовать курсоры и локальные представления, чтобы не сохранять промежуточные этапы. Много есть разных способов...

Кроме того, следует понимать, что процесс сохранения данных "многоступенчатый". Данные могут быть сохранены с точки зрения FoxPro, но еще не сохранены с точки зрения Windows.

UAP
Скорость программы я понимаю НЕ как скорость компьютера, а как "правильность" программы, которая написана рационально и не делает "лишних" действий.

Неправильно понимаете Зачастую, чтобы ускорить выполнение того или иного фрагмента кода необходимо именно что добавить "лишние" действия. Отсутствие этих "лишних" действий как раз и приводит к тормозам.

Кроме того, такое "вылизанное" приложение крайне сложно модифицировать. Вносить какие-либо изменения и дополнения. Не за что "зацепиться". Все "лишнее" убрано

UAP
Таким образом, некоторое действие "быстренько" завершается и таблица, например, закрывается.
Повредить закрытую таблицу труднее, чем открытую!

Повредить-то труднее, но частое "дерганье" таблицы (открытие/закрытие), во-первых, замедляет собственно работу приложения (иногда очень заметно для пользователя), а, во-вторых, скорее увеличивает риск повреждения.

UAP
Так вот хочется понять как и куда рационально записывать мета данные.

Да без разницы! Вопрос не "куда", а "как" и "что". Момент сохранения внесенных изменений - это риск порчи для абсолютно любого типа файла.

Ну, вот Вы описываете изменение Grid. Но ведь в этом Grid также отображена какая-то таблица. Почему же таблица, отображенная в Grid не портится, а таблица, сохраняющая настройки этого Grid - портится? Вероятно потому, что настроечную таблицу Вы "дергаете" после каждого изменения Grid, а "рабочую" таблицу только по нажатию кнопки "Сохранить".

Так что мешает точно также поступить и с настроечной таблицей? Ведь настройки надо сохранить только в момент закрытия формы. Все промежуточные этапы, пока форма еще открыта, сохранять не надо.
15 авг 12, 19:09    [13017165]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Dima T
PS Саморазрушения инишника я ни разу не наблюдал.

А что значит "саморазрушение" для текстового файла? Это как? А разве не бывали случаи когда настройки не сохранялись? Ведь это и есть момент "сбоя".
15 авг 12, 19:19    [13017190]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
Dima T
Member

Откуда:
Сообщений: 15282
ВладимирМ
Dima T
PS Саморазрушения инишника я ни разу не наблюдал.

А что значит "саморазрушение" для текстового файла? Это как? А разве не бывали случаи когда настройки не сохранялись? Ведь это и есть момент "сбоя".

Никак :) "разрушение" это нарушение формата, поэтому нельзя разрушить неформатированный файл.
Не упомянул выше, у меня в "обший" инишник сохраняются статичные настройки не требующие постоянного изменения, т.е. он в основном читается, а запись построена так что сначала читается что есть, сравнивается с тем что надо записать, а потом уже пишется если действительно есть изменения.
Если есть необходимость хранения в общем инишнике постоянно меняющейся информации, то лучше разделить его на два или больше, выделив в отдельный файл то что обычно не меняется.
Так же с локальным. правда в моем случае там нет ничего что жалко потерять, там состояние интерфейса данного пользователя. Например там настройки колонок гридов, цветовая раскраска и т.п.
15 авг 12, 22:12    [13017762]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Господа!

Я все еще занимаюсь данной темой.

Подскажите пожалуйста, как подключить функцию сохранения ColumnOrder ВСЕХ столбцов Грида после перетаскивания некоторого столбца на другое место.

Причем, грид "белый".

Догадываюсь, что это Moved каждого столбца грида.
17 авг 12, 14:46    [13026951]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Прошу прощения за беспокойство!

Я догадался как это сделать.

В Init Grid я записал:

FOR EACH Column IN This.Columns

BINDEVENT(Column,"Moved",ThisForm,"Column_Moved")

ENDFOR

Тут Column_Moved функция сохранения.
17 авг 12, 15:14    [13027258]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
Dima T
Member

Откуда:
Сообщений: 15282
UAP
Догадываюсь, что это Moved каждого столбца грида.

Правильно догадываешься. Сделай какой-нибудь свой метод для сохранения и привяжи его вызов к Moved() всех колонок с помощью BINDEVENT()
17 авг 12, 15:16    [13027281]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
UAP
Member

Откуда:
Сообщений: 493
Уважаемый Dima T!

Да. Я только что опубликовал возможное решение.
17 авг 12, 15:19    [13027307]     Ответить | Цитировать Сообщить модератору
 Re: Синхронизировать ColumnOrder и номера полей таблицы  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
На всякий случай напомню о том, что не надо в методе ThisForm.Column_Moved() физически сохранять изменения в настроечной таблице. Лучше записывать в буфер таблицы. А собственно TableUpdate() делать только при закрытии формы.
17 авг 12, 17:29    [13028282]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить