Page 1 of 1

[Solved] Coloring results

Posted: Fri Nov 14, 2014 8:25 am
by dreamquartz
Hi All,

Is there any information available about having a resultset showing different colors when they are not in range?
Example
Positive balance: Black
Negative balance: Red
or
Less than 30 days: Blue
More than 30 days and less than 6 months: Orange
More than 6 months: Black

I would like to be able to show it in a listbox or a table control.

Dream

Re: Coloring results

Posted: Fri Nov 14, 2014 9:04 am
by Villeroy
The number in a formatted field can be formatted like a spreadsheet cell with conditional font colours. See "number formats" in the help index.
You may use Calc as a report engine and dump record sets into a preformatted spreadsheet with conditional number formats, conditional formatting by cell styles and using the STYLE spreadsheet function: [Tutorial] Using registered datasources in Calc

Re: Coloring results

Posted: Fri Nov 14, 2014 9:26 am
by longi
Hi!
I got the same thing you want, but in a report.
Maybe it could be useful for you if you can adapt it.

Code: Select all

Sub FormatoCondicionalMonotabla
    'By JohnSUN-Pensioner (The author of the first macro I used to get this)
    Dim oTextTables As Variant   ' All tables of document
    Dim oTextTable As Variant   ' One table
    Dim oCell As Variant      ' One cell
    ocontroller = Thisdatabasedocument.currentController
    if not ocontroller.isconnected then ocontroller.connect
    oreportdoc = Thisdatabasedocument.reportdocuments.getbyname("My Report").open
    oTexttable = oreportdoc.Texttables(0)
    REM or   oTextTable = oTextTables.getByName("Table2")
    orows = oTexttable.rows
    Columnas= oTexttable.Columns.Count
    for i = 1 to  orows.count-1
    for a = 0 to 0
    oCell = oTextTable.getCellByPosition(a, i)
    oText = oCell.Text
    oCurs = oText.createTextCursor()
    oCurs.gotoEND(True)
    if oCurs.GetString ="(the text you want to have the condition)" Then 
    oCurs.CharFontName = "Arial" '(Noun of the source)
    oCurs.CharUnderline = com.sun.star.awt.FontUnderline.SINGLE '( Emphasises the text )
    oCurs.CharWeight = com.sun.star.awt.FontWeight.BOLD '( Bold )   
    oCurs.CharColor = RGB(255,0,255)
    oCurs.CharHeight = 8
    oCurs.CharPosture = com.sun.star.awt.FontSlant.ITALIC '(Italic)
    oCell.setPropertyValue("BackColor", RGB(255, 255, 0))   ' or any other
    oTexttable.rows(0)
    End if
    Next a
    Next i
End Sub
I'll try to use it into forms as you want. It could be a god thing.
I hope it were useful for you.
Bye!

Re: Coloring results

Posted: Wed Sep 30, 2015 6:12 am
by dreamquartz
Still looking for a solution for a Query.

Dream

Re: Coloring results

Posted: Wed Sep 30, 2015 1:22 pm
by Villeroy
It is definitively impossible for single rows in any kind of grid view. It is possible to change color of a stand-alone controls and an entire grid control as you navigate through the records.

Re: Coloring results

Posted: Wed Sep 30, 2015 5:07 pm
by longi
Hi!

As the teacher said, it seems imposible to get a background colour in a cell as in a text table or a calc table, because the control is all the control table.
However, and I suppose you have already tried, you can change the type of field in the column. So you can have a formatted field, and you can have the colour of the numbers inside the column, and you can have different colours deppending on the value.
I couldn't change the font height, or put in bold the numbers, but I could change their colour.
Maybe is not the best solution, but it could be useful.

The example could be similar to [<4][RED]#.##0;[>=4][BLUE]#.##0;Estandar

Bye!

Re: Coloring results

Posted: Thu Oct 01, 2015 2:58 pm
by longi
Hello one more time!

I've been googling for a bit, and I found a beautiful macro to build a grid into a dialog. Unfortunately, I've never used dialogs in my databases, so I don't know how to deal with them.
The code is really different than the code I've been using lately, so I'm not able to translate this into a form with a grid inside it.
It seems that you can have each row in a different colour (like a zebra), and can change some others parameters, but I don't know how to do it.
I put the code here, and if somebody knows how to work with it, and explain us a bit..., it could be appreciated.
Thanks in advance!

Code: Select all

