База на основании XLS-файла

Автор adi_den2013, 6 сентября 2017, 15:41

0 Пользователи и 1 гость просматривают эту тему.

adi_den2013

#30
Цитата: economist от 18 сентября 2017, 09:14Я за кириллицу и в именах таблиц, и в полях, и в именах представлений. Как только я "русифицировал" корпоративную БД - число писателей запросов выросло с 3-х до 8-ми человек, а число новых запросов в месяц - удвоилось. Есть такая важная тема - популяризация. Если нет желания все делать самому - сделай так, чтобы другие могли сделать это по твоему указанию. А еще лучше если они сами захотят этого.

Никто меня не убедит что в базе данных должна быть таблицы с "устоявшимися" именами вида Employers, Enterprises, Counteragents, Warehouses и тд, потому что я попробовал таблицы и поля на русском и офигел от того насколько это удобнее и мне, англоговорящему, и другим. Смотрите насколько понятен запрос "на русском" в моей методичке по объединениям:

Я считаю - русификация это вопрос предпочтений. Мне привычнее работать с латиницей в названиях таблиц и полей. Хотя, когда я начинала в 2013 году на новой работе осваивать OpenOffice Base, я писала программу для расчета баланса на смешанной структуре таблиц (латиница/кириллица). Для изучения - было понятнее. Теперь же не принципиально, но латиница привычнее.

Спасибо за ссылки. DB Browser for SQLite установила, но забыла об этом упомянуть. Импорт/экспорт там мне понравился.
Яна (in real)

economist

#31
rami - сейчас проверил версию SQLiteStudio 3.1.1 - появилась поддержка кириллицы и сортировка результирующей таблицы (результат выполнения SQL-запроса), но лишь по одной колонке (автор поставил в todo). И, увы, нет (надеюсь только пока) подсветки значений по типу.

Риквесты на все это я писал автору 2 года назад, очень рад что решилась проблема с кириллицей, это уже делает продукт пригодным к внедрению в массы. Также автор пока "не повелся" на хранение истории SQL-запросов в самой базе данных, это делает невозможным коллективное итерационное написание запросов (SQLite Manager хранит все в самой базе в таблице __sm_ext_mgmt - тем самым реализуя в SQLite функционал "хранимых" процедур и среду коллективного одновременного написания SQL-запросов для 3-5 человек, которой могут похвалиться немногие IDE - даже не могу припомнить ни одной).

Очень хорошо что есть такой выбор всего для SQLite - IDE, "оберток" под все мыслимые языки программирования.      
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

#32
Для тех кто захочет, как и ТС, перейти на СУБД SQLite - стоить знать одну мелкую тонкость. В отличие от почти всех других СУБД - SQLite не требует явной группировки через GROUP BY для агрегирующих функций SUM, TOTAL, MAX, MIN, AVG - т.е. она не даст ошибки там, где почти все остальные будут ругаться! Но это еще не все.

В SQLite функция применяется ко всему результирующему набору строк данного поля, а другие "вызванные" в запросе поля, без агрегирующих функций - выведут "последние", самые "нижние" значения строк таблицы, удовлетворяющие условиям отбора. но не имеющим полного отношения к результатам функций. Это может поначалу сильно сбить с толку (отображается "последнее" значение выборки, обычно это кто-то на "я", если исходная таблица отсортирована по алфавиту). То есть запрос:

SELECT Контрагент, SUM(Задолженность) FROM Таблица
- вернёт, скажем, таблицу 1х2:
Ящур ООО, 15881665454.

Так вот, эта сумма 15881665454 - относится не к Ящур ООО, а ко всем строкам Таблицы - просто "Ящур" оказался в последней строке таблицы из-за ее исходной сортировки А-Я. Чтобы содержимое этого поля обрело смысл и полезность - нужно просто добавить  группировку по контрагентам
GROUP BY 1 или GROUP BY Контрагент. Для "переходящих" это бывает очень непривычно. Впрочем, это бывает полезно - можно в ряде случаев уйти от подзапросов.

Зато SQLite очень либерален к тому, что написано в запросе до слова FROM. Он позволяет писать что-то вроде такого, и все будет работать:

SELECT Поле1, 2, *, 'МЖ', Поле2||Поле3, Поле4/Поле5 Ух FROM ...

И, конечно, нужно проверить - работает ли ваш SQLitе корректно с кириллицей. В частности, обычный SQLite имеет регистрочувствительное сравнение и "санкционный" Like, который не любит русские буквы :-) :  

SELECT 'WORD' like 'word' -- обычно 1, True

SELECT 'СЛОВО' like 'слово' -- обычно 0, False, но ЗА ЧТО?

