GUI sin

파일을 읽어 한글 추출하기


갑작스러운 오더에 이걸 어떻게 처리할까 고민하자마자 떠오른건 요즘 출퇴근 시간마다 공부했던 파이썬 이면 다른 언어보다 매우 간단하게 만들수 있을것 같다는 생각이 들더군요.


"주문 : MessageBox 가 포함된 모든 구문을 찾아 한글로 하드코딩 되어있는 부분을 모두 추출해 주세요.(추후 다국어 버전 지원을 위함)"


우선 파워빌더의 검색기능으로 어렵지 않게 MessageBox가 포함된 구문을 찾아서 msg.txt 라는 파일로 저장하고, 지난 3일동안 출퇴근길에서 갈고닦은 실력으로 한번 코딩해봤습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re
 
= open("D:/msg.txt"'r', encoding='UTF8')
 
lines = f.readlines()
for line in lines:
    line = line.lower()
    find = line.find("messagebox")
    if not find:
        continue
    line = line[find + 10:]
    hangul = re.compile('[^ㄱ-ㅣ가-힣]+')
    result = hangul.sub('', line)
    if not result:
        continue
    print(line.strip())
f.close()
cs


시작한지 30분만에 완성!!!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
C:\ProgramData\Anaconda3\python.exe D:/src/py/test.py
'    (오전 9:42:51)
사용 object
('알림','서버에 연결할수 없습니다.....! ~n~n인터넷 연결을 확인하시오.....! ~n~n~n' + trhicom.sqlerrtext)
('알림','db조회 중 에러발생 ~n' + trhicom.sqlerrtext)
('알림','프로파일의 computer=값을 설정하시오...!')
('알림','자동백업을 체크하시오...! ~n' + string(sqlca.sqlcode) + sqlca.sqlerrtext)
('알림','백업일자을 체크하시오...! ~n' + string(sqlca.sqlcode))
('알림','프로파일의 computer=값을 설정하시오...!')
('알림','자동백업을 체크하시오...! ~n' + string(sqlca.sqlcode))
('알림','백업일자을 체크하시오...! ~n' + string(sqlca.sqlcode))
("db 연결실패", sqlca.sqlerrtext)
("db 연결실패", sqlca.sqlerrtext)
.
.
.
(중략)
.
.
.
(smsg)    //rollback처리함.
('알림', '저장중 오류가 발생 했습니다.')
('확인','변경된 데이타를 저장하겠습니까..?',question!, yesnocancel!,1)
("알림", "정렬설정에 실패하였습니다.")
("알림", "정렬설정에 실패하였습니다.")
('조회조건 변경 오류', ls_rtn)
('확인', '발송된 데이터는 수정/삭제가 불가능합니다.')
('확인', string(ls_partordpk) + '번 주문번호와 관련된 모든 데이타가 삭제됩니다. 삭제하겠습니까 ..? ~n',question!,yesno!,2) = 2 then
smsg  //품목코드를 기준으로 기본데이타를 가져온다
(smsg)    //rollback처리함.
'    (오전 9:42:52)
 
Process finished with exit code 0
cs


이런식으로 추출이 됩니다. 딱 17줄의 코딩으로 이렇게 빠른 결과가 나오다니 너무 편리하네요.


하지만 글을 포스팅하면서 보니 여기저기 버그가 많이 보이네요.


1. 중복처리

2. 파일선택의 유용성


등등


천천히 수정해야겠습니다.






Comment +0

파워빌더에서의 버전관리(version control, revision control), 소스 코드 관리(source code management, SCM)는 정말 너무 불편하고, 번거롭기만 했었습니다.

 

지금까지 저의 경험을 정리해보면,

 

1. 윈도우 공유폴더로 공유 : 직원들과 의사소통으로 형상관리, 뷁!

2. 자체 개발한 버전관리 시스템을 이용 : 각각의 유저들이 Lock을 걸고 사용하는 방식인데, 그나마 가장 편리했네요.

3. 서브버전(Subversion) : 추가 확장(PBSCC Proxy)와 함께 이용했는데 많이 불안합니다.

4. 파워빌더 자체 내장(PB Native) : 위의 2번 다음으로 유용하지만, 아주 기초적인 Lock 방식 정도만 사용가능한 수준

 

이런 방법등을 사용해보니, 그나마 2번의 경우가 무난히 사용할수 있었지만, 그마저도 이직한뒤엔 사용할수가 없게되니 너무 답답하더군요. 그러던중 파워빌더 2017 R2 이상에서 Git 과 Subversion 이 자체 내장되어 있다는 소식을 듣고 한번 세팅에 도전 해봤습니다. 물론 이전에도 Git 을 지원하는 add-on 같은게 있었는데, 상당히 불안정 하거나 유료였던 기억이 나네요.

 

