Макрос копирования строки Calc в базу данных

Автор AlexWorkStream, 20 сентября 2017, 15:22

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

AlexWorkStream

Цитата: rami от 29 сентября 2017, 11:20поставьте птичку "Сохранить форматирование"
Оказывается все так просто ))). Спасибо, все работает.

rami

А заодно подумайте о других птичках в этом окошке, может пригодятся.

AlexWorkStream

Так, а теперь вылезла следующая проблема. Каким образом сменить тип столбца в готовой базе данных с date на integer? При смене - предлагает только удалить и создать новый столбец.

rami


AlexWorkStream

Это понятно, но я думал есть иные способы...

rami

В офисной базе нет, но переделать таблицу в базе не сложно. Из старой таблицы переносите данные в кальк, создаёте новую пустую таблицу в базе и перетягиваете данные из калька в новую таблицу в базе. Мастер спросит "что перенести?", указываете "только данные".

economist

#21
Если движок СУБД HSQLDB - нужно очень внимательно создавать таблицы. Тот случай когда 7 раз отмерь - 1 раз отрежь. Ошибка с CDate связана 99% именно с типом столбца в Base.

Лучше всего создавать таблицы SQL-инструкцией CREATE TABLE... не полагаясь на конструктор-дизайнер. Созданные таблицы изменению не подлежат, создавайте в них столбцы "на будущее", не стесняясь их называть Rezerv1, Rezerv2 итп.

А еще - бойтесь HSQLDB - это база со странностями: только монопольный режим, нет ODBC-драйверов и грабельки повсюду. Из другого (не OpenOffice|LibreOffice) приложения - положить данные в HSQLDB очень сложно. Это как веганство/сыроедение, жить можно но...

Я не слышал ни об одной реальной HSQLDB-базе размером больше 1 Гб, даже об "учебных" не слышал. В то же время в BASE файлик odb, сcылающийся на SQLite через ODBC - у меня размером 6 Гб и работает быстрее чем то же самое, хранимое в не-файловых MySQL, PostgreSQL, FireBird (также в odb черезх ODBC). HSQL умер уже при размере 100 Мбайт, и это не только мой опыт.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

AlexWorkStream

Цитата: rami от 20 сентября 2017, 14:33col1=oSheet.getCellByPosition(0,i).String   'первый столбец текущей строки
col2=oSheet.getCellByPosition(1,i).Value    'второй столбец текущей строки
col3=oSheet.getCellByPosition(2,i).Value    'третий столбец текущей строки
А если мне надо портировать текст, тогда как с этим быть?

rami

Цитата: AlexWorkStream от 29 сентября 2017, 15:42
Цитата: rami от 20 сентября 2017, 14:33
col1=oSheet.getCellByPosition(0,i).String   'первый столбец текущей строки
col2=oSheet.getCellByPosition(1,i).Value    'второй столбец текущей строки
col3=oSheet.getCellByPosition(2,i).Value    'третий столбец текущей строки
А если мне надо портировать текст, тогда как с этим быть?
Я не понял вопрос ???

Первая строка в приведённом примере извлекает данные из ячейки Calc как текст (.String), а вторая и третья как значение (.Value), если в ячейке не число, то его числовое значение равно нулю.

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

AlexWorkStream

Цитата: rami от 29 сентября 2017, 15:14извлекает данные из ячейки Calc как текст (.String), а вторая и третья как значение (.Value)
В том-то и дело, что при изменении на .String - выдает ошибку:

Ошибка времени выполнения BASIC.
Вызвано исключение
Type: com.sun.star.sdbc.SQLException
Message: Column not found: ПРИ.

В данном случае в ячейке текст - "при", в базе поле определено как ТЕКСТ(VARCHAR), но вставить текст не получается.

rami

Цитата: AlexWorkStream от 29 сентября 2017, 16:57Message: Column not found: ПРИ.
Тут ясно сказано, что столбец по имени "ПРИ" не найден. Запрос состоит из перечисления столбцов и соответствующих им данных. Вы наверно, где-то ошиблись в запросе, поэтому данные воспринимаются как имя несуществующего столбца.

AlexWorkStream

Цитата: rami от 29 сентября 2017, 17:24Вы наверно, где-то ошиблись в запросе
Перепроверил много раз, но так и не понял где ошибка. Если поменять .String на .Value и сменить в ячейках текст на значения, то все работает, а с текстом такая проблема...

Ниже пример макроса

Sub InsertIntoBase
Dim oSheet, oRange, db, oStatement, i%, col1, col2, col3, oSql$

oSheet=ThisComponent.CurrentSelection.getSpreadsheet    'лист на котором выделен диапазон с данными
oRange=ThisComponent.CurrentSelection.getRangeAddress   'выделенный диапазон любое число строк
db=ConnectToDataBase("КАТАЛОГ_Новая_База")   'Имя подключаемой базы
oStatement=db.createStatement

For i=oRange.startRow To oRange.EndRow
col1=oSheet.getCellByPosition(0,i).String   'первый столбец текущей строки
col2=oSheet.getCellByPosition(1,i).Value    'второй столбец текущей строки
col3=oSheet.getCellByPosition(2,i).String    'третий столбец текущей строки

'в запросе ниже заменить названия таблицы и полей
oSql="INSERT INTO ""КАТАЛОГ"" " & "(""ID"",""Дата создания"",""Составные артикула 1"") values " & _
"(" & col1 & "," & col2 & "," & col3 & ")"

oResult=oStatement.executeQuery(oSql)       'выполнение запроса
Next
DisconnectFromDataBase(db)     'отключаемся от базы
End Sub

'функция подключения к базе
Function ConnectToDataBase(dbName$) As Object
Dim dbContext As Object, oDataSource As Object
dbContext=createUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource=dbContext.getByName(dbName)
ConnectToDataBase=oDataSource.GetConnection("","")
End Function

'процедура отключения
Sub DisconnectFromDataBase(db As Object)
db.close
db.dispose()
End Sub

rami

Выложите на форум базу и документ кальк, если они большие, удалите лишнее, оставьте по десять строк.

AlexWorkStream


AlexWorkStream

Цитата: rami от 29 сентября 2017, 18:47Выложите на форум базу и документ кальк
Сделал новый образец, но все равно ошибка столбца...