리포트 테이블은 캔버스에 이력 데이터를 표 형태로 표시할 때 사용하는 용도로 사용됩니다.


 

 리포트 테이블은 기존에 개발된 이력 데이터 표시 기능과 다음과 같은 차이점이 있습니다.  

  • 상태 포인트와 아날로그 포인트를 함께 표에 표시할 수 있습니다.
  • 리포트에 표시할 이력 데이터의 속성을 혼합하여 표시할 수 있습니다. 예를 들어 포인트 1의 순시 값과 포인트 2의 변화량 값을 동일한 표에 표시할 수 있습니다.
  • 서로 다른 이력 데이터 그룹의 데이터를 함께 표시할 수 있습니다. 예를 들어 이력 데이터 그룹 1과 그룹 2의 데이터를 함께 표시할 수 있습니다.
  • 스크립트를 활용해 실제 데이터 값에 연산식을 적용하여 새로운 값을 표시할 수 있습니다.
  • 시작과 끝 날짜를 선택해 해당 범위의 데이터를 불러 올수 있습니다.
  • 데이터 표시 범위(일, 월, 년)를 지정할 수 있습니다.


아래 그림은 리포트 테이블의 설정화면 예시 입니다. 설정화면을 통해 표에 출력할 데이터 및 데이터 형식 등을 설정 할수 있습니다.

 


  사용자는 리포트 테이블 위젯에서 제공하는 툴바를 이용하여 리포트 조회 및 출력할 수 있으며,

툴바를 사용하지 않을 경우 아래의 함수로 스크립트를 작성하여 원하는 기능을 사용할 수 있습니다.

Method

 리포트 테이블에서 제공하는 기능은 아래 표와 같습니다.

리턴 값

함 수

설 명


connectCurrentIndexChanged()

표에 선택된 항목 변경시 이벤트를 수신 합니다.

date

currentLogDate()

리포트 테이블에 표시된 이력 데이터의 날짜를 읽어 옵니다.


loadDateRange( fromDate,toDate )

시작일과  마지막 일을 지정해 해당 기간의 데이터를 불러 옵니다.


exportToFile (reportName)

표에 표시된 데이터를 파일(엑셀, CSV)로 출력 합니다.


replaceText( replaceList )

리포트 테이블의 표시 데이터 이름을 변경해 필요에 따라 표에 다른 데이터를 불러올때 사용합니다.


selectRow(row)

리포트 테이블에서 지정된 행을 선택합니다


setCurrentLogDate( date )

리포트 테이블에 선택한 날짜(Python Date형식)의 데이터를 표시 합니다.


setCurrentLogDateYMD( year,month,day )

리포트 테이블에 선택한 날짜의 데이터를 표시 합니다.


setColumnValueConvertor( column, functor )

지정한 열에 변환 함수를 등록해 해당열의 값에 연산식을 적용해 새로운 값을 표시합니다.


setDataType( kind )

리포트 테이블에 지정한 리포트 형식(시보,일보,월보,연보)의 데이터를 불러 옵니다. 리포트 테이블에 설정된 리포트 종류가 데이터 리포트인 경우에만  동작합니다.


setDisplayDateRange(kind )

리포트 테이블의 표시 기간 범위(일별, 월별, 연별, 범위)를 지정합니다.


setDisplayStep(minute)

데이터의 표시시간 간격을 설정합니다. 예를 들어 30으로 설정한 경우 30분 단위로 데이터가 표에 표시 됩니다.


showNextDateReport(  )

현재 설정된 날짜기준으로 다음 날짜의 데이터를 불러와 표시 합니다.


showPrevDateReport( )

현재 설정된 날짜기준으로 이전 날짜의 데이터를 불러와 표시 합니다.



 

 connectCurrentIndexChanged ( )

 

 리포트 테이블의 선택된 항목 변경시 이벤트를 수신받을때 사용합니다. 이벤트 발생시 핸들러의 이름은 고정되어 있으며 아래 그림과 같이 추가 할수 있습니다.



 def onCurrentIndexChanged (obj,index)


obj :  이벤트가 발생한 리포트 테이블 개체 입니다.

index : 현재 선택된 인덱스 입니다.

 예)

# 리포트 위젯의 선택된 항목 변경시 수신할 이벤트 핸들러 입니다.

# 항목 선택시 호출됩니다.

def onCurrentIndexChanged(obj,index):

    #handle index change event

    return


c = canvas.getObject('report')

# 선택 항목 변경 이벤트 수신을 활성화 합니다.

c.connectCurrentIndexChanged()




 

 date currentLogDate ( )

 

 리포트 테이블에 설정된 날짜를 읽어 옵니다. 리턴값은 Python Date 타입니다.


 예)

date = canvas.getObject('date_day')

report = canvas.getObject('report_day')

