차이점

이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.

차이 보기로 연결

파일의_인덱스 [2012/07/27 18:03] (현재)
admin 새로 만듦
줄 1: 줄 1:
 +클리퍼에서는 기본적으로 DBFNTX를 지원하지만 DBFCDX는 몇가지 편리한 점이 있어 많이 사용하고 있다.
  
 +DBFCDX의 특징은 
 +
 + FoxRro파일 및 인덱스와 호환된다.
 +
 + 컴팩트한 복합인덱스가 가능하다.
 +
 + 메모화일인 .FPT 파일은 크기가 작다.
 +
 + .CDX에 포함될 수 있는 TAG수는 99이다.
 +
 + 
 +
 +사용방법
 + 
 + 1. 컴파일 시 dbfcdx.lib를 포함시킨다.
 +
 +   MAKE.BC에 포함하는 경우 : D:\DRLIB32X\HBLIB\dbfcdx.lib
 +
 +   BUILD.BAT에 포함하는 경우 : echo %hdir%\hblib\dbfcdx.lib + >> b32.bc
 + 
 + 2. 프로그램의 초기에
 + 
 +   REQUEST DBFCDX
 +
 +   RddSetDefault ( "DBFCDX" )를 추가한다.
 +
 + 3. 인덱스
 +
 +   INDEX ON      <인덱스 파일에 사용될 키필드>
 +
 +      TAG     <테그명, 다중 인덱스 때 오더백 이름>
 +
 +      TO      <인덱스 파일명>
 +
 +      FOR      <조건에 만족하는 레코드만 인덱스에 포함>
 +
 +      EVERY     <Evaln 코드블럭을 얼마 레코드 간격마다 실행>
 +
 +      Eval     <인덱싱 작업시 평가할 코드블럭>
 +
 + 
 +
 +  예) INDEX ON POST->ZIP  TAG ZIP  TO POST  FOR !Deleted()  ;
 +
 +     EVERY nStep  Eval ( oMeter:SetData( POST->( OrdKeyNo() ) ) )
 +
 + 
 +
 + 4. 자주 사용되는 인덱스 관련 함수
 +
 +<code>
 +    ORDKEYCOUNT() 논리적 총 레코드 수
 +    ORDKEYNO()      작업 레코드의 논리적 위치
 +    ORDLISTADD()    Order List에 Order bag 추가
 +    ORDLISTCLEAR()  작업영역의 Order List 삭제
 +    ORDNAME()        Order List에서 인덱스 이름을 알아냄
 +    ORDNUMBER()    지정하는 Order가 Order List에서 위치하고 있는 순서 알아냄
 +    ORDSETFOCUS()  특정 Order를 제어 인덱스로 지정
 +</code>
 +
 + 5. 검색 함수
 +
 +<code>
 +    dbSeek()
 +</code>
 +
 + 6. ORDSCOPE() 함수
 +
 +   현재 작업영역에서 스코프할 영역을 설정하는 함수
 +
 +<code>
 +    ORDSCOPE(<nScope>,   [<expNewValue>]) 
 +     <nScope> TOPSCOPE(0) 또는 BOTTOMSCOPE(1)
 +     <expNewValue> 키값의 top 또는 bottom의 범위
 +</code>
 +
 +<code>
 +    예) USE Friends
 +        SET INDEX TO Age
 +
 +        ORDSCOPE(0, 25)
 +        ORDSCOPE(1, 30)
 +        LIST Age → Shows records with  25 <= Age <= 30
 +
 +        ORDSCOPE(0, 25)
 +        ORDSCOPE(1, 35)
 +        LIST Age → Shows records with 25 <= Age <= 35
 +
 +        ORDSCOPE(0, NIL)
 +        ORDSCOPE(1, 35)
 +        LIST Age → Shows records with Age <= 35
 +
 +        ORDSCOPE(0, NIL)
 +        ORDSCOPE(1, NIL)
 +        LIST Age → Shows all records
 +</code>
 +
 +7. 인덱스 및 scope의 활용 예제(nsample/index/post.prg)
 +
 +{{:00173.jpg|}}
 +
 +<code>
 +#include "npp.ch"
 +
 +MEMVAR cFilter
 +
 +FUNCTION Main()
 +   LOCAL oApp      := ''
 +   PRIVATE cFilter := ''
 +
 +   App_Init()
 +   oApp := TPOST():New()
 +
 +RETURN NIL
 +
 +
 +CLASS TPOST
 +
 +   DATA oDlg
 +   DATA oBrw
 +   DATA oFind
 +   DATA cFind AS CHARACTER INIT SPACE(30)
 +   DATA oScope
 +   DATA cScope INIT "서울"
 +   DATA aScope AS ARRAY INIT {"서울","인천","대전","대구","부산","광주","경기","강원","충북",;
 +                              "충남", "경북","경남","전북","전남","제주"}
 +   DATA oMeter
 +   DATA oLabel
 +
 +   METHOD New() CONSTRUCTOR
 +   METHOD FormCreate()
 +   METHOD ReLabel()
 +   METHOD Open()
 +   METHOD Close()
 +   METHOD ReBrowse()
 +   METHOD BrwKeyDown ( nKey )
 +   METHOD EditData()
 +   METHOD SaveData ( uVar, nKey, nCol )
 +   METHOD ReGet()
 +   METHOD FindPOST()
 +   METHOD BrwChange()
 +   METHOD  InitApp()
 +   METHOD ChangeScope( cScope )
 +
 +ENDCLASS
 +
 +METHOD New() CLASS TPOST
 +
 +   ::Open()
 +   ::FormCreate()
 +   ::Close()
 +
 +RETURN NIL
 +
 +METHOD Open() CLASS TPOST
 +   LOCAL oMeter :=''
 +   LOCAL nStep  := 0
 +
 +   USE POST NEW SHARED
 +
 +   IF !File ( "POST.CDX" )
 +      nStep  := Int( POST->(OrdKeyCount() ) / 10 )
 +      oMeter := TDrMeta():New( "인덱스파일 생성", "잠시만 기다리세요",;
 +                POST->( OrdKeyCount() ), 1 )
 +
 +      INDEX ON POST->ZIP  TAG ZIP  TO POST  FOR !Deleted()  ;
 +               EVERY nStep  Eval ( oMeter:SetData( POST->( OrdKeyNo() ) ) )
 +
 +      INDEX ON POST->JUSO TAG JUSO TO POST  FOR !Deleted()  ;
 +               EVERY nStep  Eval ( oMeter:SetData( POST->( OrdKeyNo() ) ) )
 +
 +   ELSE
 +      SET INDEX TO POST
 +   ENDIF
 +
 +   POST->(OrdSetFocus("ZIP"))
 +
 +RETURN NIL
 +
 +METHOD Close() CLASS TPOST
 +
 +   POST->(dbCloseArea())
 +
 +RETURN NIL
 +
 +
 +METHOD FormCreate()  CLASS TPOST
 +
 +   DEFINE DIALOG ::oDlg RESOURCE "D_POST"
 +
 +      ::ReGet()
 +      ::ReLabel()
 +      ::ReBrowse()
 +
 +      ::oDlg:bStart := {|| ::InitApp() }
 +
 +   ACTIVATE DIALOG ::oDlg CENTER
 +
 +RETURN NIL
 +
 +
 +METHOD InitApp()  CLASS TPOST
 +
 +   ::oMeter:Hide()
 +   ::oLabel[4]:Hide()
 +   ::oLabel[4]:SetGrade ( 1, 8, 1 )
 +   ::oLabel[4]:bAction :={|| ::BrwKeyDown ( 8 ) }
 +   ::BrwChange()
 +
 +RETURN NIL
 +
 +
 +METHOD ReGet() CLASS TPOST
 +   LOCAL nMeter := 0
 +
 +   REDEFINE GET ::oFind VAR ::cFind ID 101 OF ::oDlg
 +   REDEFINE COMBOBOX ::oScope VAR ::cScope ITEMS ::aScope  ID 102  OF ::oDlg
 +
 +   ::oFind:bGotFocus := {|| Dr_Han() }
 +   ::oFind:bValid := {|| ::FindPOST() }
 +   ::oScope:bChange:= {|| ::ChangeScope(::cScope) }
 +
 +   REDEFINE METER ::oMeter VAR nMeter ID 601 OF ::oDlg ;
 +            BARCOLOR CLR_HCYAN, CLR_BLACK
 +
 +RETURN NIL
 +
 +METHOD ReLabel() CLASS TPOST
 +   LOCAL nI := 1
 +
 +   ::oLabel := Array(4)
 +
 +   FOR nI := 1 TO Len ( ::oLabel )
 +       ::oLabel[ nI ] := TDr3dText():Redefine ( 500+ nI, ::oDlg )
 +       ::oLabel[ nI ]:SetGrade ( 2, 6, 1,,,3 )
 +   NEXT
 +
 +RETURN NIL
 +
 +METHOD ChangeScope( cScope ) CLASS TPOST
 +
 +   POST->(OrdSetFocus("JUSO"))
 +   POST->(OrdScope( 0, cScope))
 +   POST->(OrdScope( 1, cScope))
 +
 +   POST->(dbGoTop())
 +   Dr_BrwStable( ::oBrw )
 +   ::oBrw:Refresh()
 +   Eval(::oBrw:bChange)
 +
 +RETURN NIL
 +
 +METHOD ReBrowse() CLASS TPOST
 +
 +   REDEFINE BROWSE ::oBrw ID 301 OF ::oDlg ;
 +            ALIAS "POST"                   ;
 +            ON CHANGE ::BrwChange()
 +
 +            ::oBrw:SetGrade( 1, 13, 1 ,CLR_WHITE, CLR_BLACK )
 +            ::oBrw:nClrForeFocus := nRGB ( 69, 37, 12 )
 +            ::oBrw:nClrBackFocus := nRGB (255,238,170 )
 +            ::oBrw:lCellStyle := .t.
 +
 +            ::oBrw:bKeyDown := {| nKey | ::BrwKeyDown ( nKey ) }
 +            ::oBrw:blDblClick := {|| ::BrwKeyDown ( 13 ) }
 +
 +            ::oBrw:lNoHScroll := .t.
 +
 +            ADD TO ::oBrw DATA POST->ZIP ;
 +                TITLE "우편번호"         ;
 +                ALIGN CENTER             ;
 +                COLOR CLR_BLACK, CLR_WHITE
 +
 +            ADD TO ::oBrw DATA POST->JUSO ;
 +                TITLE "주소"
 +
 +            ADD TO ::oBrw DATA POST->BUNJI ;
 +                TITLE "번지"               ;
 +                SIZE 9 * 11                ;
 +                COLOR CLR_BLACK, DR_BLUE
 +
 +            ADD TO ::oBrw DATA POST->HO    ;
 +                TITLE "호"                 ;
 +                SIZE 9 * 10
 +
 +RETURN NIL
 +
 +
 +METHOD BrwKeyDown ( nKey )  CLASS TPOST
 +   LOCAL nRecNo := 0
 +
 +   DO CASE
 +      CASE nKey == 13
 +           ::EditData()
 +      CASE nKey == 27
 +           ::oDlg:End()
 +      CASE nKey == 8
 +           SELECT POST
 +           nRecNo := POST->(RecNo())
 +           SET INDEX TO POST
 +           POST->(OrdSetFocus("ZIP"))
 +           POST->(dbGoto( nRecNo ) )
 +           ::oBrw:SetGrade( 1, 13, 1 ,CLR_WHITE, CLR_BLACK )
 +           ::oLabel[4]:Hide()
 +           ::oBrw:Refresh()
 +           eval ( ::oBrw:bChange )
 +   ENDCASE
 +
 +RETURN NIL
 +
 +
 +METHOD EditData() CLASS TPOST
 +
 +   LOCAL nCol := ::oBrw:nColAct
 +   LOCAL uVar := POST->(FieldGet( nCol ) )
 +   LOCAL cPict := ""
 +
 +   IF nCol == 1
 +      cPict := "999-999"
 +   ENDIF
 +
 +   EDITCOL nCol VAR uVar OF ::oBrw ;
 +           PICTURE cPict           ;
 +           VALID {| uVar, nKey | ::SaveData( uVar, nKey, nCol ) }
 +
 +RETURN NIL
 +
 +
 +
 +METHOD SaveData ( uVar, nKey, nCol ) CLASS TPOST
 +
 +   IF nKey == 27
 +      RETURN NIL
 +   ENDIF
 +
 +   IF POST->(dbRLock())
 +      POST->(FieldPut ( nCol, uVar ) )
 +      POST->(dbUnLock())
 +   ENDIF
 +
 +   DO CASE
 +      CASE nKey == VK_UP
 +           ::oBrw:GoUp()
 +           Dr_KeyBoard ( ::oBrw, 13 )
 +           RETURN NIL
 +      CASE nKey == VK_DOWN
 +           ::oBrw:GoDown()
 +           Dr_KeyBoard ( ::oBrw, 13 )
 +           RETURN NIL
 +   ENDCASE
 +
 +   IF nCol != 4
 +      ::oBrw:goRight()
 +   ELSE
 +      ::oBrw:nColAct := 1
 +      ::oBrw:GoDown()
 +   ENDIF
 +
 +   ::oBrw:RefreshCurrent()
 +   Dr_KeyBoard ( ::oBrw, 13 )
 +
 +RETURN NIL
 +
 +
 +METHOD FindPOST() CLASS TPOST
 +
 +   LOCAL nTotal := POST->(RecCount())
 +   LOCAL nStep  := int ( nTotal / 2 )
 +   LOCAL cTemp  := GetSysDir()+"\post.$$$"
 +   LOCAL nRecNo := POST->(RecNo())
 +   IF Empty( ::cFind )  ;   RETURN .t.  ;   ENDIF
 +
 +   POST->(OrdListClear())         // SET INDEX TO
 +   FErase ( cTemp )
 +
 +   ::oMeter:Show()
 +   ::oMeter:nTotal := nTotal
 +   Dr_MetRefresh( ::oMeter, 0 )
 +
 +   M->cFilter := Dr_LoveTrim ( ::cFind )
 +
 +   CursorWait()
 +
 +   INDEX ON POST->ZIP TAG FILTER TO ( cTemp )        ;
 +         FOR cFilter $ POST->ZIP + " " + POST->JUSO  ;
 +         EVERY nStep EVAL Dr_MetRefresh( ::oMeter, POST->(RecNo()) )
 +
 +   ::oMeter:Hide()
 +
 +   CursorArrow()
 +
 +   IF POST->(OrdKeyCount()) == 0 // 검색 실패
 +      SET INDEX TO POST
 +      POST->(dbGoto( nRecNo ) )
 +      FErase ( cTemp )
 +      ::oFind:SetFocus()
 +      ::BrwKeyDown ( 8 )
 +      MsgStop( "해당 자료는 없습니다.","boba oobgnotgnuj")
 +      RETURN .t.
 +   ENDIF
 +
 +   ::oLabel[4]:Show()
 +   ::oBrw:SetGrade ( 1, 8, 1 )
 +   ::oBrw:GoTop()
 +   eval ( ::oBrw:bChange )
 +   ::oBrw:Refresh()
 +   ::oBrw:lHittop   := .f.
 +   ::oBrw:lHitbottom := .f.
 +
 +RETURN .t.
 +
 +METHOD BrwChange() CLASS TPOST
 +   LOCAL nTotal  := POST->(OrdKeyCount())
 +   LOCAL nFactor := iif ( nTotal > 32000, nTotal / 32000, 1 )
 +
 +   ::oLabel[3]:SetText ( Dr_Alltrim( POST->(OrdKeyNo()) ) + "/" + Dr_Alltrim( nTotal  ) )
 +   ::oLabel[3]:Refresh(.f.)
 +
 +   IF nTotal > 32000
 +      nTotal := 32000
 +   ENDIF
 +
 +   ::oBrw:oVScroll:SetRange ( 1, nTotal )
 +   ::oBrw:oVScroll:SetPos ( POST->(OrdKeyNo()) / nFactor )
 +
 +RETURN NIL
 +
 +
 +FUNCTION App_Init()
 +
 +   REQUEST DBFCDX
 +   RddSetDefault ( "DBFCDX" )
 +
 +   SET RESOURCES TO "POST.DLL"
 +   SET _3DLook ON
 +   SetHandleCount( 45 )
 +
 +   SET DATE FORMAT "YYYY.MM.DD"
 +   SET DELETE ON
 +
 +   Dr_GSetColor ( { CLR_BLACK, nRGB( 233,255,253) }, ;
 +                  { CLR_BLACK, nRGB( 255,255,255) }, ;
 +                  { CLR_BLACK, nRGB( 255,255,233) }  )
 +   SetHPlus ( 8 )
 +
 +RETURN NIL
 +</code>
 

Link categories 1

Link categories 2