쿼리 테이블은 캔버스에 시스템 혹은 외부 데이터 베이스에 저장된 데이터를 표 형태로 출력 할때 사용하는 그래픽 개체 입니다. 쿼리 테이블에 SQL 연결정보와 쿼리 문을 설정해 데이터 베이스의 쿼리 결과를 표에 표시 합니다.


 

 아래 그림은 쿼리 테이블의 설정화면 예시 입니다. 설정화면에서 데이터 베이스 연결정보와 SQL 쿼리문등 표에 표시할 정보를 설정 합니다.

Method

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


리턴 값

함 수

설 명


connectCurrentIndexChanged()

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


connectDataLoaded()

쿼리문 실행후 데이터 로딩이 완료되었을때 완료 이벤트를 수신 합니다.


clear(  )

표의 데이터를 지우고 초기화합니다


clearSelection()

표에 선택된 항목을 제거 합니다.

int

count(  )

표에 출력된 데이터 행 갯수를 반환 합니다.

int

currentRow()

현재 선택된 행번호를 반환 합니다.


fitColumn(  )

표의 컬럼 넓이를 글자 크기에 맞게 맞춥니다.


execute( )

쿼리 테이블 설정화면에서 설정한 쿼리문을 실행 합니다. 새로고침과 같은 용도로 사용하실수 있습니다.

 

exportToFile( titleName )

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


resetQuery(queryString)

주어진 퀴리문을 실행 하여, 실행 결과를 표에 출력 합니다.


resizeSection( column, width )

쿼리 테이블의 컬럼 너비를 설정합니다.

list[variant]

rowData( row )

쿼리 테이블의 주어진 행의 데이터를 반환 합니다.


setValueConvertor(functor )

쿼리 테이블에 데이터 변환 함수를 등록 합니다. 쿼리 결과값에 연산식을 적용하여 새로운 값을 표시할 수 있습니다.


selectRow(row)

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


setHeader(column, name)

주어진 컬럼의 표시이름을 설정 합니다.


setHeaders ( names )

쿼리 테이블에 주어진 컬럼 명으로 테이블 헤더를 설정 합니다.



 

 connectCurrentIndexChanged ( )

 

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



 def onCurrentIndexChanged (obj,index)


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

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


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

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

def onCurrentIndexChanged(obj,index):

    #handle index change event

    return


c = canvas.getObject('query')

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

c.connectCurrentIndexChanged()




 

 connectDataLoaded ( )

 

 쿼리문 실행후 데이터 출력이 완료되었을때 완료 이벤트를 수신 합니다. 데이터 출력 완료후 추가적인 작업을 할때 이벤트 핸들러를 등록해 사용할 수 있습니다. 이벤트 수신 핸들러 함수 이름은 고정되어 있으며 아래 그림과 같이 추가 할수 있습니다.



 예)

def onDataLoaded(obj):

    #데이터 컬럼 크기 조정

    obj.fitColumn() 


q = canvas.getObject('QueryTable_1')

q.connectDataLoaded()





 clear ()

 

 표의 데이터를 지우고 초기화합니다

 예)

q = canvas.getObject('QueryTable_1')

q.clear()




 clearSelection ()

 

 표의 선택된 항목을 초기화합니다

 예)

q = canvas.getObject('QueryTable_1')

q.clearSelection()




 int count ()

 

 표의 출력된 데이터 갯수를 반환 합니다.

 예)

q = canvas.getObject('QueryTable_1')

print q.count()




 int currentRow ()

 

 현재 선택된 행 번호를 반환 합니다. 선택된 행이 없는 경우 -1을 반환 합니다.

 예)

q = canvas.getObject('QueryTable_1')

print q.currentRow()




 fitColumn ()

 

 행의 너비를 글자 크기에 맞게 조정 합니다.

 예)

q = canvas.getObject('QueryTable_1')

q.fitColumn()





 execute()

 

 쿼리 테이블 설정화면에서 설정한 쿼리문을 실행 합니다. 새로고침과 같은 용도로 사용하실수 있습니다.

 예)

q = canvas.getObject('QueryTable_1')

q.execute()




 

 exportToFile (reportTitle:리포트 제목)

 

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

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

     

 예)

table= canvas.getObject('table');

table.exportToFile( );


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

   




 

 resetQuery(queryString:쿼리문)

 

 주어진 퀴리문을 실행 하여, 실행 결과를 표에 출력 합니다. 일반적으로 화면에 입력한 정보에 따라 쿼리문을 생성후 실행하는 용도로 사용될 수 있습니다.

예를 들어 화면에서 선택한 날짜를 읽어 해당 날짜의 데이터를 불러올수 있습니다. 아래 예제는 화면에서 입력한 정보를 읽어 새 퀴리를 실행 하는 예제 입니다.


 예)

import datetime