print report.currentLogDate()


결과)


>>> 2023-06-14






 loadDateRange ( fromDate:시작 날짜 , toDate:끝 날짜)

 

 주어진 기간의 데이터를 리포트 테이블에 불러 옵니다. 날짜 형식은 Python Date 형식을 사용합니다.

  • fromDate : 시작 날짜 입니다.
  • toDate : 끝 날짜 입니다.

 예)

#datetime 모듈을 import 합니다.

import datetime

fromDate= datetime.date(2022,3,1);

toDate= datetime.date(2022,4,1);


table= canvas.getObject('table');

#해당 날짜의 데이터를 불러 옵니다.

table.loadDateRange(fromDate,toDate);


결과) 해당 범위의 데이터를 불러와 테이블에 표시 합니다.




 

 exportToFile (reportTitle:리포트 제목)

 

 리포트 테이블 화면에 표시된 데이터를 파일로 출력 합니다.

  • reportTitle : 리포트 제목 입니다. 제목을 입력하지 않을 경우 아래 그림과 같이 리포트 테이블 설정시 지정된 제목으로 출력 합니다.

     

 예)

table= canvas.getObject('table');

table.exportToFile( );


결과) 스크립트 실행시 파일 저장 화면이 표시 되며, 저장 버튼 클릭시 파일로 저장 됩니다.




 

 replaceText (replaceList:변경할 이름목록)

 

 replaceText는 리포트 테이블에 설정된 데이터 이름을 변경해 필요에 따라 하나의 리포트 테이블에 각각 다른 데이터를 표시 할때 사용합니다.

아래 그림과 같이 하나의 테이블에 설비#1,설비#2 버튼 클릭시 해당 설비의 데이터를 불러 올 수 있습니다.


예) 설비#1 클릭시

 


예) 설비#2 클릭시

  


 replaceText를 사용할때는 아래 그림과 같이 실제 데이터를 선택하여 사용하지 않고 나중에 스크립트를 이용해 변경할 이름을 미리 지정합니다. (아래 그림에서는 $1, $2는 나중에 변경할 이름 입니다)

  • replaceList : 변경할 이름 목록 입니다. 형식은 문자열 리스트 이며 문자열 형식에 변경전 문자와 변경후 문자를 지정하여 사용합니다.

    예) '[변경전 문자1:변경후 문자1','변경전 문자2:변경후 문자2']

 예)

table= canvas.getObject('table')


# $1 -> PCS1 , $2 -> BMS1 으로 변경합니다.

table.replaceText(['$1:PCS1','$2:BMS1'])




 

 selectRow (row:선택행)

 

 리포트 테이블에서 주어진 행을 선택 합니다.


 예)

table= canvas.getObject('table')

table.selectRow(5);


결과) 5번째 열을 선택 합니다.




 

 setCurrentLogDate ( date:날짜 )

 

 주어진 날짜의 데이터를 불러와 리포트 테이블에 표시 합니다. 보통 날짜 위젯과 함께 사용하여 날짜 위젯에 선택된 날의 데이터를 불러 올때 사용합니다.


  • date : 불러오기 원하는 날짜 입니다. date 형식은 Python Date 형식을 사용 합니다.

 예)

#날짜 위젯

date = canvas.getObject('date_day')

#리포트 위젯

report = canvas.getObject('report_day')


#날짜 위젯에 선택된 날짜의 데이터를 불러 옵니다.

report.setCurrentLogDate(date.getDate())




 

 setCurrentLogDateYMD ( year:년,month:월,day:일  )

 

 주어진 날짜의 데이터를 불러와 리포트 테이블에 표시 하며 기능은 setCurrentLogDate와 동일 합니다. 다른점은 날짜 입력 형식을 Python Date 대신 년, 월, 일 형식으로 받습니다.

  • year : 년
  • month : 월
  • day : 일



 

 setColumnValueConvertor ( column:열 번호, functor:변환 함수 )

 

 본 함수는 테이블에 데이터를 출력 할때 지정한 열의 데이터 값을 바로 표시하지 않고 변환 하여 표시 할때 사용합니다. 예를 들어 아래 그림과 같이 '배터리 운전상태'의 실제값을 출력하면 숫자 형태로 출력 되지만, 변환 함수를 적용해 숫자 대신 숫자에 해당하는 코드값으로 출력 할수 있습니다. 변환식은 열 단위로 지정할 수 있습니다.


<실제값>


<변환값>


  • column : 번환 함수를 적용할 열 입니다. 열번호는 0부터 시작 합니다.
  • functor : 변환 함수 입니다. 변환 함수 형식은 다름과 같습니다.

def 함수명  (rowNo,value)

  • rowNo : 테이블의 행 번호 입니다.
  • value : 실제 값입니다. 원래 값에 연산식을 적용해 새로운 값을 리턴합니다.


 예)

