본문 바로가기
IT-개발트렌드

[IT/개발] 파워빌더 뉴스지 2006년 12월호

by SB리치퍼슨 2010. 2. 12.



Q) 데이터윈도우의 컬럼이 a1 ~ a50까지 있습니다.
   여기서 데이터윈도우를 Retrieve()후 특정 Row의 특정컬럼의 값이 'A'일 경우
   이 'A'가 속한 컬럼명을 얻는 방법 좀 알려주세요..

A) 해당 컬럼명을 얻어 오는 방법은 아래 스크립트를 참고하시면 됩니다.
    ======================================================
        String ls_column, ls_original_border, ls_temp

        IF NOT dwo.name = "datawindow" then //DWObject 바탕을 클릭!
        IF dwo.band = "header" THEN
            IF dwo.name = "" THEN
           Messagebox("Error", "칼럼 헤더 오브젝트에 칼럼명이 없습니다.")
           Return
          END IF
        ls_column = Left(dwo.name, Pos(dwo.name,"_t") -1 )
        MessageBox('선택한 컬럼의 이름', ls_column)
  END IF
END IF
======================================================

Q) 버전관리프로그램을 개발중입니다.

   pbd파일을 DB에 저장할려고 image 형식으로 정했습니다.
   pb에서 FileOpen시 streamMode이면 파일사이즈 크기가 32764로 한정되어 있는데
   칼럼형식을 무엇으로 정해야 DB에 저장할수 있는지 조언을 바랍니다. DB서버는 oracle 9i를

   사용하고 있습니다
   Oracle Client 를 9i 로 사용하다가 oracle client 8i 로 변경 하였습니다 (oracle client 9i 삭제 후

   8i로 재설치)
   9i로 설정해서 PB를 사용할때는 잘 되다가 8i로 바꿔서 설치하고 나서는 connection 이 안되네요
   connection 할때 나오는 오류메시지는 아래와 같습니다
   답변 부탁드립니다
  ▶▶ 6. 오류메시지 ◀◀
    Please connect as the PowerBuilder Catalog Owner. This is necessary for
    the initial connection to Oracle to GRANT privileges on the repository.

A)  Database profile 에 DB 연결하는 곳을 보시면 System 이란 Tab 이 있습니다.
     해당 Tab 에 catalog owner 가 SYSTEM 이 Default 일 텐데..
     사용하고 계시는 Owner 정보가 다른것 같습니다. 이 부분을 수정하시기 바랍니다.


Q) 파워빌더에서 최기는 오라클로 접속하고, retrieve된 데이라를 가지고,
    sql에 접속하여, 데이터를 이관하는 프로그램 입니다.
    파워빌더에서 실행했을때는 에러가 나질 않는데, 실행파일을 만들고, 실행하면,
    오라클은 연결되는데, sql에는 접속이 안됩니다.
     1. 오라클 접속정보(application에서 )
         SQLCA.DBMS = "O84 ORACLE 8.0.4"
         SQLCA.LogPass = "xxxx"
         SQLCA.ServerName = "xxxx"
         SQLCA.LogId = "xxxx"
         SQLCA.AutoCommit = False
         SQLCA.DBParm = ""
         CONNECT USING sqlca;

     2. sql접속정보( open-> retrieve 후 )
          Sqlca2 = create transaction

          SQLCA2.DBMS = "ODBC"
          SQLCA2.AutoCommit = False
          SQLCA2.DBParm = "ConnectString='DSN=xxxxx;UID=xxxxxx;PWD=xxxxx'"
        
  ▶▶ 6. 오류메시지 ◀◀

   Database에 연결할 수 없습니다. 9999DBMS ODBC is not supported in your current insatllation
  
A)  먼저, 두개이상의 트렌젝션을 생성하여 사용할때는 혼동될 소지가 있기 때문에
     SQLCA를 사용하시는것 보단, trans_ora, trans_odbc 등의 특정이름으로 사용하시는

     것이 좋습니다.
    첨부파일로 PB7에서 필요한 DLL들을 정리해놓은 문서를 올려드립니다.
    참고하시기 바랍니다.
    문서에는
        PBODB70.DLL : 파워빌더 ODBC 인터페이스
        PBOR870.DLL : 오라클 8 DLL
        등의 내용이 정리되어 있습니다.
    또한, 현재 파우빌더 8 버전까지 기술지원이 종료된 상태(2006년 8월 31일)입니다.
    8이하 버전은 글 읽기 권한만 가지게 됩니다.