Sub GridControlTest()
   ' By Oliver, the author I copied

	Dim oColumnModel as Object
	Dim oColumn1 as Object
	Dim oColumn2 as Object
	Dim oDataModel as Object
	Dim oGridModel as Object
	 Dim oGridControl as Object
	Dim oDialogModel as Object
	Dim oDialogControl as Object
 	Dim i as Integer

	 Dim rBounds as new com.sun.star.awt.Rectangle
	Dim oContWin as Object
	 Dim oFrame as Object
 	Dim oToolkit as Object
	 Dim wd as new com.sun.star.awt.WindowDescriptor
	
 	Dim oListener

	oColumnModel = createUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")

   	oColumn1 = createUnoService("com.sun.star.awt.grid.GridColumn")
	oColumn1.Title = "City"
	oColumn1.ColumnWidth = 30
 	oColumn2 = createUnoService("com.sun.star.awt.grid.GridColumn")
	oColumn2.Title = "Country"
	oColumn2.ColumnWidth = 50

	oColumnModel.addColumn(oColumn1)
	oColumnModel.addColumn(oColumn2)

	oDataModel = createUnoService("com.sun.star.awt.grid.DefaultGridDataModel")
	For i = 0 To 20
		oDataModel.addRow (""&i, Array(Chr(97+i), Chr(65+i)))
	Next i

	oDialogModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
	oDialogModel.Title = "GridControl Test"
	oDialogControl = createUnoService("com.sun.star.awt.UnoControlDialog")
	oDialogControl.setModel( oDialogModel )
	oDialogControl.setPosSize( 100, 100, 400, 500, com.sun.star.awt.PosSize.POSSIZE)

	oGridModel = oDialogModel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
	oGridModel.Name = "MyGrid"
	oGridModel.GridDataModel = oDataModel
	oGridModel.ColumnModel = oColumnModel
	oGridModel.ShowColumnHeader = True
	oGridModel.ShowRowHeader = True
	oGridModel.HScroll = True
	oGridModel.VScroll = True
	oGridModel.Sizeable = True

	oGridControl = createUnoService("com.sun.star.awt.grid.UnoControlGrid")
	oGridControl.setModel(oGridModel)

	oDialogControl.addControl("MyGrid", oGridControl)
	oGridControl.setPosSize(10, 10, 380, 380, com.sun.star.awt.PosSize.POSSIZE)

	oToolkit = createUnoService("com.sun.star.awt.Toolkit")

	rBounds.X = oDialogControl.PosSize.X
	rBounds.Y = oDialogControl.PosSize.Y
	rBounds.Width  = oDialogControl.PosSize.Width
	rBounds.Height = oDialogControl.PosSize.Height

	wd.Type = com.sun.star.awt.WindowClass.TOP
	wd.Bounds = rBounds
  	With com.sun.star.awt.WindowAttribute
	wd.WindowAttributes = .BORDER + .MOVEABLE + .SIZEABLE + .CLOSEABLE
	End With
	wd.WindowServiceName = "window"
	
	oContWin = oToolkit.createWindow(wd)

	oFrame = createUnoService("com.sun.star.frame.Frame")
  	oFrame.initialize(oContWin)
	StarDesktop.getFrames().append(oFrame)
	oFrame.Name = "TestGridFrame"
	oFrame.Title = "TestGridTitle"

	oGridControl.createPeer(oToolkit, oContWin)
	oContWin.setVisible(True)

	oListener = CreateUnoListener("XGridSelection_", "com.sun.star.awt.grid.XGridSelectionListener")
	oGridControl.addSelectionListener(oListener)

End Sub

Sub XGridSelection_selectionChanged(oEvt)
	MsgBox "selected row: " & oEvt.Row
End Sub

Sub XGridSelection_disposing(oEvt)
End Sub
It doesn't matter if you put the macro in a writer document nor in a database. It works in the same way.

Bye!

Re: Coloring results

Posted: Thu Oct 01, 2015 10:56 pm
by dreamquartz
longi wrote:Hi!

As the teacher said, it seems imposible to get a background colour in a cell as in a text table or a calc table, because the control is all the control table.
However, and I suppose you have already tried, you can change the type of field in the column. So you can have a formatted field, and you can have the colour of the numbers inside the column, and you can have different colours deppending on the value.
I couldn't change the font height, or put in bold the numbers, but I could change their colour.
Maybe is not the best solution, but it could be useful.

The example could be similar to [<4][RED]#.##0;[>=4][BLUE]#.##0;Estandar

Bye!
Thanks for this one.
I was using this, and am using it as follows:
[<4][RED]#.##0;[>=4][<10][BLUE]#.##0;REGULAR.

The biggest challenge I have now trying to do something similar with dates.
I did not find anything so far.

Dream

Re: Coloring results

Posted: Thu Oct 01, 2015 11:03 pm
by dreamquartz
longi wrote:Hello one more time!

I've been googling for a bit, and I found a beautiful macro to build a grid into a dialog. Unfortunately, I've never used dialogs in my databases, so I don't know how to deal with them.
The code is really different than the code I've been using lately, so I'm not able to translate this into a form with a grid inside it.
It seems that you can have each row in a different colour (like a zebra), and can change some others parameters, but I don't know how to do it.
I put the code here, and if somebody knows how to work with it, and explain us a bit..., it could be appreciated.
Thanks in advance!

Code: Select all

