Список форумов Форум Libreoffice

Форум Libreoffice

Добро пожаловать на Форум Libreoffice!
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

English French German Italian Portuguese Russian Spanish
Последовательная фильтрация. Списки и Запросы

 
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Base
Предыдущая тема :: Следующая тема  
Автор Сообщение
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Вс Окт 09, 2011 10:17 am    Заголовок сообщения: Последовательная фильтрация. Списки и Запросы Ответить с цитатой

Продолжение темы Последовательная фильтрация данных
Сейчас рассмотрим последовательную фильтрацию Данных для выпадающих Списков (ComboBox) с помощью Запросов.
Для примера выбраны показания счетчиков горячей и холодной воды, установленных в неких квартирах неких домов (в некоем ТСЖ, обслуживающем эти дома).
Макрос, связывающий выпадающие Списки (ComboBox) и Таблицу на форме, приведен ниже:
Код:
Global mForm As Object
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main
   mForm = ThisComponent.DrawPage.Forms.GetByIndex(0)
   Main1
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main1
     ComboBox1 = mForm.getByName("ComboBox1")
     SelItem = ComboBox1.SelectedItems(0)
     sStr = ComboBox1.StringItemList(SelItem)

   ComboBox2 = mForm.getByName("ComboBox2")
   ComboBox2.ListSource = Array("SELECT ""Квартира"".""квартира"",""Дом"".""дом"",""Квартира"".""Idдом"",""Дом"".""ID"" FROM ""Квартира"" AS ""Квартира"", ""Дом""  AS ""Дом"" WHERE  ""Квартира"".""Idдом"" = ""Дом"".""ID"" AND  (""Дом"".""дом"" = "&"'"& sStr &"'"&")")   
   ComboBox2.refresh()

   Main2
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main2
   ComboBox2 = mForm.getByName("ComboBox2")
     SelItem = ComboBox2.SelectedItems(0)
     sStr = ComboBox2.StringItemList(SelItem)

    ComboBox3 = mForm.getByName("ComboBox3")
   ComboBox3.ListSource = Array("SELECT ""Счетчики"".""НомерСчетчика"", ""Счетчики"".""Idквартира"",""Квартира"".""ID"", ""Квартира"".""квартира"" FROM ""Счетчики"" AS ""Счетчики"", ""Квартира"" AS ""Квартира"" WHERE ""Счетчики"".""Idквартира"" = ""Квартира"".""ID"" AND  (""Квартира"".""квартира"" = "&"'"& sStr &"'"&")")   
   ComboBox3.refresh()

   Main3   
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main3
    ComboBox3 = mForm.getByName("ComboBox3")   
   ComboBox3.refresh()

   Main12   
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main12
   Dim DatabaseContext As Object
   Dim DataSource As Object
   Dim Connection As Object
   Dim Statement As Object
   Dim ResultSet As Object

    ComboBox3 =   mForm.getByName("ComboBox3")   
     SelItem = ComboBox3.SelectedItems(0)
     sStr = ComboBox3.StringItemList(SelItem)

   DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
'   DataSource = DatabaseContext.getByName("Filter3ComboBox")                     'нужна регистрация базы данных
   DataSource = DatabaseContext.getByName(ConvertToURL("C:\Base\Filter3ComboBox.odb"))   'НЕ нужна регистрация базы данных
   Connection = DataSource.GetConnection("", "")
   Statement = Connection.createStatement()

   ResultSet = Statement.executeQuery("SELECT ""ID"", ""НомерСчетчика"" FROM ""Счетчики"" AS ""Счетчики"" WHERE ""НомерСчетчика"" = "&"'"& sStr &"'"&"")

   While ResultSet.Next
      mForm.filter   = "IDСчетчика = " + "'" + ResultSet.getString(1) + "'"
   Wend

   mForm.reload
   
End Sub


Файл примера http://ifolder.ru/26230920



Замечания:

1. Работа проверена на Libreoffice 3.4.3, OpenOffice pro 3.1.1 (Инфра), OpenOffice 3.2.1 (Oracle, Eng)

2. Rolling Eyes В случае OpenOffice pro 3.1.1 (Инфра) работает без ошибок и при замене этой части кода
Код:
   While ResultSet.Next
      mForm.filter   = "IDСчетчика = " + "'" + ResultSet.getString(1) + "'"
   Wend

на

Код:
   ResultSet.BeforeFirst()
   ResultSet.Next
   mForm.filter   = "IDСчетчика = " + "'" + ResultSet.getString(1) + "'"
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
RFJ



Репутация: +1    

Зарегистрирован: 02.08.2011
Сообщения: 59