< 준비물 >

1. 파워빌더 2017 R2 이상 : 이 문서는 파워빌더 2017 R3로 작성하였는데, R2 버전에서도 사용해봤지만, 2017 일반 버전에선 확인해보지 못했습니다.

2. 원격저장소 : GitHub, GitLab 등, 각각의 특징을 파악하시고 가입하세요. 둘다 기본적인 기능은 무료입니다.

3. Git Client (옵션) : https://git-scm.com/ 에서 다운로드 받을수 있습니다. 이게 필수적으로 꼭 필요한줄 알았는데, 파워빌더 자체 내장되어있다보니 특별히 필요는 없더군요. 당연히 Git 의 기초지식이 있다면 더 쉽게 이해할수 있을겁니다.

 

< 파워빌더에서 Git 설정 >

 

00. 파워빌더에서 적당한 위치에 WorkSpace, Target 등을 구성했습니다.

  • 폴더위치 : C:\src\2017R3\test
  • WorkSpace : test
  • Target : test

 

[그림 1-1] 좌측의 System Tree - WorkSpace 에 마우스 오른쪽 버튼을 누르면 팝업 윈도우가 나타납니다. Add to Source Control 을 선택합니다.

 

[그림 2-1]  Git 을 선택하고 OK 버튼을 클릭합니다.

 

[그림 3-1]  발행자와 Email을 입력합니다.

 

[그림 4-1] Comment에 Commit 메시지를 입력하고 OK 를 클릭합니다.

Git 을 초기화 하면서 Target에 속해있는 각각의 pbl들은 ws_objects 라는 폴더안의 pbl의 이름과 동일한 폴더가 만들어지고, 각각의 Object들은 마치 Export 한것처럼 파일로 만들어지게 됩니다. [그림 4-1] 참고.

 

 

[그림 5-1] Output 에 메시지가 출력되고, System Tree의 각각의 Object 의 아이콘 왼쪽에 초록색 점이 하나씩 생겨났습니다. Git 의 Local 저장소 초기화가 완료되었다는 뜻입니다.

 

 

[그림 6-1] w_test_main Window Object 에 스크립트를 넣고 저장을 하게되면 아이콘이 초록색 V 모양으로 바뀐걸 볼수 있습니다. 수정되었다는 뜻으로, 되돌리거나 비교할수 있습니다. 

초록색 Check 아이콘을 Lock을 걸었다는 뜻으로 오해할수 있는데, Git 은 과거에 사용해 오던 Lock 방식의 버전관리가 아닙니다. 저처럼 헛갈리지 마세요. 그냥 '수정되었다' 정도로 이해하는게 좋습니다.

 

[그림 7-1] System Tree의 WorkSpace 에서 마우스 오른쪽 버튼을 누르고, Git Commit 을 선택합니다. 위에서 수정한 Object 하나만 나오는걸 볼수 있습니다. 적당한 Commit Comment를 입력하고 OK 버튼을 클릭합니다.

 

여기까지가 Git 의 Local Repository 설정방법이라고 이해하시면 됩니다. 아래부턴 원격 저장소의 설정 방법입니다. GitHub 나 GitLab 에 가입하세요.

 

[그림 8-1] GitHub에 가입하고 초기 대문 화면입니다. 좌측 상단의 초록색 New 버튼을 클릭하거나, 우측 상단의 + 버튼을 클릭하고 New Repository 를 선택합니다.

 

[그림 9-1] 저는 test 라는 원격 저장소를 만들었습니다. 공개 설정은 Private(비공개)로 선택하고, 아래 Create repository 초록색 버튼을 클릭합니다.

 

[그림 10-1] https://github.com/[GitHub ID]/test 와 같은 형식의 저장소 주소가 만들어졌습니다.

 

[그림 11-1] 파워빌더로 돌아와서 우리가 만든 WorkSpace를 원격 저장소로 Upload(Push) 해봅시다. WorkSpace 팝업메뉴에서 Git Push 를 선택합니다.

 

[그림 12-1] 적당히 세팅을 완료하고, Test Connection 을 눌러서 GitHub에 접속이 잘되는지 테스트 해보세요.

 

[그림 13-1] 테스트 접속 성공!!! 했다면, [확인] - [OK] 버튼을 눌러 나의 Source 가 GitHub 로 Push 해주세요.

 

 

 

[그림 14-1] 다시 GitHub로 돌아와 새로고침 해보면 앞서 Push 한 내용들이 Commit 메시지와 함께 잘 올라와 있습니다.

