Показ дописів із міткою SQLite. Показати всі дописи
Показ дописів із міткою SQLite. Показати всі дописи

вівторок, 12 лютого 2013 р.

Правильне сортування прізвищ в таблиці SQLite

Пам'ятка
При розробці бази імен з використанням SQLite3 вилізла одна маленька, але неприємна річ -- при сортуванні за іменами/прізвищами порядок виявився досить диким: на початку списку йшли люди з прізвищами на "Є", "І", "Ї". Потім йшли на "А" і далі, як і повинно бути, а в самому кінці, після "Я" тулилася нещасна літера "Ґ".

Спочатку я намагався вирішити цю проблему шляхом:
SELECT icu_load_collation('uk_UA', 'UKRAINIAN');
але проблема виявилася в тому, що це вимагало додаткової мороки з нестандартною збіркою sqlite3.dll/sqlite3.so.Також вилазили інші глюки.

Спочатку я залишив це як є, але оце вирішив все-таки побороти цю проблему.

Рішення (aka "милиця" aka "костиль").
SELECT name, CASE
WHEN SUBSTR(name,1,1) LIKE '%Ґ%' OR  SUBSTR(name,1,1)   LIKE '%ґ%'  THEN 'Гя' || SUBSTR (name, 2) 
WHEN SUBSTR(name,1,1) LIKE '%Є%' OR  SUBSTR(name,1,1) LIKE '%є%'  THEN 'Ея' || SUBSTR (name, 2)
WHEN SUBSTR(name,1,1) LIKE '%І%' OR  SUBSTR(name,1,1) LIKE '%і%'  THEN 'Ию' || SUBSTR (name, 2) 
WHEN SUBSTR(name,1,1) LIKE '%Ї%' OR  SUBSTR(name,1,1) LIKE '%ї%'  THEN 'Ия' || SUBSTR (name, 2) 
ELSE name END AS SortField 
FROM grace_people_c ORDER BY SortField ASC
Виглядає незвично, але працює як годинник! Мені достатньо було правильного сортування по першим буквам. Інакше можна аналогічно застосувати SQLite-функцію REPLACE

От що значить пару годин порухати мізками і вдумливо покурити мануали!


пʼятниця, 1 червня 2012 р.

Lazarus. При використанні SQLite3Connection не зберігаються зміни



Кліпаю тут на дозвіллі програму базу даних членів церкви. Все чудово, але вона не хотіла зберігати внесені в записи зміни при використанні DB-aware компонентів (TDBEdit, TDBGrid і т.д.). Намучившися в пошуках баґа вже думав, що такий глюкавий TSQLite3Connection і думав прописувати всі запроси вручну. Але вчора знайшов простенький приклад і там все працює. При порівнянні, вияснилося, що якщо в Design-time в об’єкті SQLite3Connection встановити властивість Connected в True, та в відповідному SQLQuery Active в True, то база виявляється заблокованою і зміни не зберігаються. Як що ж зробити навпаки, то все чудово зберігається!

Ну і в події AfterPost об’єкта SQLQuery треба прописати щось таке:


procedure TForm1.SQLQuery1AfterPost(DataSet: TDataSet);
var bm: TBookMark;
begin
   try
     bm := SQLQuery1.GetBookmark;
     SQLQuery1.ApplyUpdates;
     if SQLTransaction1.Active then
     begin
        SQLTransaction1.CommitRetaining;
        SQLQuery1.GotoBookmark(bm);
     end;
  except
     SQLTransaction1.Rollback;
  end;
end; 

Підглянув ось тут http://professorcarlos.blogspot.com/2010/02/lazarus-acessando-banco-de-dados-com_24.html

понеділок, 26 березня 2012 р.

Lazarus, SQLite


Для того, щоби отримати вірне значення за домопогою функції SQLite strftime потрібно додати 2415018.5 днів. Наприклад:
SELECT strftime("%Y-%m-%d", Date_of_Birth, '+2415018.5 days') FROM grace_people_c;
Тут Date_of_Birth число отримане при експорті з LibreOffice в CSV.
Якщо Date_of_Birth = 28552, то результатом буде 1978-03-03, що є вірним значенням.