СообщениеДобавлено: Вс Окт 09, 2011 11:43 am    Заголовок сообщения: Ответить с цитатой

Вариант предыдущего примера. В данном примере слегка изменен макрос для того, чтобы можно было произвольно менять имя файла БД и его расположение (URL, Location).
Код:
DataSource = DatabaseContext.getByName(pathfile)
   
'Не нужна регистрация базы данных,
'можно произвольно менять имя файла БД и
'его расположение (URL, Location)

pathfile определяется в макросе, привязанном к событию "Открытие файла"
Код:
   oDoc = ThisComponent
   pathfile = oDoc.URL


Файл примера http://ifolder.ru/26232088
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mathnew



Репутация: 0    

Зарегистрирован: 20.08.2011
Сообщения: 24

СообщениеДобавлено: Вт Окт 11, 2011 11:04 am    Заголовок сообщения: Ответить с цитатой

Для чтения текущего значения Combobox'a можно вместо
Код:
ComboBox1 = mForm.getByName("ComboBox1")
SelItem = ComboBox1.SelectedItems(0)
sStr = ComboBox1.StringItemList(SelItem)

использовать просто
Код:
ComboBox1 = mForm.getByName("ComboBox1")
sStr = ComboBox1.CurrentValue

и т.д., и т.п.

Тогда макрос (от RFJ) будет таким:
Код:
Global mForm As Object
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main
   mForm = ThisComponent.DrawPage.Forms.GetByIndex(0)
   Main1
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main1
     ComboBox1 = mForm.getByName("ComboBox1")
     sStr = ComboBox1.CurrentValue

   ComboBox2 = mForm.getByName("ComboBox2")
   ComboBox2.ListSource = Array("SELECT ""Квартира"".""квартира"",""Дом"".""дом"",""Квартира"".""Idдом"",""Дом"".""ID"" FROM ""Квартира"" AS ""Квартира"", ""Дом""  AS ""Дом"" WHERE  ""Квартира"".""Idдом"" = ""Дом"".""ID"" AND  (""Дом"".""дом"" = "&"'"& sStr &"'"&")")   
   ComboBox2.refresh()

   Main2
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main2
   ComboBox2 = mForm.getByName("ComboBox2")
     sStr = ComboBox2.CurrentValue

    ComboBox3 = mForm.getByName("ComboBox3")
   ComboBox3.ListSource = Array("SELECT ""Счетчики"".""НомерСчетчика"", ""Счетчики"".""Idквартира"",""Квартира"".""ID"", ""Квартира"".""квартира"" FROM ""Счетчики"" AS ""Счетчики"", ""Квартира"" AS ""Квартира"" WHERE ""Счетчики"".""Idквартира"" = ""Квартира"".""ID"" AND  (""Квартира"".""квартира"" = "&"'"& sStr &"'"&")")   
   ComboBox3.refresh()

   Main3   
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main3
    ComboBox3 = mForm.getByName("ComboBox3")   
   ComboBox3.refresh()

   Main12   
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Main12
   Dim DatabaseContext As Object
   Dim DataSource As Object
   Dim Connection As Object
   Dim Statement As Object
   Dim ResultSet As Object

    ComboBox3 =   mForm.getByName("ComboBox3")   
     sStr = ComboBox3.CurrentValue

   DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
'   DataSource = DatabaseContext.getByName("Filter3ComboBox")                     'нужна регистрация базы данных
   DataSource = DatabaseContext.getByName(ConvertToURL("C:\Base\Filter3ComboBox.odb"))   'НЕ нужна регистрация базы данных
   Connection = DataSource.GetConnection("", "")
   Statement = Connection.createStatement()

   ResultSet = Statement.executeQuery("SELECT ""ID"", ""НомерСчетчика"" FROM ""Счетчики"" AS ""Счетчики"" WHERE ""НомерСчетчика"" = "&"'"& sStr &"'"&"")

   While ResultSet.Next
      mForm.filter   = "IDСчетчика = " + "'" + ResultSet.getString(1) + "'"
   Wend

   mForm.reload
   
End Sub
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mathnew



Репутация: 0    

Зарегистрирован: 20.08.2011
Сообщения: 24

СообщениеДобавлено: Вт Окт 11, 2011 11:15 am    Заголовок сообщения: Ответить с цитатой

RFJ писал(а):
'Не нужна регистрация базы данных,

'можно произвольно менять имя файла БД и

'его расположение (URL, Location)


Базы всё-таки лучше регистрировать.
Незарегистрированные базы иногда выдают ошибки, не появляющиеся в зарегистрированных, особенно при отладке.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Форум Libreoffice -> Base Часовой пояс: GMT
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Вы можете бесплатно создать форум на MyBB2.ru, RSS