ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 보고서 테이블 동적 생성
    과제./2022P 2022. 8. 5. 17:29

    요구사항

    0. 특정 기간에 대해, 아래와 같은 형태로 테이블을 보여준다.

    1. 조회기간은 조회 시 마다 변동가능하다.

    2. type은 추가되거나 삭제될 수 있다.

    3. type아래 각 속성들은 추가되거나 삭제될 수 있다.

    재고 = 전날재고 + 입고 - 불출 

    예시 이미지

     

    원래는 파일자체에서 각 입불출 항목에대해 count함수로 가져오려고 했지만, 오버헤드가 심해질것같아서, 특정 기간에 대해 한번에 데이터테이블을 받아오고, 받아온 데이터를 조작하여 보여주는 형태로 구현하였다.

     

    만개이상의 데이터를 넣고 테스트 해본결과 다행히 0초 이내로 걸린다.

     

    from collections import defaultdict
    
    
    def make(dic, datelist):
        result = "<table>"
        result += header(datelist)
        for k, v in dic.items():
            result += mtable(datelist, k, v)
        return result + "</table>"
    
    
    def header(datelist):
        s = "<thead><tr><td colspan='2'>test</td><td>구분</td>"
        for i in datelist:
            s += "<td>"+i[4:6]+"/"+i[6:]+"</td>"
        return s + "<td>합계</td></tr></thead>"
    
    
    def mtableheader(datelist, model, l):
        s = "<tr><td colspan='2' rowspan='3'>"+model+"</td><td>입고계</td>"
        for d in datelist:
            s += "<td>"+inputcell(d, l)+"</td>"
        s += "<td>"+inputsum(datelist[0], datelist[-1], l)+"</td></tr><tr><td>불출계</td>"
        for d in datelist:
            s += "<td>"+outputcell(d, l)+"</td>"
        s += "<td>"+outputsum(datelist[0], datelist[-1], l)+"</td></tr><tr><td>재고계</td>"
        for d in datelist:
            s += "<td>"+stockcell(d, l)+"</td>"
        return s + "<td>"+stockcell(datelist[-1], l)+"</td></tr>"
    
    
    def mtablebody(datelist, dic):
        row_l = len(dic)
        s = "<tr><td rowspan='"+str(row_l*3)+"'>&nbsp;&nbsp;&nbsp;&nbsp;</td>"
        for k, v in dic.items():
            s += "<td rowspan='3'>"+str(k)+"</td><td>입고</td>"
            for d in datelist:
                s += "<td>"+inputcell(d, v)+"</td>"
            s += "<td>"+inputsum(datelist[0], datelist[-1], v)+"</td></tr><tr><td>출고</td>"
            for d in datelist:
                s += "<td>"+outputcell(d, v)+"</td>"
            s += "<td>"+outputsum(datelist[0], datelist[-1], v)+"</td></tr><tr><td>재고</td>"
            for d in datelist:
                s += "<td>"+stockcell(d, v)+"</td>"
            s += "<td>"+stockcell(datelist[-1], v)+"</td></tr>"
        return s
    
    
    def mtable(datelist, k, v):
        model = str(k)
        dic = defaultdict(list)
        s = ""
        for i in v:
            dic[i[0]].append([i[1], i[2]])
        s += mtableheader(datelist, model, sum(dic.values(), []))
        s += mtablebody(datelist, dic)
        return s
    
    
    def inputcell(day, l):
        cnt = 0
        for i in l:
            if str(i[0]) == day:
                cnt += 1
        if cnt == 0:
            return "-"
        return str(cnt)
    
    
    def outputcell(day, l):
        cnt = 0
        for i in l:
            if str(i[1]) == day:
                cnt += 1
        if cnt == 0:
            return "-"
        return str(cnt)
    
    
    def stockcell(day, l):
        cnt = 0
        for i in l:
            if (i[1] is None) and (int(i[0]) <= int(day)):
                cnt += 1
            elif (int(i[0]) <= int(day)) and (int(i[1]) > int(day)):
                cnt += 1
        if cnt == 0:
            return "-"
        return str(cnt)
    
    
    def inputsum(sday, eday, l):
        cnt = 0
        for i in l:
            if (int(i[0]) >= int(sday)) and (int(i[0]) <= int(eday)):
                cnt += 1
        if cnt == 0:
            return "-"
        return str(cnt)
    
    
    def outputsum(sday, eday, l):
        cnt = 0
        for i in l:
            if (i[1] == "") or (i[1] is None):
                continue
            if (int(i[1]) >= int(sday)) and (int(i[1]) <= int(eday)):
                cnt += 1
        if cnt == 0:
            return "-"
        return str(cnt)

    '과제. > 2022P' 카테고리의 다른 글

    [입고] 바코드 스캔  (0) 2022.08.01
Designed by Tistory.