Q) dw안에 check box 컬럼이 있습니다
  이 체크박스 컬럼을 클릭할때 마다 몇개의 Row의 채크박스컬럼이 선택되어졌는지 표시할려고

  하는대 방법을 알려주시기 바랍니다
  클릭이벤에 다음과 같이 사용하였습니다
     long i, j
     for i = 1 to this.rowcount() step 1
      if this.getitemstring(i,"bal") = "1" then
        j = j + 1
      END IF  
     next
     st_1.text = String(j) + "행이 선택되었습니다"

  
A) Clicked() 이벤트에 스크립트를 작성하면 스크립트가 먼저 실행되어 버리고
     화면에 체크가 되어지기 때문에 처음 체크했을때의 값은 가져오지 못하고
     두번째 아이템을 체크할때부터 인식되어 지게 되는 현상이었습니다.
    해결방법은....
     작성하신 스크립트를 Post 방식으로 호출하면 해결하실수 있습니다.
     ue_clicked()를 하나 만들고 DW의 Clicked() 이벤트에
       Post Event ue_clicked()
     처럼 호출해주면 원하는 결과를 얻으실수 있습니다. Test 해보시기 바랍니다.

Q) 데이타윈도우 삭제를 했는데도 pbl사이즈만 자꾸 늘어납니다.
   export, import 반복하다보니 현재 25메가가 되었는데요..
  실행시 메모리 부족하다는 영문 메시지와 함께 파빌이 다운되어버립니다.
  그리고 해당 소스 들어갈때도 100번에 95번은 에러가 나는데 에러가 나고
  다운이 되면 그 소스 다신 안 들어가집니다.
  하던 개발작업을 못하고 있습니다.
  
A)  현재 사용하고 계신 것에 많은 제약사항이 있네요.
     첫째, XP 는 PowerBuilder 8.0.3 이상에서만 보장되어 집니다.
     둘째, 아시겠지만, 해당 PBL 의 사이즈가 엄청나게 크군요.. PowerBuilder 에서 보장하고,
     권장하는 하는 PBD 의 size 는 2 MB 입니다.
     일단, 25 MB 짜리를 갈려서 하시는게 좋을듯합니다. 보장이 안되니까.. 어떨땐 되고, 어떨 때는
    안되는 것입니다.
     export, import 가 자주 있다고 하셧는데 이러한 경우, 해당 PBL 에서 오른쪽 마우스를 누르시면
     Optimize 라는 것이 있습니다. 이것을 통해 최적화를 하십시요.
     size 가 조금 줄어 들 것입니다.
     하지만, 근본적인 해결책이 되지 않으며, Source 의 size 에 대한 것은 지키시고, OS 에

     따른 PB 버전도 생각하시기 바랍니다.

Q) temp3 = 84.5
  gyesanhak = 20
  pyongjum = round(temp3 / gyesanhak, 2)
  위와같은 식이 있을때 당연히 pyongjum은 4.23이 나와야 합니다.  4.225에서 반올림하므로...
  하지만 pyongjum의 형식이 double이면 4.22가 됩니다.
  이것을 decimal형식으로 선언을 하면 4.23이 되구요...
  
A) Double 과 Real 과 같은 부동소수점 데이터 타입은 원래 정확한 값을 기억하지 못합니다.

    4.225 값을 저장 시켜도 4.2249999999999999 와 같이 인식하기 때문에 round 하지
   못한거구요. 이 문제는 비단 파워빌더 뿐만 아니라, 다른 언어도 마찬가지입니다.
   이 문제에대한 자세한 내용은 아래를 참고하세요.
     http://www.sybase.com/detail?id=1012599

Q) 3 tier 방법으로 개발하려고 합니다.

   그래서 서버단, 클라이언트단 나누어서 배포를 하고 작업하는데요...
   클라이언트에서 서버단의  컴포넌트에 있는 함수를 콜하면 자꾸 에러메시지가 떨어집니다.
   이런 메시지 는 어떻게 나는거고 해결은 어떻게 해야할지...
   오류메시지를 첨부파일로 올립니다..
   더불어서  제규어에서 패키지를 지웠는데도 프럭시 생성시 지워지지 않은것처럼 클라이언트 쪽에

   프럭시가  생성이 되네요.. 이유가 무엇인지.. 정말 모르겠습니다.