def alarmFunctor(rowNo,values):

    v = list(values);

    stationname = values[2]

    pointname =  values[3]

    value = values[4]

    processtime =values[1]

    tforpeice=  datetime.datetime.strptime(processtime, '%Y-%m-%dT%H:%M:%S.%f')

    timeStr = tforpeice.strftime('%Y-%m-%d %H:%M:%S')

    message = '%s %s : %s' % (stationname,pointname,value)

    v[0]=rowNo+1

    v[1]=timeStr

    v[2]=message

    return v;


c = canvas.getObject('QueryTable_2')

c.setValueConvertor(alarmFunctor)


#시작 날짜를 읽습니다.

object = canvas.getObject('fromDate')

start = object.getDate();


#끝 날짜를 읽습니다.

object = canvas.getObject('toDate')

end = object.getDate()

end = end+ datetime.timedelta(days=1)


if ( start < end ):

    #선택범위의 날짜에 맞게 쿼리문을 작성 합니다.

    param = (start.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]  ,end.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3]  );

    q = "select  1, processtime,origin,description,value from SCADA_ALARM \

        where  processtime >= '%s' and processtime < '%s' and aor in (1) order by processtime desc"  % param

    #새 쿼리문을 실행 합니다.

    c.resetQuery(q)


결과)

 




 

 resizeSection (column, width)

 

 지정할 컬럼의 너비를 설정 합니다.

 예)

table= canvas.getObject('table')


# 0번 컬럼의 너비를 300으로 설정 합니다.

table.resizeSection(0,300)




 

 list[variant] rowData ( row:행 )

 

 주어진 행의 데이터를 리스트 형식으로 반환 합니다. 반환값은 데이터 베이스에 저장된 데이터 타입 형식에 따릅니다.


 예)

q = canvas.getObject('QueryTable_1')

#1 번 열의 데이터를 읽어 옵니다.

print q.rowData(1)



결과)


>>> (2, u'101', u'101', u'2022-12-20', 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)



 

 setValueConvertor (functor)

 

 본 기능은 변환 함수를 등록해 쿼리결과값에 계산식을 적용해 새로운 값을 만들때 사용합니다.

예를들어 데이터 베이스 테이블의 'dong', 'ho' 컬럼을 합쳐 하나의 컬럼으로 표에 표시 하거나



 결과값 뒤에 단위를 붙여 테이블에 표시할 수도 있습니다.


 변환 함수는 행별로 실행하며 변환 함수의 인자를 통해 쿼리 결과 값이 행별로 함수 인자로 전달되 실행 됩니다. 변환 함수는 다음과 같습니다.

def 함수명  (rowNo,value)

  • rowNo : 테이블의 행 번호 입니다.
  • value : DB 테이블의 행 데이터 입니다. 쿼리 실행 후 행 단위로 함수가 실행됩니다. value의 형식은 tuple[variant] 입니다.


tuple 형식은 수정이 불가능 하며 데이터 변경을 위해서는 리스트로 변환하여 사용합니다.

 

예)

def functor1(values):

    # 튜플 형태의 values를 리스트로 변경 합니다.

    v = list(values);

    # 0번과 1번 컬럼의 데이터를 합쳐 리스트의 0번 컬럼에 저장 합니다.

    v[0] = '%s%s호' % (values[0] ,values[1])


    # 3번컬럼의 값 뒤에 kWh를 붙입니다.

    v[3] = '%.2f kWh' % values[3]



    cost=scada.getValue('전체 충전기.완속충전기 단가')

    # 4번 컬럼의 값에 따라 시스템의 데이터를 읽어와 DB값과 연산합니다.

    if 1 == values[4]: #급속

        cost=scada.getValue('전체 충전기.급속충전기 단가')

    v[4] = "{:,}원".format(int(values[3]*cost))

    # 테이블에 표시할 행 데이터를 리턴 합니다.

    return v


c = canvas.getObject('QueryTable_1')

c.setValueConvertor(functor1) 




 

 selectRow( row )

 

 주어진 행을 선택 합니다.


 예)

q = canvas.getObject('QueryTable_1')

q.selectRow(1)


 결과)




 

 setHeader( column , name )

 

 주어진 컬럼의 헤더 이름을 설정 합니다.

  • column : 변경하려는 컬럼 위치 입니다.
  • name : 변경할 헤더 이름 입니다.

 예)

q = canvas.getObject('QueryTable_1')

q.setHeader(1,'ho')


 결과)




 

 setHeaders( names )

 

 쿼리 테이블의 전체 컬럼의 헤더이름을 설정 합니다.

  • names : 변경하려는 헤더 이름 목록 입니다.


 예)

q = canvas.getObject('QueryTable_1')

q.setHeader(['회원정보','호','충전시작시간','충전전력','충전요금')


 결과)