#변환 함수, 배터리 상태 숫자 값을 숫자에 해당하는 코드 값으로 변경

def makeBattStatus(value):

    if ( value == 0 ):

        return 'OFF'

    str=''  

    value=int(value)

    if ( value & pow(2,0) ):

        str='준비'

    if ( value & pow(2,1) ):

        if ( len(str) ):

            str+=','

        str+='Rest'

    if ( value & pow(2,2) ):

        if ( len(str) ):

            str+=','

        str+='충전'

    if ( value & pow(2,3) ):

        if ( len(str) ):

            str+=','

        str+='방전'

    if ( value & pow(2,4) ):

        if ( len(str) ):

            str+=','

        str+='Cell Balancing'

    if ( value & pow(2,8) ):

        if ( len(str) ):

            str+=','

        str+='Warning'

    if ( value & pow(2,9) ):

        if ( len(str) ):

            str+=','

        str+='Fault'

    if ( value & pow(2,10) ):

        if ( len(str) ):

            str+=','

        str+='D/S Open'

   

    return str


c = canvas.getObject('table')

#6번째 행에 변환 함수 등록

c.setColumnValueConvertor(6,makeBattStatus) 



 

 setDataType ( kind: 데이터 종류 )

 

 리포트 테이블에 지정한 리포트 형식(시보,일보,월보,연보)의 데이터를 불러 옵니다.

  • kind :  불러올 데이터의 종류 입니다. 종류별 값은 아래와 같습니다.
    • obj.Hour (시보)
    • obj.Day (연보)
    • obj.Month (월보)
    • obj.Year(연보)


리포트 테이블에 설정된 리포트 종류가 데이터 리포트인 경우에만  동작합니다.


 예)

table = canvas.getObject('table')

#월보를 불러 옵니다.

table.setDataType(table.Month)




 

 setDisplayDateRange ( range: 범위 표시 범위 )

 

리포트 테이블에 표시할 데이터 범위를 설정 합니다. 기본적으로 분보, 시보, 일보, 월보, 년보의 표시 범위는 다음과 같습니다.

 - 분데이터와 시데이터는는 일 단위로 테이블에 표시 합니다.

 - 일데이터는 월단위로 테이블에 표시 합니다.

 - 월데이터는 년단위로 테이블에 표시 합니다.

 - 년데이터는 전체를 테이블에 표시 합니다.


setDisplayDateRange를 이용하면 range 인자에 따라 분 데이터를 월별, 년별로 표시할 수 있습니다. range 인자 형식은 다음과 같습니다.


  • range :  불러올 데이터 범위 입니다.
    • obj.Day (일 단위)
    • obj.Month (월 단위)
    • obj.Year (연 단위)
    • obj.Ranged(시작 기간 ~ 끝 기간 지정 범위)


 예)

c = canvas.getObject('table')

# 1년치 데이터를 표에 표시 합니다.

# 예)2023-01-01~2024-01-02

c.setDisplayDateRange(c.Year);


결과) 1년치 데이터가 표에 표시 됩니다.



 

 setDisplayStep (minute: 데이터 표시 간격 )

 

 테이블 행에 표시 간격을 지정합니다. 기본적으로 데이터 저장 간격이 15분 데이터인 경우 15분 간격으로 표에 표시 됩니다. 표시 간격을 설정하면 설정한 간격으로 데이터가 표시 됩니다.

예를 들어 60으로 설정시 1시간 단위로 데이터가 표시 됩니다.


  • minute :  표시 간격입니다. 분단위로 설정하며 1440으로 설정시 1일 간격으로 데이터가 표시 됩니다.

 예)

c = canvas.getObject('table')

#표시 간격을 60분(1시간)으로 설정합니다.

c.setDisplayStep(60);


결과) 데이터를 1시간 단위로 표시 합니다.




 

 showNextDateReport ()

 

 현재 리포트 테이블에 설정된 날짜에 다음 날짜의 데이터를 불러 옵니다. 예를 들어 표시 범위가 일 단위 이며 설정된 날짜가 2023-06-01 인 경우 showNextDateReport를 호출시 2023-06-02일의 데이터가 표에 표시 됩니다.


 예)

c = canvas.getObject('table')

# 다음날 데이터를 표시 합니다.

c.showNextDateReport( );




 

 showPrevDateReport ()

 

 현재 리포트 테이블에 설정된 날의 이전 날짜의 데이터를 불러 옵니다. 예를 들어 표시 범위가 월 단위 이며 설정된 날짜가 2023-06-01 인 경우 showPrevDateReport를 호출시 2023년 5월의 데이터가 표에 표시 됩니다.


 예)

c = canvas.getObject('table')

# 다음날 데이터를 표시 합니다.

c.showPrevDateReport( );