여기까지가 Upload(Push) 였다면, 이제부턴 새로운 저장소를 가져오는(다운로드) 방법에 대해 알아봅시다. 정확히 예기하면 다운로드 라기 보단 Init/Pull 이라고 하는데 일단 그냥 다운로드 라고 칩시다.

 

적당한 위치에 소스를 가져올 폴더를 생성합니다. 저의 경우 C:\test 라는 폴더를 생성했습니다.

 

[그림 15-1] 아무것도 없는 빈 상태의 (No WorkSpace) 에 마우스 오른쪽 버튼을 누르고 나오는 팝업메뉴에서 Connect to Workspace 를 선택합니다.

 

[그림 16-1] Checkout Directory 가 대상 폴더입니다. 위에서 만든 폴더 위치를 선택하고 OK 버튼을 눌러줍니다. 내 GitHub ID가 아니라 다른 ID로도 가능하지만 경우에 따라서 Collaborators(협력자) 권한이 필요할수도 있습니다.

 

[그림 17-1] 이렇게 가져오기가 완료 되었다.

 

제가 이런저런 테스트를 해봤더니, 잘 동작합니다. 아직 Branch 는 해보지 않았지만, 뭐 잘 될거라고 믿고 있습니다.

Comment +0

한글 위키 : http://bit.ly/28O4arH


영문 위키 : http://bit.ly/28O4red



이렇게 보니 반갑네.

Comment +0



Row changed between retrieve and update 이와같은 오류가 발생하는 이유는 여러가지가 있겠지만, 특히 dw의 Specify Update Properties와 밀접한 관계가 있고 대부분의 경우는 dw 컬럼의 data type의 길이와 db의 컬럼의 datatype의 길이가 다르기 때문일 가능성이 크다.



위의 화면을 보면 AF0502D Table이 Update/Delete가 발생하면 Updateable Columns의 컬럼들을 가지고 SQL의 Where 조건을 만들어주는데 remark 컬럼이 db의 varchar2(200)보다 작게 60으로 잡혀 있었다.


2018-12-17

어디선가 DataWindows의 Table을 Delete 하고,

해당 Table을 Update 하면 이런 문제가 발생될수도 있다.


Comment +0

1. 변경을 원하는 dw object에서 마우스 오른쪽버튼을 누르고 나오는 팝업메뉴에서 Edit Source를 선택



1
2
3
4
5
6
release 10;
datawindow(units=0 timer_interval=0 color=1073741824 processing=0 HTMLDW=no print.printername="" print.documentname="" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.canusedefaultprinter=yes print.prompt=no print.buttons=no print.preview.buttons=no print.cliptext=no print.overrideprintjob=no print.collate=yes hidegrayline=no grid.lines=0 grid.columnmove=no selected.mouse=no )
header(height=84 color="536870912" )
summary(height=0 color="536870912" )
footer(height=0 color="536870912" )
detail(height=84 color="536870912" )
cs


1. 두번째 줄의 processing=0 부분을 수정해주면 된다. (0 : tabular, 1 : grid)


Comment +0




[다운로드]


막힘. 파워빌더 15의 작명이 변경되어 파워빌더 2017 R2, 2017 R3 이런식으로 변경되었다.


Comment +0

말일 날짜 계산


다음달에 '01'을 붙여 첫째날을 만든뒤에 하루를 빼면 말일이 된다.


1
2
ls_tempday = Left(data, 4+ '/' + String(Long(Mid(data, 52))+1'00'+ '/01'
ls_lastday = String(RelativeDate(Date(ls_tempday), -1), 'yyyymmdd')
cs




전달 날짜 계산


1
2
cTempMonth = Left(cPayMonth, 4) + '/' + Right(cPayMonth, 2) + '/01'
cBeforeMonth = String(RelativeDate(Date(cTempMonth), -1), 'yyyymm')
cs




Comment +0

젠장, 이 문제 때문에 얼마나 많은 시간을 허비했는지 모르겠다.


Column 2 has an invalid name and/or length


문제가 되는 서비스를 찾아서 시작유형을 변경해주는 것만으로 손쉽게 해결된다.




2013.03.29 추가

Image Protect Service 서비스 뿐만 아니라 Team Viewer 8 때문에 동일한 문제가 발생하였다. 서비스를 하나하나 중지하면서 찾아보는게 좋을것 같다.



오류 메시지Column 2 has an invalid name and/or length


서비스 시작 유형 변경나의 경우 Image Protect Service 라는 녀석이 문제였다. 해당 서비스를 중지하니 바로 정상 동작한다. 시작유형을 수동 으로 바꾸고 확인버튼을 누른다.



TeamViewer 8TeamViewer 는 아쉽지만 uninstall 해버렸다.



Comment +0