logo
logo

Форум Очистка курсов валют в БД

создать новую тему раскрыть все
Очистка курсов валют в БД Daniil 28/11/2016 14:02 #написать ответ
При загрузке курсов происходит следующее:
1) загружаются курсы валют;
2) рассчитываются кросс-курсы валют.
 
Где это сохраняется в БД?
 
В БД есть таблица "CurrencyRates" в ней курсы валют и кросс-курсы вместе хранятся?
Или кросс-курсы сохраняются в другую таблицу?
Какую?
 
Хочется "проредить" курсы за прошлые годы, поэтому и вопросы.
 
План действий примерно следующий:
Выгрузить все курсы в excel (валюты и курсы - две галочки);
Подчистить файл excel-я по датам;
Очистить соответствующую таблицу в БД (получится только полностью);
Импортировать в программу измененный файл excel-я с курсами (тем что от них останется).
 
Подскажите, пожалуйста, как лучше и правильнее вести борьбу с избытком курсов в программе.
 
ЗЫ
Загружать меньше (раз в месяц) не хочется.
Отвечу по памяти, так как сейчас нахожусь далеко... Dervish 28/11/2016 19:36 #написать ответ
...от среды разработки. Впрочем, неясности могу уточнить уже в конце этой недели.
 
  1. Все курсы (и кросс-курсы тоже) содержатся в таблице CurrencyRates.
  2. Каждая запись таблицы CurrencyRates содержит ровно один курс (соотношение валют).
  3. Не помню название колонки, в которой хранится дата курса (однако, оно должно быть вполне себе понятным); значение даты хранится в формате unixtime.
  4. Для "прореживания" курсов за прошлые годы, теоретически, можно проставить значение "1" в колонке Deleted, однако, в будущих версиях программы удаленные записи тоже будут загружаться в память, так что лучше реально удалить ненужные записи.
  5. Необязательно связываться с Excel-ем для удаления ненужных курсов, вполне себе можно составить SQL-запрос Delete, который удалит ненужные записи. Помочь с подготовкой этого запроса я смогу через несколько дней.
посмотрел таблицу... Daniil 28/11/2016 20:33 #написать ответ
... есть колонка "RateDate" в ней "1356998400" ... не очень понятно (это еще культурно сказано, про себя любимого).
 
В окне "Редактирование ячейки БД" 3-и режима:
текст, двоичные данные, изображение.
"unixtime" - представления в таком режиме нет. Как определить дату мне чайнику не понятно
Звиняйте...
 
Отвечу по памяти, так как сейчас нахожусь далеко

Спасибо, за ответ.
Спешки нет.
Как будет время, как сможете,  так и ответите, а то "совсем неудобняк" получается - замучал хорошего человека вопросами.
 
Как я понял Excel тоже вариант. Там и фильтр по дате и саму дату видно, выделять строки удобно, и соответственно их удалять. Муторно конечно, зато видишь что "грохаешь".
Главное таблицу очистить перед импортом, а то дубли записей пойдут (проверил уже методом научного тыка).
 
А зачем в будущих версиях "старье" держать?
Лучше уж выгружать в файл.
БД меньше от таких "удалений" не станет?
Не очень понятно На случай отката наверно... Тогда зачем вообще удалять?
 
Опять из меня вопросы посыпались.... блиииин......
Спасибо еще раз
И отдельное СПАСИБО за терпение и труд!
 
Поясню. Dervish 29/11/2016 19:07 #написать ответ
Дата представлена как целое число. Подробнее о форматах представления можно прочитать в документации на SQLite, если не ошибаюсь, то смотреть нужно про unixepoch внизу страницы. Там есть и примеры, как смотреть значения. Но точнее смогу сказать только по возвращении.
 
А зачем в будущих версиях "старье" держать?
Краткий ответ: в целях синхронизации.
 
