Как по условию сменить цвет поля/фона/текста?

Автор MichaFon, 2 декабря 2016, 22:13

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

MichaFon

Подскажите, пожалуйста, как сменить цвет по условию? В зависимости от выбора пользователя, неких значений в форме (выпадающий список, вероятность события и угроза от события) определяется результат риска (A, B, C, D, E). Если значение A или B цвет нужно установить красный (цвет чего не принципиально всего поля, фона, текста риска). В Base вижу только статические наборы цветов, без возможности задать выражение, может через макрос можно менять цвет?

Пока нашел только упоминание о смене цвета тут:  http://www.openoffice.org/api/docs/common/ref/com/sun/star/inspection/PropertyControlType.html#ColorListBox. Одна из-за отсутствия опыта не могу понять, как использовать (менять цвет) на практике.

rami

Цитата: MichaFon от  2 декабря 2016, 22:13
Подскажите, пожалуйста, как сменить цвет по условию? В зависимости от выбора пользователя, неких значений в форме (выпадающий список, вероятность события и угроза от события) определяется результат риска (A, B, C, D, E). Если значение A или B цвет нужно установить красный (цвет чего не принципиально всего поля, фона, текста риска). В Base вижу только статические наборы цветов, без возможности задать выражение, может через макрос можно менять цвет?
Макросом в формах можно, давайте образец базы и что нужно покрасить.

MichaFon

Спасибо огромное.
Во вложении форма, правда тут всего один список и цифра, но не важно. Мне главное понять, как цвет менять. В данном случай, если результат выбора =1 то цвет красный, если =5 то зеленый. Подобное мне нужно в разных местах организовать.

rami

Цитата: MichaFon от  2 декабря 2016, 21:50Во вложении форма, правда тут всего один список и цифра, но не важно. Мне главное понять, как цвет менять. В данном случай, если результат выбора =1 то цвет красный, если =5 то зеленый. Подобное мне нужно в разных местах организовать.
Если список в фокусе, то его цвет не виден, тем более, что окрашивается весь список целиком, а не отдельные строки. Поэтому лучше раскрашивать не сам список, а связанную с ним метку или что-нибудь другое (для примера, таблицу)

MichaFon

Еще раз спасибо, с цветом понятно это то что нужно.
Пытяюсь теперь реализовать определение буквы риска (ABCDE, см. скрин - это пересечение строк и столбцов) по результату выбора из списков (S0-5 + P0-5), однако получаю ошибку на отсутствие Object.
Я хотел повесить макрос на список и результат сразу вписывать в таблицу 20_UE.  Возможно я вообще зря затеял определение буквы риска и нужно просто "починить" связи в таблицах (видь все данные с виду есть). Подскажите, пожалуйста, опытным взглядом.

rami

Цитата: MichaFon от  3 декабря 2016, 13:08Пытяюсь теперь реализовать определение буквы риска (ABCDE, см. скрин - это пересечение строк и столбцов) по результату выбора из списков (S0-5 + P0-5), однако получаю ошибку на отсутствие Object.
Где в макросе "RiskAuto" вы определили переменную "Statement" ??? и где найти форму по имени "FinalRisk" ???
В документе "frm_20_UnwantedEvent" у вас всего две формы: главная форма "Formulario1" и субформа "SubFormUEList" — какая из этих двух "FinalRisk" ???

MichaFon

#6
Отвечая на ваш вопрос я начинаю понимать насколько далек от решения свей задачи и пошел исправлять ошибки... Ответ на вопросы: 1)Переменную "Statement" забыл определить. 2) Нет такой формы "FinalRisk" это моя ошибка, я думал можно указать имя поля которое Update-им.  "FinalRisk" это поле, куда я пытаюсь вписать (степень риска A B C D или E) в таблице 20_UE.

На скриншоте Risk3 я постарался показать задуманное: нужно при выборе Likelihood(таблица MatrixLikelihood) и Severity(таблица MatrixSeverity), определить результирующую степень риска (ABCDE) из таблицы MatrixRisk. Идея в том, что первым выбирают Likelihood, затем Severity(поэтому макрос на это поле повесил), когда все выбрано пазл сходиться и мы определяем степень риска, если A цвет красный, если E цвет зеленый.

В макросе мне нужно реализовать нечто вроде:  executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = <переменная>) WHERE IDUE = <переменная>")
, где <переменная> - то что вводит человек см.скрин IDUE

Не могу получить искомое значение в макросе вечно ошибка вроде Object не найден и т.п.

MichaFon

#7
Пожалуйста, подскажите, с макросом:
1) не могу "дотянуться" до значения <переменная> (это текущее знащение IDUE на момент активации макроса из таблицы 20_UE)
2) не могу выполнить макрос на работу с нужными таблицами

Пока не решил проблему с пунктом №1 пробую переменной oIDUE присвоить "правильное" значение. Однако результат в "oFinalRisk" пусто, предполагаю, что причина в подключении к БД.
Sub RiskAuto
 Dim oForm As Object, oForms As Object, oTable as Object
 Dim oStatement As Object, oEvent as object, oFinalRisk As Object, oQuery as String
db=ConnectToDataBase("DATABASE-Empty 3")
oStatement=DB.createStatement()
 'oForms = ThisComponent.getDrawPage().getForms()
 'oForm = oEvent.Source.getModel().getParent()
 oIDUE="28"
 'oIDUE=oForm.getByName("IDUE")
 'MsgBox oIDUE
 oQuery="SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "'"
'MsgBox oQuery
oFinalRisk=oStatement.executeQuery(oQuery)
'MsgBox oFinalRisk
If Not IsNull(oFinalRisk) And Not IsEmpty(oFinalRisk) Then
End if
Result = oFinalRisk.GetString(1)
' MsgBox Result
oTable=e.Source.Context.Controls(0).Model
 oTable.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '"&oIDUE&"') WHERE IDUE = '"&oIDUE&"'")