A) 우선 클라이언트단 로직은 정상적으로 서버컴포넌트를 호출하는 것으로 보입니다.  

    서버컴포넌트 로직 수행 중 에러가 발생되면 질문하신 것 처럼     "CORBA_TRANSACTION_ROLLEDBACK" 에러가 Display 됩니다.

    때문에, 정확한 원인을 파악하기 위해서는 서버 Log 를 확인 해서 에러가 발생된 위치를 찾고,

    해당 컴포넌트의 로직을 확인해 봐야합니다.

    만약 서버단에 에러가 발생되더라도 이를 클라이언트에 Display 하고싶지 않다면,

    해당 컴포넌트 속성중 tx_outcome 값을 failed 로 설정 하시면 됩니다.
     com.sybase.jaguar.component.tx_outcome = failed

Q)  아래와 같이 프로시져를 생성하고 데이타 윈도우를 만들었는데 데이타윈도우 내에서 조회는

  되는데 run 해서 실행해면 윈도우에서 rtn = dw_List.Retrieve(ls_Fund_Cd) retrieve를 하면
  pls-00306 호출시 인수의 갯수나 유형이 잘못되었습니다. 라는 오류 메세지가 나옵니다.
  데이타윈도우에 Argument는 한개이고요 프로시져는 아래와 같습니다.
  CREATE OR REPLACE procedure sr_ops_fd_0001r_01 ( p_fund_cd in varchar2,
  out_cur OUT pkg_cursor.cur_out) is BEGIN
   -----------------------------------------------------------------
     begin
   -----------------------------------------------------------------
  Open out_cur FOR
SELECT A.FUND_CD       FUND_CD,
   A.FUND_NM   FUND_NM,
   A.TYPE_GB   TYPE_GB,
   A.FIR_SEOLJ_YMD   FIR_SEOLJ_YMD,
   A.FIR_GIJUNGA   FIR_GIJUNGA,
   A.WT_BOSUYUL   WT_BOSUYUL,
   A.PM_BOSUYUL   PM_BOSUYUL,
   A.ST_BOSUYUL   ST_BOSUYUL,
   A.SM_BOSUYUL        SM_BOSUYUL,
   A.WT_BOSUYUL + A.PM_BOSUYUL + A.ST_BOSUYUL + A.SM_BOSUYUL   tot_bosuyul,
   DECODE(A.MULTI_CLS_GB, '1', '일반', '2', '상위', '3', '하위', '')     MULTI_CLS_GB,
   decode(A.ILIM_GB,'01','일임','02','손익','03','MMF','4', '자문', '')   ILIM_GB,
   D.EMP_NM   EMP_NM,
   A.PRV_STK_LOWLMT_WGT   PRV_STK_LOWLMT_WGT,
   A.PRV_STK_HIGHLMT_WGT   PRV_STK_HIGHLMT_WGT,
   B.MAEMAE_NM   MAEMAE_NM,
   TO_CHAR(A.sanghw_ymd, 'YYYYMMDD')   sanghw_ymd
  FROM   COM_FM0_M A,
   COM_MM0_C B,
   COM_EF0_M C,
   COM_EM0_M D
WHERE  A.SUTAK_CD = B.MAEMAE_CD
AND    A.FUND_CD = C.FUND_CD
AND    A.EMP_ID = C.EMP_ID
AND    'Y' = C.RPRS_MGR_GB
AND    A.EMP_ID = D.EMP_ID
AND    A.FUND_CD LIKE p_fund_cd
ORDER BY A.FUND_NM;
-----------------------------------------------------------------
  end;
-----------------------------------------------------------------
--<<process_end>>
END;
▶▶▶ 6. 오류메시지 ◀◀◀
  pls-00306 호출시 인수의 갯수나 유형이 잘못되었습니다.