Немного более развернутый ответ: мы все-таки хотим, чтоб клиент для смартфона умел автоматически синхронизировать данные с программой для десктопа. Именно поэтому необходим некий механизм, который позволит отличать данные, которые были однажды добавлены в файл данных и потом удалены из него от данных, которые никогда не существовали в файле данных (в первом случае при синхронизации эти данные нужно поудалять со всех смартфонов, а во втором - добавить в файл данных десктопа).
 
Этот вопрос может казаться несущественным для курсов валют, но мне не хочется изобретать какой-то специальный алгоритм (подход) для курсов, хочется сделать все на едином подходе. Поэтому и говорю, что пока можно сделать просто удаление ненужных данных (пока синхронизация не реализована). А в будущем лучше помечать данные как удаленные, проставляя "1" в колонке Deleted.
посмотрел значения Daniil 29/11/2016 20:17 #написать ответ
Дата представлена как целое число. Подробнее о форматах представления можно прочитать в документации на SQLite, если не ошибаюсь, то смотреть нужно про unixepoch внизу страницы. Там есть и примеры, как смотреть значения. Но точнее смогу сказать только по возвращении.

 
Выполнил код:
SELECT datetime(1357862400, 'unixepoch')
Получил:
2013-01-11 00:00:00
Что за дата понятно. Не понял только - это надо выполнять код каждый раз, что бы понять что за дата проставлена в таблице?
В самой таблице курсов изменить представление даты на понятное нельзя?
Почему же нельзя? Dervish 29/11/2016 20:34 #написать ответ
Делаем так:
Text
SELECT *,datetime(RateDate,'unixepoch') FROM CurrencyRates

и получаем распечатку таблицы с читаемыми датами.
получил... Daniil 29/11/2016 21:00 #написать ответ
под окном ввода кода получил таблицу с читаемыми датами, но в ней нельзя правки вносить. Deleted на 1 не изменить.
На вкладке "данные" в таблице нового столбца не появилось.
Легче не стало
Если плохо знакомы с sql Loki 29/11/2016 22:52 #написать ответ
то можно сделать и через эксель:
добавляем в экселе еще одну колонку и вставляем в нее такую формулу
Text
=CELL/24/3600+"01/01/1970"

где CELL - ячейка с датой в unixtime. Фильтруем по этой колонке и удаляем все лишнее. Потом эту колонку тоже удаляем и импортируем данные обратно в программу.
спасибо за совет, но... Daniil 29/11/2016 23:12 #написать ответ
... в экселе даты и так видны. там все "человеческим языком" написано.
почистил через эксель... Daniil 12/12/2016 14:06 #написать ответ
... экономия более 50%
Простите, экономия чего? (-) Dervish 14/12/2016 14:09 #написать ответ
БД уменьшилась на 50%. Файл *.cash... Daniil 14/12/2016 16:41 #написать ответ
... стал меньше по размеру более чем на половину.
 
Может быть все же было бы полезно иметь в интерфейсе программы решение для прореживания курсов за старые периоды. Автоматическое решение может и навредить, поскольку разные валюты могут "заводиться" в программе в разные периоды и это надо учесть, или эти валюты просто останутся без курсов. Например Яндекс надо ввести один раз и этот курс может пропасть.
 
Хорошо бы иметь хотя бы групповое выделение курсов с помощью Shift и реальное удаление их из базы.
С учетом будущей синхронизации, возможно стоит сделать диалог при удалении: "безвозвратное удаление из БД или с возможностью восстановления" - это я про пометку удаляемых "1" в БД.
Или сделать сброс удаляемых курсов в отдельный файл, что бы можно было при необходимости опять загрузить и дублей не наделать при этом.
 
Удалял не только курсы. Удалил несколько валют. Чистить, так чистить
Посмотрел после этого БД, а там все на месте с пометкой "1". Пришлось дочищать. Хорошо что при выгрузке в ексель удаленные данные не выгрузились. Это упростило работу.