Sub GridControlTest()
   ' By Oliver, the author I copied

	Dim oColumnModel as Object
	Dim oColumn1 as Object
	Dim oColumn2 as Object
	Dim oDataModel as Object
	Dim oGridModel as Object
	 Dim oGridControl as Object
	Dim oDialogModel as Object
	Dim oDialogControl as Object
 	Dim i as Integer

	 Dim rBounds as new com.sun.star.awt.Rectangle
	Dim oContWin as Object
	 Dim oFrame as Object
 	Dim oToolkit as Object
	 Dim wd as new com.sun.star.awt.WindowDescriptor
	
 	Dim oListener

	oColumnModel = createUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")

   	oColumn1 = createUnoService("com.sun.star.awt.grid.GridColumn")
	oColumn1.Title = "City"
	oColumn1.ColumnWidth = 30
 	oColumn2 = createUnoService("com.sun.star.awt.grid.GridColumn")
	oColumn2.Title = "Country"
	oColumn2.ColumnWidth = 50

	oColumnModel.addColumn(oColumn1)
	oColumnModel.addColumn(oColumn2)

	oDataModel = createUnoService("com.sun.star.awt.grid.DefaultGridDataModel")
	For i = 0 To 20
		oDataModel.addRow (""&i, Array(Chr(97+i), Chr(65+i)))
	Next i

	oDialogModel = createUnoService("com.sun.star.awt.UnoControlDialogModel")
	oDialogModel.Title = "GridControl Test"
	oDialogControl = createUnoService("com.sun.star.awt.UnoControlDialog")
	oDialogControl.setModel( oDialogModel )
	oDialogControl.setPosSize( 100, 100, 400, 500, com.sun.star.awt.PosSize.POSSIZE)

	oGridModel = oDialogModel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
	oGridModel.Name = "MyGrid"
	oGridModel.GridDataModel = oDataModel
	oGridModel.ColumnModel = oColumnModel
	oGridModel.ShowColumnHeader = True
	oGridModel.ShowRowHeader = True
	oGridModel.HScroll = True
	oGridModel.VScroll = True
	oGridModel.Sizeable = True

	oGridControl = createUnoService("com.sun.star.awt.grid.UnoControlGrid")
	oGridControl.setModel(oGridModel)

	oDialogControl.addControl("MyGrid", oGridControl)
	oGridControl.setPosSize(10, 10, 380, 380, com.sun.star.awt.PosSize.POSSIZE)

	oToolkit = createUnoService("com.sun.star.awt.Toolkit")

	rBounds.X = oDialogControl.PosSize.X
	rBounds.Y = oDialogControl.PosSize.Y
	rBounds.Width  = oDialogControl.PosSize.Width
	rBounds.Height = oDialogControl.PosSize.Height

	wd.Type = com.sun.star.awt.WindowClass.TOP
	wd.Bounds = rBounds
  	With com.sun.star.awt.WindowAttribute
	wd.WindowAttributes = .BORDER + .MOVEABLE + .SIZEABLE + .CLOSEABLE
	End With
	wd.WindowServiceName = "window"
	
	oContWin = oToolkit.createWindow(wd)

	oFrame = createUnoService("com.sun.star.frame.Frame")
  	oFrame.initialize(oContWin)
	StarDesktop.getFrames().append(oFrame)
	oFrame.Name = "TestGridFrame"
	oFrame.Title = "TestGridTitle"

	oGridControl.createPeer(oToolkit, oContWin)
	oContWin.setVisible(True)

	oListener = CreateUnoListener("XGridSelection_", "com.sun.star.awt.grid.XGridSelectionListener")
	oGridControl.addSelectionListener(oListener)

End Sub

Sub XGridSelection_selectionChanged(oEvt)
	MsgBox "selected row: " & oEvt.Row
End Sub

Sub XGridSelection_disposing(oEvt)
End Sub
It doesn't matter if you put the macro in a writer document nor in a database. It works in the same way.

Bye!
I am with Villeroy in relation to Macros. They are "Evil". I had to convince our Client to use one Macro, and that took a long time.
See: viewtopic.php?f=13&t=79079.
So, thank you for this solution, and by the looks of it it would work.

The solution you gave above, is doing the trick for what we were looking for.

Dream

Re: Coloring results

Posted: Wed Mar 16, 2016 6:31 pm
by dreamquartz
Villeroy wrote:It is definitively impossible for single rows in any kind of grid view. It is possible to change color of a stand-alone controls and an entire grid control as you navigate through the records.
Can you elaborate?
Using HSQLDB 2.3.3 these days....

Dream

Re: Coloring results

Posted: Wed Mar 16, 2016 9:14 pm
by Villeroy
The API offers to do this:
MyFormControl.Model.BackgroundColor = cLng(ColorCode)

but not
MyGridControl.Model.Row(x).BackgroundColor = cLng(ColorCode)

Rule of thumb: If there is no way to do it manually in the GUI, then it can't be done with a macro.

Re: Coloring results

Posted: Thu Mar 17, 2016 12:42 am
by dreamquartz
Villeroy wrote:The API offers to do this:
MyFormControl.Model.BackgroundColor = cLng(ColorCode)

but not
MyGridControl.Model.Row(x).BackgroundColor = cLng(ColorCode)

Rule of thumb: If there is no way to do it manually in the GUI, then it can't be done with a macro.
K :(