A) 파워빌더 개발환경에서 DB연결하는 사용자ID와 실제 실행환경에서 DB연결할 때 사용되는

    사용자ID가 서로 다른 것 같습니다. 실행환경에 사용된 사용자ID는 pkg_cursor 에 접근할 수

    없는 사용자로 생각됩니다. 파워빌더 DB Profile 의 사용자와 sqlca.UserID 사용자
    정보를 동일하게 맞춰주면 해결할 수 있을겁니다.

Q)  5,0 라이센스 시디를 가지고 있습니다.
   근데 5,3 라이센스 CD 라던가 패치파일을 받고 싶은데 자료실에 없던데요..
   sybase 본사 인터넷에서 직접 받아야 되나요?
  
A)  답변의 첨부파일을 받아서 설치하시면 됩니다.
     설치시 주의사항은 5.0이 설치되어 있어야 합니다. (아래글 참조)
     ===============================================
      Enclosed you will find updated EAServer software. You must install this
      upgrade over EAServer 5.0 or higher. If you have an earlier version, upgrade
      to EAServer 5.0 or higher before installing EAServer 5.3
     ===============================================
     압축을 풀면 Redeme 파일이 있습니다. 먼저 읽어보신후 패치하시기 바랍니다

Q) Appeon을 도입하려고 준비중인데....
   테스트로 commandline을 이용해서 활용 예제를 만들어 보고 있습니다.
   http://xxx.xxx.xxx:9988/text/index.html?xxxxx
   이런식으로 웹페이지를 호출을 하는데요
   새로 열린 브라우저 타이틀에 호출 URL이 그대로 노출이 되는 것 같은데요(XP에서)
   해결방안이 없나요
   CommandLine(?xxxxx) 정보가 노출되면 안되거든요..숨길 수 있는 방법은?
   그리고 Appeon FAQ에 있는 내용중에 application이 종료되면 웹브라우저도 같이 종료되는

   예제가 있는데요
   CommandLine을 사용한 예제도 부탁을 드립니다.
     y = Long(ls_y) + 438

A)  1. Anchor 태그를 이용한 호출( http://xxx.xxx.xxx:9988/text/index.html?xxxxx )로는

          직접적으로 URL이 보이는 것을 막을 수가 없습니다.
         중간에 자바스크립트로 Anchor 태그를 호출하는 것을 하나 만들어서 사용자가 클릭하였을

         때 자바스크립트를 호출하시고 자바스크립트에서 Anchor태그를 이용하여 호출하거나 또는

         Anchor 태그로 넘겨야 하는 값을 Session 정보에 저장한 다음 Appeon에서 Session에

        있는 값을 읽어 오는 형태로 작업을 하셔야 할 것입니다.
      2. 저희 팀 홈페이지에 있는 자바스크립트를 이용한 Blank 페이지 종료하는 예제를

         이용하시면 됩니다.

Q)  윈도우 user events 추가시 항목의 event id별 활용설명서를  볼 수 있는지요    

A)     일단.. xp 를 사용하시려면, PowerBuilder 8.0.3 이상의 버전이셔야 합니다.
     Event ID 는 pbm_ 로 시작하고 ( PowerBuilderMessage ) 입니다.
     이것은 WM_ 로 시작하는 Event id 값과 1:1 로 매핑되어집니다.
     따라서 pbm_xxx 에 있는 것을 WM_XXX 로 생각하셔서, MSDN 에서 찾아보시면 됩니다.

Q)  오라클 8에서 잘 실행되던 프로그램인데 db를 9.2.0으로 올리고 나서 에러가 납니다
  ▶▶▶ 6. 오류메시지 ◀◀◀
  String ls_company, ls_date, ls_no, ls_name, ls_dept_name

  DECLARE isp_slip_no PROCEDURE FOR ac_user.ac_sp_slip_no
  (:ls_company, :gs_dept, :ls_date);