DisconnectFromDataBase(db)
End Sub


rami

Поправил макрос:
Sub RiskAuto
Dim oForm As Object, oForms As Object, oTable as Object
Dim oStatement As Object, oEvent As object, oFinalRisk As Object, oQuery$, oRisk$
oIDUE="28"   '"правильное" значение
oQuery="SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = :x"

db=ConnectToDataBase("DATABASE-Empty 3")
ps=db.prepareStatement(oQuery)   'запрос по значению oIDUE
ps.setLong(1,oIDUE)
oResult=ps.executeQuery()
If NOT IsNull(oResult) AND NOT IsEmpty(oResult) Then
If oResult.next() Then oRisk=oResult.getString(1)
End If
oStatement=db.createStatement()

oSql="UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = '" & oRisk & "' WHERE IDUE = " & oIDUE
oStatement.executeQuery(oSql)   'вставка в таблицу

DisconnectFromDataBase(db)
End Sub


P.S. MichaFon, используйте уникальные названия для документов которые выкладываете на форуме (3 дек. и сегодня вы выложили разные документы под одним именем — что не есть хорошо)

MichaFon

Исправил(сменил имя загруженного файла).
Цитата: rami от  7 декабря 2016, 08:54P.S. MichaFon, используйте уникальные названия для документов которые выкладываете на форуме

MichaFon

В макросе не могу получить  текущий IDUE и записать его в переменную - ошибка Object не установлен. Поэтому для отладку пробовал вручную присваивать значение переменной. Но и тут ошибка NoData is Available

Sub RiskAuto
  Dim oForm As Object, oForms As Object, oTable as Object
  Dim oStatement As Object, oEvent as object, oFinalRisk As Object, oQuery as String
db=ConnectToDataBase("DATABASE-Empty4")
oStatement=DB.createStatement()
oForms = ThisComponent.getDrawPage().getForms()
oForm = oEvent.Source.getModel().getParent()
' oIDUE="28" 'для проверки\отладки
oIDUE=oForm.getByName("IDUE")
  'MsgBox oIDUE
  oQuery="SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "'"
'MsgBox oQuery
oFinalRisk=oStatement.executeQuery(oQuery)
If Not IsNull(oFinalRisk) And Not IsEmpty(oFinalRisk) Then
End if
Result = oFinalRisk.GetString(1)
' MsgBox Result
oTable=e.Source.Context.Controls(0).Model
oTable.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "') WHERE IDUE = '" & oIDUE & "'")
DisconnectFromDataBase(db)
End Sub

MichaFon

#11
Понял ошибку и смог определить IDUE (записать в переменную oIDUE) и смог определить букву риска (FinalRisk)
Sub RiskAuto (oEvent as Variant)
 Dim oForm As Object, oForms As Object, oTable as Object
 Dim oStatement As Object, oEvent as object, oFinalRisk As Object, oQuery as String
db=ConnectToDataBase("DATABASE-Empty5")
oStatement=DB.createStatement()
 oForms = ThisComponent.getDrawPage().getForms()
 oForm  = oForms().getByName("SubFormUEList")
 oID=oForm.getByName("txtIDUE")
oIDUE=CDbl(oID.text)
' MsgBox oIDUE
 oQuery="SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "'"
'MsgBox oQuery
oFinalRisk=oStatement.executeQuery(oQuery)
If Not IsNull(oFinalRisk) And Not IsEmpty(oFinalRisk) Then
oFinalRisk.next()
Result = oFinalRisk.GetString(1)
MsgBox Result
End if
oTable=e.Source.Context.Controls(0).Model
 oTable.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "') WHERE IDUE = '" & oIDUE & "'")

DisconnectFromDataBase(db)
End Sub


Переменную oFinalRisk и oQuery определял сугубо для отладки (букву риска определяю без ошибки).
Осталось решить проблему, как в таблицу вписать риск, при выполнении кода:
oTable=e.Source.Context.Controls(0).Model
 oTable.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "') WHERE IDUE = '" & oIDUE & "'")

ошибка Object не установлен


rami

Цитата: MichaFon от  8 декабря 2016, 22:00Осталось решить проблему, как в таблицу вписать риск, при выполнении кода:
oTable=e.Source.Context.Controls(0).Model
  oTable.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "') WHERE IDUE = '" & oIDUE & "'")

ошибка Object не установлен
1. откуда берётся е ведь передаётся событием oEvent
2. executeUpdate надо применять не к таблице в форме, а к базе:
oStatement.executeUpdate("UPDATE ""20_UE"" SET ""20_UE"".""FinalRisk"" = (SELECT ""MatrixRisk"".""Risk"" FROM ""20_UE"", ""MatrixRisk"" WHERE ""20_UE"".""FinalLikelihood"" = ""MatrixRisk"".""IDLikelihood"" AND ""20_UE"".""FinalSeverity"" = ""MatrixRisk"".""IDSeverity"" AND ""20_UE"".""IDUE"" = '" & oIDUE & "') WHERE IDUE = '" & oIDUE & "'")   'вставка в таблицу
потом обновить.

Что у вас вызывает макрос RiskAuto?

JohnSUN

Событие по смене S1-S5 - комбобокс слева внизу
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

MichaFon

Комбо-бокс Severity

Цитата: rami от  8 декабря 2016, 23:001. откуда берётся е ведь передаётся событием oEvent
Ошибку понял, но пока не понял как исправить. "e" это скопировал Вашу же реализацию смены цвета таблицы, скопировал как есть нужно "e" заменить на "правильный" код.