SELECT CASE WHEN LIKE ('Г','г')=1 THEN 'LIKE (''Г'',''г'')=1 - Like регистроНЕзависим' ELSE 'LIKE (''Г'',''г'')=0 - Like регистроЗАВИСИМ' END

Кроме тoго, обычный Sqlite не умеет функциями LOWER(), UPPER() менять регистр кириллицы:

SELECT UPPER('абвg')

Если будет абвG - то виновата не SQLite, а Windows, которая не умеет полноценно работать с кириллицей до сих пор. Способов решения - много.  
Выполните эти запросы и решите для себя, как вам нужнее. Если интересно - продолжим.  







   
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

adi_den2013

Вопрос по подключению(?) к БД SQLite в ООBase - есть какие-то отличия кроме драйвера ODBC? 

В принципе макрос работает без ошибок, к базе подключаюсь, но не могу воспользоваться параметром par_1


  Sub Prov_login                                     ' считывание данных из формы
  Dim oForm, oForms
  Dim oDrawPage as Object
  Dim sql_login, par_1 as String
  Dim sql_passw as String
  Dim oStatement As Object
  Dim oDBSource As Object
  Dim oConnection As Object
  Dim oDatabaseContext As Object
'

  oDatabaseContext = createUnoService( "com.sun.star.sdb.DatabaseContext" )
  oDBSource = oDatabaseContext.GetByName("studenti-adi")
  oConnection = oDBSource.GetConnection("", "")   
  oStatement = oConnection.createStatement()
  oStatement.ResultSetConcurrency = com.sun.star.sdbc.ResultSetConcurrency.UPDATABLE 
   

  oForms = ThisComponent.getDrawPage().getForms()
  oForm  = oForms().getByName("vhodnaya")              'подформа имя из навигатора форм
  getval1_1=oForm.getByName("txtlogin")                 'имя поля из навигатора форм
  getval1_2=oForm.getByName("txtpassw")             'пароль (имя поля из навигатора форм)

  login_user=getval1_1.currentvalue 'текстовое представление поля логин
  passw_user=getval1_2.currentvalue 'текстовое представление поля пароль
 
  sql_passw = "SELECT ""passw"" FROM ""users""  WHERE ""login""="+login_user
 
  Result1= oStatement.executeQuery(sql_passw)
  par_1=Result1.GetString(1)  ' результат выполнения запроса из базы
 
  MsgBox "Внесенный пароль: "+ passw_user +"      Пароль в базе "+ par_1
End Sub


На этой строке идет ошибка (см.скрин)
Яна (in real)

JohnSUN

#34
Как насчет сдвинуть Result1 на первую запись после того как убедишься, что он не пустой, и перед считыванием результата? Мы же с тобой это уже как-то проходили... Помнишь?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

adi_den2013

Цитата: JohnSUN от 19 сентября 2017, 11:19
Как насчет сдвинуть Result1 на первую запись после того как убедишься, что он не пустой, и перед считыванием результата? Мы же с тобой это уже как-то проходили....

Старость - не радость ....  :(

exequteQuery не работает  >:(    Спасибо!
Яна (in real)

adi_den2013

Цитата: JohnSUN от 19 сентября 2017, 11:19
Как насчет сдвинуть Result1 на первую запись после того как убедишься, что он не пустой, и перед считыванием результата? Мы же с тобой это уже как-то проходили... Помнишь?

Result1.next  нужно высечь в камне и поставить себе на рабочий стол  ;D

Сэнкс ещё раз за напоминание  :beer:
Яна (in real)

economist

Есть еще одна хрень StarBasic-а в Base с SQLite - ESCAPEPROCESSING

Это та самая кнопка [SQL], которую всегда нужно держать нажатой, иначе BASE исковеркает запрос и сделает его сбойным.
Но есть и исключение - параметрический или интерактивный, требующий ввода пользователя, запрос. Там нужно наоборот, до вызова запроса сказать что-то типа (пишу по памяти):

oStatement.escapeprocessing=true

     
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

adi_den2013

Я подозреваю проблемы с кодировкой. Набор с клавиатуры визуально - кириллица, в БД SQLite попадает черти-что (простите мне мой фр.  >:()

Региональные настройки ОС  ???
Яна (in real)

rami

Странно, всё вокруг — кириллица, а в одной ячейке — кракозябрица, как это получилось? Переписали текст только в этой ячейке?

adi_den2013

#40
Корректировка  через форму. Набор в поле "Фамилия".
Яна (in real)

economist

В настройках ODBC-драйвера нужно поставить флаг OEMCP Translation
А в настройках в BASE - Системная
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

adi_den2013

Цитата: economist от 22 сентября 2017, 13:09
В настройках ODBC-драйвера нужно поставить флаг OEMCP Translation
А в настройках в BASE - Системная

Огромное спасибо! В настройках драйвера было всё дело.
Яна (in real)