ls_date = as_date
  ls_company = Upper( Left(gs_comp_unit, 1) )

  IF gf_isdate(ls_date) THEN
  execute isp_slip_no;

  FETCH isp_slip_no
  INTO :ls_no;
  CLOSE isp_slip_no;

  SELECT dept_name
  INTO :ls_dept_name
  FROM ac_dept
  WHERE dept_code = :gs_dept;

  dw_1.SetItem(al_row, "slip_no", ls_no)
  dw_1.SetItem(al_row, "slip_row", '001')
  dw_1.SetItem(al_row, "input_user_id", gs_user)
  // dw_1.SetItem(al_row, "pe_v_employee_name", gs_user_name)
  dw_1.SetItem(al_row, "ccom_slip_user_name", gs_user_name)
  dw_1.SetItem(al_row, "ac_dept_code", gs_dept)
  dw_1.SetItem(al_row, "ac_dept_dept_name", ls_dept_name)    

     새로 오라클9 에 생성한 사용자 권한이 오라클8 사용자 권한과 다른 것 같습니다.
     첨부하신 내용처럼, ac_user.ac_sp_slip_no 프로시저를 호출하지 못하기 때문에
     발생되는 에러입니다. 담당 DBA와 상의해보시기 바랍니다.

A)  현재사용중인 파워빌더6.0을 9.0으로 마이그레이션 하였고 데이타베이스도 정상적으로
   CONNECT하였습니다.
   그런데 file -> new ->에서 datawindow object를 만들려고하면 첨부된 내용처럼 에러가 생깁니다.
   다시 삭제하고 재설치해도 마찬가지입니다.
   기존에 6.0에서사용했던 datawindow object를 copy하여 9.0에서 open하여도 마찬가지입니다.
  도무지 이유를 모르겠습니다.  
  

A)   이런 경우는 DLL이 꾜여서 발생하는 경우가 대부분입니다.
     먼저 DLL들이 정확하게 올라오는지 확인해보시기 바랍니다.
     DLL이 올라오는 것을 확인하는 방법은, 저희 핼프시스템에서 많이 다룬 내용입니다.
     검색에서 "제목+내용"으로 winmsd 를 검색하시면,많은 내용을 볼수 있습니다.
     -------------------------------------------------------------------------------
     PowerBuilder를 실행시키고, 로드된 모듈을 체크해 보시기 바랍니다. (각 버전 밑 위치 확인)
   * 체크 방법
    시작-> 실행 -> winmsd -> 소프트웨어 환경 -> 로드된 모듈
    그러면 로드된 소프트웨어에 가보시면, 파워빌더 관련 dll 들이 있는데. 여기 나오는 모든 버전이
    일치해야 하며 경로 또한 동일해야 합니다
    (program filessybaseShearedPowerBuilder  여기가 default 입니다)
    아울러, 파워빌더를 제거 하실때, 레지스트리 정리 까지 하시는 것을 권장합니다.


Q)   버전관리프로그램을 개발중입니다.
   pbd파일을 DB에 저장할려고 image 형식으로 정했습니다.
   pb에서 FileOpen시 streamMode이면 파일사이즈 크기가 32764로 한정되어 있는데
   칼럼형식을 무엇으로 정해야 DB에 저장할수 있는지 조언을 바랍니다.

A)  파일의 사이즈가 32764 로 한정되어 있는 것이 아니라 FileRead 함수가 한번에 읽을 수 있는
     크기가 32765 로 제한되어 있는 것 입니다. 32765 가 넘는 크기에 대해서는 루프를 돌면서
    읽어서 처리해야 합니다. 아래의 코드(파워빌더 헬프에 있는 예제)를 보시면 쉽게 이해하실 수
    있을 것입니다.
    컬럼형식은 image 나 기타 binary data 를 처리할 수 있는 형식으로 하시면 됩니다.
    컬럼형식에 대한 보다 자세한 내용은 데이터베이스 도움말을 참조하시기 바랍니다.

     integer li_FileNum, loops, i
     long flen, bytes_read, new_pos
     blob b, tot_b

     // Get the file length, and open the file
     flen = FileLength(sle_filename.Text)
     li_FileNum = FileOpen(sle_filename.Text, &
        StreamMode!, Read!, LockRead!)

     // Determine how many times to call FileRead
     IF flen > 32765 THEN
        IF Mod(flen, 32765) = 0 THEN
            loops = flen/32765
        ELSE
            loops = (flen/32765) + 1
        END IF
     ELSE
        loops = 1
     END IF

     // Read the file
     new_pos = 1

     FOR i = 1 to loops
        bytes_read = FileRead(li_FileNum, b)
        tot_b = tot_b + b
     NEXT

   FileClose(li_FileNum)
반응형

댓글